HTTP Client Library
Dependents: EthernetHTTPClientTest
Diff: HTTPClient.cpp
- Revision:
- 5:791fc3dcb6c4
- Parent:
- 4:c071b05ac026
diff -r c071b05ac026 -r 791fc3dcb6c4 HTTPClient.cpp --- a/HTTPClient.cpp Thu May 24 16:27:32 2012 +0000 +++ b/HTTPClient.cpp Fri Jun 15 14:24:46 2012 +0000 @@ -77,6 +77,21 @@ return m_httpResponseCode; } +#define CHECK_CONN_ERR(ret) \ + do{ \ + if(ret != OK) { \ + ::close(m_sock); \ + ERR("Connection error (%d)", ret); \ + return NET_CONN; \ + } \ + } while(0) + +#define PRTCL_ERR() \ + do{ \ + ::close(m_sock); \ + ERR("Protocol error"); \ + return NET_PROTOCOL; \ + } while(0) int HTTPClient::connect(const char* url, HTTP_METH method, IHTTPDataOut* pDataOut, IHTTPDataIn* pDataIn, uint32_t timeout) //Execute request { @@ -111,7 +126,7 @@ //Resolve DNS if needed DBG("Resolving DNS address or populate hard-coded IP address"); - struct hostent *server = socket::gethostbyname(host); + struct hostent *server = ::gethostbyname(host); if(server == NULL) { return NET_NOTFOUND; //Fail @@ -123,7 +138,7 @@ //Create socket DBG("Creating socket"); - m_sock = socket::socket(AF_INET, SOCK_STREAM, 0); //UDP socket + m_sock = ::socket(AF_INET, SOCK_STREAM, 0); //UDP socket if (m_sock < 0) { ERR("Could not create socket"); @@ -133,10 +148,10 @@ //Connect it DBG("Connecting socket to %s:%d", inet_ntoa(m_serverAddr.sin_addr), ntohs(m_serverAddr.sin_port)); - ret = socket::connect(m_sock, (const struct sockaddr *)&m_serverAddr, sizeof(m_serverAddr)); + ret = ::connect(m_sock, (const struct sockaddr *)&m_serverAddr, sizeof(m_serverAddr)); if (ret < 0) { - socket::close(m_sock); + ::close(m_sock); ERR("Could not connect"); return NET_CONN; } @@ -149,7 +164,7 @@ ret = send(line); if(ret) { - socket::close(m_sock); + ::close(m_sock); ERR("Could not write request"); return NET_CONN; } @@ -163,27 +178,27 @@ if( pDataOut->getIsChunked() ) { ret = send("Transfer-Encoding: chunked\r\n"); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); } else { snprintf(line, sizeof(line), "Content-Length: %d\r\n", pDataOut->getDataLen()); ret = send(line); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); } char type[48]; if( pDataOut->getDataType(type, 48) == OK ) { snprintf(line, sizeof(line), "Content-Type: %s\r\n", type); ret = send(line); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); } } //Close headers DBG("Headers sent"); ret = send("\r\n"); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); char buf[CHUNK_SIZE]; size_t trfLen; @@ -201,7 +216,7 @@ //Write chunk header snprintf(line, sizeof(line), "%X\r\n", trfLen); //In hex encoding ret = send(line); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); } else if( trfLen == 0 ) { @@ -210,13 +225,13 @@ if( trfLen != 0 ) { ret = send(buf, trfLen); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); } if( pDataOut->getIsChunked() ) { ret = send("\r\n"); //Chunk-terminating CRLF - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); } else { @@ -238,14 +253,14 @@ //Receive response DBG("Receiving response"); ret = recv(buf, CHUNK_SIZE - 1, CHUNK_SIZE - 1, &trfLen); //Read n bytes - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); buf[trfLen] = '\0'; char* crlfPtr = strstr(buf, "\r\n"); if(crlfPtr == NULL) { - goto prtclerr; + PRTCL_ERR(); } int crlfPos = crlfPtr - buf; @@ -256,14 +271,14 @@ { //Cannot match string, error ERR("Not a correct HTTP answer : %s\n", buf); - goto prtclerr; + PRTCL_ERR(); } if(m_httpResponseCode != 200) { //Cannot match string, error WARN("Response code %d", m_httpResponseCode); - goto prtclerr; + PRTCL_ERR(); } DBG("Reading headers"); @@ -286,12 +301,12 @@ trfLen += newTrfLen; buf[trfLen] = '\0'; DBG("Read %d chars; In buf: [%s]", newTrfLen, buf); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); continue; } else { - goto prtclerr; + PRTCL_ERR(); } } @@ -342,7 +357,7 @@ else { ERR("Could not parse header"); - goto prtclerr; + PRTCL_ERR(); } } @@ -371,12 +386,12 @@ size_t newTrfLen; ret = recv(buf + trfLen, 0, CHUNK_SIZE - trfLen - 1, &newTrfLen); trfLen += newTrfLen; - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); continue; } else { - goto prtclerr; + PRTCL_ERR(); } } buf[crlfPos] = '\0'; @@ -384,7 +399,7 @@ if(n!=1) { ERR("Could not read chunk length"); - goto prtclerr; + PRTCL_ERR(); } memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2)); //Not need to move NULL-terminating char any more @@ -420,7 +435,7 @@ if(readLen) { ret = recv(buf, 1, CHUNK_SIZE - trfLen - 1, &trfLen); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); } } while(readLen); @@ -431,13 +446,13 @@ size_t newTrfLen; //Read missing chars to find end of chunk ret = recv(buf, 2 - trfLen, CHUNK_SIZE, &newTrfLen); - if(ret != OK) goto connerr; + CHECK_CONN_ERR(ret); trfLen += newTrfLen; } if( (buf[0] != '\r') || (buf[1] != '\n') ) { ERR("Format error"); - goto prtclerr; + PRTCL_ERR(); } memmove(buf, &buf[2], trfLen - 2); trfLen -= 2; @@ -449,21 +464,10 @@ } - socket::close(m_sock); + ::close(m_sock); DBG("Completed HTTP transaction"); return OK; - - connerr: - socket::close(m_sock); - ERR("Connection error (%d)", ret); - return NET_CONN; - - prtclerr: - socket::close(m_sock); - ERR("Protocol error"); - return NET_PROTOCOL; - } int HTTPClient::recv(char* buf, size_t minLen, size_t maxLen, size_t* pReadLen) //0 on success, err code on failure @@ -480,14 +484,14 @@ struct timeval t_val; t_val.tv_sec = m_timeout / 1000; t_val.tv_usec = (m_timeout - (t_val.tv_sec * 1000)) * 1000; - int ret = socket::select(FD_SETSIZE, &socksSet, NULL, NULL, &t_val); + int ret = ::select(FD_SETSIZE, &socksSet, NULL, NULL, &t_val); if(ret <= 0 || !FD_ISSET(m_sock, &socksSet)) { WARN("Timeout"); return NET_TIMEOUT; //Timeout } - ret = socket::recv(m_sock, buf + readLen, maxLen - readLen, 0); + ret = ::recv(m_sock, buf + readLen, maxLen - readLen, 0); if( ret > 0) { readLen += ret; @@ -527,14 +531,14 @@ struct timeval t_val; t_val.tv_sec = m_timeout / 1000; t_val.tv_usec = (m_timeout - (t_val.tv_sec * 1000)) * 1000; - int ret = socket::select(FD_SETSIZE, NULL, &socksSet, NULL, &t_val); + int ret = ::select(FD_SETSIZE, NULL, &socksSet, NULL, &t_val); if(ret <= 0 || !FD_ISSET(m_sock, &socksSet)) { WARN("Timeout"); return NET_TIMEOUT; //Timeout } - ret = socket::send(m_sock, buf + writtenLen, len - writtenLen, 0); + ret = ::send(m_sock, buf + writtenLen, len - writtenLen, 0); if( ret > 0) { writtenLen += ret;