A HTTP Client for the mbed networking libraries with HTTPFile for use with latest networking stack
Fork of HTTPClient by
An extension of the HTTPClient that adds HTTPFile. Currently on get is support and only works when getting binary files.
HTTPFile data("/local/firm.bin"); HTTPResult r = client.get("https://217.140.101.20/media/uploads/ollie8/firm.bin", &data); if (r == HTTP_OK) { }
Diff: HTTPClient.cpp
- Revision:
- 12:89d09a6db00a
- Parent:
- 11:390362de8c3f
- Child:
- 13:be61104f4e91
--- a/HTTPClient.cpp Mon Jul 30 15:16:51 2012 +0000 +++ b/HTTPClient.cpp Sun Aug 05 15:30:07 2012 +0000 @@ -19,17 +19,20 @@ //Debug is disabled by default #if 0 -#define DBG(x, ...) -#define WARN(x, ...) -#define ERR(x, ...) -#else +//Enable debug #include <cstdio> #define DBG(x, ...) std::printf("[HTTPClient : DBG]"x"\r\n", ##__VA_ARGS__); #define WARN(x, ...) std::printf("[HTTPClient : WARN]"x"\r\n", ##__VA_ARGS__); #define ERR(x, ...) std::printf("[HTTPClient : ERR]"x"\r\n", ##__VA_ARGS__); + +#else +//Disable debug +#define DBG(x, ...) +#define WARN(x, ...) +#define ERR(x, ...) + #endif -#define HTTP_REQUEST_TIMEOUT 30000 #define HTTP_PORT 80 #define OK 0 @@ -62,18 +65,18 @@ } #endif -HTTPResult HTTPClient::get(const char* url, IHTTPDataIn* pDataIn, uint32_t timeout /*= HTTP_CLIENT_DEFAULT_TIMEOUT*/) //Blocking +HTTPResult HTTPClient::get(const char* url, IHTTPDataIn* pDataIn, int timeout /*= HTTP_CLIENT_DEFAULT_TIMEOUT*/) //Blocking { return connect(url, HTTP_GET, NULL, pDataIn, timeout); } -HTTPResult HTTPClient::get(const char* url, char* result, size_t maxResultLen, uint32_t timeout /*= HTTP_CLIENT_DEFAULT_TIMEOUT*/) //Blocking +HTTPResult HTTPClient::get(const char* url, char* result, size_t maxResultLen, int timeout /*= HTTP_CLIENT_DEFAULT_TIMEOUT*/) //Blocking { HTTPText str(result, maxResultLen); return get(url, &str, timeout); } -HTTPResult HTTPClient::post(const char* url, const IHTTPDataOut& dataOut, IHTTPDataIn* pDataIn, uint32_t timeout /*= HTTP_CLIENT_DEFAULT_TIMEOUT*/) //Blocking +HTTPResult HTTPClient::post(const char* url, const IHTTPDataOut& dataOut, IHTTPDataIn* pDataIn, int timeout /*= HTTP_CLIENT_DEFAULT_TIMEOUT*/) //Blocking { return connect(url, HTTP_POST, (IHTTPDataOut*)&dataOut, pDataIn, timeout); } @@ -99,8 +102,8 @@ return HTTP_PRTCL; \ } while(0) -HTTPResult HTTPClient::connect(const char* url, HTTP_METH method, IHTTPDataOut* pDataOut, IHTTPDataIn* pDataIn, uint32_t timeout) //Execute request -{ +HTTPResult HTTPClient::connect(const char* url, HTTP_METH method, IHTTPDataOut* pDataOut, IHTTPDataIn* pDataIn, int timeout) //Execute request +{ m_httpResponseCode = 0; //Invalidate code m_timeout = timeout; @@ -454,23 +457,32 @@ { DBG("Trying to read between %d and %d bytes", minLen, maxLen); size_t readLen = 0; - + + if(!m_sock.is_connected()) + { + WARN("Connection was closed by server"); + return HTTP_CLOSED; //Connection was closed by server + } + int ret; while(readLen < maxLen) { if(readLen < minLen) { - ret = m_sock.receive_all(buf + readLen, minLen - readLen, m_timeout); + DBG("Trying to read at most %d bytes [Blocking]", minLen - readLen); + m_sock.set_blocking(true, m_timeout); + ret = m_sock.receive_all(buf + readLen, minLen - readLen); } else { - ret = m_sock.receive(buf + readLen, maxLen - readLen, 0); + DBG("Trying to read at most %d bytes [Not blocking]", maxLen - readLen); + m_sock.set_blocking(false); + ret = m_sock.receive(buf + readLen, maxLen - readLen); } if( ret > 0) { readLen += ret; - continue; } else if( ret == 0 ) { @@ -478,9 +490,21 @@ } else { - ERR("Connection error (recv returned %d)", ret); - *pReadLen = readLen; - return HTTP_CONN; + if(!m_sock.is_connected()) + { + ERR("Connection error (recv returned %d)", ret); + *pReadLen = readLen; + return HTTP_CONN; + } + else + { + break; + } + } + + if(!m_sock.is_connected()) + { + break; } } DBG("Read %d bytes", readLen); @@ -496,26 +520,29 @@ } DBG("Trying to write %d bytes", len); size_t writtenLen = 0; + + if(!m_sock.is_connected()) + { + WARN("Connection was closed by server"); + return HTTP_CLOSED; //Connection was closed by server + } - int ret; - do + m_sock.set_blocking(true, m_timeout); + int ret = m_sock.send_all(buf, len); + if(ret > 0) { - ret = m_sock.send_all(buf + writtenLen, len - writtenLen, m_timeout); - if(ret > 0) - { - writtenLen += ret; - } - else if( ret == 0 ) - { - WARN("Connection was closed by server"); - return HTTP_CLOSED; //Connection was closed by server - } - else - { - ERR("Connection error (recv returned %d)", ret); - return HTTP_CONN; - } - } while(writtenLen < len); + writtenLen += ret; + } + else if( ret == 0 ) + { + WARN("Connection was closed by server"); + return HTTP_CLOSED; //Connection was closed by server + } + else + { + ERR("Connection error (send returned %d)", ret); + return HTTP_CONN; + } DBG("Written %d bytes", writtenLen); return HTTP_OK;