1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

Fix regression in WiFiClientSecure, update HTTPS test case (#2150)

This commit is contained in:
Ivan Grokhotkov 2016-06-15 11:49:51 +08:00
parent da17d5425a
commit e64e32b329
3 changed files with 35 additions and 25 deletions

View File

@ -57,7 +57,6 @@ static int s_pk_refcnt = 0;
uint8_t* default_certificate = 0; uint8_t* default_certificate = 0;
uint32_t default_certificate_len = 0; uint32_t default_certificate_len = 0;
static bool default_certificate_dynamic = false; static bool default_certificate_dynamic = false;
static ClientContext* s_io_ctx = nullptr;
static void clear_private_key(); static void clear_private_key();
static void clear_certificate(); static void clear_certificate();
@ -82,6 +81,8 @@ public:
if (_ssl_ctx_refcnt == 0) { if (_ssl_ctx_refcnt == 0) {
ssl_ctx_free(_ssl_ctx); ssl_ctx_free(_ssl_ctx);
} }
s_io_ctx = nullptr;
} }
void ref() { void ref() {
@ -95,6 +96,7 @@ public:
} }
void connect(ClientContext* ctx, const char* hostName, uint32_t timeout_ms) { void connect(ClientContext* ctx, const char* hostName, uint32_t timeout_ms) {
s_io_ctx = ctx;
_ssl = ssl_client_new(_ssl_ctx, 0, nullptr, 0, hostName); _ssl = ssl_client_new(_ssl_ctx, 0, nullptr, 0, hostName);
uint32_t t = millis(); uint32_t t = millis();
@ -107,6 +109,10 @@ public:
} }
} }
void stop() {
s_io_ctx = nullptr;
}
bool connected() { bool connected() {
return _ssl != nullptr && ssl_handshake_status(_ssl) == SSL_OK; return _ssl != nullptr && ssl_handshake_status(_ssl) == SSL_OK;
} }
@ -173,6 +179,10 @@ public:
return _ssl; return _ssl;
} }
static ClientContext* getIOContext(int fd) {
return s_io_ctx;
}
protected: protected:
int _readAll() { int _readAll() {
if (!_ssl) if (!_ssl)
@ -201,18 +211,18 @@ protected:
int _refcnt = 0; int _refcnt = 0;
const uint8_t* _read_ptr = nullptr; const uint8_t* _read_ptr = nullptr;
size_t _available = 0; size_t _available = 0;
static ClientContext* s_io_ctx;
}; };
SSL_CTX* SSLContext::_ssl_ctx = nullptr; SSL_CTX* SSLContext::_ssl_ctx = nullptr;
int SSLContext::_ssl_ctx_refcnt = 0; int SSLContext::_ssl_ctx_refcnt = 0;
ClientContext* SSLContext::s_io_ctx = nullptr;
WiFiClientSecure::WiFiClientSecure() { WiFiClientSecure::WiFiClientSecure() {
++s_pk_refcnt; ++s_pk_refcnt;
} }
WiFiClientSecure::~WiFiClientSecure() { WiFiClientSecure::~WiFiClientSecure() {
s_io_ctx = nullptr;
if (_ssl) { if (_ssl) {
_ssl->unref(); _ssl->unref();
} }
@ -264,8 +274,6 @@ int WiFiClientSecure::_connectSSL(const char* hostName) {
_ssl = nullptr; _ssl = nullptr;
} }
s_io_ctx = _client;
_ssl = new SSLContext; _ssl = new SSLContext;
_ssl->ref(); _ssl->ref();
_ssl->connect(_client, hostName, 5000); _ssl->connect(_client, hostName, 5000);
@ -371,7 +379,9 @@ uint8_t WiFiClientSecure::connected() {
} }
void WiFiClientSecure::stop() { void WiFiClientSecure::stop() {
s_io_ctx = nullptr; if (_ssl) {
_ssl->stop();
}
WiFiClient::stop(); WiFiClient::stop();
} }
@ -525,7 +535,7 @@ static void clear_certificate() {
} }
extern "C" int ax_port_read(int fd, uint8_t* buffer, size_t count) { extern "C" int ax_port_read(int fd, uint8_t* buffer, size_t count) {
ClientContext* _client = s_io_ctx; ClientContext* _client = SSLContext::getIOContext(fd);
if (!_client || _client->state() != ESTABLISHED && !_client->getSize()) { if (!_client || _client->state() != ESTABLISHED && !_client->getSize()) {
errno = EIO; errno = EIO;
return -1; return -1;
@ -542,7 +552,7 @@ extern "C" int ax_port_read(int fd, uint8_t* buffer, size_t count) {
} }
extern "C" int ax_port_write(int fd, uint8_t* buffer, size_t count) { extern "C" int ax_port_write(int fd, uint8_t* buffer, size_t count) {
ClientContext* _client = s_io_ctx; ClientContext* _client = SSLContext::getIOContext(fd);
if (!_client || _client->state() != ESTABLISHED) { if (!_client || _client->state() != ESTABLISHED) {
errno = EIO; errno = EIO;
return -1; return -1;

View File

@ -1,18 +1,18 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIICzzCCAbcCCQCUajf39FoF8jANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtj MIIC3zCCAccCCQCUajf39FoF9jANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtj
YS50bHMudGVzdDAeFw0xNjA0MjIxMTU1MTlaFw0xNzA0MjIxMTU1MTlaMD0xITAf YS50bHMudGVzdDAeFw0xNjA2MTUwMjQ2MzFaFw0xNzA2MTUwMjQ2MzFaME0xCzAJ
BgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEYMBYGA1UEAwwPc2VydmVy BgNVBAYTAkNOMREwDwYDVQQIDAhTaGFuZ2hhaTESMBAGA1UECgwJRXNwcmVzc2lm
LnRscy50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwhyGSO13 MRcwFQYDVQQDDA4xOTIuMTY4Ljc3LjIwODCCASIwDQYJKoZIhvcNAQEBBQADggEP
/ozG0rL6FxDaaxYgMyPVK3hIhTHfKOK/eRZFRDFAhYudz9NbkvUMIF1SToED9FBh ADCCAQoCggEBAMIchkjtd/6MxtKy+hcQ2msWIDMj1St4SIUx3yjiv3kWRUQxQIWL
MbJrkPzCU3cLC1zgnTLseoOS3FKC8xVfJVwsWD8YjMvyQUV/Uo9TAHQSA4SfOB4W nc/TW5L1DCBdUk6BA/RQYTGya5D8wlN3Cwtc4J0y7HqDktxSgvMVXyVcLFg/GIzL
JjRBMX2GCoWLK5wVzxX+XGd5DnqME4n/CG+Il1t8mB+ACeA1FKwVPTi1wGvDzuCo 8kFFf1KPUwB0EgOEnzgeFiY0QTF9hgqFiyucFc8V/lxneQ56jBOJ/whviJdbfJgf
swSEX3J08JB9rP5dix7t+Fezgr6PkvUcnAcu4utAw6f6c0LoHk0SnyXJg1jTdKrl gAngNRSsFT04tcBrw87gqLMEhF9ydPCQfaz+XYse7fhXs4K+j5L1HJwHLuLrQMOn
J8dIyWQR0cvaxbF+04hvpDepx/62CP+aRs1zcC37eEQ3BVf4phJXbwuXbT7a1CUf +nNC6B5NEp8lyYNY03Sq5SfHSMlkEdHL2sWxftOIb6Q3qcf+tgj/mkbNc3At+3hE
XQ0cWnJg8mdfcQIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQBV7ZiwVM8alxPN9vd/ NwVX+KYSV28Ll20+2tQlH10NHFpyYPJnX3ECAwEAATANBgkqhkiG9w0BAQsFAAOC
Ze8EiidSuztkbtZX3mhHfkcJ2Q5c+tZ0Oxy4/g6oISe1+NOQJDMrsARrdWVPmmsb AQEAMzNNwXnhp1OyNinGk700jRfe6zwdkpo1ZkclUD7fVEfnWxBj6j2lXReC6WT1
ihSHNdS6t0DTcWR5h+i/rnGh+cGiWOJKfhNWvpCVuU6YRZWhYOztL8p6iHoG3ZBi isWXe/M9k+HS0fK7rTqDumeZYgp/Ui5LKgD2JTvLX91toG7apATWqLM1XPtLEGub
+zo9GD71FNSRQxMois9sR9q/IgOmkm8CjQgYsv9bQ+Le4mRqfaOCOSoQvsRyLoam webPO2CW/7aRfkPlXvP4Ss/QbqawxkmUKW3kJ4Lw1mmklu9ULGfiHPPUKvY5Qbe9
lNl85gzvVygHYPP9ypiia8btyOHwDSHiV8UhKaERSGKFqznPmTTwTQNXEtQylCXG 9aDC/aTrjiaDmNoToZfAWuFBnxz95bKqFdbij35ZYzyVSNpezePtdOaDBR2mOMYd
C+13mMGVr49yP4cuYaM8mfL8Rg7Im8Mfa0GXq5PBwEFFYpR9xnbBouQv5erYTQdl P54ENzFbOjVRm3K+7I9S+xa/lUPWnfjVJ026JDw/3/HVWvnwkZI8xNWVOk5CbdPH
Oxqk 7d5Md13cmF1VQ0VNDqvqI3TZ5g==
-----END CERTIFICATE----- -----END CERTIFICATE-----

View File

@ -19,7 +19,7 @@ void setup()
BS_RUN(Serial); BS_RUN(Serial);
} }
const char* fp = "40 A3 6C E3 8A DF A2 D4 13 B0 32 5C 87 44 54 28 0B CE C5 A4"; const char* fp = "44 40 9E 34 92 2D E4 61 A4 89 A8 D5 7F 71 B7 62 B3 FD DD E1";
TEST_CASE("HTTP GET & POST requests", "[HTTPClient]") TEST_CASE("HTTP GET & POST requests", "[HTTPClient]")
{ {