From 1060db94c200ae18425f069455257d6447a5c060 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Fri, 29 Jan 2016 14:02:09 +0100 Subject: [PATCH] handle possible dead lock in HTTP client see: #1520 --- .../src/ESP8266HTTPClient.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 6877f14bac..fd11c0360b 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -264,7 +264,7 @@ void HTTPClient::setAuthorization(const char * auth) { /** * set the timeout for the TCP connection - * @param timeout unsigned int + * @param timeout unsigned int */ void HTTPClient::setTimeout(uint16_t timeout) { _tcpTimeout = timeout; @@ -273,14 +273,12 @@ void HTTPClient::setTimeout(uint16_t timeout) { } } - - /** * use HTTP1.0 * @param timeout */ void HTTPClient::useHTTP10(bool useHTTP10) { - _useHTTP10 = useHTTP10; + _useHTTP10 = useHTTP10; } /** @@ -392,7 +390,6 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { // create buffer for read uint8_t * buff = (uint8_t *) malloc(buff_size); - if(buff) { // read all data from stream and send it to server while(connected() && (stream->available() > -1) && (len > 0 || len == -1)) { @@ -471,8 +468,7 @@ int HTTPClient::sendRequest(const char * type, Stream * stream, size_t size) { free(buff); if(size && (int) size != bytesWritten) { - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload bytesWritten %d and size %d mismatch!.\n", bytesWritten, size); - DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] ERROR SEND PAYLOAD FAILED!"); + DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload bytesWritten %d and size %d mismatch!.\n", bytesWritten, size); DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] ERROR SEND PAYLOAD FAILED!"); return returnError(HTTPC_ERROR_SEND_PAYLOAD_FAILED); } else { DEBUG_HTTPCLIENT("[HTTP-Client][sendRequest] Stream payload written: %d\n", bytesWritten); @@ -829,10 +825,12 @@ int HTTPClient::handleHeaderResponse() { if(!connected()) { return HTTPC_ERROR_NOT_CONNECTED; } + String transferEncoding; _returnCode = -1; _size = -1; _transferEncoding = HTTPC_TE_IDENTITY; + unsigned long lastDataTime = millis(); while(connected()) { size_t len = _tcp->available(); @@ -840,6 +838,8 @@ int HTTPClient::handleHeaderResponse() { String headerLine = _tcp->readStringUntil('\n'); headerLine.trim(); // remove \r + lastDataTime = millis(); + DEBUG_HTTPCLIENT("[HTTP-Client][handleHeaderResponse] RX: '%s'\n", headerLine.c_str()); if(headerLine.startsWith("HTTP/1.")) { @@ -895,6 +895,9 @@ int HTTPClient::handleHeaderResponse() { } } else { + if((millis() - lastDataTime) > _tcpTimeout) { + return HTTPC_ERROR_READ_TIMEOUT; + } delay(0); } } @@ -902,8 +905,6 @@ int HTTPClient::handleHeaderResponse() { return HTTPC_ERROR_CONNECTION_LOST; } - - /** * write one Data Block to Stream * @param stream Stream *