8000 Bugfix/esp8266 http client by Jeroen88 · Pull Request #5250 · esp8266/Arduino · GitHub
[go: up one dir, main page]

Skip to content

Bugfix/esp8266 http client #5250

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Oct 21, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Correcting bad fix for #5216
  • Loading branch information
Jeroen88 committed Oct 16, 2018
commit 3c23315cb87dab604b78244359fb936eefabb47f
Original file line number Diff line number Diff line change
Expand Up @@ -45,37 +45,38 @@ void loop() {

client->setFingerprint(fingerprint);

HTTPClient https;

Serial.print("[HTTPS] begin...\n");
if (https.begin(*client, "https://jigsaw.w3.org/HTTP/connection.html")) { // HTTPS


Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = https.GET();

// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);

// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.println(payload);
{ // Create a block arround HTTPClient, so it is destroyed before WiFiClientSecure *client is deleted
HTTPClient https;

Serial.print("[HTTPS] begin...\n");
if (https.begin(*client, "https://jigsaw.w3.org/HTTP/connection.html")) { // HTTPS

Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = https.GET();

// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);

// file found at server
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
}

https.end();
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
Serial.printf("[HTTPS] Unable to connect\n");
}

https.end();
} else {
Serial.printf("[HTTPS] Unable to connect\n");
}

} // End block around HTTPClient
delete client;
}

Serial.println("Wait 10s before next round...");
delay(10000);
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ void loop() {
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) {

HTTPClient http;

BearSSL::WiFiClientSecure *client = new BearSSL::WiFiClientSecure ;

bool mfln = client->probeMaxFragmentLength("tls.mbed.org", 443, 1024);
Expand All @@ -55,61 +53,66 @@ void loop() {
const uint8_t fingerprint[20] = {0xEB, 0xD9, 0xDF, 0x37, 0xC2, 0xCC, 0x84, 0x89, 0x00, 0xA0, 0x58, 0x52, 0x24, 0x04, 0xE4, 0x37, 0x3E, 0x2B, 0xF1, 0x41};
client->setFingerprint(fingerprint);

if (http.begin(*client, "https://tls.mbed.org/")) {
{ // Create a block arround HTTPClient, so it is destroyed before WiFiClientSecure *client is deleted
HTTPClient https;

if (https.begin(*client, "https://tls.mbed.org/")) {

Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = http.GET();
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = https.GET();
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);

// file found at server
if (httpCode == HTTP_CODE_OK) {
// file found at server
if (httpCode == HTTP_CODE_OK) {

// get lenght of document (is -1 when Server sends no Content-Length header)
int len = http.getSize();
// get lenght of document (is -1 when Server sends no Content-Length header)
int len = https.getSize();

// create buffer for read
static uint8_t buff[128] = { 0 };
// create buffer for read
static uint8_t buff[128] = { 0 };

// get tcp stream
WiFiClient * stream = client;
// get tcp stream
WiFiClient * stream = client;

// read all data from server
while (http.connected() && (len > 0 || len == -1)) {
// get available data size
size_t size = stream->available();
// read all data from server
while (https.connected() && (len > 0 || len == -1)) {
// get available data size
size_t size = stream->available();

if (size) {
// read up to 128 byte
int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
if (size) {
// read up to 128 byte
int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));

// write it to Serial
Serial.write(buff, c);
// write it to Serial
Serial.write(buff, c);

if (len > 0) {
len -= c;
if (len > 0) {
len -= c;
}
}
delay(1);
}
delay(1);
}

Serial.println();
Serial.print("[HTTPS] connection closed or file end.\n");
Serial.println();
Serial.print("[HTTPS] connection closed or file end.\n");

}
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
}

https.end();
} else {
Serial.printf("[HTTPS] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
Serial.printf("Unable to connect\n");
}

http.end();
} else {
Serial.printf("Unable to connect\n");
}
} // End block around HTTPCLient

delete client;
}

Serial.println("Wait 10s before the next round...");
delay(10000);
}
67 changes: 50 additions & 17 deletions libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ HTTPClient::HTTPClient()
HTTPClient::~HTTPClient()
{
if(_client) {
DEBUG_HTTPCLIENT("[HTTP-Client][~HTTPClient] end() not called before destruction of HTTPClient\n");
_client->stop();
}
if(_currentHeaders) {
delete[] _currentHeaders;
Expand All @@ -147,7 +147,13 @@ void HTTPClient::clear()
* @return success bool
*/
bool HTTPClient::begin(WiFiClient &client, String url) {
end();
#ifdef HTTPCLIENT_1_1_COMPATIBLE
if(_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}
#endif

_client = &client;

Expand Down Expand Up @@ -180,7 +186,13 @@ bool HTTPClient::begin(WiFiClient &client, String url) {
*/
bool HTTPClient::begin(WiFiClient &client, String host, uint16_t port, String uri, bool https)
{
end();
#ifdef HTTPCLIENT_1_1_COMPATIBLE
if(_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}
#endif

_client = &client;

Expand All @@ -196,7 +208,11 @@ bool HTTPClient::begin(WiFiClient &client, String host, uint16_t port, String ur
#ifdef HTTPCLIENT_1_1_COMPATIBLE
bool HTTPClient::begin(String url, String httpsFingerprint)
{
end();
if(_client && !_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}

_port = 443;
if (httpsFingerprint.length() == 0) {
Expand All @@ -213,7 +229,11 @@ bool HTTPClient::begin(String url, String httpsFingerprint)

bool HTTPClient::begin(String url, const uint8_t httpsFingerprint[20])
{
end();
if(_client && !_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}

_port = 443;
if (!beginInternal(url, "https")) {
Expand All @@ -235,7 +255,11 @@ bool HTTPClient::begin(String url, const uint8_t httpsFingerprint[20])
*/
bool HTTPClient::begin(String url)
{
end();
if(_client && !_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}

_port = 80;
if (!beginInternal(url, "http")) {
Expand Down Expand Up @@ -296,7 +320,11 @@ bool HTTPClient::beginInternal(String url, const char* expectedProtocol)
#ifdef HTTPCLIENT_1_1_COMPATIBLE
bool HTTPClient::begin(String host, uint16_t port, String uri)
{
end();
if(_client && !_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}

clear();
_host = host;
Expand All @@ -321,7 +349,11 @@ bool HTTPClient::begin(String host, uint16_t port, String uri, bool https, Strin

bool HTTPClient::begin(String host, uint16_t port, String uri, String httpsFingerprint)
{
end();
if(_client && !_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}

clear();
_host = host;
Expand All @@ -338,7 +370,11 @@ bool HTTPClient::begin(String host, uint16_t port, String uri, String httpsFinge

bool HTTPClient::begin(String host, uint16_t port, String uri, const uint8_t httpsFingerprint[20])
{
end();
if(_client && !_tcpDeprecated) {
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
_canReuse = false;
end();
}

clear();
_host = host;
Expand All @@ -361,7 +397,6 @@ bool HTTPClient::begin(String host, uint16_t port, String uri, const uint8_t htt
*/
void HTTPClient::end(void)
{
_canReuse = false;
disconnect();
clear();
}
Expand All @@ -373,15 +408,13 @@ void HTTPClient::end(void)
void HTTPClient::disconnect()
{
if(connected()) {
if(_client) {
if(_client->available() > 0) {
DEBUG_HTTPCLIENT("[HTTP-Client][end] still data in buffer (%d), clean up.\n", _client->available());
while(_client->available() > 0) {
_client->read();
}
if(_client->available() > 0) {
DEBUG_HTTPCLIENT("[HTTP-Client][end] still data in buffer (%d), clean up.\n", _client->available());
while(_client->available() > 0) {
_client->read();
}

}

if(_reuse && _canReuse) {
DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp keep open for reuse\n");
} else {
Expand Down
0