diff --git a/libraries/ESP8266HTTPClient/examples/ReuseConnectionV2/ReuseConnectionV2.ino b/libraries/ESP8266HTTPClient/examples/ReuseConnectionV2/ReuseConnectionV2.ino new file mode 100644 index 0000000000..5a208e282b --- /dev/null +++ b/libraries/ESP8266HTTPClient/examples/ReuseConnectionV2/ReuseConnectionV2.ino @@ -0,0 +1,76 @@ +/** + reuseConnectionV2.ino + + Created on: 22.11.2015 + + This example reuses the http connection and also restores the connection if the connection is lost +*/ + + +#include + +#include +#include + +#include + +ESP8266WiFiMulti WiFiMulti; + +HTTPClient http; +WiFiClient client; + +void setup() { + + Serial.begin(115200); + // Serial.setDebugOutput(true); + + Serial.println(); + Serial.println(); + Serial.println("Connecting to WiFi..."); + + WiFi.mode(WIFI_STA); + WiFiMulti.addAP("SSID", "PASSWORD"); + + // wait for WiFi connection + while ((WiFiMulti.run() != WL_CONNECTED)) { + Serial.write('.'); + delay(500); + } + Serial.println(" connected to WiFi"); + + // allow reuse (if server supports it) + http.setReuse(true); + + + http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html"); + //http.begin(client, "jigsaw.w3.org", 80, "/HTTP/connection.html"); +} + +void loop() { + for (int i = 0; i < 10; i++) { + Serial.printf("Reuse connection example, GET url for the %d time\n", i + 1); + int httpCode = http.GET(); + if (httpCode > 0) { + Serial.printf("[HTTP] GET... code: %d\n", httpCode); + + // file found at server + if (httpCode == HTTP_CODE_OK) { + http.writeToStream(&Serial); + } + } else { + Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); + // Something went wrong with the connection, try to reconnect + http.end(); + http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html"); + //http.begin(client, "jigsaw.w3.org", 80, "/HTTP/connection.html"); + } + + Serial.println("\n\n\nWait 5 second...\n"); + delay(5000); + } + + http.end(); + + Serial.println("Done testing, now wait forever"); + for (;;) delay(100); // Wait forever +} diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 55608f0d3b..b553c404d3 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -456,6 +456,10 @@ void HTTPClient::disconnect(bool preserveClient) #endif } } else { + if (!preserveClient && _client) { // Also destroy _client if not connected() + _client = nullptr; + } + DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp is closed\n"); } } @@ -922,7 +926,9 @@ int HTTPClient::writeToStream(Stream * stream) return returnError(HTTPC_ERROR_NO_STREAM); } - if(!connected()) { + // Only return error if not connected and no data available, because otherwise ::getString() will return an error instead of an empty + // string when the server returned a http code 204 (no content) + if(!connected() && _transferEncoding != HTTPC_TE_IDENTITY && _size > 0) { return returnError(HTTPC_ERROR_NOT_CONNECTED); } @@ -931,11 +937,13 @@ int HTTPClient::writeToStream(Stream * stream) int ret = 0; if(_transferEncoding == HTTPC_TE_IDENTITY) { - ret = writeToStreamDataBlock(stream, len); + if(len > 0) { + ret = writeToStreamDataBlock(stream, len); - // have we an error? - if(ret < 0) { - return returnError(ret); + // have we an error? + if(ret < 0) { + return returnError(ret); + } } } else if(_transferEncoding == HTTPC_TE_CHUNKED) { int size = 0; @@ -1289,6 +1297,7 @@ int HTTPClient::handleHeaderResponse() _canReuse = (headerLine[sizeof "HTTP/1." - 1] != '0'); } _returnCode = headerLine.substring(9, headerLine.indexOf(' ', 9)).toInt(); + _canReuse = (_returnCode != '0'); } else if(headerLine.indexOf(':')) { String headerName = headerLine.substring(0, headerLine.indexOf(':')); String headerValue = headerLine.substring(headerLine.indexOf(':') + 1); diff --git a/tools/sdk/lwip2/builder b/tools/sdk/lwip2/builder index ffa962483c..2314329c86 160000 --- a/tools/sdk/lwip2/builder +++ b/tools/sdk/lwip2/builder @@ -1 +1 @@ -Subproject commit ffa962483cc1c5d874b11bec13080359619c4cb2 +Subproject commit 2314329c86cb7eb9670e3adf7632bd52001f45cd