]> WPIA git - cassiopeia.git/blobdiff - src/io/record.cpp
upd: only throwing exceptions now
[cassiopeia.git] / src / io / record.cpp
index 422244e0021e2d06216df0f31e2ea7f626ee914b..4cc5b898bab50e377d71df9b8017cd2932a3dc91 100644 (file)
@@ -31,7 +31,7 @@ void sendCommand( RecordHeader& head, const std::string& data, std::shared_ptr<O
     size_t pos = 0;
     head.offset = 0;
     head.totalLength = data.size();
-    while(pos < data.size()){
+    do {
         size_t toTransfer = std::min(static_cast<size_t>(0xF000), data.size() - pos);
         head.payloadLength = toTransfer;
 
@@ -47,7 +47,7 @@ void sendCommand( RecordHeader& head, const std::string& data, std::shared_ptr<O
 
         pos += toTransfer;
         head.offset += 1;
-    }
+    } while(pos < data.size());
 }
 
 int32_t fromHexDigit( char c ) {
@@ -96,10 +96,10 @@ std::string parseCommand( RecordHeader& head, const std::string& input) {
         std::stringstream ss;
         ss << "Expected: " << expectedTotalLength << ", Got: " << input.size();
         logger::error( ss.str() );
-        throw "Error, invalid length";
+        throw std::length_error("Error, invalid length");
     }
     if( checksum != -1 || error || dlen < RECORD_HEADER_SIZE ) {
-        throw "Error, invalid checksum";
+        throw std::runtime_error("Error, invalid checksum");
     }
 
     data.pop_back();
@@ -112,6 +112,7 @@ std::string parseCommandChunked( RecordHeader& head, std::shared_ptr<OpensslBIOW
     std::string all(head.totalLength, ' ');
     auto target = all.begin();
     size_t pos = 0;
+    RecordHeader head2;
     while(true) {
         pos += head.payloadLength;
         target = std::copy ( payload.begin(), payload.end(), target);
@@ -119,7 +120,11 @@ std::string parseCommandChunked( RecordHeader& head, std::shared_ptr<OpensslBIOW
             break;
         }
         logger::note("chunk digested, reading next one");
-        payload = parseCommand( head, io->readLine() );
+        payload = parseCommand( head2, io->readLine() );
+        if(!head2.isFollowupOf(head)){
+            throw std::runtime_error("Error, header of follow up chunk was malformed");
+        }
+        head = head2;
     }
     return all;
 }