A HTTP Client for the mbed networking libraries. Work with Xively. Send location using PUT request.

Fork of HTTPClient by Donatien Garnier

Files at this revision

API Documentation at this revision

Comitter:
donatien
Date:
Thu May 24 16:27:32 2012 +0000
Parent:
3:5aef7584de4b
Child:
5:791fc3dcb6c4
Commit message:
FIX

Changed in this revision

HTTPClient.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/HTTPClient.cpp	Thu Apr 26 14:23:15 2012 +0000
+++ b/HTTPClient.cpp	Thu May 24 16:27:32 2012 +0000
@@ -154,12 +154,6 @@
     return NET_CONN;
   }
 
-  size_t recvContentLength = 0;
-  bool recvChunked = false;
-  char buf[CHUNK_SIZE];
-  size_t trfLen;
-  int crlfPos;
-
   //Send all headers
 
   //Send default headers
@@ -191,6 +185,9 @@
   ret = send("\r\n");
   if(ret != OK) goto connerr;
 
+  char buf[CHUNK_SIZE];
+  size_t trfLen;
+
   //Send data (if POST)
   if( (method == HTTP_POST) && (pDataOut != NULL) )
   {
@@ -240,7 +237,7 @@
 
   //Receive response
   DBG("Receiving response");
-  ret = recv(buf, CHUNK_SIZE, CHUNK_SIZE, &trfLen); //Read n bytes
+  ret = recv(buf, CHUNK_SIZE - 1, CHUNK_SIZE - 1, &trfLen); //Read n bytes
   if(ret != OK) goto connerr;
 
   buf[trfLen] = '\0';
@@ -251,7 +248,7 @@
     goto prtclerr;
   }
 
-  crlfPos = crlfPtr - buf;
+  int crlfPos = crlfPtr - buf;
   buf[crlfPos] = '\0';
 
   //Parse HTTP response
@@ -271,22 +268,24 @@
 
   DBG("Reading headers");
 
-  memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2));
+  memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2) + 1); //Be sure to move NULL-terminating char as well
   trfLen -= (crlfPos + 2);
 
+  size_t recvContentLength = 0;
+  bool recvChunked = false;
   //Now get headers
   while( true )
   {
     crlfPtr = strstr(buf, "\r\n");
     if(crlfPtr == NULL)
     {
-      if( trfLen < CHUNK_SIZE )
+      if( trfLen < CHUNK_SIZE - 1 )
       {
         size_t newTrfLen;
         ret = recv(buf + trfLen, 1, CHUNK_SIZE - trfLen - 1, &newTrfLen);
         trfLen += newTrfLen;
         buf[trfLen] = '\0';
-        DBG("In buf: [%s]", buf);
+        DBG("Read %d chars; In buf: [%s]", newTrfLen, buf);
         if(ret != OK) goto connerr;
         continue;
       }
@@ -301,17 +300,20 @@
     if(crlfPos == 0) //End of headers
     {
       DBG("Headers read");
-      memmove(buf, &buf[2], trfLen - 2);
+      memmove(buf, &buf[2], trfLen - 2 + 1); //Be sure to move NULL-terminating char as well
       trfLen -= 2;
       break;
     }
 
     buf[crlfPos] = '\0';
 
-    char key[16];
-    char value[16];
+    char key[32];
+    char value[32];
 
-    int n = sscanf(buf, "%16[^:]: %16[^\r\n]", key, value);
+    key[31] = '\0';
+    value[31] = '\0';
+
+    int n = sscanf(buf, "%31[^:]: %31[^\r\n]", key, value);
     if ( n == 2 )
     {
       DBG("Read header : %s: %s\n", key, value);
@@ -333,7 +335,7 @@
         pDataIn->setDataType(value);
       }
 
-      memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2));
+      memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2) + 1); //Be sure to move NULL-terminating char as well
       trfLen -= (crlfPos + 2);
 
     }
@@ -385,7 +387,7 @@
         goto prtclerr;
       }
 
-      memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2));
+      memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2)); //Not need to move NULL-terminating char any more
       trfLen -= (crlfPos + 2);
 
       if( readLen == 0 )
@@ -419,7 +421,6 @@
       {
         ret = recv(buf, 1, CHUNK_SIZE - trfLen - 1, &trfLen);
         if(ret != OK) goto connerr;
-
       }
     } while(readLen);
 
@@ -454,18 +455,15 @@
   return OK;
 
   connerr:
-  {
     socket::close(m_sock);
     ERR("Connection error (%d)", ret);
-    return NET_CONN;
-  }
-  
+  return NET_CONN;
+
   prtclerr:
-  {
     socket::close(m_sock);
     ERR("Protocol error");
-    return NET_PROTOCOL;
-  }
+  return NET_PROTOCOL;
+
 }
 
 int HTTPClient::recv(char* buf, size_t minLen, size_t maxLen, size_t* pReadLen) //0 on success, err code on failure