diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp index c4db82225..83a68ce9f 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.cpp @@ -221,6 +221,32 @@ String ESP8266WebServer::arg(const char* name) return String(); } +String ESP8266WebServer::arg(int i) +{ + if (i < _currentArgCount) + return _currentArgs[i].value; + return String(); +} + +String ESP8266WebServer::argName(int i) +{ + if (i < _currentArgCount) + return _currentArgs[i].key; + return String(); +} + +int ESP8266WebServer::args(){ + return _currentArgCount; +} + +bool ESP8266WebServer::hasArg(const char* name) +{ + for (int i = 0; i < _currentArgCount; ++i) { + if (_currentArgs[i].key == name) + return true; + } + return false; +} void ESP8266WebServer::_parseArguments(String data) { @@ -293,6 +319,9 @@ void ESP8266WebServer::_parseArguments(String data) } +void ESP8266WebServer::onNotFound(TNotFoundHandlerFunction fn){ + _notFoundHandler = fn; +} void ESP8266WebServer::_handleRequest(WiFiClient& client, String uri, HTTPMethod method) { _currentClient = client; @@ -312,12 +341,12 @@ void ESP8266WebServer::_handleRequest(WiFiClient& client, String uri, HTTPMethod break; } - if (!handler) - { + if (!handler){ #ifdef DEBUG Serial.println("request handler not found"); #endif - send(404, "text/plain", String("Not found: ") + uri); + if(!_notFoundHandler || !_notFoundHandler()) + send(404, "text/plain", String("Not found: ") + uri); } _currentClient = WiFiClient(); diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 6d9c5ffb5..2c3000447 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -39,22 +39,27 @@ public: void handleClient(); typedef std::function THandlerFunction; + typedef std::function TNotFoundHandlerFunction; void on(const char* uri, THandlerFunction handler); void on(const char* uri, HTTPMethod method, THandlerFunction fn); + void onNotFound(TNotFoundHandlerFunction fn);//called when handler is not assigned String uri() { return _currentUri; } HTTPMethod method() { return _currentMethod; } WiFiClient client() { return _currentClient; } - + + String arg(const char* name);// get request argument value + String arg(int i);// get request argument value buy number + String argName(int i);// get request argument name buy number + int args();//get arguments count + bool hasArg(const char* name);//check if argument exists + // 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" // content - actual content body void send(int code, const char* content_type = NULL, String content = String("")); - // get request argument value - String arg(const char* name); - protected: void _handleRequest(WiFiClient& client, String uri, HTTPMethod method); void _parseArguments(String data); @@ -76,6 +81,7 @@ protected: RequestHandler* _firstHandler; RequestHandler* _lastHandler; + TNotFoundHandlerFunction _notFoundHandler; };