Skip to content
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

Bugfix/esp8266 http client #5250

Merged
merged 14 commits into from
Oct 21, 2018
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ void loop() {
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) {

BearSSL::WiFiClientSecure *client = new BearSSL::WiFiClientSecure;
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);

client->setFingerprint(fingerprint);

Expand All @@ -50,7 +50,6 @@ void loop() {
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();
Expand All @@ -73,9 +72,8 @@ void loop() {
} else {
Serial.printf("[HTTPS] Unable to connect\n");
}

delete client;
}

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

HTTPClient http;

BearSSL::WiFiClientSecure *client = new BearSSL::WiFiClientSecure ;
std::unique_ptr<BearSSL::WiFiClientSecure> client(new BearSSL::WiFiClientSecure);

bool mfln = client->probeMaxFragmentLength("tls.mbed.org", 443, 1024);
Serial.printf("\nConnecting to https://tls.mbed.org\n");
Expand All @@ -53,13 +51,16 @@ void loop() {

// configure server and url
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/")) {
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();
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);
Expand All @@ -68,22 +69,19 @@ void loop() {
if (httpCode == HTTP_CODE_OK) {

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

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

// get tcp stream
WiFiClient * stream = client;

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

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

// write it to Serial
Serial.write(buff, c);
Expand All @@ -100,16 +98,15 @@ void loop() {

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

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

delete client;
}

Serial.println("Wait 10s before the next round...");
delay(10000);
}
73 changes: 50 additions & 23 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,8 +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)
{
_canReuse = false;
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 @@ -214,8 +229,11 @@ bool HTTPClient::begin(String url, String httpsFingerprint)

bool HTTPClient::begin(String url, const uint8_t httpsFingerprint[20])
{
_canReuse = false;
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 @@ -237,8 +255,11 @@ bool HTTPClient::begin(String url, const uint8_t httpsFingerprint[20])
*/
bool HTTPClient::begin(String url)
{
_canReuse = false;
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 @@ -299,8 +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)
{
_canReuse = false;
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 @@ -325,8 +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)
{
_canReuse = false;
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 @@ -343,8 +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])
{
_canReuse = false;
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 @@ -367,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 @@ -379,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