diff --git a/libraries/WiFiS3/src/WiFiClient.cpp b/libraries/WiFiS3/src/WiFiClient.cpp index adb020053..143f92dae 100644 --- a/libraries/WiFiS3/src/WiFiClient.cpp +++ b/libraries/WiFiS3/src/WiFiClient.cpp @@ -3,11 +3,11 @@ using namespace std; /* -------------------------------------------------------------------------- */ -WiFiClient::WiFiClient() : _sock(-1), destroy_at_distructor(true), rx_buffer(nullptr) { +WiFiClient::WiFiClient() : _sock(-1), destroy_at_distructor(true), rx_buffer(nullptr) { rx_buffer = std::shared_ptr>(new FifoBuffer()); } /* -------------------------------------------------------------------------- */ - + /* -------------------------------------------------------------------------- */ WiFiClient::WiFiClient(int s) : _sock(s), destroy_at_distructor(false), rx_buffer(nullptr) { rx_buffer = std::shared_ptr>(new FifoBuffer()); @@ -18,9 +18,9 @@ WiFiClient::WiFiClient(int s) : _sock(s), destroy_at_distructor(false), rx_buffe WiFiClient::~WiFiClient() { } /* -------------------------------------------------------------------------- */ -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ WiFiClient::WiFiClient(const WiFiClient& c) { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ _sock = c._sock; rx_buffer = c.rx_buffer; } @@ -28,13 +28,19 @@ WiFiClient::WiFiClient(const WiFiClient& c) { /* -------------------------------------------------------------------------- */ void WiFiClient::getSocket() { /* -------------------------------------------------------------------------- */ + if(_sock >= 0 && !connected()) { + // if sock >= 0 -> it means we were connected, but something happened and we need + // to reset this socket in order to be able to connect again + stop(); + } + if(_sock == -1) { string res = ""; modem.begin(); if(modem.write(string(PROMPT(_BEGINCLIENT)),res, "%s" , CMD(_BEGINCLIENT))) { _sock = atoi(res.c_str()); } - } + } } /* -------------------------------------------------------------------------- */ @@ -45,7 +51,7 @@ int WiFiClient::connect(IPAddress ip, uint16_t port){ /* -------------------------------------------------------------------------- */ int WiFiClient::connect(const char *host, uint16_t port){ -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ getSocket(); if(_sock >= 0) { string res = ""; @@ -55,17 +61,18 @@ int WiFiClient::connect(const char *host, uint16_t port){ return 1; } } else { - if(modem.write(string(PROMPT(_CLIENTCONNECTNAME)),res, "%s%d,%s,%d\r\n" , CMD_WRITE(_CLIENTCONNECTNAME), _sock, host,port)) { - return 1; - } + if(modem.write(string(PROMPT(_CLIENTCONNECTNAME)),res, "%s%d,%s,%d\r\n" , CMD_WRITE(_CLIENTCONNECTNAME), _sock, host,port)) { + return 1; + } } } + return 0; } /* -------------------------------------------------------------------------- */ size_t WiFiClient::write(uint8_t b){ -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ return write(&b, 1); } @@ -79,7 +86,6 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size){ if(modem.passthrough(buf,size)) { return size; } - } return 0; @@ -87,7 +93,7 @@ size_t WiFiClient::write(const uint8_t *buf, size_t size){ /* -------------------------------------------------------------------------- */ int WiFiClient::available() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ int rv = 0; if(_sock >= 0 && rx_buffer != nullptr) { if(rx_buffer->available() > 0) { @@ -109,17 +115,17 @@ int WiFiClient::available() { /* -------------------------------------------------------------------------- */ int WiFiClient::_read() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ int rv = -1; if(_sock >= 0 && rx_buffer != nullptr) { string res = ""; uint32_t size = rx_buffer->freePositions() - 1; modem.begin(); - + /* important - it works one shot */ modem.avoid_trim_results(); modem.read_using_size(); - + if(modem.write(string(PROMPT(_CLIENTRECEIVE)),res, "%s%d,%d\r\n" , CMD_WRITE(_CLIENTRECEIVE), _sock, size)) { if(res.size() > 0) { for(int i = 0, rv = 0; i < size && i < res.size(); i++) { @@ -133,11 +139,11 @@ int WiFiClient::_read() { } } return rv; -} +} /* -------------------------------------------------------------------------- */ void WiFiClient::read_if_needed(size_t s) { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ if(rx_buffer != nullptr) { if((size_t)rx_buffer->available() < s) { _read(); @@ -147,12 +153,12 @@ void WiFiClient::read_if_needed(size_t s) { /* -------------------------------------------------------------------------- */ int WiFiClient::read() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ uint8_t b; if(read(&b, 1) == 1) { return b; } - return -1; + return -1; } /* -------------------------------------------------------------------------- */ @@ -173,19 +179,19 @@ int WiFiClient::read(uint8_t *buf, size_t size) { } } } - return rv; + return rv; } /* -------------------------------------------------------------------------- */ int WiFiClient::peek() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ int rv = -1; if(_sock >= 0) { string res = ""; modem.begin(); if(modem.write(string(PROMPT(_PEEK)),res, "%s%d\r\n" , CMD_WRITE(_PEEK), _sock)) { rv = atoi(res.c_str()); - } + } } return rv; } @@ -193,7 +199,7 @@ int WiFiClient::peek() { /* -------------------------------------------------------------------------- */ void WiFiClient::flush() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ if(_sock >= 0) { string res = ""; modem.begin(); @@ -203,18 +209,20 @@ void WiFiClient::flush() { /* -------------------------------------------------------------------------- */ void WiFiClient::stop() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ if(_sock >= 0) { string res = ""; modem.begin(); modem.write(string(PROMPT(_CLIENTCLOSE)),res, "%s%d\r\n" , CMD_WRITE(_CLIENTCLOSE), _sock); _sock = -1; } + + rx_buffer->clear(); } /* -------------------------------------------------------------------------- */ uint8_t WiFiClient::connected() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ uint8_t rv = 0; if(this->available() > 0) { return 1; @@ -224,16 +232,16 @@ uint8_t WiFiClient::connected() { modem.begin(); if(modem.write(string(PROMPT(_CLIENTCONNECTED)),res, "%s%d\r\n" , CMD_WRITE(_CLIENTCONNECTED), _sock)) { rv = atoi(res.c_str()); - } + } } + return rv; } /* -------------------------------------------------------------------------- */ -bool WiFiClient::operator==(const WiFiClient& whs) -{ - /* -------------------------------------------------------------------------- */ - return _sock == whs._sock; +bool WiFiClient::operator==(const WiFiClient& whs) { +/* -------------------------------------------------------------------------- */ + return _sock == whs._sock; } /* -------------------------------------------------------------------------- */ @@ -246,14 +254,14 @@ IPAddress WiFiClient::remoteIP() { if(modem.write(string(PROMPT(_REMOTEIP)),res, "%s%d\r\n" , CMD_WRITE(_REMOTEIP), _sock)) { ip.fromString(res.c_str()); return ip; - } + } } return IPAddress(0,0,0,0); } /* -------------------------------------------------------------------------- */ uint16_t WiFiClient::remotePort(){ -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ uint16_t rv = 0; if(_sock >= 0) { string res = ""; @@ -261,7 +269,7 @@ uint16_t WiFiClient::remotePort(){ if(modem.write(string(PROMPT(_REMOTEPORT)),res, "%s%d\r\n" , CMD_WRITE(_REMOTEPORT), _sock)) { rv = atoi(res.c_str()); return rv; - } + } } - return rv; + return rv; } diff --git a/libraries/WiFiS3/src/WiFiClient.h b/libraries/WiFiS3/src/WiFiClient.h index 972b98b8a..54d86ad39 100644 --- a/libraries/WiFiS3/src/WiFiClient.h +++ b/libraries/WiFiS3/src/WiFiClient.h @@ -67,7 +67,7 @@ class WiFiClient : public Client { } friend class WiFiServer; - + using Print::write; protected: @@ -77,7 +77,6 @@ class WiFiClient : public Client { std::shared_ptr> rx_buffer; int _read(); void read_if_needed(size_t s); - void clear_buffer(); bool destroy_at_distructor; diff --git a/libraries/WiFiS3/src/WiFiSSLClient.cpp b/libraries/WiFiS3/src/WiFiSSLClient.cpp index f67c30896..91b6951e5 100644 --- a/libraries/WiFiS3/src/WiFiSSLClient.cpp +++ b/libraries/WiFiS3/src/WiFiSSLClient.cpp @@ -3,9 +3,8 @@ using namespace std; /* -------------------------------------------------------------------------- */ -WiFiSSLClient::WiFiSSLClient() : _sock(-1) { +WiFiSSLClient::WiFiSSLClient() { /* -------------------------------------------------------------------------- */ - rx_buffer = std::shared_ptr>(new FifoBuffer()); } /* -------------------------------------------------------------------------- */ @@ -17,13 +16,19 @@ WiFiSSLClient::~WiFiSSLClient() { /* -------------------------------------------------------------------------- */ void WiFiSSLClient::getSocket() { /* -------------------------------------------------------------------------- */ + if(_sock >= 0 && !connected()) { + // if sock >= 0 -> it means we were connected, but something happened and we need + // to reset this socket in order to be able to connect again + stop(); + } + if(_sock == -1) { string res = ""; modem.begin(); if(modem.write(string(PROMPT(_SSLBEGINCLIENT)),res, "%s" , CMD(_SSLBEGINCLIENT))) { _sock = atoi(res.c_str()); } - } + } } /* -------------------------------------------------------------------------- */ @@ -87,7 +92,7 @@ void WiFiSSLClient::setEccSlot(int ecc508KeySlot, const byte cert[], int certLen /* -------------------------------------------------------------------------- */ size_t WiFiSSLClient::write(uint8_t b){ -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ return write(&b, 1); } @@ -101,7 +106,7 @@ size_t WiFiSSLClient::write(const uint8_t *buf, size_t size){ if(modem.passthrough(buf,size)) { return size; } - + } return 0; @@ -109,7 +114,7 @@ size_t WiFiSSLClient::write(const uint8_t *buf, size_t size){ /* -------------------------------------------------------------------------- */ int WiFiSSLClient::available(){ -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ int rv = 0; if(_sock >= 0 && rx_buffer != nullptr) { if(rx_buffer->available() > 0) { @@ -123,7 +128,7 @@ int WiFiSSLClient::available(){ if (rv < 0) { return 0; } - } + } } } return rv; @@ -131,13 +136,13 @@ int WiFiSSLClient::available(){ /* -------------------------------------------------------------------------- */ int WiFiSSLClient::_read() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ int rv = -1; - if(_sock >= 0) { + if(_sock >= 0 && rx_buffer != nullptr) { string res = ""; uint32_t size = rx_buffer->freePositions() - 1; modem.begin(); - + /* important - it works one shot */ modem.avoid_trim_results(); modem.read_using_size(); @@ -154,11 +159,11 @@ int WiFiSSLClient::_read() { } } return rv; -} +} /* -------------------------------------------------------------------------- */ void WiFiSSLClient::read_if_needed(size_t s) { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ if((size_t)rx_buffer->available() < s) { _read(); } @@ -166,12 +171,12 @@ void WiFiSSLClient::read_if_needed(size_t s) { /* -------------------------------------------------------------------------- */ int WiFiSSLClient::read() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ uint8_t b; if(read(&b, 1) == 1) { return b; } - return -1; + return -1; } /* -------------------------------------------------------------------------- */ @@ -190,19 +195,19 @@ int WiFiSSLClient::read(uint8_t *buf, size_t size) { go_on = false; } } - return rv; + return rv; } /* -------------------------------------------------------------------------- */ int WiFiSSLClient::peek() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ int rv = -1; if(_sock >= 0) { string res = ""; modem.begin(); if(modem.write(string(PROMPT(_SSLPEEK)),res, "%s%d\r\n" , CMD_WRITE(_SSLPEEK), _sock)) { rv = atoi(res.c_str()); - } + } } return rv; } @@ -210,7 +215,7 @@ int WiFiSSLClient::peek() { /* -------------------------------------------------------------------------- */ void WiFiSSLClient::flush() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ if(_sock >= 0) { string res = ""; modem.begin(); @@ -220,31 +225,33 @@ void WiFiSSLClient::flush() { /* -------------------------------------------------------------------------- */ void WiFiSSLClient::stop() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ if(_sock >= 0) { string res = ""; modem.begin(); modem.write(string(PROMPT(_SSLCLIENTCLOSE)),res, "%s%d\r\n" , CMD_WRITE(_SSLCLIENTCLOSE), _sock); _sock = -1; } + + rx_buffer->clear(); } /* -------------------------------------------------------------------------- */ uint8_t WiFiSSLClient::connected() { -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ uint8_t rv = 0; if(_sock >= 0) { string res = ""; modem.begin(); if(modem.write(string(PROMPT(_SSLCLIENTCONNECTED)),res, "%s%d\r\n" , CMD_WRITE(_SSLCLIENTCONNECTED), _sock)) { rv = atoi(res.c_str()); - } + } } return rv; } -bool WiFiSSLClient::operator==(const WiFiSSLClient& whs) -{ - return _sock == whs._sock; + +bool WiFiSSLClient::operator==(const WiFiSSLClient& whs) { + return _sock == whs._sock; } /* -------------------------------------------------------------------------- */ @@ -257,14 +264,14 @@ IPAddress WiFiSSLClient::remoteIP() { if(modem.write(string(PROMPT(_SSLREMOTEIP)),res, "%s%d\r\n" , CMD_WRITE(_SSLREMOTEIP), _sock)) { ip.fromString(res.c_str()); return ip; - } + } } return IPAddress(0,0,0,0); } /* -------------------------------------------------------------------------- */ uint16_t WiFiSSLClient::remotePort(){ -/* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ uint16_t rv = 0; if(_sock >= 0) { string res = ""; @@ -272,7 +279,7 @@ uint16_t WiFiSSLClient::remotePort(){ if(modem.write(string(PROMPT(_SSLREMOTEPORT)),res, "%s%d\r\n" , CMD_WRITE(_SSLREMOTEPORT), _sock)) { rv = atoi(res.c_str()); return rv; - } + } } - return rv; + return rv; } \ No newline at end of file diff --git a/libraries/WiFiS3/src/WiFiSSLClient.h b/libraries/WiFiS3/src/WiFiSSLClient.h index c021a0a16..6bdbf9687 100644 --- a/libraries/WiFiS3/src/WiFiSSLClient.h +++ b/libraries/WiFiS3/src/WiFiSSLClient.h @@ -45,7 +45,7 @@ class WiFiSSLClient : public WiFiClient { virtual void stop(); virtual uint8_t connected(); virtual operator bool() { - return _sock != -1; + return _sock != -1; } virtual bool operator==(const WiFiSSLClient&); virtual bool operator!=(const WiFiSSLClient& whs) @@ -60,7 +60,6 @@ class WiFiSSLClient : public WiFiClient { using Print::write; private: - int _sock; void getSocket(); int _read(); void read_if_needed(size_t s);