From 63ead30ad01614c9b747e1039dc4803ec044cb69 Mon Sep 17 00:00:00 2001 From: anschrammh Date: Thu, 10 Oct 2019 18:16:33 +0200 Subject: [PATCH] Moved the HttpRequestData Structure from the WEBClient class to the WEBServer class --- src/software_test/tcpServer_test/WEBServer.h | 69 ++++++++++++++++---- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/src/software_test/tcpServer_test/WEBServer.h b/src/software_test/tcpServer_test/WEBServer.h index 21d4dde..536d984 100644 --- a/src/software_test/tcpServer_test/WEBServer.h +++ b/src/software_test/tcpServer_test/WEBServer.h @@ -5,6 +5,9 @@ #include "Dictionary.h" #define DEBUG_WEBS +//forward declaration of HttpRequestData implemented in WEBClient.h +struct HttpRequestData; + template class WEBServer : public TCPServer { @@ -14,9 +17,38 @@ class WEBServer : public TCPServer enum HttpMIMEType{UNKNOWN_MIME, TEXT_PLAIN, TEXT_CSS, TEXT_HTML, TEXT_JAVASCRIPT, APPLICATION_JSON, APPLICATION_X_WWW_FORM_URLENCODED, IMAGE_PNG, IMAGE_JPEG, AUDIO_MPEG, APPLICATION_OCTET_STREAM}; enum HttpParserStatus {HTTP_VERB, HTTP_RESSOURCE, HTTP_VERSION, HTTP_PARAMS, POST_DATA}; enum WEBClientState {ACCEPTED, QUERY_PARSED, RESPONSE_SENT, DONE}; - enum HTTP_CODE {_400, _401, _403, _404, _500, _501}; + enum HTTP_CODE {_100, _101, _200, _400, _401, _403, _404, _405, _500, _501}; + + struct HttpRequestData + { + HttpRequestMethod HRM; + HttpVersion HV; + HttpMIMEType HMT; + + Dictionary getParams; + char *getParamsDataPointer; //Used in the getParams algorithm + Dictionary postParams; + char *postParamsDataPointer; //Used in the postParams algorithm + + char *httpResource; + uint16_t maxResourceBuffer; + char *httpBody; + uint16_t maxBodyBuffer; + }; WEBServer(unsigned int port = 80, uint8_t maxClient = MAX_CLIENT, uint16_t clientDataBufferSize = 512) : TCPServer(port, maxClient, clientDataBufferSize) {} + + boolean addApiRoutine(const char *uri, boolean (*apiRoutine)(HttpRequestData&, WiFiClient*, void*), void *pData, HttpRequestMethod HRM = UNDEFINED) + { + return _apiDictionary.add(uri, new ApiRoutine({apiRoutine, pData, HRM})); + } + + void clearApiRoutine() { _apiDictionary.clear(); }; + + boolean removeApiRoutine(const char* uri) + { + return _apiDictionary.remove(uri); + } protected: private: virtual T* createNewClient(WiFiClient wc) @@ -43,9 +75,7 @@ class WEBServer : public TCPServer break; case DONE: break; - } - - + } } void queryParser(T *client) @@ -253,23 +283,25 @@ class WEBServer : public TCPServer void sendInfoResponse(HTTP_CODE http_code, T *client, const char *message) { + uint16_t code(0); + char codeLiteral[100]; switch(http_code) { case _500: - client->_client.print(F("HTTP/1.1 500 Internal Server Error\r\nContent-Type: text/html\r\nContent-Length: ")); - client->_client.print(strlen(message) + 59); - client->_client.print(F("\r\n\r\n\r\n\r\n

Error 500

")); - client->_client.print(message); - client->_client.print(F("

\r\n")); + code = 500; + strcpy_P(codeLiteral,(PGM_P)F("Internal Server Error")); break; case _400: - client->_client.print(F("HTTP/1.1 400 Bad Request\r\nContent-Type: text/html\r\nContent-Length: ")); - client->_client.print(strlen(message) + 59); - client->_client.print(F("\r\n\r\n\r\n\r\n

Error 400

")); - client->_client.print(message); - client->_client.print(F("

\r\n")); + code = 400; + strcpy_P(codeLiteral,(PGM_P)F("Bad Request")); break; } + + client->_client.print(F("HTTP/1.1 "));client->_client.print(code);client->_client.print(F(" "));client->_client.print(codeLiteral);client->_client.print(F("\r\nContent-Type: text/html\r\nContent-Length: ")); + client->_client.print(strlen(message) + 59); + client->_client.print(F("\r\n\r\n\r\n\r\n

Error "));client->_client.print(code);client->_client.print(F("

")); + client->_client.print(message); + client->_client.print(F("

\r\n")); } /*Static helper methods*/ @@ -300,6 +332,15 @@ class WEBServer : public TCPServer else return HttpVersion::UNKNOWN; } + + struct ApiRoutine + { + boolean (*apiRoutine)(HttpRequestData&, WiFiClient*, void*); + void *pData; + HttpRequestMethod HRM; + }; + + Dictionary _apiDictionary; }; #endif //WEBSERVER_H