From 81af3a061eb6ebecd7474ae4bd9653103e032102 Mon Sep 17 00:00:00 2001 From: ficeto Date: Fri, 1 May 2015 02:43:51 +0300 Subject: [PATCH] adding extra finctionaity the the web server void onNotFound(bool(void)) handler routes and errors not in the defined handlers int args() returns nubmer of currentarguments String arg(int i) returns the "i" argument value String argName(int i) returns the "i" argument name(key) bool hasArg(const char * name) looks up if an argument exist by seraching for it's key --- .../ESP8266WebServer/src/ESP8266WebServer.cpp | 35 +++++++++++++++++-- .../ESP8266WebServer/src/ESP8266WebServer.h | 14 +++++--- 2 files changed, 42 insertions(+), 7 deletions(-) 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; };