mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-21 10:26:06 +03:00
Bugfix/esp8266 http client (#5250)
* Removed _client->stop() from destructor; some minor changes * Changed BasicHttpsClient.ino to allocate BearSSL::WiFiClientSecure object on the heap in stead of stack * Removed unnecessary code * Correcting bad fix for #5216 * Minor formatting to pass Travis tests * Changed client * to std::unique_ptr<> client * Updated example
This commit is contained in:
parent
6218c40740
commit
e954022b94
@ -41,7 +41,7 @@ void loop() {
|
|||||||
// wait for WiFi connection
|
// wait for WiFi connection
|
||||||
if ((WiFiMulti.run() == WL_CONNECTED)) {
|
if ((WiFiMulti.run() == WL_CONNECTED)) {
|
||||||
|
|
||||||
BearSSL::WiFiClientSecure *client = new BearSSL::WiFiClientSecure;
|
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
|
||||||
|
|
||||||
client->setFingerprint(fingerprint);
|
client->setFingerprint(fingerprint);
|
||||||
|
|
||||||
@ -50,7 +50,6 @@ void loop() {
|
|||||||
Serial.print("[HTTPS] begin...\n");
|
Serial.print("[HTTPS] begin...\n");
|
||||||
if (https.begin(*client, "https://jigsaw.w3.org/HTTP/connection.html")) { // HTTPS
|
if (https.begin(*client, "https://jigsaw.w3.org/HTTP/connection.html")) { // HTTPS
|
||||||
|
|
||||||
|
|
||||||
Serial.print("[HTTPS] GET...\n");
|
Serial.print("[HTTPS] GET...\n");
|
||||||
// start connection and send HTTP header
|
// start connection and send HTTP header
|
||||||
int httpCode = https.GET();
|
int httpCode = https.GET();
|
||||||
@ -73,9 +72,8 @@ void loop() {
|
|||||||
} else {
|
} else {
|
||||||
Serial.printf("[HTTPS] Unable to connect\n");
|
Serial.printf("[HTTPS] Unable to connect\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
delete client;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Serial.println("Wait 10s before next round...");
|
||||||
delay(10000);
|
delay(10000);
|
||||||
}
|
}
|
||||||
|
@ -38,9 +38,7 @@ void loop() {
|
|||||||
// wait for WiFi connection
|
// wait for WiFi connection
|
||||||
if ((WiFiMulti.run() == WL_CONNECTED)) {
|
if ((WiFiMulti.run() == WL_CONNECTED)) {
|
||||||
|
|
||||||
HTTPClient http;
|
std::unique_ptr<BearSSL::WiFiClientSecure> client(new BearSSL::WiFiClientSecure);
|
||||||
|
|
||||||
BearSSL::WiFiClientSecure *client = new BearSSL::WiFiClientSecure ;
|
|
||||||
|
|
||||||
bool mfln = client->probeMaxFragmentLength("tls.mbed.org", 443, 1024);
|
bool mfln = client->probeMaxFragmentLength("tls.mbed.org", 443, 1024);
|
||||||
Serial.printf("\nConnecting to https://tls.mbed.org\n");
|
Serial.printf("\nConnecting to https://tls.mbed.org\n");
|
||||||
@ -53,13 +51,16 @@ void loop() {
|
|||||||
|
|
||||||
// configure server and url
|
// 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};
|
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);
|
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");
|
Serial.print("[HTTPS] GET...\n");
|
||||||
// start connection and send HTTP header
|
// start connection and send HTTP header
|
||||||
int httpCode = http.GET();
|
int httpCode = https.GET();
|
||||||
if (httpCode > 0) {
|
if (httpCode > 0) {
|
||||||
// HTTP header has been send and Server response header has been handled
|
// HTTP header has been send and Server response header has been handled
|
||||||
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
|
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
|
||||||
@ -68,22 +69,19 @@ void loop() {
|
|||||||
if (httpCode == HTTP_CODE_OK) {
|
if (httpCode == HTTP_CODE_OK) {
|
||||||
|
|
||||||
// get lenght of document (is -1 when Server sends no Content-Length header)
|
// 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
|
// create buffer for read
|
||||||
static uint8_t buff[128] = { 0 };
|
static uint8_t buff[128] = { 0 };
|
||||||
|
|
||||||
// get tcp stream
|
|
||||||
WiFiClient * stream = client;
|
|
||||||
|
|
||||||
// read all data from server
|
// read all data from server
|
||||||
while (http.connected() && (len > 0 || len == -1)) {
|
while (https.connected() && (len > 0 || len == -1)) {
|
||||||
// get available data size
|
// get available data size
|
||||||
size_t size = stream->available();
|
size_t size = client->available();
|
||||||
|
|
||||||
if (size) {
|
if (size) {
|
||||||
// read up to 128 byte
|
// 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
|
// write it to Serial
|
||||||
Serial.write(buff, c);
|
Serial.write(buff, c);
|
||||||
@ -100,16 +98,15 @@ void loop() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} 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 {
|
} else {
|
||||||
Serial.printf("Unable to connect\n");
|
Serial.printf("Unable to connect\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
delete client;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Serial.println("Wait 10s before the next round...");
|
||||||
delay(10000);
|
delay(10000);
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ HTTPClient::HTTPClient()
|
|||||||
HTTPClient::~HTTPClient()
|
HTTPClient::~HTTPClient()
|
||||||
{
|
{
|
||||||
if(_client) {
|
if(_client) {
|
||||||
DEBUG_HTTPCLIENT("[HTTP-Client][~HTTPClient] end() not called before destruction of HTTPClient\n");
|
_client->stop();
|
||||||
}
|
}
|
||||||
if(_currentHeaders) {
|
if(_currentHeaders) {
|
||||||
delete[] _currentHeaders;
|
delete[] _currentHeaders;
|
||||||
@ -147,7 +147,13 @@ void HTTPClient::clear()
|
|||||||
* @return success bool
|
* @return success bool
|
||||||
*/
|
*/
|
||||||
bool HTTPClient::begin(WiFiClient &client, String url) {
|
bool HTTPClient::begin(WiFiClient &client, String url) {
|
||||||
|
#ifdef HTTPCLIENT_1_1_COMPATIBLE
|
||||||
|
if(_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
_client = &client;
|
_client = &client;
|
||||||
|
|
||||||
@ -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)
|
bool HTTPClient::begin(WiFiClient &client, String host, uint16_t port, String uri, bool https)
|
||||||
{
|
{
|
||||||
|
#ifdef HTTPCLIENT_1_1_COMPATIBLE
|
||||||
|
if(_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
_client = &client;
|
_client = &client;
|
||||||
|
|
||||||
@ -196,8 +208,11 @@ bool HTTPClient::begin(WiFiClient &client, String host, uint16_t port, String ur
|
|||||||
#ifdef HTTPCLIENT_1_1_COMPATIBLE
|
#ifdef HTTPCLIENT_1_1_COMPATIBLE
|
||||||
bool HTTPClient::begin(String url, String httpsFingerprint)
|
bool HTTPClient::begin(String url, String httpsFingerprint)
|
||||||
{
|
{
|
||||||
|
if(_client && !_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
_canReuse = false;
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
|
||||||
_port = 443;
|
_port = 443;
|
||||||
if (httpsFingerprint.length() == 0) {
|
if (httpsFingerprint.length() == 0) {
|
||||||
@ -214,8 +229,11 @@ bool HTTPClient::begin(String url, String httpsFingerprint)
|
|||||||
|
|
||||||
bool HTTPClient::begin(String url, const uint8_t httpsFingerprint[20])
|
bool HTTPClient::begin(String url, const uint8_t httpsFingerprint[20])
|
||||||
{
|
{
|
||||||
|
if(_client && !_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
_canReuse = false;
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
|
||||||
_port = 443;
|
_port = 443;
|
||||||
if (!beginInternal(url, "https")) {
|
if (!beginInternal(url, "https")) {
|
||||||
@ -237,8 +255,11 @@ bool HTTPClient::begin(String url, const uint8_t httpsFingerprint[20])
|
|||||||
*/
|
*/
|
||||||
bool HTTPClient::begin(String url)
|
bool HTTPClient::begin(String url)
|
||||||
{
|
{
|
||||||
|
if(_client && !_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
_canReuse = false;
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
|
||||||
_port = 80;
|
_port = 80;
|
||||||
if (!beginInternal(url, "http")) {
|
if (!beginInternal(url, "http")) {
|
||||||
@ -299,8 +320,11 @@ bool HTTPClient::beginInternal(String url, const char* expectedProtocol)
|
|||||||
#ifdef HTTPCLIENT_1_1_COMPATIBLE
|
#ifdef HTTPCLIENT_1_1_COMPATIBLE
|
||||||
bool HTTPClient::begin(String host, uint16_t port, String uri)
|
bool HTTPClient::begin(String host, uint16_t port, String uri)
|
||||||
{
|
{
|
||||||
|
if(_client && !_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
_canReuse = false;
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
_host = host;
|
_host = host;
|
||||||
@ -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)
|
bool HTTPClient::begin(String host, uint16_t port, String uri, String httpsFingerprint)
|
||||||
{
|
{
|
||||||
|
if(_client && !_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
_canReuse = false;
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
_host = host;
|
_host = host;
|
||||||
@ -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])
|
bool HTTPClient::begin(String host, uint16_t port, String uri, const uint8_t httpsFingerprint[20])
|
||||||
{
|
{
|
||||||
|
if(_client && !_tcpDeprecated) {
|
||||||
|
DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n");
|
||||||
_canReuse = false;
|
_canReuse = false;
|
||||||
end();
|
end();
|
||||||
|
}
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
_host = host;
|
_host = host;
|
||||||
@ -367,7 +397,6 @@ bool HTTPClient::begin(String host, uint16_t port, String uri, const uint8_t htt
|
|||||||
*/
|
*/
|
||||||
void HTTPClient::end(void)
|
void HTTPClient::end(void)
|
||||||
{
|
{
|
||||||
_canReuse = false;
|
|
||||||
disconnect();
|
disconnect();
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
@ -379,7 +408,6 @@ void HTTPClient::end(void)
|
|||||||
void HTTPClient::disconnect()
|
void HTTPClient::disconnect()
|
||||||
{
|
{
|
||||||
if(connected()) {
|
if(connected()) {
|
||||||
if(_client) {
|
|
||||||
if(_client->available() > 0) {
|
if(_client->available() > 0) {
|
||||||
DEBUG_HTTPCLIENT("[HTTP-Client][end] still data in buffer (%d), clean up.\n", _client->available());
|
DEBUG_HTTPCLIENT("[HTTP-Client][end] still data in buffer (%d), clean up.\n", _client->available());
|
||||||
while(_client->available() > 0) {
|
while(_client->available() > 0) {
|
||||||
@ -387,7 +415,6 @@ void HTTPClient::disconnect()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
if(_reuse && _canReuse) {
|
if(_reuse && _canReuse) {
|
||||||
DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp keep open for reuse\n");
|
DEBUG_HTTPCLIENT("[HTTP-Client][end] tcp keep open for reuse\n");
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user