From 559670baaa7a4c4ab17777130ee1e1d5c795e26a Mon Sep 17 00:00:00 2001 From: aalku Date: Fri, 14 Aug 2015 22:30:15 +0200 Subject: [PATCH] Host header support --- .../ESP8266WebServer/src/ESP8266WebServer.cpp | 4 +++ .../ESP8266WebServer/src/ESP8266WebServer.h | 4 +++ libraries/ESP8266WebServer/src/Parsing.cpp | 35 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index 2f5b68a14..3af856184 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -253,6 +253,10 @@ bool ESP8266WebServer::hasArg(const char* name) { return false; } +String ESP8266WebServer::hostHeader() { + return _hostHeader; +} + void ESP8266WebServer::onFileUpload(THandlerFunction fn) { _fileUploadHandler = fn; } diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index ae38eb8cc..3382de3d0 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -80,6 +80,8 @@ public: int args(); // get arguments count bool hasArg(const char* name); // check if argument exists + String hostHeader(); // get request host header if available or empty String if not + // send response to the client // code - HTTP response code, can be 200 or 404 // content_type - HTTP content type, like "text/plain" or "image/png" @@ -134,6 +136,8 @@ protected: size_t _contentLength; String _responseHeaders; + String _hostHeader; + RequestHandler* _firstHandler; RequestHandler* _lastHandler; THandlerFunction _notFoundHandler; diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index 682839d13..431c7ee66 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -94,6 +94,14 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { } headerName = req.substring(0, headerDiv); headerValue = req.substring(headerDiv + 2); + + #ifdef DEBUG + DEBUG_OUTPUT.print("headerName: "); + DEBUG_OUTPUT.println(headerName); + DEBUG_OUTPUT.print("headerValue: "); + DEBUG_OUTPUT.println(headerValue); + #endif + if (headerName == "Content-Type"){ if (headerValue.startsWith("text/plain")){ isForm = false; @@ -103,6 +111,8 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { } } else if (headerName == "Content-Length"){ contentLength = headerValue.toInt(); + } else if (headerName == "Host"){ + _hostHeader = headerValue; } } @@ -134,6 +144,31 @@ bool ESP8266WebServer::_parseRequest(WiFiClient& client) { _parseForm(client, boundaryStr, contentLength); } } else { + String headerName; + String headerValue; + //parse headers + while(1){ + req = client.readStringUntil('\r'); + client.readStringUntil('\n'); + if (req == "") break;//no moar headers + int headerDiv = req.indexOf(':'); + if (headerDiv == -1){ + break; + } + headerName = req.substring(0, headerDiv); + headerValue = req.substring(headerDiv + 2); + + #ifdef DEBUG + DEBUG_OUTPUT.print("headerName: "); + DEBUG_OUTPUT.println(headerName); + DEBUG_OUTPUT.print("headerValue: "); + DEBUG_OUTPUT.println(headerValue); + #endif + + if (headerName == "Host"){ + _hostHeader = headerValue; + } + } _parseArguments(searchStr); } client.flush();