From 5a775e75ca60ab0bae7f3a2206343b06f553622b Mon Sep 17 00:00:00 2001 From: Victor Aprea Date: Sat, 20 Apr 2019 15:32:53 -0400 Subject: [PATCH 1/5] add support for CORS headers --- libraries/WebServer/src/WebServer.cpp | 18 ++++++++++++++++-- libraries/WebServer/src/WebServer.h | 8 +++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index 2057b230eea..f8f9b2ee266 100644 --- a/libraries/WebServer/src/WebServer.cpp +++ b/libraries/WebServer/src/WebServer.cpp @@ -55,6 +55,7 @@ WebServer::WebServer(IPAddress addr, int port) , _currentHeaders(nullptr) , _contentLength(0) , _chunked(false) +, _corsEnabled(false) { } @@ -75,6 +76,7 @@ WebServer::WebServer(int port) , _currentHeaders(nullptr) , _contentLength(0) , _chunked(false) +, _corsEnabled(false) { } @@ -104,7 +106,7 @@ void WebServer::begin(uint16_t port) { String WebServer::_extractParam(String& authReq,const String& param,const char delimit){ int _begin = authReq.indexOf(param); - if (_begin == -1) + if (_begin == -1) return ""; return authReq.substring(_begin+param.length(),authReq.indexOf(delimit,_begin+param.length())); } @@ -348,6 +350,11 @@ void WebServer::stop() { close(); } +void setCORS(boolean value) { + +} + + void WebServer::sendHeader(const String& name, const String& value, bool first) { String headerLine = name; headerLine += F(": "); @@ -366,6 +373,10 @@ void WebServer::setContentLength(const size_t contentLength) { _contentLength = contentLength; } +void WebServer::setCORS(boolean value) { + _corsEnabled = value; +} + void WebServer::_prepareHeader(String& response, int code, const char* content_type, size_t contentLength) { response = String(F("HTTP/1.")) + String(_currentVersion) + ' '; response += String(code); @@ -388,6 +399,9 @@ void WebServer::_prepareHeader(String& response, int code, const char* content_t sendHeader(String(F("Accept-Ranges")),String(F("none"))); sendHeader(String(F("Transfer-Encoding")),String(F("chunked"))); } + if (_corsEnabled) { + sendHeader(String(FPSTR("Access-Control-Allow-Origin")), String("*")); + } sendHeader(String(F("Connection")), String(F("close"))); response += _responseHeaders; @@ -494,7 +508,7 @@ void WebServer::_streamFileCore(const size_t fileSize, const String & fileName, send(200, contentType, ""); } -String WebServer::pathArg(unsigned int i) { +String WebServer::pathArg(unsigned int i) { if (_currentHandler != nullptr) return _currentHandler->pathArg(i); return ""; diff --git a/libraries/WebServer/src/WebServer.h b/libraries/WebServer/src/WebServer.h index aedfb40fb49..ccaebd106aa 100644 --- a/libraries/WebServer/src/WebServer.h +++ b/libraries/WebServer/src/WebServer.h @@ -122,6 +122,7 @@ class WebServer void send_P(int code, PGM_P content_type, PGM_P content); void send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength); + void setCORS(boolean value); void setContentLength(const size_t contentLength); void sendHeader(const String& name, const String& value, bool first = false); void sendContent(const String& content); @@ -130,12 +131,12 @@ class WebServer static String urlDecode(const String& text); - template + template size_t streamFile(T &file, const String& contentType) { _streamFileCore(file.size(), file.name(), contentType); return _currentClient.write(file); } - + 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 ); } @@ -151,7 +152,7 @@ class WebServer int _uploadReadByte(WiFiClient& client); void _prepareHeader(String& response, int code, const char* content_type, size_t contentLength); bool _collectHeader(const char* headerName, const char* headerValue); - + void _streamFileCore(const size_t fileSize, const String & fileName, const String & contentType); String _getRandomHexString(); @@ -163,6 +164,7 @@ class WebServer String value; }; + boolean _corsEnabled; WiFiServer _server; WiFiClient _currentClient; From 33d69ecb1aafb8750f0be95f50949f49bb01e2f5 Mon Sep 17 00:00:00 2001 From: Victor Aprea Date: Sat, 20 Apr 2019 15:36:53 -0400 Subject: [PATCH 2/5] remove accidental function impl --- libraries/WebServer/src/WebServer.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index f8f9b2ee266..408adeb753c 100644 --- a/libraries/WebServer/src/WebServer.cpp +++ b/libraries/WebServer/src/WebServer.cpp @@ -350,11 +350,6 @@ void WebServer::stop() { close(); } -void setCORS(boolean value) { - -} - - void WebServer::sendHeader(const String& name, const String& value, bool first) { String headerLine = name; headerLine += F(": "); From 5395e16eb041b1276c80219a77ce87fe46a46451 Mon Sep 17 00:00:00 2001 From: Victor Aprea Date: Mon, 22 Apr 2019 10:13:43 -0400 Subject: [PATCH 3/5] rename setCORS to enableCORS, and add aliased function enableCrossOrigin --- libraries/WebServer/src/WebServer.cpp | 6 +++++- libraries/WebServer/src/WebServer.h | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index 408adeb753c..5dfb14f4767 100644 --- a/libraries/WebServer/src/WebServer.cpp +++ b/libraries/WebServer/src/WebServer.cpp @@ -368,10 +368,14 @@ void WebServer::setContentLength(const size_t contentLength) { _contentLength = contentLength; } -void WebServer::setCORS(boolean value) { +void WebServer::enableCORS(boolean value) { _corsEnabled = value; } +void WebServer::enableCrossOrigin(boolean value) { + enableCORS(value); +} + void WebServer::_prepareHeader(String& response, int code, const char* content_type, size_t contentLength) { response = String(F("HTTP/1.")) + String(_currentVersion) + ' '; response += String(code); diff --git a/libraries/WebServer/src/WebServer.h b/libraries/WebServer/src/WebServer.h index ccaebd106aa..97aa032e1f4 100644 --- a/libraries/WebServer/src/WebServer.h +++ b/libraries/WebServer/src/WebServer.h @@ -122,7 +122,9 @@ class WebServer void send_P(int code, PGM_P content_type, PGM_P content); void send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength); - void setCORS(boolean value); + void enableCORS(boolean value = true); + void enableCrossOrigin(boolean value = true); + void setContentLength(const size_t contentLength); void sendHeader(const String& name, const String& value, bool first = false); void sendContent(const String& content); From d84f1e7f7fa63a0b5e721b5f47e7a16cfe12f106 Mon Sep 17 00:00:00 2001 From: Victor Aprea Date: Wed, 26 Jun 2019 14:10:26 -0400 Subject: [PATCH 4/5] fix accidentally introduced change and commit proposed fix --- libraries/WebServer/src/WebServer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index 29adca1dc85..90416f90b1a 100644 --- a/libraries/WebServer/src/WebServer.cpp +++ b/libraries/WebServer/src/WebServer.cpp @@ -56,7 +56,6 @@ WebServer::WebServer(IPAddress addr, int port) , _currentHeaders(nullptr) , _contentLength(0) , _chunked(false) -, _corsEnabled(false) { } @@ -78,7 +77,6 @@ WebServer::WebServer(int port) , _currentHeaders(nullptr) , _contentLength(0) , _chunked(false) -, _corsEnabled(false) { } @@ -304,7 +302,9 @@ void WebServer::handleClient() { // Wait for data from client to become available if (_currentClient.available()) { if (_parseRequest(_currentClient)) { - _currentClient.setTimeout(HTTP_MAX_SEND_WAIT); + // because HTTP_MAX_SEND_WAIT is expressed in milliseconds, + // it must be divided by 1000 + _currentClient.setTimeout(HTTP_MAX_SEND_WAIT / 1000); _contentLength = CONTENT_LENGTH_NOT_SET; _handleRequest(); From d82205e4d0eb370ecc08d6d12f7b682b83d9169f Mon Sep 17 00:00:00 2001 From: Victor Aprea Date: Wed, 26 Jun 2019 15:01:23 -0400 Subject: [PATCH 5/5] found an adjacent misuse of setTimeout in httpUpdateSecure example --- .../HTTPUpdate/examples/httpUpdateSecure/httpUpdateSecure.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/HTTPUpdate/examples/httpUpdateSecure/httpUpdateSecure.ino b/libraries/HTTPUpdate/examples/httpUpdateSecure/httpUpdateSecure.ino index e7e93eeadc8..5daa2a4f2a1 100644 --- a/libraries/HTTPUpdate/examples/httpUpdateSecure/httpUpdateSecure.ino +++ b/libraries/HTTPUpdate/examples/httpUpdateSecure/httpUpdateSecure.ino @@ -96,7 +96,7 @@ void loop() { client.setCACert(rootCACertificate); // Reading data over SSL may be slow, use an adequate timeout - client.setTimeout(12000); + client.setTimeout(12000 / 1000); // timeout argument is defined in seconds for setTimeout // The line below is optional. It can be used to blink the LED on the board during flashing // The LED will be on during download of one buffer of data from the network. The LED will