-
Notifications
You must be signed in to change notification settings - Fork 13.3k
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
Feature/http client wi fi client parameter #4979
Changes from 4 commits
ff2858a
f9ae2c4
d0d7466
96636f2
5aff343
d4db72d
2807373
815fb0f
2047402
5ff9728
11ea32a
cfd977c
dc20696
29e7754
fba638c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,6 +12,8 @@ | |
|
||
#include <ESP8266HTTPClient.h> | ||
|
||
#include <WiFiClient.h> | ||
|
||
#define USE_SERIAL Serial | ||
|
||
ESP8266WiFiMulti WiFiMulti; | ||
|
@@ -40,34 +42,39 @@ void loop() { | |
// wait for WiFi connection | ||
if ((WiFiMulti.run() == WL_CONNECTED)) { | ||
|
||
WiFiClient client; | ||
|
||
HTTPClient http; | ||
|
||
USE_SERIAL.print("[HTTP] begin...\n"); | ||
// configure traged server and url | ||
//http.begin("https://192.168.1.12/test.html", "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38"); //HTTPS | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. let's remove the comment, maybe it's better to add "BasicHTTPSClient.ino" instead. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Removing comment and adding a BasicHTTPSClient.ino with fingerprint security check |
||
http.begin("http://192.168.1.12/test.html"); //HTTP | ||
if (http.begin(client, "http://jigsaw.w3.org/HTTP/connection.html")) { // HTTP | ||
|
||
|
||
USE_SERIAL.print("[HTTP] GET...\n"); | ||
// start connection and send HTTP header | ||
int httpCode = http.GET(); | ||
USE_SERIAL.print("[HTTP] GET...\n"); | ||
// start connection and send HTTP header | ||
int httpCode = http.GET(); | ||
|
||
// httpCode will be negative on error | ||
if (httpCode > 0) { | ||
// HTTP header has been send and Server response header has been handled | ||
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); | ||
// httpCode will be negative on error | ||
if (httpCode > 0) { | ||
// HTTP header has been send and Server response header has been handled | ||
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); | ||
|
||
// file found at server | ||
if (httpCode == HTTP_CODE_OK) { | ||
String payload = http.getString(); | ||
USE_SERIAL.println(payload); | ||
// file found at server | ||
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { | ||
String payload = http.getString(); | ||
USE_SERIAL.println(payload); | ||
} | ||
} else { | ||
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); | ||
} | ||
|
||
http.end(); | ||
} else { | ||
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); | ||
USE_SERIAL.printf("Unable to connect\n"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Minor thing, but suggest adding "[HTTP]" to this message to match formatting of other outputs in the example. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Adding [HTTP] in basicHttpClient.ino and [HTTPS] in the new basicHttpsClient.ino |
||
} | ||
|
||
http.end(); | ||
} | ||
|
||
delay(10000); | ||
} | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -45,8 +45,10 @@ void loop() { | |
// wait for WiFi connection | ||
if ((WiFiMulti.run() == WL_CONNECTED)) { | ||
|
||
http.begin("http://192.168.1.12/test.html"); | ||
//http.begin("192.168.1.12", 80, "/test.html"); | ||
WiFiClient client; | ||
|
||
http.begin(client, "http://192.168.1.12/test.html"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe move this to jigsaw as well? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Moving to jigsaw |
||
//http.begin(client, "192.168.1.12", 80, "/test.html"); | ||
|
||
int httpCode = http.GET(); | ||
if (httpCode > 0) { | ||
|
@@ -65,6 +67,3 @@ void loop() { | |
|
||
delay(1000); | ||
} | ||
|
||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
/** | ||
StreamHTTPClient.ino | ||
|
||
Created on: 24.05.2015 | ||
|
||
*/ | ||
|
||
#include <Arduino.h> | ||
|
||
#include <ESP8266WiFi.h> | ||
#include <ESP8266WiFiMulti.h> | ||
|
||
#include <ESP8266HTTPClient.h> | ||
|
||
#define USE_SERIAL Serial | ||
|
||
ESP8266WiFiMulti WiFiMulti; | ||
|
||
void setup() { | ||
|
||
USE_SERIAL.begin(115200); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am not sure that Serial1 is such a common use case to justify USE_SERIAL. I think using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. USE_SERIAL was already present in the examples of the current 1.1 version of the library. Replacing USE_SERIAL with Serial in all examples |
||
// USE_SERIAL.setDebugOutput(true); | ||
|
||
USE_SERIAL.println(); | ||
USE_SERIAL.println(); | ||
USE_SERIAL.println(); | ||
|
||
for (uint8_t t = 4; t > 0; t--) { | ||
USE_SERIAL.printf("[SETUP] WAIT %d...\n", t); | ||
USE_SERIAL.flush(); | ||
delay(1000); | ||
} | ||
|
||
WiFi.mode(WIFI_STA); | ||
WiFiMulti.addAP("SSID", "PASSWORD"); | ||
|
||
} | ||
|
||
void loop() { | ||
// wait for WiFi connection | ||
if ((WiFiMulti.run() == WL_CONNECTED)) { | ||
|
||
HTTPClient http; | ||
|
||
BearSSL::WiFiClientSecure client; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Reinforcing @igrr's comment below, the SSL client object is pretty big and using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @earlephilhower I tried to use new and delete, however I get a stack dump (zero pointer reference with a delete). Is it possible that BearSLL destructor is causing the problem? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you're getting that kind of crash, you've probably got a use-after-free problem in the code you changed. Without the source that is crashing, can't really get deeper than that. The constructor/destructor is pretty solid and been used with new/delete especially due to the size of the object involved. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @earlephilhower I am almost sure that the problem is in WiFiClientSecureBearSSL.cpp. This is the code that crashes: /**
*/ #include <Arduino.h> #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> ESP8266WiFiMulti WiFiMulti; void setup() { Serial.begin(115200); Serial.println(); for (uint8_t t = 4; t > 0; t--) { WiFi.mode(WIFI_STA); } void loop() {
// BearSSL::WiFiClientSecure client; // bool mfln = client.probeMaxFragmentLength("tls.mbed.org", 443, 1024);
// client.setFingerprint(fingerprint); // if (http.begin(client, "https://tls.mbed.org/")) {
// WiFiClient * stream = &client;
} delay(10000); I nailed the problem down to the destructor ~HTTPClient() in ESP8266HTTPClient. This calls _client->stop(). |
||
|
||
bool mfln = client.probeMaxFragmentLength("tls.mbed.org", 443, 1024); | ||
USE_SERIAL.printf("\nConnecting to https://tls.mbed.org\n"); | ||
USE_SERIAL.printf("MFLN supported: %s\n", mfln ? "yes" : "no"); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. MFLN is not a commonly used acronym, suggest spelling out "Maximum fragment length negotiation". There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Replacing MFLN with "Maximum fragment length negotiation" |
||
if (mfln) { | ||
client.setBufferSizes(1024, 1024); | ||
} | ||
|
||
USE_SERIAL.print("[HTTP] begin...\n"); | ||
|
||
// 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, "jigsaw.w3.org", 443, "/HTTP/connection.html", true)) { | ||
if (http.begin(client, "https://tls.mbed.org/")) { | ||
|
||
USE_SERIAL.print("[HTTP] 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 | ||
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); | ||
|
||
// 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(); | ||
|
||
// create buffer for read | ||
uint8_t buff[128] = { 0 }; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Suggest moving this from stack to global static. I can see how a user might think "i need to make this a bit bigger" and get a stack overflow. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Changing into static uint8_t buff[128] |
||
|
||
// 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(); | ||
|
||
if (size) { | ||
// read up to 128 byte | ||
int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size)); | ||
|
||
// write it to Serial | ||
USE_SERIAL.write(buff, c); | ||
|
||
if (len > 0) { | ||
len -= c; | ||
} | ||
} | ||
delay(1); | ||
} | ||
|
||
USE_SERIAL.println(); | ||
USE_SERIAL.print("[HTTP] connection closed or file end.\n"); | ||
|
||
} | ||
} else { | ||
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); | ||
} | ||
|
||
http.end(); | ||
} else { | ||
USE_SERIAL.printf("Unable to connect\n"); | ||
} | ||
} | ||
|
||
delay(10000); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice test, moving it to a public web service!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
:)