From 672e4faa92b0560352f34fd99f67ff388e05d413 Mon Sep 17 00:00:00 2001 From: Victor Aprea Date: Mon, 22 Apr 2019 14:52:39 -0400 Subject: [PATCH] Add optional support for CORS headers (#2688) * add support for CORS headers * remove accidental function impl * rename setCORS to enableCORS, and add aliased function enableCrossOrigin --- libraries/WebServer/src/WebServer.cpp | 17 +++++++++++++++-- libraries/WebServer/src/WebServer.h | 10 +++++++--- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/libraries/WebServer/src/WebServer.cpp b/libraries/WebServer/src/WebServer.cpp index 2057b230..5dfb14f4 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())); } @@ -366,6 +368,14 @@ void WebServer::setContentLength(const size_t contentLength) { _contentLength = contentLength; } +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); @@ -388,6 +398,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 +507,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 aedfb40f..97aa032e 100644 --- a/libraries/WebServer/src/WebServer.h +++ b/libraries/WebServer/src/WebServer.h @@ -122,6 +122,9 @@ public: 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 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); @@ -130,12 +133,12 @@ public: 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 +154,7 @@ protected: 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 +166,7 @@ protected: String value; }; + boolean _corsEnabled; WiFiServer _server; WiFiClient _currentClient;