diff --git a/README.md b/README.md index c8cbb5217..91af606c5 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Arduino core for ESP8266 WiFi chip # Quick links -- [Latest release documentation](https://arduino-esp8266.readthedocs.io/en/2.7.2/) +- [Latest release documentation](https://arduino-esp8266.readthedocs.io/en/2.7.4_a/) - [Current "git version" documentation](https://arduino-esp8266.readthedocs.io/en/latest/) - [Install git version](https://arduino-esp8266.readthedocs.io/en/latest/installing.html#using-git-version) ([sources](doc/installing.rst#using-git-version)) @@ -36,7 +36,7 @@ Starting with 1.6.4, Arduino allows installation of third-party platform package #### Latest release [![Latest release](https://img.shields.io/github/release/esp8266/Arduino.svg)](https://github.com/esp8266/Arduino/releases/latest/) Boards manager link: `https://arduino.esp8266.com/stable/package_esp8266com_index.json` -Documentation: [https://arduino-esp8266.readthedocs.io/en/2.7.2/](https://arduino-esp8266.readthedocs.io/en/2.7.2/) +Documentation: [https://arduino-esp8266.readthedocs.io/en/2.7.4_a/](https://arduino-esp8266.readthedocs.io/en/2.7.4_a/) ### Using git version [![Linux build status](https://travis-ci.org/esp8266/Arduino.svg)](https://travis-ci.org/esp8266/Arduino) diff --git a/cores/esp8266/Print.cpp b/cores/esp8266/Print.cpp index b0e2e31a1..186d6e1cb 100644 --- a/cores/esp8266/Print.cpp +++ b/cores/esp8266/Print.cpp @@ -146,35 +146,39 @@ size_t Print::print(unsigned int n, int base) { } size_t Print::print(long n, int base) { - if(base == 0) { - return write(n); - } else if(base == 10) { - if(n < 0) { - int t = print('-'); - n = -n; - return printNumber(n, 10) + t; - } - return printNumber(n, 10); - } else { - return printNumber(n, base); + int t = 0; + if (base == 10 && n < 0) { + t = print('-'); + n = -n; } + return printNumber(static_cast(n), base) + t; } size_t Print::print(unsigned long n, int base) { - if(base == 0) + if (base == 0) { return write(n); - else - return printNumber(n, base); + } + return printNumber(n, base); +} + +size_t Print::print(long long n, int base) { + int t = 0; + if (base == 10 && n < 0) { + t = print('-'); + n = -n; + } + return printNumber(static_cast(n), base) + t; +} + +size_t Print::print(unsigned long long n, int base) { + if (base == 0) { + return write(n); + } + return printNumber(n, base); } size_t Print::print(double n, int digits) { - return printFloat(n, digits); -} - -size_t Print::println(const __FlashStringHelper *ifsh) { - size_t n = print(ifsh); - n += println(); - return n; + return printNumber(n, digits); } size_t Print::print(const Printable& x) { @@ -185,89 +189,90 @@ size_t Print::println(void) { return print("\r\n"); } +size_t Print::println(const __FlashStringHelper* ifsh) { + return _println(ifsh); +} + size_t Print::println(const String &s) { - size_t n = print(s); - n += println(); - return n; + return _println(s); } size_t Print::println(const char c[]) { - size_t n = print(c); - n += println(); - return n; + return _println(c); } size_t Print::println(char c) { - size_t n = print(c); - n += println(); - return n; + return _println(c); } size_t Print::println(unsigned char b, int base) { - size_t n = print(b, base); - n += println(); - return n; + return _println(b, base); } size_t Print::println(int num, int base) { - size_t n = print(num, base); - n += println(); - return n; + return _println(num, base); } size_t Print::println(unsigned int num, int base) { - size_t n = print(num, base); - n += println(); - return n; + return _println(num, base); } size_t Print::println(long num, int base) { - size_t n = print(num, base); - n += println(); - return n; + return _println(num, base); } size_t Print::println(unsigned long num, int base) { - size_t n = print(num, base); - n += println(); - return n; + return _println(num, base); +} + +size_t Print::println(long long num, int base) { + return _println(num, base); +} + +size_t Print::println(unsigned long long num, int base) { + return _println(num, base); } size_t Print::println(double num, int digits) { - size_t n = print(num, digits); - n += println(); - return n; + return _println(num, digits); } size_t Print::println(const Printable& x) { - size_t n = print(x); - n += println(); - return n; + return _println(x); } // Private Methods ///////////////////////////////////////////////////////////// -size_t Print::printNumber(unsigned long n, uint8_t base) { - char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte. - char *str = &buf[sizeof(buf) - 1]; +template inline size_t Print::_println(T v, P... args) +{ + size_t n = print(v, args...); + n += println(); + return n; +}; + +template size_t Print::printNumber(T n, uint8_t base) { + char buf[8 * sizeof(n) + 1]; // Assumes 8-bit chars plus zero byte. + char* str = &buf[sizeof(buf) - 1]; *str = '\0'; // prevent crash if called with base == 1 - if(base < 2) + if (base < 2) { base = 10; + } do { - unsigned long m = n; + auto m = n; n /= base; char c = m - base * n; + *--str = c < 10 ? c + '0' : c + 'A' - 10; - } while(n); + } while (n); return write(str); } -size_t Print::printFloat(double number, uint8_t digits) { +template<> size_t Print::printNumber(double number, uint8_t digits) { char buf[40]; return write(dtostrf(number, 0, digits, buf)); } diff --git a/cores/esp8266/Print.h b/cores/esp8266/Print.h index e43883b39..e49332b31 100644 --- a/cores/esp8266/Print.h +++ b/cores/esp8266/Print.h @@ -36,9 +36,9 @@ class Print { private: int write_error; - size_t printNumber(unsigned long, uint8_t); - size_t printFloat(double, uint8_t); - protected: + template size_t printNumber(T n, uint8_t base); + template inline size_t _println(T v, P... args); +protected: void setWriteError(int err = 1) { write_error = err; } @@ -71,6 +71,8 @@ class Print { inline size_t write(unsigned int t) { return write((uint8_t)t); } inline size_t write(long t) { return write((uint8_t)t); } inline size_t write(unsigned long t) { return write((uint8_t)t); } + inline size_t write(long long t) { return write((uint8_t)t); } + inline size_t write(unsigned long long t) { return write((uint8_t)t); } // Enable write(char) to fall through to write(uint8_t) inline size_t write(char c) { return write((uint8_t) c); } inline size_t write(int8_t c) { return write((uint8_t) c); } @@ -86,6 +88,8 @@ class Print { size_t print(unsigned int, int = DEC); size_t print(long, int = DEC); size_t print(unsigned long, int = DEC); + size_t print(long long, int = DEC); + size_t print(unsigned long long, int = DEC); size_t print(double, int = 2); size_t print(const Printable&); @@ -98,6 +102,8 @@ class Print { size_t println(unsigned int, int = DEC); size_t println(long, int = DEC); size_t println(unsigned long, int = DEC); + size_t println(long long, int = DEC); + size_t println(unsigned long long, int = DEC); size_t println(double, int = 2); size_t println(const Printable&); size_t println(void); @@ -105,4 +111,6 @@ class Print { virtual void flush() { /* Empty implementation for backward compatibility */ } }; +template<> size_t Print::printNumber(double number, uint8_t digits); + #endif diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp index 580964da1..7ec3ab86f 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp @@ -28,62 +28,12 @@ #include #include -class TransportTraits -{ -public: - virtual ~TransportTraits() - { - } - - virtual std::unique_ptr create() - { - return std::unique_ptr(new WiFiClient()); - } - - virtual bool verify(WiFiClient& client, const char* host) - { - (void)client; - (void)host; - return true; - } -}; - - -class BearSSLTraits : public TransportTraits -{ -public: - BearSSLTraits(const uint8_t fingerprint[20]) - { - memcpy(_fingerprint, fingerprint, sizeof(_fingerprint)); - } - - std::unique_ptr create() override - { - BearSSL::WiFiClientSecure *client = new BearSSL::WiFiClientSecure(); - client->setFingerprint(_fingerprint); - return std::unique_ptr(client); - } - - bool verify(WiFiClient& client, const char* host) override - { - // No-op. BearSSL will not connect if the fingerprint doesn't match. - // So if you get to here you've already connected and it matched - (void) client; - (void) host; - return true; - } - -protected: - uint8_t _fingerprint[20]; -}; - /** * constructor */ HTTPClient::HTTPClient() : _client(nullptr), _userAgent(F("ESP8266HTTPClient")) { - _tcpDeprecated.reset(nullptr); } /** @@ -117,12 +67,6 @@ void HTTPClient::clear() * @return success bool */ bool HTTPClient::begin(WiFiClient &client, const String& url) { - if(_tcpDeprecated) { - DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n"); - _canReuse = false; - end(); - } - _client = &client; // check for : (http: or https:) @@ -154,12 +98,6 @@ bool HTTPClient::begin(WiFiClient &client, const String& url) { */ bool HTTPClient::begin(WiFiClient &client, const String& host, uint16_t port, const String& uri, bool https) { - if(_tcpDeprecated) { - DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n"); - _canReuse = false; - end(); - } - _client = &client; clear(); @@ -171,52 +109,6 @@ bool HTTPClient::begin(WiFiClient &client, const String& host, uint16_t port, co } -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; - end(); - } - - if (!beginInternal(url, "https")) { - return false; - } - _transportTraits = TransportTraitsPtr(new (std::nothrow) BearSSLTraits(httpsFingerprint)); - if(!_transportTraits) { - DEBUG_HTTPCLIENT("[HTTP-Client][begin] could not create transport traits\n"); - return false; - } - - DEBUG_HTTPCLIENT("[HTTP-Client][begin] BearSSL-httpsFingerprint:"); - for (size_t i=0; i < 20; i++) { - DEBUG_HTTPCLIENT(" %02x", httpsFingerprint[i]); - } - DEBUG_HTTPCLIENT("\n"); - return true; -} - - -/** - * parsing the url for all needed parameters - * @param url String - */ -bool HTTPClient::begin(String url) -{ - if(_client && !_tcpDeprecated) { - DEBUG_HTTPCLIENT("[HTTP-Client][begin] mix up of new and deprecated api\n"); - _canReuse = false; - end(); - } - - if (!beginInternal(url, "http")) { - return false; - } - _transportTraits = TransportTraitsPtr(new TransportTraits()); - return true; -} - - bool HTTPClient::beginInternal(const String& __url, const char* expectedProtocol) { String url(__url); @@ -278,47 +170,6 @@ bool HTTPClient::beginInternal(const String& __url, const char* expectedProtocol } -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; - end(); - } - - clear(); - _host = host; - _port = port; - _uri = uri; - _transportTraits = TransportTraitsPtr(new TransportTraits()); - DEBUG_HTTPCLIENT("[HTTP-Client][begin] host: %s port: %d uri: %s\n", host.c_str(), port, uri.c_str()); - return true; -} - - -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; - end(); - } - - clear(); - _host = host; - _port = port; - _uri = uri; - - _transportTraits = TransportTraitsPtr(new BearSSLTraits(httpsFingerprint)); - DEBUG_HTTPCLIENT("[HTTP-Client][begin] host: %s port: %d url: %s BearSSL-httpsFingerprint:", host.c_str(), port, uri.c_str()); - for (size_t i=0; i < 20; i++) { - DEBUG_HTTPCLIENT(" %02x", httpsFingerprint[i]); - } - DEBUG_HTTPCLIENT("\n"); - return true; -} - - /** * end * called after the payload is handled @@ -353,10 +204,6 @@ void HTTPClient::disconnect(bool preserveClient) _client = nullptr; } } - if(_tcpDeprecated) { - _transportTraits.reset(nullptr); - _tcpDeprecated.reset(nullptr); - } } } else { if (!preserveClient && _client) { // Also destroy _client if not connected() @@ -460,15 +307,6 @@ bool HTTPClient::setURL(const String& url) return beginInternal(url, nullptr); } -/** - * set true to follow redirects. - * @param follow - * @deprecated - */ -void HTTPClient::setFollowRedirects(bool follow) -{ - _followRedirects = follow ? HTTPC_STRICT_FOLLOW_REDIRECTS : HTTPC_DISABLE_FOLLOW_REDIRECTS; -} /** * set redirect follow mode. See `followRedirects_t` enum for avaliable modes. * @param follow @@ -1116,15 +954,6 @@ bool HTTPClient::connect(void) return true; } - if(!_client && _transportTraits) { - _tcpDeprecated = _transportTraits->create(); - if(!_tcpDeprecated) { - DEBUG_HTTPCLIENT("[HTTP-Client] connect: could not create tcp\n"); - return false; - } - _client = _tcpDeprecated.get(); - } - if(!_client) { DEBUG_HTTPCLIENT("[HTTP-Client] connect: HTTPClient::begin was not called or returned error\n"); return false; @@ -1139,12 +968,6 @@ bool HTTPClient::connect(void) DEBUG_HTTPCLIENT("[HTTP-Client] connected to %s:%u\n", _host.c_str(), _port); - if (_tcpDeprecated && !_transportTraits->verify(*_tcpDeprecated, _host.c_str())) { - DEBUG_HTTPCLIENT("[HTTP-Client] transport level verify failed\n"); - _client->stop(); - return false; - } - #ifdef ESP8266 _client->setNoDelay(true); #endif diff --git a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h index 5dd3df5fb..9699b92b5 100644 --- a/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h +++ b/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h @@ -163,14 +163,12 @@ public: bool begin(WiFiClient &client, const String& url); bool begin(WiFiClient &client, const String& host, uint16_t port, const String& uri = "/", bool https = false); - // Plain HTTP connection, unencrypted - bool begin(String url) __attribute__ ((deprecated)); - bool begin(String host, uint16_t port, String uri = "/") __attribute__ ((deprecated)); - // Use BearSSL for secure HTTPS connection - bool begin(String url, const uint8_t httpsFingerprint[20]) __attribute__ ((deprecated)); - bool begin(String host, uint16_t port, String uri, const uint8_t httpsFingerprint[20]) __attribute__ ((deprecated)); - // deprecated, use the overload above instead - bool begin(String host, uint16_t port, String uri, bool https, String httpsFingerprint) __attribute__ ((deprecated)); + // old API is now explicitely forbidden + bool begin(String url) __attribute__ ((error("obsolete API, use ::begin(WiFiClient, url)"))); + bool begin(String host, uint16_t port, String uri = "/") __attribute__ ((error("obsolete API, use ::begin(WiFiClient, host, port, uri)"))); + bool begin(String url, const uint8_t httpsFingerprint[20]) __attribute__ ((error("obsolete API, use ::begin(WiFiClientSecure, ...)"))); + bool begin(String host, uint16_t port, String uri, const uint8_t httpsFingerprint[20]) __attribute__ ((error("obsolete API, use ::begin(WiFiClientSecure, ...)"))); + bool begin(String host, uint16_t port, String uri, bool https, String httpsFingerprint) __attribute__ ((error("obsolete API, use ::begin(WiFiClientSecure, ...)"))); void end(void); @@ -183,7 +181,6 @@ public: void setTimeout(uint16_t timeout); // Redirections - void setFollowRedirects(bool follow) __attribute__ ((deprecated)); void setFollowRedirects(followRedirects_t follow); void setRedirectLimit(uint16_t limit); // max redirects to follow for a single request @@ -237,9 +234,6 @@ protected: int handleHeaderResponse(); int writeToStreamDataBlock(Stream * stream, int len); - - TransportTraitsPtr _transportTraits; - std::unique_ptr _tcpDeprecated; WiFiClient* _client; /// request handling diff --git a/libraries/ESP8266mDNS/src/ESP8266mDNS.h b/libraries/ESP8266mDNS/src/ESP8266mDNS.h index 2e0e1fcec..ec1242338 100644 --- a/libraries/ESP8266mDNS/src/ESP8266mDNS.h +++ b/libraries/ESP8266mDNS/src/ESP8266mDNS.h @@ -42,6 +42,9 @@ */ +#ifndef __ESP8266MDNS_H +#define __ESP8266MDNS_H + enum class MDNSApiVersion { LEA, LEAv2 }; #include "LEAmDNS.h" // LEA @@ -57,3 +60,5 @@ using MDNSResponder = esp8266::MDNSImplementation::MDNSResponder; extern MDNSResponder MDNS; #endif + +#endif // __ESP8266MDNS_H