Single instance HTTP Server using new Ethernet Interface with bug fix for URL arguments
Fork of HTTPServer by
Diff: HTTPServer.cpp
- Revision:
- 0:7a2421e63e74
- Child:
- 1:6b7472d5e9ee
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPServer.cpp Sun May 26 20:13:28 2013 +0000 @@ -0,0 +1,118 @@ +#include "mbed.h" +#include "HTTPServer.h" + +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +#if (1 && !defined(TARGET_LPC11U24)) +#define INFO(x, ...) if (m_pDbg) m_pDbg->printf("[HttpServer : DBG]"x"\r\n", ##__VA_ARGS__); else printf("[HttpServer : DBG]"x"\r\n", ##__VA_ARGS__); +#define WARN(x, ...) if (m_pDbg) m_pDbg->printf("[HttpServer : WARN]"x"\r\n", ##__VA_ARGS__); else printf("[HttpServer : DBG]"x"\r\n", ##__VA_ARGS__); +#define ERR(x, ...) if (m_pDbg) m_pDbg->printf("[HttpServer : ERR]"x"\r\n", ##__VA_ARGS__); else printf("[HttpServer : DBG]"x"\r\n", ##__VA_ARGS__); +#else +#define INFO(x, ...) +#define WARN(x, ...) +#define ERR(x, ...) +#endif + + +HTTPServer::HTTPServer(Serial* pDbg) +{ + m_pDbg = pDbg; + m_pSvr = NULL; + m_bServerListening = false; +} + +HTTPServer::~HTTPServer() +{ + if (m_pSvr) { + delete m_pSvr; + m_pSvr = NULL; + m_bServerListening = false; + } +} + +int 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; + } + + m_bServerListening = false; + + // 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"); + } + + // 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"); + m_bServerListening = true; + } + + // set into non blocking operation + m_pSvr->set_blocking(false, 100); + + return 0; +} + + +int HTTPServer::poll() +{ + INFO("Listening for new connection requests."); + + // 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; + + led4 = 1; // Indicate we are waiting for a new connection + if (m_pSvr->accept(Clnt) < 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"); + led2 = 0; + m_bServerListening = false; + m_pSvr->close(); + delete m_pSvr; + m_pSvr = NULL; + led4 = 0; + led3 = 1; // ERROR + led2 = 0; + led1 = 0; + return -1; + } + else { + led4 = 0; + // a new connection was received + INFO("Client (IP=%s) is connected !\n", Clnt.get_address()); + // Start the main connection thread + led3 = 1; + led2 = 1; + HTTPConnection con; + int c = con.poll(); + if (c == 0) { + } + led2 = 0; + led3 = 0; + } + + + INFO("Leaving polling thread"); + return 0; +} \ No newline at end of file