Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: CurrentWeatherData_W5500 EmailButton EmailButton HTTPClient_Weather ... more
Fork of HTTPClient by
Diff: HTTPClient.cpp
- Revision:
- 4:c071b05ac026
- Parent:
- 3:5aef7584de4b
- Child:
- 5:791fc3dcb6c4
diff -r 5aef7584de4b -r c071b05ac026 HTTPClient.cpp
--- 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
