This is a HTTP Server example using the new EthernetInterface and new mbed-rpc libraries.
Dependents: HTTP-RPCServerExample
Fork of HTTPServer by
Diff: HTTPServer.h
- Revision:
- 3:d6224049b3bf
- Parent:
- 2:8653bbcf7e58
- Child:
- 4:d065642c32cc
diff -r 8653bbcf7e58 -r d6224049b3bf HTTPServer.h --- a/HTTPServer.h Sun May 26 23:22:36 2013 +0000 +++ b/HTTPServer.h Tue May 28 01:56:14 2013 +0000 @@ -1,4 +1,25 @@ /* HTTPServer.cpp */ +/* +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 __HTTPSERVER_H__ #define __HTTPSERVER_H__ #include "mbed.h" @@ -13,30 +34,66 @@ #include <TCPSocketConnection.h> #include <TCPSocketServer.h> -typedef void (*HTTPRequestHandlerFunction)(HTTPMessage&, TCPSocketConnection&); +/** Typedefinition for a handler function +*/ +typedef void (*HTTPRequestHandlerFunction)(HTTPConnection::HTTPMessage&, TCPSocketConnection&); + -/** Class HTTPServer for WiFly Interface Library - * - */ - class HTTPServer - { - +/** Class HTTPServer for use with <a href="http://mbed.org/users/samux/code/WiflyInterface/">WiflyInterface</a>. +* This class is a simple implementation of an HTTP Server for use with the WiFly interface. +* The class will listen for incoming connections on the (configurable) HTTP port. For each +* incoming connection, one request will be processed. +* After instantiating this class, add all required handlers using the \c addHandler function, +* replace the default error handler using \c addErrorHandler if needed and call the \c start +* method to initialize the class. +* You need to continuously poll for any new incoming connections after one request has been +* served using the \c poll member function. +* +* \b Example: +* @code +* #include "mbed.h" +* #include "HTTPServer.h" +* #include "LocalFileSystem.h" +* +* LocalFileSystem local("local"); +* WiflyInterface wifly(p9, p10, p25, p26, "<your access point>", "<your password>", WPA); +* +* void main(void) +* { +* HTTPServer svr; + svr.mount("/local/", "/"); +* svr.addHandler<HTTPFsRequestHandler>( "/" ); +* svr.start(); +* while(1) +* { +* if (svr.poll() < 0) +* exit(0); +* } +* } +* @endcode +*/ +class HTTPServer +{ public: - HTTPServer(Serial* pDbg = NULL); + /** Constructor for HTTPServer objects. + */ + HTTPServer(Serial* dbg = NULL); + + /** Destructor for HTTPServer objects. + */ ~HTTPServer(); - struct handlersComp //Used to order handlers in the right way { bool operator() (const string& handler1, const string& handler2) const { - //The first handler is longer than the second one - if (handler1.length() > handler2.length()) - return true; //Returns true if handler1 is to appear before handler2 - else if (handler1.length() < handler2.length()) - return false; - else //To avoid the == case, sort now by address - return ((&handler1)>(&handler2)); + //The first handler is longer than the second one + if (handler1.length() > handler2.length()) + return true; //Returns true if handler1 is to appear before handler2 + else if (handler1.length() < handler2.length()) + return false; + else //To avoid the == case, sort now by address + return ((&handler1)>(&handler2)); } }; @@ -46,43 +103,42 @@ @param T : class which will be instanciated to serve these requests @param path : requests starting with this path will be served using this handler */ -// template<typename T> -// void addHandler(const char* path) //Template decl in header -// { m_pHandlers[path] = &T::inst; } - - void addHandler(const char* path, HTTPRequestHandlerFunction hdlFunc) - { m_pHandlers[path] = hdlFunc; } + template<typename T> + void addHandler(const char* path) + { m_lpHandlers[path] = &T::create; } + /** + Replaces the standard error Handler. The error Handler will be called everytime a request is not + handled by a handler from the handler list. + @param hdlFunc: Handler which serves an error condition. + */ void addErrorHandler(HTTPRequestHandlerFunction hdlFunc) { m_pErrorHandler = hdlFunc!=NULL ?hdlFunc : StdErrorHandler; } - ///Starts listening - /** - Binds server to a specific port and starts listening. This member prepares the internal variables and the server socket - and terminates after successfull initialization - @param port : port on which to listen for incoming connections - @returns : -1 if an unrecoverable error occured, or 0 if everything was ok. + + /** Binds server to a specific port and starts listening. This member prepares the internal variables and the server socket + * and terminates after successfull initialization + * @param port : port on which to listen for incoming connections + * @returns : -1 if an unrecoverable error occured, or 0 if everything was ok. */ int start(int port = 80); - /** - Performs the regular polling of the server component. Needs to be called cyclically. - The function will internally check whether new connections are requested by a client and will also poll all existing client connections. + /** Performs the regular polling of the server component. Needs to be called cyclically. + * The function will internally check whether new connections are requested by a client and will also poll all existing client connections. */ int poll(); -private: - - static void StdErrorHandler(HTTPMessage&, TCPSocketConnection&); - - TCPSocketServer* m_pSvr; - bool m_bServerListening; + private: + static void StdErrorHandler(HTTPConnection::HTTPMessage&, TCPSocketConnection&); - Serial* m_pDbg; - void HandleRequest(HTTPMessage& con, TCPSocketConnection&); - - map<string, HTTPRequestHandlerFunction> m_pHandlers; - HTTPRequestHandlerFunction m_pErrorHandler; + TCPSocketServer* m_pSvr; + bool m_bServerListening; + + Serial* m_pDbg; + void HandleRequest(HTTPConnection::HTTPMessage& con, TCPSocketConnection&); + map<string, HTTPRequestHandler* (*)(const char*, const char*, HTTPConnection::HTTPMessage&, TCPSocketConnection&), handlersComp> m_lpHandlers; + HTTPRequestHandlerFunction m_pErrorHandler; + }; #endif //__HTTPSERVER_H__ \ No newline at end of file