Single instance HTTP Server using new Ethernet Interface with bug fix for URL arguments

Fork of HTTPServer by Henry Leinen

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