From 777e8d715c3aa67dd5b436e845b8b88b5fecfc9a Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 12 Apr 2019 07:58:24 -0700 Subject: [PATCH 01/10] Convert ESP8266WebServer* into templatized model Supercedes #4912 Refactor the three versions of ESP8266WebServer and *WebServerSecure to a single templated class. Use "using" to enable old, non-templated names to b used (so no user changes required to compile or run). Fixes #4908 and clean up the code base a lot. Basic tests run (the ones in the example code). No code changes are required in userland except for setting the SSL certificates which now use a cleaner "getServer()" accessor and lets the app use the native BearSSL calls on the WiFiClientSecure object. @devyte should be proud, it removes virtuals and even has template specialization... --- .../SecureBearSSLUpdater.ino | 2 +- .../SecureHTTPSUpdater/SecureHTTPSUpdater.ino | 2 +- ...ver.cpp => ESP8266HTTPUpdateServer-impl.h} | 9 +- .../src/ESP8266HTTPUpdateServer.h | 21 ++- .../HelloServerBearSSL/HelloServerBearSSL.ino | 2 +- .../HelloServerSecure/HelloServerSecure.ino | 2 +- ...6WebServer.cpp => ESP8266WebServer-impl.h} | 167 +++++++++++------- .../ESP8266WebServer/src/ESP8266WebServer.h | 55 +++--- .../src/ESP8266WebServerSecure.h | 10 +- .../src/ESP8266WebServerSecureAxTLS.cpp | 157 ---------------- .../src/ESP8266WebServerSecureAxTLS.h | 65 ------- .../src/ESP8266WebServerSecureBearSSL.cpp | 165 ----------------- .../src/ESP8266WebServerSecureBearSSL.h | 69 -------- .../src/{Parsing.cpp => Parsing-impl.h} | 41 +++-- .../src/detail/RequestHandler.h | 11 +- .../src/detail/RequestHandlersImpl.h | 18 +- 16 files changed, 212 insertions(+), 584 deletions(-) rename libraries/ESP8266HTTPUpdateServer/src/{ESP8266HTTPUpdateServer.cpp => ESP8266HTTPUpdateServer-impl.h} (88%) rename libraries/ESP8266WebServer/src/{ESP8266WebServer.cpp => ESP8266WebServer-impl.h} (67%) delete mode 100644 libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.cpp delete mode 100644 libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.h delete mode 100644 libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.cpp delete mode 100644 libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.h rename libraries/ESP8266WebServer/src/{Parsing.cpp => Parsing-impl.h} (90%) diff --git a/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino index 9792ae3979..0303c20863 100644 --- a/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino +++ b/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino @@ -32,7 +32,7 @@ const char* ssid = STASSID; const char* password = STAPSK; BearSSL::ESP8266WebServerSecure httpServer(443); -ESP8266HTTPUpdateServer httpUpdater; +ESP8266HTTPUpdateServerTemplate httpUpdater; static const char serverCert[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- diff --git a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino index 07d39ab1c6..4e1f3e4c6f 100644 --- a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino +++ b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino @@ -61,7 +61,7 @@ const char* ssid = STASSID; const char* password = STAPSK; ESP8266WebServerSecure httpServer(443); -ESP8266HTTPUpdateServer httpUpdater; +ESP8266HTTPUpdateServerTemplate httpUpdater; // The certificate is stored in PMEM static const uint8_t x509[] PROGMEM = { diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.cpp b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h similarity index 88% rename from libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.cpp rename to libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h index b53f0fa749..faf1cc40b1 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.cpp +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h @@ -16,7 +16,8 @@ static const char serverIndex[] PROGMEM = static const char successResponse[] PROGMEM = "Update Success! Rebooting...\n"; -ESP8266HTTPUpdateServer::ESP8266HTTPUpdateServer(bool serial_debug) +template +ESP8266HTTPUpdateServerTemplate::ESP8266HTTPUpdateServer(bool serial_debug) { _serial_output = serial_debug; _server = NULL; @@ -25,7 +26,8 @@ ESP8266HTTPUpdateServer::ESP8266HTTPUpdateServer(bool serial_debug) _authenticated = false; } -void ESP8266HTTPUpdateServer::setup(ESP8266WebServer *server, const String& path, const String& username, const String& password) +template +void ESP8266HTTPUpdateServerTemplate::setup(ESP8266WebServerTemplate *server, const String& path, const String& username, const String& password) { _server = server; _username = username; @@ -95,7 +97,8 @@ void ESP8266HTTPUpdateServer::setup(ESP8266WebServer *server, const String& path }); } -void ESP8266HTTPUpdateServer::_setUpdaterError() +template +void ESP8266HTTPUpdateServerTemplate::_setUpdaterError() { if (_serial_output) Update.printError(Serial); StreamString str; diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h index a0faa46758..9df63e6ab2 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h @@ -1,29 +1,30 @@ #ifndef __HTTP_UPDATE_SERVER_H #define __HTTP_UPDATE_SERVER_H -class ESP8266WebServer; +#include -class ESP8266HTTPUpdateServer +temnplate +class ESP8266HTTPUpdateServerTemplate { public: - ESP8266HTTPUpdateServer(bool serial_debug=false); + ESP8266HTTPUpdateServerTemplate(bool serial_debug=false); - void setup(ESP8266WebServer *server) + void setup(ESP8266WebServerTemplate *server) { setup(server, emptyString, emptyString); } - void setup(ESP8266WebServer *server, const String& path) + void setup(ESP8266WebServerTemplate *server, const String& path) { setup(server, path, emptyString, emptyString); } - void setup(ESP8266WebServer *server, const String& username, const String& password) + void setup(ESP8266WebServerTemplate *server, const String& username, const String& password) { setup(server, "/update", username, password); } - void setup(ESP8266WebServer *server, const String& path, const String& username, const String& password); + void setup(ESP8266WebServerTemplate *server, const String& path, const String& username, const String& password); void updateCredentials(const String& username, const String& password) { @@ -36,12 +37,16 @@ class ESP8266HTTPUpdateServer private: bool _serial_output; - ESP8266WebServer *_server; + ESP8266WebServerTemplate *_server; String _username; String _password; bool _authenticated; String _updaterError; }; +#include "ESP8266HTTPUpdateServer-impl.h" + + +using ESP8266HTTPUpdateServer = ESP8266HTTPUpdateServerTemplate; #endif diff --git a/libraries/ESP8266WebServer/examples/HelloServerBearSSL/HelloServerBearSSL.ino b/libraries/ESP8266WebServer/examples/HelloServerBearSSL/HelloServerBearSSL.ino index 5f34848d97..4b786dc1a5 100644 --- a/libraries/ESP8266WebServer/examples/HelloServerBearSSL/HelloServerBearSSL.ino +++ b/libraries/ESP8266WebServer/examples/HelloServerBearSSL/HelloServerBearSSL.ino @@ -128,7 +128,7 @@ void setup(void){ Serial.println("MDNS responder started"); } - server.setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey)); + server.getServer().setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey)); server.on("/", handleRoot); diff --git a/libraries/ESP8266WebServer/examples/HelloServerSecure/HelloServerSecure.ino b/libraries/ESP8266WebServer/examples/HelloServerSecure/HelloServerSecure.ino index b0f94740b8..87c34ccb58 100644 --- a/libraries/ESP8266WebServer/examples/HelloServerSecure/HelloServerSecure.ino +++ b/libraries/ESP8266WebServer/examples/HelloServerSecure/HelloServerSecure.ino @@ -165,7 +165,7 @@ void setup(void) { Serial.println("MDNS responder started"); } - server.setServerKeyAndCert_P(rsakey, sizeof(rsakey), x509, sizeof(x509)); + server.getServer().setServerKeyAndCert_P(rsakey, sizeof(rsakey), x509, sizeof(x509)); server.on("/", handleRoot); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h similarity index 67% rename from libraries/ESP8266WebServer/src/ESP8266WebServer.cpp rename to libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h index 2aac608083..59e884a0c6 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h @@ -43,7 +43,8 @@ static const char WWW_Authenticate[] PROGMEM = "WWW-Authenticate"; static const char Content_Length[] PROGMEM = "Content-Length"; -ESP8266WebServer::ESP8266WebServer(IPAddress addr, int port) +template +ESP8266WebServerTemplate::ESP8266WebServerTemplate(IPAddress addr, int port) : _server(addr, port) , _currentMethod(HTTP_ANY) , _currentVersion(0) @@ -63,7 +64,8 @@ ESP8266WebServer::ESP8266WebServer(IPAddress addr, int port) { } -ESP8266WebServer::ESP8266WebServer(int port) +template +ESP8266WebServerTemplate::ESP8266WebServerTemplate(int port) : _server(port) , _currentMethod(HTTP_ANY) , _currentVersion(0) @@ -83,36 +85,41 @@ ESP8266WebServer::ESP8266WebServer(int port) { } -ESP8266WebServer::~ESP8266WebServer() { +template +ESP8266WebServerTemplate::~ESP8266WebServerTemplate() { _server.close(); if (_currentHeaders) delete[]_currentHeaders; - RequestHandler* handler = _firstHandler; + RequestHandlerType* handler = _firstHandler; while (handler) { - RequestHandler* next = handler->next(); + RequestHandlerType* next = handler->next(); delete handler; handler = next; } } -void ESP8266WebServer::begin() { +template +void ESP8266WebServerTemplate::begin() { close(); _server.begin(); } -void ESP8266WebServer::begin(uint16_t port) { +template +void ESP8266WebServerTemplate::begin(uint16_t port) { close(); _server.begin(port); } -String ESP8266WebServer::_extractParam(String& authReq,const String& param,const char delimit) const { +template +String ESP8266WebServerTemplate::_extractParam(String& authReq,const String& param,const char delimit) const { int _begin = authReq.indexOf(param); if (_begin == -1) return emptyString; return authReq.substring(_begin+param.length(),authReq.indexOf(delimit,_begin+param.length())); } -bool ESP8266WebServer::authenticate(const char * username, const char * password){ +template +bool ESP8266WebServerTemplate::authenticate(const char * username, const char * password){ if(hasHeader(FPSTR(AUTHORIZATION_HEADER))) { String authReq = header(FPSTR(AUTHORIZATION_HEADER)); if(authReq.startsWith(F("Basic"))){ @@ -216,7 +223,8 @@ bool ESP8266WebServer::authenticate(const char * username, const char * password return false; } -String ESP8266WebServer::_getRandomHexString() { +template +String ESP8266WebServerTemplate::_getRandomHexString() { char buffer[33]; // buffer to hold 32 Hex Digit + /0 int i; for(i = 0; i < 4; i++) { @@ -225,7 +233,8 @@ String ESP8266WebServer::_getRandomHexString() { return String(buffer); } -void ESP8266WebServer::requestAuthentication(HTTPAuthMethod mode, const char* realm, const String& authFailMsg) { +template +void ESP8266WebServerTemplate::requestAuthentication(HTTPAuthMethod mode, const char* realm, const String& authFailMsg) { if(realm == NULL) { _srealm = String(F("Login Required")); } else { @@ -242,23 +251,28 @@ void ESP8266WebServer::requestAuthentication(HTTPAuthMethod mode, const char* re send(401, String(FPSTR(mimeTable[html].mimeType)), authFailMsg); } -void ESP8266WebServer::on(const String &uri, ESP8266WebServer::THandlerFunction handler) { +template +void ESP8266WebServerTemplate::on(const String &uri, ESP8266WebServerTemplate::THandlerFunction handler) { on(uri, HTTP_ANY, handler); } -void ESP8266WebServer::on(const String &uri, HTTPMethod method, ESP8266WebServer::THandlerFunction fn) { +template +void ESP8266WebServerTemplate::on(const String &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn) { on(uri, method, fn, _fileUploadHandler); } -void ESP8266WebServer::on(const String &uri, HTTPMethod method, ESP8266WebServer::THandlerFunction fn, ESP8266WebServer::THandlerFunction ufn) { - _addRequestHandler(new FunctionRequestHandler(fn, ufn, uri, method)); +template +void ESP8266WebServerTemplate::on(const String &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn, ESP8266WebServerTemplate::THandlerFunction ufn) { + _addRequestHandler(new FunctionRequestHandler(fn, ufn, uri, method)); } -void ESP8266WebServer::addHandler(RequestHandler* handler) { +template +void ESP8266WebServerTemplate::addHandler(RequestHandlerType* handler) { _addRequestHandler(handler); } -void ESP8266WebServer::_addRequestHandler(RequestHandler* handler) { +template +void ESP8266WebServerTemplate::_addRequestHandler(RequestHandlerType* handler) { if (!_lastHandler) { _firstHandler = handler; _lastHandler = handler; @@ -269,13 +283,15 @@ void ESP8266WebServer::_addRequestHandler(RequestHandler* handler) { } } -void ESP8266WebServer::serveStatic(const char* uri, FS& fs, const char* path, const char* cache_header) { - _addRequestHandler(new StaticRequestHandler(fs, path, uri, cache_header)); +template +void ESP8266WebServerTemplate::serveStatic(const char* uri, FS& fs, const char* path, const char* cache_header) { + _addRequestHandler(new StaticRequestHandler(fs, path, uri, cache_header)); } -void ESP8266WebServer::handleClient() { +template +void ESP8266WebServerTemplate::handleClient() { if (_currentStatus == HC_NONE) { - WiFiClient client = _server.available(); + ClientType client = _server.available(); if (!client) { return; } @@ -328,7 +344,7 @@ void ESP8266WebServer::handleClient() { } if (!keepCurrentClient) { - _currentClient = WiFiClient(); + _currentClient = ClientType(); _currentStatus = HC_NONE; _currentUpload.reset(); } @@ -338,18 +354,21 @@ void ESP8266WebServer::handleClient() { } } -void ESP8266WebServer::close() { +template +void ESP8266WebServerTemplate::close() { _server.close(); _currentStatus = HC_NONE; if(!_headerKeysCount) collectHeaders(0, 0); } -void ESP8266WebServer::stop() { +template +void ESP8266WebServerTemplate::stop() { close(); } -void ESP8266WebServer::sendHeader(const String& name, const String& value, bool first) { +template +void ESP8266WebServerTemplate::sendHeader(const String& name, const String& value, bool first) { String headerLine = name; headerLine += F(": "); headerLine += value; @@ -363,11 +382,13 @@ void ESP8266WebServer::sendHeader(const String& name, const String& value, bool } } -void ESP8266WebServer::setContentLength(const size_t contentLength) { +template +void ESP8266WebServerTemplate::setContentLength(const size_t contentLength) { _contentLength = contentLength; } -void ESP8266WebServer::_prepareHeader(String& response, int code, const char* content_type, size_t contentLength) { +template +void ESP8266WebServerTemplate::_prepareHeader(String& response, int code, const char* content_type, size_t contentLength) { response = String(F("HTTP/1.")) + String(_currentVersion) + ' '; response += String(code); response += ' '; @@ -396,18 +417,20 @@ void ESP8266WebServer::_prepareHeader(String& response, int code, const char* co _responseHeaders = ""; } -void ESP8266WebServer::send(int code, const char* content_type, const String& content) { +template +void ESP8266WebServerTemplate::send(int code, const char* content_type, const String& content) { String header; // Can we asume the following? //if(code == 200 && content.length() == 0 && _contentLength == CONTENT_LENGTH_NOT_SET) // _contentLength = CONTENT_LENGTH_UNKNOWN; _prepareHeader(header, code, content_type, content.length()); - _currentClientWrite(header.c_str(), header.length()); + _currentClient.write((const uint8_t *)header.c_str(), header.length()); if(content.length()) sendContent(content); } -void ESP8266WebServer::send_P(int code, PGM_P content_type, PGM_P content) { +template +void ESP8266WebServerTemplate::send_P(int code, PGM_P content_type, PGM_P content) { size_t contentLength = 0; if (content != NULL) { @@ -418,13 +441,14 @@ void ESP8266WebServer::send_P(int code, PGM_P content_type, PGM_P content) { char type[64]; memccpy_P((void*)type, (PGM_VOID_P)content_type, 0, sizeof(type)); _prepareHeader(header, code, (const char* )type, contentLength); - _currentClientWrite(header.c_str(), header.length()); + _currentClient.write(header.c_str(), header.length()); if (contentLength) { sendContent_P(content); } } -void ESP8266WebServer::send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength) { +template +void ESP8266WebServerTemplate::send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength) { String header; char type[64]; memccpy_P((void*)type, (PGM_VOID_P)content_type, 0, sizeof(type)); @@ -433,43 +457,48 @@ void ESP8266WebServer::send_P(int code, PGM_P content_type, PGM_P content, size_ sendContent_P(content, contentLength); } -void ESP8266WebServer::send(int code, char* content_type, const String& content) { +template +void ESP8266WebServerTemplate::send(int code, char* content_type, const String& content) { send(code, (const char*)content_type, content); } -void ESP8266WebServer::send(int code, const String& content_type, const String& content) { +template +void ESP8266WebServerTemplate::send(int code, const String& content_type, const String& content) { send(code, (const char*)content_type.c_str(), content); } -void ESP8266WebServer::sendContent(const String& content) { +template +void ESP8266WebServerTemplate::sendContent(const String& content) { const char * footer = "\r\n"; size_t len = content.length(); if(_chunked) { char chunkSize[11]; sprintf(chunkSize, "%zx\r\n", len); - _currentClientWrite(chunkSize, strlen(chunkSize)); + _currentClient.write((const uint8_t *)chunkSize, strlen(chunkSize)); } - _currentClientWrite(content.c_str(), len); + _currentClient.write((const uint8_t *)content.c_str(), len); if(_chunked){ - _currentClient.write(footer, 2); + _currentClient.write((const uint8_t *)footer, 2); if (len == 0) { _chunked = false; } } } -void ESP8266WebServer::sendContent_P(PGM_P content) { +template +void ESP8266WebServerTemplate::sendContent_P(PGM_P content) { sendContent_P(content, strlen_P(content)); } -void ESP8266WebServer::sendContent_P(PGM_P content, size_t size) { +template +void ESP8266WebServerTemplate::sendContent_P(PGM_P content, size_t size) { const char * footer = "\r\n"; if(_chunked) { char chunkSize[11]; sprintf(chunkSize, "%zx\r\n", size); - _currentClientWrite(chunkSize, strlen(chunkSize)); + _currentClient.write(chunkSize, strlen(chunkSize)); } - _currentClientWrite_P(content, size); + _currentClient.write_P(content, size); if(_chunked){ _currentClient.write(footer, 2); if (size == 0) { @@ -479,7 +508,8 @@ void ESP8266WebServer::sendContent_P(PGM_P content, size_t size) { } -void ESP8266WebServer::_streamFileCore(const size_t fileSize, const String & fileName, const String & contentType) +template +void ESP8266WebServerTemplate::_streamFileCore(const size_t fileSize, const String & fileName, const String & contentType) { using namespace mime; setContentLength(fileSize); @@ -492,7 +522,8 @@ void ESP8266WebServer::_streamFileCore(const size_t fileSize, const String & fil } -const String& ESP8266WebServer::arg(String name) const { +template +const String& ESP8266WebServerTemplate::arg(String name) const { for (int j = 0; j < _postArgsLen; ++j) { if ( _postArgs[j].key == name ) return _postArgs[j].value; @@ -504,23 +535,27 @@ const String& ESP8266WebServer::arg(String name) const { return emptyString; } -const String& ESP8266WebServer::arg(int i) const { +template +const String& ESP8266WebServerTemplate::arg(int i) const { if (i >= 0 && i < _currentArgCount) return _currentArgs[i].value; return emptyString; } -const String& ESP8266WebServer::argName(int i) const { +template +const String& ESP8266WebServerTemplate::argName(int i) const { if (i >= 0 && i < _currentArgCount) return _currentArgs[i].key; return emptyString; } -int ESP8266WebServer::args() const { +template +int ESP8266WebServerTemplate::args() const { return _currentArgCount; } -bool ESP8266WebServer::hasArg(const String& name) const { +template +bool ESP8266WebServerTemplate::hasArg(const String& name) const { for (int j = 0; j < _postArgsLen; ++j) { if (_postArgs[j].key == name) return true; @@ -533,7 +568,8 @@ bool ESP8266WebServer::hasArg(const String& name) const { } -const String& ESP8266WebServer::header(String name) const { +template +const String& ESP8266WebServerTemplate::header(String name) const { for (int i = 0; i < _headerKeysCount; ++i) { if (_currentHeaders[i].key.equalsIgnoreCase(name)) return _currentHeaders[i].value; @@ -541,7 +577,8 @@ const String& ESP8266WebServer::header(String name) const { return emptyString; } -void ESP8266WebServer::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) { +template +void ESP8266WebServerTemplate::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) { _headerKeysCount = headerKeysCount + 1; if (_currentHeaders) delete[]_currentHeaders; @@ -552,23 +589,27 @@ void ESP8266WebServer::collectHeaders(const char* headerKeys[], const size_t hea } } -const String& ESP8266WebServer::header(int i) const { +template +const String& ESP8266WebServerTemplate::header(int i) const { if (i < _headerKeysCount) return _currentHeaders[i].value; return emptyString; } -const String& ESP8266WebServer::headerName(int i) const { +template +const String& ESP8266WebServerTemplate::headerName(int i) const { if (i < _headerKeysCount) return _currentHeaders[i].key; return emptyString; } -int ESP8266WebServer::headers() const { +template +int ESP8266WebServerTemplate::headers() const { return _headerKeysCount; } -bool ESP8266WebServer::hasHeader(String name) const { +template +bool ESP8266WebServerTemplate::hasHeader(String name) const { for (int i = 0; i < _headerKeysCount; ++i) { if ((_currentHeaders[i].key.equalsIgnoreCase(name)) && (_currentHeaders[i].value.length() > 0)) return true; @@ -576,19 +617,23 @@ bool ESP8266WebServer::hasHeader(String name) const { return false; } -const String& ESP8266WebServer::hostHeader() const { +template +const String& ESP8266WebServerTemplate::hostHeader() const { return _hostHeader; } -void ESP8266WebServer::onFileUpload(THandlerFunction fn) { +template +void ESP8266WebServerTemplate::onFileUpload(THandlerFunction fn) { _fileUploadHandler = fn; } -void ESP8266WebServer::onNotFound(THandlerFunction fn) { +template +void ESP8266WebServerTemplate::onNotFound(THandlerFunction fn) { _notFoundHandler = fn; } -void ESP8266WebServer::_handleRequest() { +template +void ESP8266WebServerTemplate::_handleRequest() { bool handled = false; if (!_currentHandler){ #ifdef DEBUG_ESP_HTTP_SERVER @@ -619,13 +664,15 @@ void ESP8266WebServer::_handleRequest() { } -void ESP8266WebServer::_finalizeResponse() { +template +void ESP8266WebServerTemplate::_finalizeResponse() { if (_chunked) { sendContent(emptyString); } } -const String ESP8266WebServer::responseCodeToString(const int code) { +template +const String ESP8266WebServerTemplate::responseCodeToString(const int code) { switch (code) { case 100: return F("Continue"); case 101: return F("Switching Protocols"); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 10e9a5666f..c44efc6949 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -48,7 +48,8 @@ enum HTTPAuthMethod { BASIC_AUTH, DIGEST_AUTH }; #define CONTENT_LENGTH_UNKNOWN ((size_t) -1) #define CONTENT_LENGTH_NOT_SET ((size_t) -2) -class ESP8266WebServer; +template +class ESP8266WebServerTemplate; typedef struct { HTTPUploadStatus status; @@ -67,18 +68,20 @@ namespace fs { class FS; } -class ESP8266WebServer +template +class ESP8266WebServerTemplate { public: - ESP8266WebServer(IPAddress addr, int port = 80); - ESP8266WebServer(int port = 80); - virtual ~ESP8266WebServer(); + ESP8266WebServerTemplate(IPAddress addr, int port = 80); + ESP8266WebServerTemplate(int port = 80); + ~ESP8266WebServerTemplate(); - virtual void begin(); - virtual void begin(uint16_t port); - virtual void handleClient(); + using RequestHandlerType = RequestHandler; - virtual void close(); + void begin(); + void begin(uint16_t port); + void handleClient(); + void close(); void stop(); bool authenticate(const char * username, const char * password); @@ -88,16 +91,19 @@ class ESP8266WebServer void on(const String &uri, THandlerFunction handler); void on(const String &uri, HTTPMethod method, THandlerFunction fn); void on(const String &uri, HTTPMethod method, THandlerFunction fn, THandlerFunction ufn); - void addHandler(RequestHandler* handler); + void addHandler(RequestHandlerType* handler); void serveStatic(const char* uri, fs::FS& fs, const char* path, const char* cache_header = NULL ); void onNotFound(THandlerFunction fn); //called when handler is not assigned void onFileUpload(THandlerFunction fn); //handle file uploads const String& uri() const { return _currentUri; } HTTPMethod method() const { return _currentMethod; } - virtual WiFiClient client() { return _currentClient; } + ClientType client() { return _currentClient; } HTTPUpload& upload() { return *_currentUpload; } + // Allows setting server options (i.e. SSL keys) by the instantiator + ServerType &getServer() { return _server; } + const String& arg(String name) const; // get request argument value by name const String& arg(int i) const; // get request argument value by number const String& argName(int i) const; // get request argument name by number @@ -138,18 +144,16 @@ class ESP8266WebServer static const String responseCodeToString(const int code); protected: - virtual size_t _currentClientWrite(const char* b, size_t l) { return _currentClient.write( b, l ); } - virtual size_t _currentClientWrite_P(PGM_P b, size_t l) { return _currentClient.write_P( b, l ); } - void _addRequestHandler(RequestHandler* handler); + void _addRequestHandler(RequestHandlerType* handler); void _handleRequest(); void _finalizeResponse(); - bool _parseRequest(WiFiClient& client); + bool _parseRequest(ClientType& client); void _parseArguments(const String& data); int _parseArgumentsPrivate(const String& data, std::function handler); - bool _parseForm(WiFiClient& client, const String& boundary, uint32_t len); + bool _parseForm(ClientType& client, const String& boundary, uint32_t len); bool _parseFormUploadAborted(); void _uploadWriteByte(uint8_t b); - uint8_t _uploadReadByte(WiFiClient& client); + uint8_t _uploadReadByte(ClientType& client); void _prepareHeader(String& response, int code, const char* content_type, size_t contentLength); bool _collectHeader(const char* headerName, const char* headerValue); @@ -164,18 +168,17 @@ class ESP8266WebServer String value; }; - WiFiServer _server; - - WiFiClient _currentClient; + ServerType _server; + ClientType _currentClient; HTTPMethod _currentMethod; String _currentUri; uint8_t _currentVersion; HTTPClientStatus _currentStatus; unsigned long _statusChange; - RequestHandler* _currentHandler; - RequestHandler* _firstHandler; - RequestHandler* _lastHandler; + RequestHandlerType* _currentHandler; + RequestHandlerType* _firstHandler; + RequestHandlerType* _lastHandler; THandlerFunction _notFoundHandler; THandlerFunction _fileUploadHandler; @@ -201,4 +204,10 @@ class ESP8266WebServer }; +#include "ESP8266WebServer-impl.h" +#include "Parsing-impl.h" + +using ESP8266WebServer = ESP8266WebServerTemplate; + + #endif //ESP8266WEBSERVER_H diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h b/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h index 5258c6cc89..5689495187 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h @@ -19,7 +19,13 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include #include -//#include "ESP8266WebServerSecureAxTLS.h" -#include "ESP8266WebServerSecureBearSSL.h" +namespace axTLS { + using ESP8266WebServerSecure = ESP8266WebServerTemplate; +}; + +namespace BearSSL { + using ESP8266WebServerSecure = ESP8266WebServerTemplate; +}; diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.cpp deleted file mode 100644 index 09ba1ba5c9..0000000000 --- a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.cpp +++ /dev/null @@ -1,157 +0,0 @@ -/* - ESP8266WebServerSecure.cpp - Dead simple HTTPS web-server. - Supports only one simultaneous client, knows how to handle GET and POST. - - Copyright (c) 2017 Earle F. Philhower, III. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Modified 8 May 2015 by Hristo Gochkov (proper post and file upload handling) -*/ - - -#include -#include -#include "WiFiServer.h" -#include "WiFiClient.h" -#include "ESP8266WebServerSecureAxTLS.h" - -//#define DEBUG_ESP_HTTP_SERVER -#ifdef DEBUG_ESP_PORT -#define DEBUG_OUTPUT DEBUG_ESP_PORT -#else -#define DEBUG_OUTPUT Serial -#endif - -namespace axTLS { - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - -ESP8266WebServerSecure::ESP8266WebServerSecure(IPAddress addr, int port) -: _serverSecure(addr, port) -{ -} - -ESP8266WebServerSecure::ESP8266WebServerSecure(int port) -: _serverSecure(port) -{ -} - -#pragma GCC diagnostic pop - -void ESP8266WebServerSecure::setServerKeyAndCert_P(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen) -{ - _serverSecure.setServerKeyAndCert_P(key, keyLen, cert, certLen); -} - -void ESP8266WebServerSecure::setServerKeyAndCert(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen) -{ - _serverSecure.setServerKeyAndCert(key, keyLen, cert, certLen); -} - -ESP8266WebServerSecure::~ESP8266WebServerSecure() { - // Nothing to do here. - // Base class's destructor will be called to clean up itself -} - -// We need to basically cut-n-paste these from WebServer because of the problem -// of object slicing. The class uses assignment operators like "WiFiClient x=y;" -// When this happens, even if "y" is a WiFiClientSecure, the main class is -// already compiled down into code which will only copy the WiFiClient superclass -// and not the extra bits for our own class (since when it was compiled it needed -// to know the size of memory to allocate on the stack for this local variable -// there's not realy anything else it could do). - -void ESP8266WebServerSecure::begin() { - _currentStatus = HC_NONE; - _serverSecure.begin(); - if(!_headerKeysCount) - collectHeaders(0, 0); -} - -void ESP8266WebServerSecure::handleClient() { - if (_currentStatus == HC_NONE) { - WiFiClientSecure client = _serverSecure.available(); - if (!client) { - return; - } - -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.println("New secure client"); -#endif - - _currentClientSecure = client; - _currentStatus = HC_WAIT_READ; - _statusChange = millis(); - } - - bool keepCurrentClient = false; - bool callYield = false; - - if (_currentClientSecure.connected()) { - switch (_currentStatus) { - case HC_NONE: - // No-op to avoid C++ compiler warning - break; - case HC_WAIT_READ: - // Wait for data from client to become available - if (_currentClientSecure.available()) { - if (_parseRequest(_currentClientSecure)) { - _currentClientSecure.setTimeout(HTTP_MAX_SEND_WAIT); - _contentLength = CONTENT_LENGTH_NOT_SET; - _handleRequest(); - - if (_currentClientSecure.connected()) { - _currentStatus = HC_WAIT_CLOSE; - _statusChange = millis(); - keepCurrentClient = true; - } - } - } else { // !_currentClient.available() - if (millis() - _statusChange <= HTTP_MAX_DATA_WAIT) { - keepCurrentClient = true; - } - callYield = true; - } - break; - case HC_WAIT_CLOSE: - // Wait for client to close the connection - if (millis() - _statusChange <= HTTP_MAX_CLOSE_WAIT) { - keepCurrentClient = true; - callYield = true; - } - } - } - - if (!keepCurrentClient) { -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - _currentClientSecure = WiFiClientSecure(); -#pragma GCC diagnostic pop - _currentStatus = HC_NONE; - _currentUpload.reset(); - } - - if (callYield) { - yield(); - } -} - -void ESP8266WebServerSecure::close() { - _currentClientSecure.stop(); - _serverSecure.close(); -} - -}; diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.h b/libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.h deleted file mode 100644 index a53d6fa834..0000000000 --- a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureAxTLS.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - ESP8266WebServerSecure.h - Dead simple HTTPS web-server. - Supports only one simultaneous client, knows how to handle GET and POST. - - Copyright (c) 2017 Earle F. Philhower, III. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - - -#ifndef ESP8266WEBSERVERSECURE_H -#define ESP8266WEBSERVERSECURE_H - -#include -#include -#include - -namespace axTLS { - -class ESP8266WebServerSecure : public ESP8266WebServer -{ -public: - ESP8266WebServerSecure(IPAddress addr, int port = 443); - ESP8266WebServerSecure(int port = 443); - virtual ~ESP8266WebServerSecure(); - - void setServerKeyAndCert_P(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen); - void setServerKeyAndCert(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen); - - WiFiClient client() override { return _currentClientSecure; } - - void begin() override; - void handleClient() override; - void close() override; - - template - size_t streamFile(T &file, const String& contentType) { - _streamFileCore(file.size(), file.name(), contentType); - return _currentClientSecure.write(file); - } - -private: - size_t _currentClientWrite (const char *bytes, size_t len) override { return _currentClientSecure.write((const uint8_t *)bytes, len); } - size_t _currentClientWrite_P (PGM_P bytes, size_t len) override { return _currentClientSecure.write_P(bytes, len); } - -protected: - WiFiServerSecure _serverSecure; - WiFiClientSecure _currentClientSecure; -}; - -}; - -#endif //ESP8266WEBSERVERSECURE_H diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.cpp deleted file mode 100644 index 83428ff1d7..0000000000 --- a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - ESP8266WebServerSecure.cpp - Dead simple HTTPS web-server. - Supports only one simultaneous client, knows how to handle GET and POST. - - Copyright (c) 2017 Earle F. Philhower, III. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Modified 8 May 2015 by Hristo Gochkov (proper post and file upload handling) -*/ - - -#include -#include -#include "WiFiServer.h" -#include "WiFiClient.h" -#include "ESP8266WebServerSecureBearSSL.h" - -//#define DEBUG_ESP_HTTP_SERVER -#ifdef DEBUG_ESP_PORT -#define DEBUG_OUTPUT DEBUG_ESP_PORT -#else -#define DEBUG_OUTPUT Serial -#endif - -namespace BearSSL { - -ESP8266WebServerSecure::ESP8266WebServerSecure(IPAddress addr, int port) -: _serverSecure(addr, port) -{ -} - -ESP8266WebServerSecure::ESP8266WebServerSecure(int port) -: _serverSecure(port) -{ -} - -void ESP8266WebServerSecure::setRSACert(const X509List *chain, const PrivateKey *sk) -{ - _serverSecure.setRSACert(chain, sk); -} - -void ESP8266WebServerSecure::setECCert(const X509List *chain, unsigned cert_issuer_key_type, const PrivateKey *sk) -{ - _serverSecure.setECCert(chain, cert_issuer_key_type, sk); -} - -void ESP8266WebServerSecure::setBufferSizes(int recv, int xmit) -{ - _serverSecure.setBufferSizes(recv, xmit); -} - -ESP8266WebServerSecure::~ESP8266WebServerSecure() { - // Nothing to do here. - // Base class's destructor will be called to clean up itself -} - -// We need to basically cut-n-paste these from WebServer because of the problem -// of object slicing. The class uses assignment operators like "WiFiClient x=y;" -// When this happens, even if "y" is a WiFiClientSecure, the main class is -// already compiled down into code which will only copy the WiFiClient superclass -// and not the extra bits for our own class (since when it was compiled it needed -// to know the size of memory to allocate on the stack for this local variable -// there's not realy anything else it could do). - -void ESP8266WebServerSecure::begin() { - _currentStatus = HC_NONE; - _serverSecure.begin(); - if(!_headerKeysCount) - collectHeaders(0, 0); -} - -void ESP8266WebServerSecure::handleClient() { - if (_currentStatus == HC_NONE) { - WiFiClientSecure client = _serverSecure.available(); - if (!client) { - return; - } - -#ifdef DEBUG_ESP_HTTP_SERVER - DEBUG_OUTPUT.println("New secure client"); -#endif - - _currentClientSecure = client; - _currentStatus = HC_WAIT_READ; - _statusChange = millis(); - } - - bool keepCurrentClient = false; - bool callYield = false; - - if (_currentClientSecure.connected()) { - switch (_currentStatus) { - case HC_NONE: - // No-op to avoid C++ compiler warning - break; - case HC_WAIT_READ: - // Wait for data from client to become available - if (_currentClientSecure.available()) { - if (_parseRequest(_currentClientSecure)) { - _currentClientSecure.setTimeout(HTTP_MAX_SEND_WAIT); - _contentLength = CONTENT_LENGTH_NOT_SET; - _handleRequest(); - - if (_currentClientSecure.connected()) { - _currentStatus = HC_WAIT_CLOSE; - _statusChange = millis(); - keepCurrentClient = true; - } - } - } else { // !_currentClient.available() - if (millis() - _statusChange <= HTTP_MAX_DATA_WAIT) { - keepCurrentClient = true; - } - callYield = true; - } - break; - case HC_WAIT_CLOSE: - // Wait for client to close the connection - if (millis() - _statusChange <= HTTP_MAX_CLOSE_WAIT) { - keepCurrentClient = true; - callYield = true; - } - } - } - - if (!keepCurrentClient) { - _currentClientSecure = WiFiClientSecure(); - _currentStatus = HC_NONE; - _currentUpload.reset(); - } - - if (callYield) { - yield(); - } -} - -void ESP8266WebServerSecure::close() { - _currentClientSecure.flush(); - _currentClientSecure.stop(); - _serverSecure.close(); -} - - -void ESP8266WebServerSecure::setServerKeyAndCert_P(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen) { - _serverSecure.setServerKeyAndCert_P(key, keyLen, cert, certLen); -} - -void ESP8266WebServerSecure::setServerKeyAndCert(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen) -{ - _serverSecure.setServerKeyAndCert(key, keyLen, cert, certLen); -} - -}; diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.h b/libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.h deleted file mode 100644 index d7a69a973a..0000000000 --- a/libraries/ESP8266WebServer/src/ESP8266WebServerSecureBearSSL.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - ESP8266WebServerSecure.h - Dead simple HTTPS web-server. - Supports only one simultaneous client, knows how to handle GET and POST. - - Copyright (c) 2017 Earle F. Philhower, III. All rights reserved. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - - -#ifndef ESP8266WEBSERVERBEARSSL_H -#define ESP8266WEBSERVERBEARSSL_H - -#include -#include -#include - -namespace BearSSL { - -class ESP8266WebServerSecure : public ESP8266WebServer -{ -public: - ESP8266WebServerSecure(IPAddress addr, int port = 443); - ESP8266WebServerSecure(int port = 443); - virtual ~ESP8266WebServerSecure(); - - void setBufferSizes(int recv, int xmit); - void setRSACert(const X509List *chain, const PrivateKey *sk); - void setECCert(const X509List *chain, unsigned cert_issuer_key_type, const PrivateKey *sk); - - WiFiClient client() override { return _currentClientSecure; } - - void begin() override; - void handleClient() override; - void close() override; - - template - size_t streamFile(T &file, const String& contentType) { - _streamFileCore(file.size(), file.name(), contentType); - return _currentClientSecure.write(file); - } - - // AXTLS Compatibility - void setServerKeyAndCert_P(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen); - void setServerKeyAndCert(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen); - -private: - size_t _currentClientWrite (const char *bytes, size_t len) override { return _currentClientSecure.write((const uint8_t *)bytes, len); } - size_t _currentClientWrite_P (PGM_P bytes, size_t len) override { return _currentClientSecure.write_P(bytes, len); } - -protected: - WiFiServerSecure _serverSecure; - WiFiClientSecure _currentClientSecure; -}; - -}; -#endif //ESP8266WEBSERVERSECURE_H diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing-impl.h similarity index 90% rename from libraries/ESP8266WebServer/src/Parsing.cpp rename to libraries/ESP8266WebServer/src/Parsing-impl.h index 9d5ecc012d..5f520cd1b8 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing-impl.h @@ -39,7 +39,8 @@ static const char Content_Type[] PROGMEM = "Content-Type"; static const char filename[] PROGMEM = "filename"; -static bool readBytesWithTimeout(WiFiClient& client, size_t maxLength, String& data, int timeout_ms) +template +static bool readBytesWithTimeout(ClientType& client, size_t maxLength, String& data, int timeout_ms) { if (!data.reserve(maxLength + 1)) return false; @@ -59,7 +60,8 @@ static bool readBytesWithTimeout(WiFiClient& client, size_t maxLength, String& d return data.length() == maxLength; } -bool ESP8266WebServer::_parseRequest(WiFiClient& client) { +template +bool ESP8266WebServerTemplate::_parseRequest(ClientType& client) { // Read the first line of HTTP request String req = client.readStringUntil('\r'); #ifdef DEBUG_ESP_HTTP_SERVER @@ -120,7 +122,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { #endif //attach handler - RequestHandler* handler; + RequestHandlerType* handler; for (handler = _firstHandler; handler; handler = handler->next()) { if (handler->canHandle(_currentMethod, _currentUri)) break; @@ -179,7 +181,7 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { String plainBuf; if ( !isForm && // read content into plainBuf - ( !readBytesWithTimeout(client, contentLength, plainBuf, HTTP_MAX_POST_WAIT) + ( !readBytesWithTimeout(client, contentLength, plainBuf, HTTP_MAX_POST_WAIT) || (plainBuf.length() < contentLength) ) ) @@ -258,7 +260,8 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { return true; } -bool ESP8266WebServer::_collectHeader(const char* headerName, const char* headerValue) { +template +bool ESP8266WebServerTemplate::_collectHeader(const char* headerName, const char* headerValue) { for (int i = 0; i < _headerKeysCount; i++) { if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) { _currentHeaders[i].value=headerValue; @@ -268,13 +271,14 @@ bool ESP8266WebServer::_collectHeader(const char* headerName, const char* header return false; } +template struct storeArgHandler { void operator() (String& key, String& value, const String& data, int equal_index, int pos, int key_end_pos, int next_index) { - key = ESP8266WebServer::urlDecode(data.substring(pos, key_end_pos)); + key = ESP8266WebServerTemplate::urlDecode(data.substring(pos, key_end_pos)); if ((equal_index != -1) && ((equal_index < next_index - 1) || (next_index == -1))) - value = ESP8266WebServer::urlDecode(data.substring(equal_index + 1, next_index)); + value = ESP8266WebServerTemplate::urlDecode(data.substring(equal_index + 1, next_index)); } }; @@ -286,7 +290,8 @@ struct nullArgHandler } }; -void ESP8266WebServer::_parseArguments(const String& data) { +template +void ESP8266WebServerTemplate::_parseArguments(const String& data) { if (_currentArgs) delete[] _currentArgs; @@ -295,10 +300,11 @@ void ESP8266WebServer::_parseArguments(const String& data) { // allocate one more, this is needed because {"plain": plainBuf} is always added _currentArgs = new RequestArgument[_currentArgCount + 1]; - (void)_parseArgumentsPrivate(data, storeArgHandler()); + (void)_parseArgumentsPrivate(data, storeArgHandler()); } -int ESP8266WebServer::_parseArgumentsPrivate(const String& data, std::function handler) { +template +int ESP8266WebServerTemplate::_parseArgumentsPrivate(const String& data, std::function handler) { #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("args: "); @@ -349,7 +355,8 @@ int ESP8266WebServer::_parseArgumentsPrivate(const String& data, std::function +void ESP8266WebServerTemplate::_uploadWriteByte(uint8_t b){ if (_currentUpload->currentSize == HTTP_UPLOAD_BUFLEN){ if(_currentHandler && _currentHandler->canUpload(_currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); @@ -359,7 +366,8 @@ void ESP8266WebServer::_uploadWriteByte(uint8_t b){ _currentUpload->buf[_currentUpload->currentSize++] = b; } -uint8_t ESP8266WebServer::_uploadReadByte(WiFiClient& client){ +template +uint8_t ESP8266WebServerTemplate::_uploadReadByte(ClientType& client){ int res = client.read(); if(res == -1){ while(!client.available() && client.connected()) @@ -369,7 +377,8 @@ uint8_t ESP8266WebServer::_uploadReadByte(WiFiClient& client){ return (uint8_t)res; } -bool ESP8266WebServer::_parseForm(WiFiClient& client, const String& boundary, uint32_t len){ +template +bool ESP8266WebServerTemplate::_parseForm(ClientType& client, const String& boundary, uint32_t len){ (void) len; #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Parse Form: Boundary: "); @@ -586,7 +595,8 @@ bool ESP8266WebServer::_parseForm(WiFiClient& client, const String& boundary, ui return false; } -String ESP8266WebServer::urlDecode(const String& text) +template +String ESP8266WebServerTemplate::urlDecode(const String& text) { String decoded = ""; char temp[] = "0x00"; @@ -617,7 +627,8 @@ String ESP8266WebServer::urlDecode(const String& text) return decoded; } -bool ESP8266WebServer::_parseFormUploadAborted(){ +template +bool ESP8266WebServerTemplate::_parseFormUploadAborted(){ _currentUpload->status = UPLOAD_FILE_ABORTED; if(_currentHandler && _currentHandler->canUpload(_currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandler.h b/libraries/ESP8266WebServer/src/detail/RequestHandler.h index fc5d0371d2..118f53d578 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandler.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandler.h @@ -1,19 +1,20 @@ #ifndef REQUESTHANDLER_H #define REQUESTHANDLER_H +template class RequestHandler { public: virtual ~RequestHandler() { } virtual bool canHandle(HTTPMethod method, String uri) { (void) method; (void) uri; return false; } virtual bool canUpload(String uri) { (void) uri; return false; } - virtual bool handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) { (void) server; (void) requestMethod; (void) requestUri; return false; } - virtual void upload(ESP8266WebServer& server, String requestUri, HTTPUpload& upload) { (void) server; (void) requestUri; (void) upload; } + virtual bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) { (void) server; (void) requestMethod; (void) requestUri; return false; } + virtual void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) { (void) server; (void) requestUri; (void) upload; } - RequestHandler* next() { return _next; } - void next(RequestHandler* r) { _next = r; } + RequestHandler* next() { return _next; } + void next(RequestHandler* r) { _next = r; } private: - RequestHandler* _next = nullptr; + RequestHandler* _next = nullptr; }; #endif //REQUESTHANDLER_H diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h index feada8c13b..0d7aa860d0 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h @@ -7,9 +7,10 @@ using namespace mime; -class FunctionRequestHandler : public RequestHandler { +template +class FunctionRequestHandler : public RequestHandler { public: - FunctionRequestHandler(ESP8266WebServer::THandlerFunction fn, ESP8266WebServer::THandlerFunction ufn, const String &uri, HTTPMethod method) + FunctionRequestHandler(typename ESP8266WebServerTemplate::THandlerFunction fn, typename ESP8266WebServerTemplate::THandlerFunction ufn, const String &uri, HTTPMethod method) : _fn(fn) , _ufn(ufn) , _uri(uri) @@ -34,7 +35,7 @@ class FunctionRequestHandler : public RequestHandler { return true; } - bool handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) override { + bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { (void) server; if (!canHandle(requestMethod, requestUri)) return false; @@ -43,7 +44,7 @@ class FunctionRequestHandler : public RequestHandler { return true; } - void upload(ESP8266WebServer& server, String requestUri, HTTPUpload& upload) override { + void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) override { (void) server; (void) upload; if (canUpload(requestUri)) @@ -51,13 +52,14 @@ class FunctionRequestHandler : public RequestHandler { } protected: - ESP8266WebServer::THandlerFunction _fn; - ESP8266WebServer::THandlerFunction _ufn; + typename ESP8266WebServerTemplate::THandlerFunction _fn; + typename ESP8266WebServerTemplate::THandlerFunction _ufn; String _uri; HTTPMethod _method; }; -class StaticRequestHandler : public RequestHandler { +template +class StaticRequestHandler : public RequestHandler { public: StaticRequestHandler(FS& fs, const char* path, const char* uri, const char* cache_header) : _fs(fs) @@ -80,7 +82,7 @@ class StaticRequestHandler : public RequestHandler { return true; } - bool handle(ESP8266WebServer& server, HTTPMethod requestMethod, String requestUri) override { + bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { if (!canHandle(requestMethod, requestUri)) return false; From 1559a3bd1a40015333e20e995bf09bb0cc4a8260 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 12 Apr 2019 09:29:54 -0700 Subject: [PATCH 02/10] Fix HTTPUpdate templates and examples --- .../examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino | 2 +- .../examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino | 2 +- .../src/ESP8266HTTPUpdateServer-impl.h | 2 +- .../ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h | 2 +- libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino index 0303c20863..cdfcd793e2 100644 --- a/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino +++ b/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino @@ -106,7 +106,7 @@ void setup() MDNS.begin(host); - httpServer.setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey)); + httpServer.getServer().setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey)); httpUpdater.setup(&httpServer, update_path, update_username, update_password); httpServer.begin(); diff --git a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino index 4e1f3e4c6f..faf499ac7c 100644 --- a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino +++ b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino @@ -176,7 +176,7 @@ void setup() { MDNS.begin(host); - httpServer.setServerKeyAndCert_P(rsakey, sizeof(rsakey), x509, sizeof(x509)); + httpServer.getServer().setServerKeyAndCert_P(rsakey, sizeof(rsakey), x509, sizeof(x509)); httpUpdater.setup(&httpServer, update_path, update_username, update_password); httpServer.begin(); diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h index faf1cc40b1..42027771d6 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h @@ -17,7 +17,7 @@ static const char successResponse[] PROGMEM = "Update Success! Rebooting...\n"; template -ESP8266HTTPUpdateServerTemplate::ESP8266HTTPUpdateServer(bool serial_debug) +ESP8266HTTPUpdateServerTemplate::ESP8266HTTPUpdateServerTemplate(bool serial_debug) { _serial_output = serial_debug; _server = NULL; diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h index 9df63e6ab2..417d9a788c 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h @@ -3,7 +3,7 @@ #include -temnplate +template class ESP8266HTTPUpdateServerTemplate { public: diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h index 59e884a0c6..d9dc7afe1b 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h @@ -441,7 +441,7 @@ void ESP8266WebServerTemplate::send_P(int code, PGM_P co char type[64]; memccpy_P((void*)type, (PGM_VOID_P)content_type, 0, sizeof(type)); _prepareHeader(header, code, (const char* )type, contentLength); - _currentClient.write(header.c_str(), header.length()); + _currentClient.write((const uint8_t *)header.c_str(), header.length()); if (contentLength) { sendContent_P(content); } @@ -496,11 +496,11 @@ void ESP8266WebServerTemplate::sendContent_P(PGM_P conte if(_chunked) { char chunkSize[11]; sprintf(chunkSize, "%zx\r\n", size); - _currentClient.write(chunkSize, strlen(chunkSize)); + _currentClient.write((const uint8_t *)chunkSize, strlen(chunkSize)); } _currentClient.write_P(content, size); if(_chunked){ - _currentClient.write(footer, 2); + _currentClient.write((const uint8_t *)footer, 2); if (size == 0) { _chunked = false; } From 9a56e85023a6788164ece263179c1de3f125f5c3 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 12 Apr 2019 09:41:09 -0700 Subject: [PATCH 03/10] Fix HTTPUpdateServer library build Need to remove dot-a linkage since there are no .cpp files in the directory anymore due to templates. --- .../SecureHTTPSUpdater/SecureHTTPSUpdater.ino | 12 +++++++++++- libraries/ESP8266HTTPUpdateServer/library.properties | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino index faf499ac7c..52ec808789 100644 --- a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino +++ b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino @@ -42,11 +42,21 @@ This example is released into the public domain. */ +// AXTLS is deprecated, do not use in new code. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #include #include #include #include #include +#include +#include +#include +#include + +#pragma GCC diagnostic pop #ifndef STASSID #define STASSID "your-ssid" @@ -60,7 +70,7 @@ const char* update_password = "admin"; const char* ssid = STASSID; const char* password = STAPSK; -ESP8266WebServerSecure httpServer(443); +ESP8266WebServerTemplate httpServer(443); ESP8266HTTPUpdateServerTemplate httpUpdater; // The certificate is stored in PMEM diff --git a/libraries/ESP8266HTTPUpdateServer/library.properties b/libraries/ESP8266HTTPUpdateServer/library.properties index 23ced5a862..b52b2e26f2 100644 --- a/libraries/ESP8266HTTPUpdateServer/library.properties +++ b/libraries/ESP8266HTTPUpdateServer/library.properties @@ -7,4 +7,4 @@ paragraph=The library accepts HTTP post requests to the /update url, and updates category=Communication url= architectures=esp8266 -dot_a_linkage=true +dot_a_linkage=false From 8a3e3eb6ec8ce7c8ba7b0f98192f03db01ce63fe Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 12 Apr 2019 10:50:12 -0700 Subject: [PATCH 04/10] Provide backward-compat names for updt template Allow existing code to use the same well known names for HTTPUpdateSecure. --- .../SecureBearSSLUpdater/SecureBearSSLUpdater.ino | 4 ++-- .../examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino | 4 ++-- .../ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h | 8 ++++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino index cdfcd793e2..a2514e171d 100644 --- a/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino +++ b/libraries/ESP8266HTTPUpdateServer/examples/SecureBearSSLUpdater/SecureBearSSLUpdater.ino @@ -31,8 +31,8 @@ const char* update_password = "admin"; const char* ssid = STASSID; const char* password = STAPSK; -BearSSL::ESP8266WebServerSecure httpServer(443); -ESP8266HTTPUpdateServerTemplate httpUpdater; +ESP8266WebServerSecure httpServer(443); +ESP8266HTTPUpdateServerSecure httpUpdater; static const char serverCert[] PROGMEM = R"EOF( -----BEGIN CERTIFICATE----- diff --git a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino index 52ec808789..a28d48de81 100644 --- a/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino +++ b/libraries/ESP8266HTTPUpdateServer/examples/SecureHTTPSUpdater/SecureHTTPSUpdater.ino @@ -70,8 +70,8 @@ const char* update_password = "admin"; const char* ssid = STASSID; const char* password = STAPSK; -ESP8266WebServerTemplate httpServer(443); -ESP8266HTTPUpdateServerTemplate httpUpdater; +axTLS::ESP8266WebServerSecure httpServer(443); +axTLS::ESP8266HTTPUpdateServerSecure httpUpdater; // The certificate is stored in PMEM static const uint8_t x509[] PROGMEM = { diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h index 417d9a788c..8629dc7cd2 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h @@ -49,4 +49,12 @@ class ESP8266HTTPUpdateServerTemplate using ESP8266HTTPUpdateServer = ESP8266HTTPUpdateServerTemplate; +namespace BearSSL { +using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; +}; + +namespace axTLS { +using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; +}; + #endif From a90a14560251358f0bb4207e78c4022f36ab2ad8 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 12 Apr 2019 12:41:05 -0700 Subject: [PATCH 05/10] Remove ClientType from all templates, auto-infer Remove the ClientType template parameter from all objects. Simplifies the code and makes it more foolproof. Add a "using" in each server to define the type of connection returned by all servers, which is then used in the above templates automatically. --- .../src/ESP8266HTTPUpdateServer-impl.h | 12 +- .../src/ESP8266HTTPUpdateServer.h | 18 +- .../src/ESP8266WebServer-impl.h | 192 +++++++++--------- .../ESP8266WebServer/src/ESP8266WebServer.h | 9 +- .../src/ESP8266WebServerSecure.h | 4 +- libraries/ESP8266WebServer/src/Parsing-impl.h | 50 ++--- .../src/detail/RequestHandler.h | 12 +- .../src/detail/RequestHandlersImpl.h | 20 +- libraries/ESP8266WiFi/src/WiFiServer.h | 1 + .../ESP8266WiFi/src/WiFiServerSecureAxTLS.h | 2 + .../ESP8266WiFi/src/WiFiServerSecureBearSSL.h | 2 + 11 files changed, 164 insertions(+), 158 deletions(-) diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h index 42027771d6..ccae49af0f 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h @@ -16,8 +16,8 @@ static const char serverIndex[] PROGMEM = static const char successResponse[] PROGMEM = "Update Success! Rebooting...\n"; -template -ESP8266HTTPUpdateServerTemplate::ESP8266HTTPUpdateServerTemplate(bool serial_debug) +template +ESP8266HTTPUpdateServerTemplate::ESP8266HTTPUpdateServerTemplate(bool serial_debug) { _serial_output = serial_debug; _server = NULL; @@ -26,8 +26,8 @@ ESP8266HTTPUpdateServerTemplate::ESP8266HTTPUpdateServer _authenticated = false; } -template -void ESP8266HTTPUpdateServerTemplate::setup(ESP8266WebServerTemplate *server, const String& path, const String& username, const String& password) +template +void ESP8266HTTPUpdateServerTemplate::setup(ESP8266WebServerTemplate *server, const String& path, const String& username, const String& password) { _server = server; _username = username; @@ -97,8 +97,8 @@ void ESP8266HTTPUpdateServerTemplate::setup(ESP8266WebSe }); } -template -void ESP8266HTTPUpdateServerTemplate::_setUpdaterError() +template +void ESP8266HTTPUpdateServerTemplate::_setUpdaterError() { if (_serial_output) Update.printError(Serial); StreamString str; diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h index 8629dc7cd2..024120745c 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h @@ -3,28 +3,28 @@ #include -template +template class ESP8266HTTPUpdateServerTemplate { public: ESP8266HTTPUpdateServerTemplate(bool serial_debug=false); - void setup(ESP8266WebServerTemplate *server) + void setup(ESP8266WebServerTemplate *server) { setup(server, emptyString, emptyString); } - void setup(ESP8266WebServerTemplate *server, const String& path) + void setup(ESP8266WebServerTemplate *server, const String& path) { setup(server, path, emptyString, emptyString); } - void setup(ESP8266WebServerTemplate *server, const String& username, const String& password) + void setup(ESP8266WebServerTemplate *server, const String& username, const String& password) { setup(server, "/update", username, password); } - void setup(ESP8266WebServerTemplate *server, const String& path, const String& username, const String& password); + void setup(ESP8266WebServerTemplate *server, const String& path, const String& username, const String& password); void updateCredentials(const String& username, const String& password) { @@ -37,7 +37,7 @@ class ESP8266HTTPUpdateServerTemplate private: bool _serial_output; - ESP8266WebServerTemplate *_server; + ESP8266WebServerTemplate *_server; String _username; String _password; bool _authenticated; @@ -47,14 +47,14 @@ class ESP8266HTTPUpdateServerTemplate #include "ESP8266HTTPUpdateServer-impl.h" -using ESP8266HTTPUpdateServer = ESP8266HTTPUpdateServerTemplate; +using ESP8266HTTPUpdateServer = ESP8266HTTPUpdateServerTemplate; namespace BearSSL { -using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; +using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; }; namespace axTLS { -using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; +using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; }; #endif diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h index d9dc7afe1b..6cc54582bb 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h @@ -43,8 +43,8 @@ static const char WWW_Authenticate[] PROGMEM = "WWW-Authenticate"; static const char Content_Length[] PROGMEM = "Content-Length"; -template -ESP8266WebServerTemplate::ESP8266WebServerTemplate(IPAddress addr, int port) +template +ESP8266WebServerTemplate::ESP8266WebServerTemplate(IPAddress addr, int port) : _server(addr, port) , _currentMethod(HTTP_ANY) , _currentVersion(0) @@ -64,8 +64,8 @@ ESP8266WebServerTemplate::ESP8266WebServerTemplate(IPAdd { } -template -ESP8266WebServerTemplate::ESP8266WebServerTemplate(int port) +template +ESP8266WebServerTemplate::ESP8266WebServerTemplate(int port) : _server(port) , _currentMethod(HTTP_ANY) , _currentVersion(0) @@ -85,8 +85,8 @@ ESP8266WebServerTemplate::ESP8266WebServerTemplate(int p { } -template -ESP8266WebServerTemplate::~ESP8266WebServerTemplate() { +template +ESP8266WebServerTemplate::~ESP8266WebServerTemplate() { _server.close(); if (_currentHeaders) delete[]_currentHeaders; @@ -98,28 +98,28 @@ ESP8266WebServerTemplate::~ESP8266WebServerTemplate() { } } -template -void ESP8266WebServerTemplate::begin() { +template +void ESP8266WebServerTemplate::begin() { close(); _server.begin(); } -template -void ESP8266WebServerTemplate::begin(uint16_t port) { +template +void ESP8266WebServerTemplate::begin(uint16_t port) { close(); _server.begin(port); } -template -String ESP8266WebServerTemplate::_extractParam(String& authReq,const String& param,const char delimit) const { +template +String ESP8266WebServerTemplate::_extractParam(String& authReq,const String& param,const char delimit) const { int _begin = authReq.indexOf(param); if (_begin == -1) return emptyString; return authReq.substring(_begin+param.length(),authReq.indexOf(delimit,_begin+param.length())); } -template -bool ESP8266WebServerTemplate::authenticate(const char * username, const char * password){ +template +bool ESP8266WebServerTemplate::authenticate(const char * username, const char * password){ if(hasHeader(FPSTR(AUTHORIZATION_HEADER))) { String authReq = header(FPSTR(AUTHORIZATION_HEADER)); if(authReq.startsWith(F("Basic"))){ @@ -223,8 +223,8 @@ bool ESP8266WebServerTemplate::authenticate(const char * return false; } -template -String ESP8266WebServerTemplate::_getRandomHexString() { +template +String ESP8266WebServerTemplate::_getRandomHexString() { char buffer[33]; // buffer to hold 32 Hex Digit + /0 int i; for(i = 0; i < 4; i++) { @@ -233,8 +233,8 @@ String ESP8266WebServerTemplate::_getRandomHexString() { return String(buffer); } -template -void ESP8266WebServerTemplate::requestAuthentication(HTTPAuthMethod mode, const char* realm, const String& authFailMsg) { +template +void ESP8266WebServerTemplate::requestAuthentication(HTTPAuthMethod mode, const char* realm, const String& authFailMsg) { if(realm == NULL) { _srealm = String(F("Login Required")); } else { @@ -251,28 +251,28 @@ void ESP8266WebServerTemplate::requestAuthentication(HTT send(401, String(FPSTR(mimeTable[html].mimeType)), authFailMsg); } -template -void ESP8266WebServerTemplate::on(const String &uri, ESP8266WebServerTemplate::THandlerFunction handler) { +template +void ESP8266WebServerTemplate::on(const String &uri, ESP8266WebServerTemplate::THandlerFunction handler) { on(uri, HTTP_ANY, handler); } -template -void ESP8266WebServerTemplate::on(const String &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn) { +template +void ESP8266WebServerTemplate::on(const String &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn) { on(uri, method, fn, _fileUploadHandler); } -template -void ESP8266WebServerTemplate::on(const String &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn, ESP8266WebServerTemplate::THandlerFunction ufn) { - _addRequestHandler(new FunctionRequestHandler(fn, ufn, uri, method)); +template +void ESP8266WebServerTemplate::on(const String &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn, ESP8266WebServerTemplate::THandlerFunction ufn) { + _addRequestHandler(new FunctionRequestHandler(fn, ufn, uri, method)); } -template -void ESP8266WebServerTemplate::addHandler(RequestHandlerType* handler) { +template +void ESP8266WebServerTemplate::addHandler(RequestHandlerType* handler) { _addRequestHandler(handler); } -template -void ESP8266WebServerTemplate::_addRequestHandler(RequestHandlerType* handler) { +template +void ESP8266WebServerTemplate::_addRequestHandler(RequestHandlerType* handler) { if (!_lastHandler) { _firstHandler = handler; _lastHandler = handler; @@ -283,13 +283,13 @@ void ESP8266WebServerTemplate::_addRequestHandler(Reques } } -template -void ESP8266WebServerTemplate::serveStatic(const char* uri, FS& fs, const char* path, const char* cache_header) { - _addRequestHandler(new StaticRequestHandler(fs, path, uri, cache_header)); +template +void ESP8266WebServerTemplate::serveStatic(const char* uri, FS& fs, const char* path, const char* cache_header) { + _addRequestHandler(new StaticRequestHandler(fs, path, uri, cache_header)); } -template -void ESP8266WebServerTemplate::handleClient() { +template +void ESP8266WebServerTemplate::handleClient() { if (_currentStatus == HC_NONE) { ClientType client = _server.available(); if (!client) { @@ -354,21 +354,21 @@ void ESP8266WebServerTemplate::handleClient() { } } -template -void ESP8266WebServerTemplate::close() { +template +void ESP8266WebServerTemplate::close() { _server.close(); _currentStatus = HC_NONE; if(!_headerKeysCount) collectHeaders(0, 0); } -template -void ESP8266WebServerTemplate::stop() { +template +void ESP8266WebServerTemplate::stop() { close(); } -template -void ESP8266WebServerTemplate::sendHeader(const String& name, const String& value, bool first) { +template +void ESP8266WebServerTemplate::sendHeader(const String& name, const String& value, bool first) { String headerLine = name; headerLine += F(": "); headerLine += value; @@ -382,13 +382,13 @@ void ESP8266WebServerTemplate::sendHeader(const String& } } -template -void ESP8266WebServerTemplate::setContentLength(const size_t contentLength) { +template +void ESP8266WebServerTemplate::setContentLength(const size_t contentLength) { _contentLength = contentLength; } -template -void ESP8266WebServerTemplate::_prepareHeader(String& response, int code, const char* content_type, size_t contentLength) { +template +void ESP8266WebServerTemplate::_prepareHeader(String& response, int code, const char* content_type, size_t contentLength) { response = String(F("HTTP/1.")) + String(_currentVersion) + ' '; response += String(code); response += ' '; @@ -417,8 +417,8 @@ void ESP8266WebServerTemplate::_prepareHeader(String& re _responseHeaders = ""; } -template -void ESP8266WebServerTemplate::send(int code, const char* content_type, const String& content) { +template +void ESP8266WebServerTemplate::send(int code, const char* content_type, const String& content) { String header; // Can we asume the following? //if(code == 200 && content.length() == 0 && _contentLength == CONTENT_LENGTH_NOT_SET) @@ -429,8 +429,8 @@ void ESP8266WebServerTemplate::send(int code, const char sendContent(content); } -template -void ESP8266WebServerTemplate::send_P(int code, PGM_P content_type, PGM_P content) { +template +void ESP8266WebServerTemplate::send_P(int code, PGM_P content_type, PGM_P content) { size_t contentLength = 0; if (content != NULL) { @@ -447,8 +447,8 @@ void ESP8266WebServerTemplate::send_P(int code, PGM_P co } } -template -void ESP8266WebServerTemplate::send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength) { +template +void ESP8266WebServerTemplate::send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength) { String header; char type[64]; memccpy_P((void*)type, (PGM_VOID_P)content_type, 0, sizeof(type)); @@ -457,18 +457,18 @@ void ESP8266WebServerTemplate::send_P(int code, PGM_P co sendContent_P(content, contentLength); } -template -void ESP8266WebServerTemplate::send(int code, char* content_type, const String& content) { +template +void ESP8266WebServerTemplate::send(int code, char* content_type, const String& content) { send(code, (const char*)content_type, content); } -template -void ESP8266WebServerTemplate::send(int code, const String& content_type, const String& content) { +template +void ESP8266WebServerTemplate::send(int code, const String& content_type, const String& content) { send(code, (const char*)content_type.c_str(), content); } -template -void ESP8266WebServerTemplate::sendContent(const String& content) { +template +void ESP8266WebServerTemplate::sendContent(const String& content) { const char * footer = "\r\n"; size_t len = content.length(); if(_chunked) { @@ -485,13 +485,13 @@ void ESP8266WebServerTemplate::sendContent(const String& } } -template -void ESP8266WebServerTemplate::sendContent_P(PGM_P content) { +template +void ESP8266WebServerTemplate::sendContent_P(PGM_P content) { sendContent_P(content, strlen_P(content)); } -template -void ESP8266WebServerTemplate::sendContent_P(PGM_P content, size_t size) { +template +void ESP8266WebServerTemplate::sendContent_P(PGM_P content, size_t size) { const char * footer = "\r\n"; if(_chunked) { char chunkSize[11]; @@ -508,8 +508,8 @@ void ESP8266WebServerTemplate::sendContent_P(PGM_P conte } -template -void ESP8266WebServerTemplate::_streamFileCore(const size_t fileSize, const String & fileName, const String & contentType) +template +void ESP8266WebServerTemplate::_streamFileCore(const size_t fileSize, const String & fileName, const String & contentType) { using namespace mime; setContentLength(fileSize); @@ -522,8 +522,8 @@ void ESP8266WebServerTemplate::_streamFileCore(const siz } -template -const String& ESP8266WebServerTemplate::arg(String name) const { +template +const String& ESP8266WebServerTemplate::arg(String name) const { for (int j = 0; j < _postArgsLen; ++j) { if ( _postArgs[j].key == name ) return _postArgs[j].value; @@ -535,27 +535,27 @@ const String& ESP8266WebServerTemplate::arg(String name) return emptyString; } -template -const String& ESP8266WebServerTemplate::arg(int i) const { +template +const String& ESP8266WebServerTemplate::arg(int i) const { if (i >= 0 && i < _currentArgCount) return _currentArgs[i].value; return emptyString; } -template -const String& ESP8266WebServerTemplate::argName(int i) const { +template +const String& ESP8266WebServerTemplate::argName(int i) const { if (i >= 0 && i < _currentArgCount) return _currentArgs[i].key; return emptyString; } -template -int ESP8266WebServerTemplate::args() const { +template +int ESP8266WebServerTemplate::args() const { return _currentArgCount; } -template -bool ESP8266WebServerTemplate::hasArg(const String& name) const { +template +bool ESP8266WebServerTemplate::hasArg(const String& name) const { for (int j = 0; j < _postArgsLen; ++j) { if (_postArgs[j].key == name) return true; @@ -568,8 +568,8 @@ bool ESP8266WebServerTemplate::hasArg(const String& name } -template -const String& ESP8266WebServerTemplate::header(String name) const { +template +const String& ESP8266WebServerTemplate::header(String name) const { for (int i = 0; i < _headerKeysCount; ++i) { if (_currentHeaders[i].key.equalsIgnoreCase(name)) return _currentHeaders[i].value; @@ -577,8 +577,8 @@ const String& ESP8266WebServerTemplate::header(String na return emptyString; } -template -void ESP8266WebServerTemplate::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) { +template +void ESP8266WebServerTemplate::collectHeaders(const char* headerKeys[], const size_t headerKeysCount) { _headerKeysCount = headerKeysCount + 1; if (_currentHeaders) delete[]_currentHeaders; @@ -589,27 +589,27 @@ void ESP8266WebServerTemplate::collectHeaders(const char } } -template -const String& ESP8266WebServerTemplate::header(int i) const { +template +const String& ESP8266WebServerTemplate::header(int i) const { if (i < _headerKeysCount) return _currentHeaders[i].value; return emptyString; } -template -const String& ESP8266WebServerTemplate::headerName(int i) const { +template +const String& ESP8266WebServerTemplate::headerName(int i) const { if (i < _headerKeysCount) return _currentHeaders[i].key; return emptyString; } -template -int ESP8266WebServerTemplate::headers() const { +template +int ESP8266WebServerTemplate::headers() const { return _headerKeysCount; } -template -bool ESP8266WebServerTemplate::hasHeader(String name) const { +template +bool ESP8266WebServerTemplate::hasHeader(String name) const { for (int i = 0; i < _headerKeysCount; ++i) { if ((_currentHeaders[i].key.equalsIgnoreCase(name)) && (_currentHeaders[i].value.length() > 0)) return true; @@ -617,23 +617,23 @@ bool ESP8266WebServerTemplate::hasHeader(String name) co return false; } -template -const String& ESP8266WebServerTemplate::hostHeader() const { +template +const String& ESP8266WebServerTemplate::hostHeader() const { return _hostHeader; } -template -void ESP8266WebServerTemplate::onFileUpload(THandlerFunction fn) { +template +void ESP8266WebServerTemplate::onFileUpload(THandlerFunction fn) { _fileUploadHandler = fn; } -template -void ESP8266WebServerTemplate::onNotFound(THandlerFunction fn) { +template +void ESP8266WebServerTemplate::onNotFound(THandlerFunction fn) { _notFoundHandler = fn; } -template -void ESP8266WebServerTemplate::_handleRequest() { +template +void ESP8266WebServerTemplate::_handleRequest() { bool handled = false; if (!_currentHandler){ #ifdef DEBUG_ESP_HTTP_SERVER @@ -664,15 +664,15 @@ void ESP8266WebServerTemplate::_handleRequest() { } -template -void ESP8266WebServerTemplate::_finalizeResponse() { +template +void ESP8266WebServerTemplate::_finalizeResponse() { if (_chunked) { sendContent(emptyString); } } -template -const String ESP8266WebServerTemplate::responseCodeToString(const int code) { +template +const String ESP8266WebServerTemplate::responseCodeToString(const int code) { switch (code) { case 100: return F("Continue"); case 101: return F("Switching Protocols"); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index c44efc6949..af7e716841 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -48,7 +48,7 @@ enum HTTPAuthMethod { BASIC_AUTH, DIGEST_AUTH }; #define CONTENT_LENGTH_UNKNOWN ((size_t) -1) #define CONTENT_LENGTH_NOT_SET ((size_t) -2) -template +template class ESP8266WebServerTemplate; typedef struct { @@ -68,7 +68,7 @@ namespace fs { class FS; } -template +template class ESP8266WebServerTemplate { public: @@ -76,7 +76,8 @@ class ESP8266WebServerTemplate ESP8266WebServerTemplate(int port = 80); ~ESP8266WebServerTemplate(); - using RequestHandlerType = RequestHandler; + using ClientType = typename ServerType::ClientType; + using RequestHandlerType = RequestHandler; void begin(); void begin(uint16_t port); @@ -207,7 +208,7 @@ class ESP8266WebServerTemplate #include "ESP8266WebServer-impl.h" #include "Parsing-impl.h" -using ESP8266WebServer = ESP8266WebServerTemplate; +using ESP8266WebServer = ESP8266WebServerTemplate; #endif //ESP8266WEBSERVER_H diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h b/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h index 5689495187..0c2cfd7c67 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h @@ -23,9 +23,9 @@ #include namespace axTLS { - using ESP8266WebServerSecure = ESP8266WebServerTemplate; + using ESP8266WebServerSecure = ESP8266WebServerTemplate; }; namespace BearSSL { - using ESP8266WebServerSecure = ESP8266WebServerTemplate; + using ESP8266WebServerSecure = ESP8266WebServerTemplate; }; diff --git a/libraries/ESP8266WebServer/src/Parsing-impl.h b/libraries/ESP8266WebServer/src/Parsing-impl.h index 5f520cd1b8..65ad38d62c 100644 --- a/libraries/ESP8266WebServer/src/Parsing-impl.h +++ b/libraries/ESP8266WebServer/src/Parsing-impl.h @@ -39,8 +39,8 @@ static const char Content_Type[] PROGMEM = "Content-Type"; static const char filename[] PROGMEM = "filename"; -template -static bool readBytesWithTimeout(ClientType& client, size_t maxLength, String& data, int timeout_ms) +template +static bool readBytesWithTimeout(typename ServerType::ClientType& client, size_t maxLength, String& data, int timeout_ms) { if (!data.reserve(maxLength + 1)) return false; @@ -60,8 +60,8 @@ static bool readBytesWithTimeout(ClientType& client, size_t maxLength, String& d return data.length() == maxLength; } -template -bool ESP8266WebServerTemplate::_parseRequest(ClientType& client) { +template +bool ESP8266WebServerTemplate::_parseRequest(ClientType& client) { // Read the first line of HTTP request String req = client.readStringUntil('\r'); #ifdef DEBUG_ESP_HTTP_SERVER @@ -181,7 +181,7 @@ bool ESP8266WebServerTemplate::_parseRequest(ClientType& String plainBuf; if ( !isForm && // read content into plainBuf - ( !readBytesWithTimeout(client, contentLength, plainBuf, HTTP_MAX_POST_WAIT) + ( !readBytesWithTimeout(client, contentLength, plainBuf, HTTP_MAX_POST_WAIT) || (plainBuf.length() < contentLength) ) ) @@ -260,8 +260,8 @@ bool ESP8266WebServerTemplate::_parseRequest(ClientType& return true; } -template -bool ESP8266WebServerTemplate::_collectHeader(const char* headerName, const char* headerValue) { +template +bool ESP8266WebServerTemplate::_collectHeader(const char* headerName, const char* headerValue) { for (int i = 0; i < _headerKeysCount; i++) { if (_currentHeaders[i].key.equalsIgnoreCase(headerName)) { _currentHeaders[i].value=headerValue; @@ -271,14 +271,14 @@ bool ESP8266WebServerTemplate::_collectHeader(const char return false; } -template +template struct storeArgHandler { void operator() (String& key, String& value, const String& data, int equal_index, int pos, int key_end_pos, int next_index) { - key = ESP8266WebServerTemplate::urlDecode(data.substring(pos, key_end_pos)); + key = ESP8266WebServerTemplate::urlDecode(data.substring(pos, key_end_pos)); if ((equal_index != -1) && ((equal_index < next_index - 1) || (next_index == -1))) - value = ESP8266WebServerTemplate::urlDecode(data.substring(equal_index + 1, next_index)); + value = ESP8266WebServerTemplate::urlDecode(data.substring(equal_index + 1, next_index)); } }; @@ -290,8 +290,8 @@ struct nullArgHandler } }; -template -void ESP8266WebServerTemplate::_parseArguments(const String& data) { +template +void ESP8266WebServerTemplate::_parseArguments(const String& data) { if (_currentArgs) delete[] _currentArgs; @@ -300,11 +300,11 @@ void ESP8266WebServerTemplate::_parseArguments(const Str // allocate one more, this is needed because {"plain": plainBuf} is always added _currentArgs = new RequestArgument[_currentArgCount + 1]; - (void)_parseArgumentsPrivate(data, storeArgHandler()); + (void)_parseArgumentsPrivate(data, storeArgHandler()); } -template -int ESP8266WebServerTemplate::_parseArgumentsPrivate(const String& data, std::function handler) { +template +int ESP8266WebServerTemplate::_parseArgumentsPrivate(const String& data, std::function handler) { #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("args: "); @@ -355,8 +355,8 @@ int ESP8266WebServerTemplate::_parseArgumentsPrivate(con return arg_total; } -template -void ESP8266WebServerTemplate::_uploadWriteByte(uint8_t b){ +template +void ESP8266WebServerTemplate::_uploadWriteByte(uint8_t b){ if (_currentUpload->currentSize == HTTP_UPLOAD_BUFLEN){ if(_currentHandler && _currentHandler->canUpload(_currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); @@ -366,8 +366,8 @@ void ESP8266WebServerTemplate::_uploadWriteByte(uint8_t _currentUpload->buf[_currentUpload->currentSize++] = b; } -template -uint8_t ESP8266WebServerTemplate::_uploadReadByte(ClientType& client){ +template +uint8_t ESP8266WebServerTemplate::_uploadReadByte(ClientType& client){ int res = client.read(); if(res == -1){ while(!client.available() && client.connected()) @@ -377,8 +377,8 @@ uint8_t ESP8266WebServerTemplate::_uploadReadByte(Client return (uint8_t)res; } -template -bool ESP8266WebServerTemplate::_parseForm(ClientType& client, const String& boundary, uint32_t len){ +template +bool ESP8266WebServerTemplate::_parseForm(ClientType& client, const String& boundary, uint32_t len){ (void) len; #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Parse Form: Boundary: "); @@ -595,8 +595,8 @@ bool ESP8266WebServerTemplate::_parseForm(ClientType& cl return false; } -template -String ESP8266WebServerTemplate::urlDecode(const String& text) +template +String ESP8266WebServerTemplate::urlDecode(const String& text) { String decoded = ""; char temp[] = "0x00"; @@ -627,8 +627,8 @@ String ESP8266WebServerTemplate::urlDecode(const String& return decoded; } -template -bool ESP8266WebServerTemplate::_parseFormUploadAborted(){ +template +bool ESP8266WebServerTemplate::_parseFormUploadAborted(){ _currentUpload->status = UPLOAD_FILE_ABORTED; if(_currentHandler && _currentHandler->canUpload(_currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandler.h b/libraries/ESP8266WebServer/src/detail/RequestHandler.h index 118f53d578..7aeb3212cb 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandler.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandler.h @@ -1,20 +1,20 @@ #ifndef REQUESTHANDLER_H #define REQUESTHANDLER_H -template +template class RequestHandler { public: virtual ~RequestHandler() { } virtual bool canHandle(HTTPMethod method, String uri) { (void) method; (void) uri; return false; } virtual bool canUpload(String uri) { (void) uri; return false; } - virtual bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) { (void) server; (void) requestMethod; (void) requestUri; return false; } - virtual void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) { (void) server; (void) requestUri; (void) upload; } + virtual bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) { (void) server; (void) requestMethod; (void) requestUri; return false; } + virtual void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) { (void) server; (void) requestUri; (void) upload; } - RequestHandler* next() { return _next; } - void next(RequestHandler* r) { _next = r; } + RequestHandler* next() { return _next; } + void next(RequestHandler* r) { _next = r; } private: - RequestHandler* _next = nullptr; + RequestHandler* _next = nullptr; }; #endif //REQUESTHANDLER_H diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h index 0d7aa860d0..a225a503f8 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h @@ -7,10 +7,10 @@ using namespace mime; -template -class FunctionRequestHandler : public RequestHandler { +template +class FunctionRequestHandler : public RequestHandler { public: - FunctionRequestHandler(typename ESP8266WebServerTemplate::THandlerFunction fn, typename ESP8266WebServerTemplate::THandlerFunction ufn, const String &uri, HTTPMethod method) + FunctionRequestHandler(typename ESP8266WebServerTemplate::THandlerFunction fn, typename ESP8266WebServerTemplate::THandlerFunction ufn, const String &uri, HTTPMethod method) : _fn(fn) , _ufn(ufn) , _uri(uri) @@ -35,7 +35,7 @@ class FunctionRequestHandler : public RequestHandler { return true; } - bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { + bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { (void) server; if (!canHandle(requestMethod, requestUri)) return false; @@ -44,7 +44,7 @@ class FunctionRequestHandler : public RequestHandler { return true; } - void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) override { + void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) override { (void) server; (void) upload; if (canUpload(requestUri)) @@ -52,14 +52,14 @@ class FunctionRequestHandler : public RequestHandler { } protected: - typename ESP8266WebServerTemplate::THandlerFunction _fn; - typename ESP8266WebServerTemplate::THandlerFunction _ufn; + typename ESP8266WebServerTemplate::THandlerFunction _fn; + typename ESP8266WebServerTemplate::THandlerFunction _ufn; String _uri; HTTPMethod _method; }; -template -class StaticRequestHandler : public RequestHandler { +template +class StaticRequestHandler : public RequestHandler { public: StaticRequestHandler(FS& fs, const char* path, const char* uri, const char* cache_header) : _fs(fs) @@ -82,7 +82,7 @@ class StaticRequestHandler : public RequestHandler { return true; } - bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { + bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { if (!canHandle(requestMethod, requestUri)) return false; diff --git a/libraries/ESP8266WiFi/src/WiFiServer.h b/libraries/ESP8266WiFi/src/WiFiServer.h index 81f2e9ab44..ec0cea17d6 100644 --- a/libraries/ESP8266WiFi/src/WiFiServer.h +++ b/libraries/ESP8266WiFi/src/WiFiServer.h @@ -62,6 +62,7 @@ class WiFiServer : public Server { void stop(); using Print::write; + using ClientType = WiFiClient; protected: long _accept(tcp_pcb* newpcb, long err); diff --git a/libraries/ESP8266WiFi/src/WiFiServerSecureAxTLS.h b/libraries/ESP8266WiFi/src/WiFiServerSecureAxTLS.h index b309eb89ed..777f7ac081 100644 --- a/libraries/ESP8266WiFi/src/WiFiServerSecureAxTLS.h +++ b/libraries/ESP8266WiFi/src/WiFiServerSecureAxTLS.h @@ -34,6 +34,8 @@ class WiFiServerSecure : public WiFiServer { void setServerKeyAndCert_P(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen); virtual ~WiFiServerSecure() {} WiFiClientSecure available(uint8_t* status = NULL); + using ClientType = WiFiClientSecure; + private: bool usePMEM = false; const uint8_t *rsakey = nullptr; diff --git a/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.h b/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.h index d104749f24..07142c7a41 100644 --- a/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.h +++ b/libraries/ESP8266WiFi/src/WiFiServerSecureBearSSL.h @@ -62,6 +62,8 @@ class WiFiServerSecure : public WiFiServer { void setServerKeyAndCert(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen); void setServerKeyAndCert_P(const uint8_t *key, int keyLen, const uint8_t *cert, int certLen); + using ClientType = WiFiClientSecure; + private: const X509List *_chain = nullptr; unsigned _cert_issuer_key_type = 0; From 06aa44f2141de6ff4291fd7fe8851e992b9fef4a Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 12 Apr 2019 12:50:00 -0700 Subject: [PATCH 06/10] Can safely include FS.h now that SD/SPIFFS unified --- libraries/ESP8266WebServer/src/ESP8266WebServer.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index af7e716841..c3dfcf1a25 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -27,6 +27,7 @@ #include #include #include +#include enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS }; enum HTTPUploadStatus { UPLOAD_FILE_START, UPLOAD_FILE_WRITE, UPLOAD_FILE_END, @@ -64,10 +65,6 @@ typedef struct { #include "detail/RequestHandler.h" -namespace fs { -class FS; -} - template class ESP8266WebServerTemplate { From 3a8e1d4df8d086ee4b0f68a09eb45ffa987bfc51 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Fri, 12 Apr 2019 13:19:33 -0700 Subject: [PATCH 07/10] Move the templates/objects to their own namespaces --- .../src/ESP8266HTTPUpdateServer-impl.h | 4 ++++ .../src/ESP8266HTTPUpdateServer.h | 11 ++++++++--- libraries/ESP8266WebServer/src/ESP8266WebServer.h | 15 ++++++++++----- .../ESP8266WebServer/src/ESP8266WebServerSecure.h | 4 ++-- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h index ccae49af0f..8131caf60c 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer-impl.h @@ -6,6 +6,8 @@ #include "StreamString.h" #include "ESP8266HTTPUpdateServer.h" +namespace esp8266httpupdateserver { +using namespace esp8266webserver; static const char serverIndex[] PROGMEM = R"(
@@ -105,3 +107,5 @@ void ESP8266HTTPUpdateServerTemplate::_setUpdaterError() Update.printError(str); _updaterError = str.c_str(); } + +}; diff --git a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h index 024120745c..73ceaf767f 100644 --- a/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h +++ b/libraries/ESP8266HTTPUpdateServer/src/ESP8266HTTPUpdateServer.h @@ -3,6 +3,9 @@ #include +namespace esp8266httpupdateserver { +using namespace esp8266webserver; + template class ESP8266HTTPUpdateServerTemplate { @@ -44,17 +47,19 @@ class ESP8266HTTPUpdateServerTemplate String _updaterError; }; +}; + #include "ESP8266HTTPUpdateServer-impl.h" -using ESP8266HTTPUpdateServer = ESP8266HTTPUpdateServerTemplate; +using ESP8266HTTPUpdateServer = esp8266httpupdateserver::ESP8266HTTPUpdateServerTemplate; namespace BearSSL { -using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; +using ESP8266HTTPUpdateServerSecure = esp8266httpupdateserver::ESP8266HTTPUpdateServerTemplate; }; namespace axTLS { -using ESP8266HTTPUpdateServerSecure = ESP8266HTTPUpdateServerTemplate; +using ESP8266HTTPUpdateServerSecure = esp8266httpupdateserver::ESP8266HTTPUpdateServerTemplate; }; #endif diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index c3dfcf1a25..4aac9dc302 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -28,6 +28,7 @@ #include #include #include +#include "detail/mimetable.h" enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS }; enum HTTPUploadStatus { UPLOAD_FILE_START, UPLOAD_FILE_WRITE, UPLOAD_FILE_END, @@ -49,9 +50,6 @@ enum HTTPAuthMethod { BASIC_AUTH, DIGEST_AUTH }; #define CONTENT_LENGTH_UNKNOWN ((size_t) -1) #define CONTENT_LENGTH_NOT_SET ((size_t) -2) -template -class ESP8266WebServerTemplate; - typedef struct { HTTPUploadStatus status; String filename; @@ -63,6 +61,11 @@ typedef struct { uint8_t buf[HTTP_UPLOAD_BUFLEN]; } HTTPUpload; +namespace esp8266webserver { + +template +class ESP8266WebServerTemplate; + #include "detail/RequestHandler.h" template @@ -201,11 +204,13 @@ class ESP8266WebServerTemplate }; - #include "ESP8266WebServer-impl.h" #include "Parsing-impl.h" -using ESP8266WebServer = ESP8266WebServerTemplate; +}; + + +using ESP8266WebServer = esp8266webserver::ESP8266WebServerTemplate; #endif //ESP8266WEBSERVER_H diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h b/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h index 0c2cfd7c67..4ab02bff07 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServerSecure.h @@ -23,9 +23,9 @@ #include namespace axTLS { - using ESP8266WebServerSecure = ESP8266WebServerTemplate; + using ESP8266WebServerSecure = esp8266webserver::ESP8266WebServerTemplate; }; namespace BearSSL { - using ESP8266WebServerSecure = ESP8266WebServerTemplate; + using ESP8266WebServerSecure = esp8266webserver::ESP8266WebServerTemplate; }; From da812db9bdc588556c661839964ba165322aeec7 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sun, 26 May 2019 16:16:18 -0700 Subject: [PATCH 08/10] Fix merge issues with untemplated methods --- .../examples/HttpHashCredAuth/HttpHashCredAuth.ino | 2 +- libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/ESP8266WebServer/examples/HttpHashCredAuth/HttpHashCredAuth.ino b/libraries/ESP8266WebServer/examples/HttpHashCredAuth/HttpHashCredAuth.ino index f77484d7e5..e37295b060 100644 --- a/libraries/ESP8266WebServer/examples/HttpHashCredAuth/HttpHashCredAuth.ino +++ b/libraries/ESP8266WebServer/examples/HttpHashCredAuth/HttpHashCredAuth.ino @@ -110,7 +110,7 @@ void setup() { ESP.restart(); } - server.setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey)); + server.getServer().setRSACert(new BearSSL::X509List(serverCert), new BearSSL::PrivateKey(serverKey)); server.on("/",showcredentialpage); //for this simple example, just show a simple page for changing credentials at the root server.on("/" + change_creds,handlecredentialchange); //handles submission of credentials from the client server.onNotFound(redirect); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h index 6403443dce..c5bcb59f75 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h @@ -156,7 +156,8 @@ bool ESP8266WebServerTemplate::authenticate(const char * username, c return false; } -bool ESP8266WebServer::authenticateDigest(const String& username, const String& H1) +template +bool ESP8266WebServerTemplate::authenticateDigest(const String& username, const String& H1) { if(hasHeader(FPSTR(AUTHORIZATION_HEADER))) { String authReq = header(FPSTR(AUTHORIZATION_HEADER)); @@ -517,7 +518,8 @@ void ESP8266WebServerTemplate::sendContent_P(PGM_P content, size_t s } } -String ESP8266WebServer::credentialHash(const String& username, const String& realm, const String& password) +template +String ESP8266WebServerTemplate::credentialHash(const String& username, const String& realm, const String& password) { MD5Builder md5; md5.begin(); From 60a6274b0d5e9bc945db587388c870abef56af98 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Tue, 2 Jul 2019 11:33:45 -0700 Subject: [PATCH 09/10] Address review comments --- libraries/ESP8266WebServer/src/ESP8266WebServer.h | 2 ++ .../ESP8266WebServer/src/detail/RequestHandler.h | 7 +++++-- .../src/detail/RequestHandlersImpl.h | 15 +++++++++------ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index e0107d712a..30a71cdfd0 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -78,6 +78,7 @@ class ESP8266WebServerTemplate using ClientType = typename ServerType::ClientType; using RequestHandlerType = RequestHandler; + using WebServerType = ESP8266WebServerTemplate; void begin(); void begin(uint16_t port); @@ -207,6 +208,7 @@ class ESP8266WebServerTemplate }; + #include "ESP8266WebServer-impl.h" #include "Parsing-impl.h" diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandler.h b/libraries/ESP8266WebServer/src/detail/RequestHandler.h index 7aeb3212cb..db840af2a1 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandler.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandler.h @@ -1,14 +1,17 @@ #ifndef REQUESTHANDLER_H #define REQUESTHANDLER_H +#include + template class RequestHandler { + using WebServerType = ESP8266WebServerTemplate; public: virtual ~RequestHandler() { } virtual bool canHandle(HTTPMethod method, String uri) { (void) method; (void) uri; return false; } virtual bool canUpload(String uri) { (void) uri; return false; } - virtual bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) { (void) server; (void) requestMethod; (void) requestUri; return false; } - virtual void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) { (void) server; (void) requestUri; (void) upload; } + virtual bool handle(WebServerType& server, HTTPMethod requestMethod, String requestUri) { (void) server; (void) requestMethod; (void) requestUri; return false; } + virtual void upload(WebServerType& server, String requestUri, HTTPUpload& upload) { (void) server; (void) requestUri; (void) upload; } RequestHandler* next() { return _next; } void next(RequestHandler* r) { _next = r; } diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h index a225a503f8..1c930aed76 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h @@ -1,6 +1,7 @@ #ifndef REQUESTHANDLERSIMPL_H #define REQUESTHANDLERSIMPL_H +#include #include "RequestHandler.h" #include "mimetable.h" #include "WString.h" @@ -9,8 +10,9 @@ using namespace mime; template class FunctionRequestHandler : public RequestHandler { + using WebServerType = ESP8266WebServerTemplate; public: - FunctionRequestHandler(typename ESP8266WebServerTemplate::THandlerFunction fn, typename ESP8266WebServerTemplate::THandlerFunction ufn, const String &uri, HTTPMethod method) + FunctionRequestHandler(typename WebServerType::THandlerFunction fn, typename WebServerType::THandlerFunction ufn, const String &uri, HTTPMethod method) : _fn(fn) , _ufn(ufn) , _uri(uri) @@ -35,7 +37,7 @@ class FunctionRequestHandler : public RequestHandler { return true; } - bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { + bool handle(WebServerType& server, HTTPMethod requestMethod, String requestUri) override { (void) server; if (!canHandle(requestMethod, requestUri)) return false; @@ -44,7 +46,7 @@ class FunctionRequestHandler : public RequestHandler { return true; } - void upload(ESP8266WebServerTemplate& server, String requestUri, HTTPUpload& upload) override { + void upload(WebServerType& server, String requestUri, HTTPUpload& upload) override { (void) server; (void) upload; if (canUpload(requestUri)) @@ -52,14 +54,15 @@ class FunctionRequestHandler : public RequestHandler { } protected: - typename ESP8266WebServerTemplate::THandlerFunction _fn; - typename ESP8266WebServerTemplate::THandlerFunction _ufn; + typename WebServerType::THandlerFunction _fn; + typename WebServerType::THandlerFunction _ufn; String _uri; HTTPMethod _method; }; template class StaticRequestHandler : public RequestHandler { + using WebServerType = ESP8266WebServerTemplate; public: StaticRequestHandler(FS& fs, const char* path, const char* uri, const char* cache_header) : _fs(fs) @@ -82,7 +85,7 @@ class StaticRequestHandler : public RequestHandler { return true; } - bool handle(ESP8266WebServerTemplate& server, HTTPMethod requestMethod, String requestUri) override { + bool handle(WebServerType& server, HTTPMethod requestMethod, String requestUri) override { if (!canHandle(requestMethod, requestUri)) return false; From 613d2c1540699f45f9949690772e859a2ebda4ad Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Wed, 3 Jul 2019 20:10:01 -0700 Subject: [PATCH 10/10] Fix mock test, remove warnings inside test dir Make the simple mock test CI job pass and clean up any spurious warnings in the test directory. There still are warnings in the libraries and core, but they should be addressed in a separate PR. --- tests/host/Makefile | 2 -- tests/host/common/MockEsp.cpp | 3 +++ tests/host/common/MockUART.cpp | 13 +++++++++++++ tests/host/common/UdpContextSocket.cpp | 3 +++ tests/host/common/sdfs_mock.h | 2 +- 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/tests/host/Makefile b/tests/host/Makefile index 19444e6c40..fd506d3574 100644 --- a/tests/host/Makefile +++ b/tests/host/Makefile @@ -260,8 +260,6 @@ ARDUINO_LIBS := \ OPT_ARDUINO_LIBS ?= $(addprefix ../../libraries/,\ $(addprefix ESP8266WebServer/src/,\ - ESP8266WebServer.cpp \ - Parsing.cpp \ detail/mimetable.cpp \ ) \ $(addprefix ESP8266mDNS/src/,\ diff --git a/tests/host/common/MockEsp.cpp b/tests/host/common/MockEsp.cpp index 21a124b80d..8ff16cd01a 100644 --- a/tests/host/common/MockEsp.cpp +++ b/tests/host/common/MockEsp.cpp @@ -94,6 +94,7 @@ uint32_t EspClass::getChipId() bool EspClass::checkFlashConfig(bool needsEquals) { + (void) needsEquals; return true; } @@ -143,6 +144,7 @@ void EspClass::getHeapStats(uint32_t* hfree, uint16_t* hmax, uint8_t* hfrag) { bool EspClass::flashEraseSector(uint32_t sector) { + (void) sector; return true; } @@ -153,6 +155,7 @@ FlashMode_t EspClass::getFlashChipMode() FlashMode_t EspClass::magicFlashChipMode(uint8_t byte) { + (void) byte; return FM_DOUT; } diff --git a/tests/host/common/MockUART.cpp b/tests/host/common/MockUART.cpp index 152072bca8..6c6a54ab35 100644 --- a/tests/host/common/MockUART.cpp +++ b/tests/host/common/MockUART.cpp @@ -255,6 +255,7 @@ uart_tx_free(uart_t* uart) void uart_wait_tx_empty(uart_t* uart) { + (void) uart; } void @@ -291,6 +292,8 @@ uart_get_baudrate(uart_t* uart) uart_t* uart_init(int uart_nr, int baudrate, int config, int mode, int tx_pin, size_t rx_size) { + (void) config; + (void) tx_pin; uart_t* uart = (uart_t*) malloc(sizeof(uart_t)); if(uart == NULL) return NULL; @@ -361,16 +364,23 @@ uart_uninit(uart_t* uart) void uart_swap(uart_t* uart, int tx_pin) { + (void) uart; + (void) tx_pin; } void uart_set_tx(uart_t* uart, int tx_pin) { + (void) uart; + (void) tx_pin; } void uart_set_pins(uart_t* uart, int tx, int rx) { + (void) uart; + (void) tx; + (void) rx; } bool @@ -405,6 +415,7 @@ uart_has_overrun(uart_t* uart) bool uart_has_rx_error(uart_t* uart) { + (void) uart; return false; } @@ -423,11 +434,13 @@ uart_get_debug() void uart_start_detect_baudrate(int uart_nr) { + (void) uart_nr; } int uart_detect_baudrate(int uart_nr) { + (void) uart_nr; return 115200; } diff --git a/tests/host/common/UdpContextSocket.cpp b/tests/host/common/UdpContextSocket.cpp index 83d47053f7..13c9b2d31c 100644 --- a/tests/host/common/UdpContextSocket.cpp +++ b/tests/host/common/UdpContextSocket.cpp @@ -77,6 +77,7 @@ bool mockUDPListen (int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast) // Filling server information servaddr.sin_family = AF_INET; //servaddr.sin_addr.s_addr = global_ipv4_netfmt?: dstaddr; + (void) dstaddr; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(mockport); @@ -153,6 +154,7 @@ size_t mockUDPFillInBuf (int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& size_t mockUDPPeekBytes (int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf, size_t& ccinbufsize) { + (void) sock; if (usersize > CCBUFSIZE) fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE, usersize - CCBUFSIZE, usersize); @@ -184,6 +186,7 @@ size_t mockUDPRead (int sock, char* dst, size_t size, int timeout_ms, char* ccin size_t mockUDPWrite (int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4, uint16_t port) { + (void) timeout_ms; // Filling server information struct sockaddr_in peer; peer.sin_family = AF_INET; diff --git a/tests/host/common/sdfs_mock.h b/tests/host/common/sdfs_mock.h index 4508e1a903..611474701a 100644 --- a/tests/host/common/sdfs_mock.h +++ b/tests/host/common/sdfs_mock.h @@ -23,7 +23,7 @@ class SDFSMock { public: - SDFSMock(ssize_t fs_size, size_t fs_block, size_t fs_page, const String& storage = emptyString) { } + SDFSMock(ssize_t fs_size, size_t fs_block, size_t fs_page, const String& storage = emptyString) { (void)fs_size; (void)fs_block; (void)fs_page; (void)storage; } void reset() { } ~SDFSMock() { } };