From 0dbb04e88183f5304d1ade9b60058e16e4f9a252 Mon Sep 17 00:00:00 2001 From: Zakary Kamal Ismail Date: Sat, 17 Aug 2019 14:58:40 -0400 Subject: [PATCH] Add HTTP_HEAD to HTTPMethod and parse it (#6413) * Add HTTP_HEAD to HTTPMethod * Parse the HTTP_HEAD variant of HTTPMethod from a method string * Add HTTP_HEAD to the ESP8266WebServer constants * Skip sending the content of the response if the HTTP method is HEAD method * Convert the HTTP status code 418 to string This status code is an easter egg from the IETF and is described in [RFC2324](https://tools.ietf.org/html/rfc2324#section-2.3.2) --- libraries/ESP8266WebServer/keywords.txt | 1 + libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h | 2 ++ libraries/ESP8266WebServer/src/ESP8266WebServer.h | 6 +++--- libraries/ESP8266WebServer/src/Parsing-impl.h | 4 +++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/libraries/ESP8266WebServer/keywords.txt b/libraries/ESP8266WebServer/keywords.txt index e68547eb2..73cba339c 100644 --- a/libraries/ESP8266WebServer/keywords.txt +++ b/libraries/ESP8266WebServer/keywords.txt @@ -42,6 +42,7 @@ hostHeader KEYWORD2 ####################################### HTTP_GET LITERAL1 +HTTP_HEAD LITERAL1 HTTP_POST LITERAL1 HTTP_ANY LITERAL1 CONTENT_LENGTH_UNKNOWN LITERAL1 diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h index c5bcb59f7..3af7ca394 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h @@ -480,6 +480,7 @@ void ESP8266WebServerTemplate::send(int code, const String& content_ template void ESP8266WebServerTemplate::sendContent(const String& content) { + if (_currentMethod == HTTP_HEAD) return; const char * footer = "\r\n"; size_t len = content.length(); if(_chunked) { @@ -728,6 +729,7 @@ const String ESP8266WebServerTemplate::responseCodeToString(const in case 415: return F("Unsupported Media Type"); case 416: return F("Requested range not satisfiable"); case 417: return F("Expectation Failed"); + case 418: return F("I'm a teapot"); case 500: return F("Internal Server Error"); case 501: return F("Not Implemented"); case 502: return F("Bad Gateway"); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 6eec446d9..9b7c2bbb3 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -30,7 +30,7 @@ #include #include "detail/mimetable.h" -enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS }; +enum HTTPMethod { HTTP_ANY, HTTP_GET, HTTP_HEAD, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS }; enum HTTPUploadStatus { UPLOAD_FILE_START, UPLOAD_FILE_WRITE, UPLOAD_FILE_END, UPLOAD_FILE_ABORTED }; enum HTTPClientStatus { HC_NONE, HC_WAIT_READ, HC_WAIT_CLOSE }; @@ -194,10 +194,10 @@ protected: std::unique_ptr _currentUpload; int _postArgsLen; RequestArgument* _postArgs; - + int _headerKeysCount; RequestArgument* _currentHeaders; - + size_t _contentLength; String _responseHeaders; diff --git a/libraries/ESP8266WebServer/src/Parsing-impl.h b/libraries/ESP8266WebServer/src/Parsing-impl.h index 65ad38d62..c6b8ea16e 100644 --- a/libraries/ESP8266WebServer/src/Parsing-impl.h +++ b/libraries/ESP8266WebServer/src/Parsing-impl.h @@ -99,7 +99,9 @@ bool ESP8266WebServerTemplate::_parseRequest(ClientType& client) { _chunked = false; HTTPMethod method = HTTP_GET; - if (methodStr == F("POST")) { + if (methodStr == F("HEAD")) { + method = HTTP_HEAD; + } else if (methodStr == F("POST")) { method = HTTP_POST; } else if (methodStr == F("DELETE")) { method = HTTP_DELETE;