Team E1
Fork of HTTPServer by
Diff: HTTPServer.cpp
- Revision:
- 13:aa5338a5e452
- Parent:
- 12:ba81cc117fb6
- Child:
- 14:011edcd33e86
--- a/HTTPServer.cpp Wed Jun 05 23:39:24 2013 +0000 +++ b/HTTPServer.cpp Sat Jun 22 15:41:34 2013 +0000 @@ -1,7 +1,9 @@ #include "mbed.h" #include "HTTPServer.h" +#define DEBUG +#include "debug.h" -#define _DEBUG 0 +#define _DEBUG 1 #ifdef _DEBUG DigitalOut led1(LED1); @@ -10,32 +12,17 @@ DigitalOut led4(LED4); #endif -#if (_DEBUG && !defined(TARGET_LPC11U24)) -#define INFO(x, ...) std::printf("[HttpServer : DBG]"x"\r\n", ##__VA_ARGS__); -#define WARN(x, ...) std::printf("[HttpServer : DBG]"x"\r\n", ##__VA_ARGS__); -#define ERR(x, ...) std::printf("[HttpServer : DBG]"x"\r\n", ##__VA_ARGS__); -#else -#define INFO(x, ...) -#define WARN(x, ...) -#define ERR(x, ...) -#endif - +static EthernetInterface eth; /* Constructor */ /* initialize all members and set the standard error handler. */ -HTTPServer::HTTPServer(PinName tx, PinName rx, PinName reset, PinName tcp_status, const char * ssid, const char * phrase, Security sec) - : m_wifly(tx, rx, reset, tcp_status, ssid, phrase, sec) +HTTPServer::HTTPServer() { m_pErrorHandler = StdErrorHandler; - m_pSvr = NULL; } HTTPServer::~HTTPServer() { - if (m_pSvr) { - delete m_pSvr; - m_pSvr = NULL; - } } @@ -51,93 +38,47 @@ } -int HTTPServer::start(int port) +bool HTTPServer::start(int port) { - // check if the start member was called already once - if (m_pSvr != NULL) { - ERR("start function was already called, server is already in listening state."); - return -1; - } - INFO("Initializing wifly\n"); - // Initialize the wifly wlan device - m_wifly.init(); + INFO("Initializing network\n"); + eth.init(); INFO("Connecting to network..."); - // Try join the network - while(!m_wifly.connect()) { - INFO("Failed to connect. Trying again\n"); - m_wifly.reset(); - } - INFO("connected\n"); + eth.connect(); - // check if the start member was called already once - if (m_pSvr != NULL) { - ERR("start function was already called, server is already in listening state."); - return -1; - } - - // Create a new server object - m_pSvr = new TCPSocketServer(); - - // Bind the local server to the given port - if (m_pSvr->bind(port) < 0) { - ERR("Failed to bind to port %d\n", port); - return -1; - } - else { - INFO("Binding succeeded !\n"); + INFO("Binding to port %d...", port); + if (m_Svr.bind(port) < 0) { + ERR("Failed to bind to port !\n"); + error("Binding"); + return false; } - // Listen to a maximum of 10 concurrent connections - if (m_pSvr->listen(1) < 0) { - ERR("Faild to listen !\n"); - delete m_pSvr; - m_pSvr = NULL; - return -1; - } - else { - INFO("Listening\n"); + INFO("Listening ..."); + if (m_Svr.listen(1) < 0) { + ERR("Failed to listen !\n"); + error("Listening"); + return false; } + ERR("Connected !"); // set into non blocking operation - m_pSvr->set_blocking(false, 100); - - return 0; + m_Svr.set_blocking(false, 100); + + return true; } int HTTPServer::poll(bool blocking) -{ +{ int retval = -1; - INFO("Listening for new connection requests."); +#ifdef _DEBUG + led4 = 1; // Indicate we are waiting for a new connection +#endif // This thread basically checks if there is a new incoming connection. // If so , a new HTTPConnection is created and the connection thread is started. TCPSocketConnection Clnt; - -#ifdef _DEBUG - led4 = 1; // Indicate we are waiting for a new connection -#endif - m_pSvr->set_blocking(blocking); - retval = m_pSvr->accept(Clnt); - if (retval > 0) { - // no connection availale yet, so just return -#ifdef _DEBUG -led4 = 0; -led3 = 0; -led2 = 0; -#endif - return retval; - } - if ( retval < 0) { - // an error occured - ERR("There was an error, Accept returned with an error. Probably the connection to the router was lost. Shutting down server"); -#ifdef _DEBUG - led2 = 0; -#endif - m_pSvr->close(); - delete m_pSvr; - m_pSvr = NULL; + if (m_Svr.accept(Clnt) < 0) { #ifdef _DEBUG led4 = 0; led3 = 1; // ERROR @@ -146,40 +87,35 @@ #endif return -1; } - else { + + // a new connection was received + INFO("Client (IP=%s) is connected !\n", Clnt.get_address()); +#ifdef _DEBUG + led4 = 0; + led3 = 0; + led2 = 0; +#endif + #ifdef _DEBUG - led4 = 0; -#endif - // a new connection was received - INFO("Client (IP=%s) is connected !\n", Clnt.get_address()); - // Start the main connection thread -// while(1) { - - #ifdef _DEBUG - led3 = 1; - led2 = 1; - #endif - HTTPConnection con; - int c = con.poll(); - if (c == 0) { - // Handle the request - HandleRequest(con.m_Msg, Clnt); -// INFO("Closing connection.\n"); -// if (!m_wifly.close()) { -// ERR("Failed to close connection !\n"); -// } - } - if (c == -1) { - // No more data available or error - // break; - } - #ifdef _DEBUG - led2 = 0; - led3 = 0; - #endif -// } + led3 = 1; + led2 = 1; +#endif + HTTPConnection con(Clnt); + int c = con.poll(); + if (c == 0) { + // Handle the request + INFO("Handling request !"); + HandleRequest(con.m_Msg, Clnt); } - + if (c == -1) { +// break; + } +#ifdef _DEBUG + led2 = 0; + led3 = 0; +#endif + + INFO("Leaving polling thread"); return 0; } @@ -200,14 +136,13 @@ break; } } - + if (it == m_lpHandlers.end()) { // There is no such handler, so return invalid - m_pErrorHandler(msg, tcp); + m_pErrorHandler(msg, tcp); INFO("Webrequest left unhandled."); - } - else { + } else { // Valid handler was found INFO("Routing webrequest !"); // Instantiate the handler object (handling will be done from withing the object's constructor