HTTPServer
Diff: HTTPConnection.h
- Revision:
- 0:caf5feddac47
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPConnection.h Sat Sep 16 02:39:55 2017 +0000 @@ -0,0 +1,139 @@ +/* HTTPConnection.h */ +/* +Copyright (c) 2013 Henry Leinen (henry[dot]leinen [at] online [dot] de) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ +#ifndef __HTTPConnection_H__ +#define __HTTPConnection_H__ + +#include "mbed.h" +#include "TCPSocketConnection.h" + +#include <string> +#include <map> + +class HTTPServer; + +/** Type HTTPRequestType enumerates request types +*/ +typedef enum +{ + HTTP_RT_GET, /*!< GET request */ + HTTP_RT_POST, /*!< POST request */ + HTTP_RT_PUT, /*!< PUT request */ + HTTP_RT_OPTIONS, /*!< OPTIONS request */ + HTTP_RT_HEAD, /*!< HEAD request */ + HTTP_RT_DELETE, /*!< DELETE request */ + HTTP_RT_TRACE, /*!< TRACE request */ + HTTP_RT_CONNECT /*!< CONNECT request */ +} HTTPRequestType; + +/** class HTTPConnection, encapsulates one connection being made throught the HTTPServer + * + */ +class HTTPConnection { + public: + + /** HTTPMessage contains all the details of the request received by external HTTP client. + */ + typedef struct + { + /** Specifies the request type received + */ + HTTPRequestType request; + /** The uri associated with the request. + */ + std::string uri; + /** Contains the HTTP/1.1 or HTTP/1.0 version requested by client. + */ + std::string version; + /** Map of headers provided by the client in the form <HeaderName>:<HeaderValue> + */ + std::map<std::string, std::string> headers; + /** Map of arguments that came with the uri string + */ + std::map<std::string, std::string> args; + } HTTPMessage; + + /** Public constructor for HTTPConnection objects. + * + */ + HTTPConnection (TCPSocketConnection& clnt); + + /** Destructor for HTTPConnection objects. + * + */ + ~HTTPConnection(); + + /** Query if this connection is already closed and can be deleted. + @returns true, if connection is closed. + */ + bool is_closed(); + + /** Polling function for the connection. + * @returns -1 if connection is not required anymore. In the current version of this library this should be the normal case. This may change in future versions. + */ + int poll(); + + protected: + + /** Function to close this connection. To be called from internally. + */ + void close(); + + friend class HTTPServer; + + TCPSocketConnection m_Tcp; + HTTPMessage m_Msg; + + /** parse a HTTP request line from the content of the buffer. + * @param buffer : the request received from the client in the form <RequestType> <uri> <Http Version> + * @returns -1 if the request is invalid or 0 if the request is valid + */ + int parse(char *buffer); + + /** parses the received string in \c buffer for HTTP request headers. + * @param buffer : buffer which contains the string to parse for headers. + * @returns -1 in case of an error, otherwise returns 0 + */ + int parseHeader(char *buffer); + int receiveHeaders(const char* buffer, int nBuffSize); + + /** Function which receives a line from the current Socket + * @param szline : will contain one line received from the socket + * @param nMaxLen : the size of the buffer. If the line is longer than the buffer the line is cropped at the end. + * @param nTimeout : if the timeout elapses, only the portion that has been received within this time will be returned. + * @param szLineTerm : the \c end-of-line character to be used to detect the end of the line. + * @returns -1 in case of an error or timeout, -2 in case of an empty line or the number of received characters. + */ + int receiveLine(char* szLine, int nMaxLen, int nTimeout = -1, char szLineTerm = '\n'); + + + /** parse the receoved \c uri_string for arguments which will be stored in the \c args map. + * @parse uri_string : the uri string which was received from the client. + * @parse args : the args map which will receive the argument:value touples from the \c uri_string. + * @returns -1 if an error occured, otherwise returns 0. + */ + int parseUriArgs(char *uri_string, map<string,string>& args); + +}; + +#endif // __HTTPConnection_H__ +