HTTPClient

Fork of HTTPClient by Donatien Garnier

Revision:
14:2744e0c0e527
Parent:
13:be61104f4e91
Child:
15:5ad07f90e895
diff -r be61104f4e91 -r 2744e0c0e527 HTTPClient.cpp
--- a/HTTPClient.cpp	Sun Aug 05 16:12:10 2012 +0000
+++ b/HTTPClient.cpp	Tue Aug 28 15:55:32 2012 +0000
@@ -355,34 +355,44 @@
     if( recvChunked )
     {
       //Read chunk header
-      crlfPos=0;
-      for(crlfPos++; crlfPos < trfLen - 2; crlfPos++)
+      bool foundCrlf;
+      do
       {
-        if( buf[crlfPos] == '\r' && buf[crlfPos + 1] == '\n' )
-        {
-          break;
-        }
-      }
-      if(crlfPos >= trfLen - 2) //Try to read more
-      {
-        if( trfLen < CHUNK_SIZE )
+        foundCrlf = false;
+        crlfPos=0;
+        buf[trfLen]=0;
+        if(trfLen >= 2)
         {
-          size_t newTrfLen;
-          ret = recv(buf + trfLen, 0, CHUNK_SIZE - trfLen - 1, &newTrfLen);
-          trfLen += newTrfLen;
-          CHECK_CONN_ERR(ret);
-          continue;
+          for(; crlfPos < trfLen - 2; crlfPos++)
+          {
+            if( buf[crlfPos] == '\r' && buf[crlfPos + 1] == '\n' )
+            {
+              foundCrlf = true;
+              break;
+            }
+          }
         }
-        else
+        if(!foundCrlf) //Try to read more
         {
-          PRTCL_ERR();
+          if( trfLen < CHUNK_SIZE )
+          {
+            size_t newTrfLen;
+            ret = recv(buf + trfLen, 0, CHUNK_SIZE - trfLen - 1, &newTrfLen);
+            trfLen += newTrfLen;
+            CHECK_CONN_ERR(ret);
+            continue;
+          }
+          else
+          {
+            PRTCL_ERR();
+          }
         }
-      }
+      } while(!foundCrlf);
       buf[crlfPos] = '\0';
       int n = sscanf(buf, "%x", &readLen);
       if(n!=1)
       {
-        ERR("Could not read chunk length");
+        ERR("Could not read chunk length -- crlfpos == %d & got %s", crlfPos, buf);
         PRTCL_ERR();
       }
 
@@ -429,7 +439,7 @@
       {
         size_t newTrfLen;
         //Read missing chars to find end of chunk
-        ret = recv(buf, 2 - trfLen, CHUNK_SIZE, &newTrfLen);
+        ret = recv(buf + trfLen, 2 - trfLen, CHUNK_SIZE - trfLen - 1, &newTrfLen);
         CHECK_CONN_ERR(ret);
         trfLen += newTrfLen;
       }