HTTP Server library for Mbed OS-5. A fork of Henry Leinen's [[https://os.mbed.com/users/leihen/code/HTTPServer/]] library.

Dependents:   STM32F407VET6_HTTPServer

Revision:
17:8bcc62289a07
Parent:
16:cc3f5c53d0d5
--- a/HTTPServer.cpp	Sat Aug 17 16:17:55 2013 +0000
+++ b/HTTPServer.cpp	Sun Oct 06 18:10:41 2019 +0000
@@ -23,13 +23,13 @@
 
 static const char* szStdErrorPage = "<HTML><HEAD><META content=\"text/html\" http-equiv=Content-Type></HEAD><BODY><h1>Error 404</h1><P>This resource is not available<P></BODY></HTML>\r\n\r\n";
 
-void HTTPServer::StdErrorHandler(HTTPConnection::HTTPMessage& msg, TCPSocketConnection& tcp)
+void HTTPServer::StdErrorHandler(HTTPConnection::HTTPMessage& msg, TCPSocket* tcp)
 {
     char echoHeader[256];
-    tcp.set_blocking(true, 1500);
+    tcp->set_blocking(false);
     sprintf(echoHeader,"HTTP/1.0 404 Fail\r\nConnection: close\r\nContent-Length: %d\r\nContent-Type: text/html\r\nServer: mbed embedded\r\n\n\r",strlen(szStdErrorPage));
-    tcp.send(echoHeader, strlen(echoHeader));
-    tcp.send((char*)szStdErrorPage, strlen(szStdErrorPage));
+    tcp->send(echoHeader, strlen(echoHeader));
+    tcp->send((char*)szStdErrorPage, strlen(szStdErrorPage));
 }
 
 
@@ -38,57 +38,42 @@
     //  If no ethernet interface is provided, instantiate own on the heap. This has to be deleted later in the destructor.
     //  If a valid pointer to an thernet interface is proveded, we can simply use it. 
     if (pEthernet == NULL) {
-        INFO("Creating EthernetInterface object\n");
-        m_pEthernet = new EthernetInterface();
-        
-        if (m_pEthernet == NULL) {
-            ERR("Out of memory, unable to instantiate an EthernetInterface object.");
-            return false;
-        }
-
-        //  Initiaize the network
-        INFO("Initializing network\n");
-        if (m_pEthernet->init() != 0) {
-            ERR("Failed to initialize the ethernet interface !");
-            delete m_pEthernet;
-            m_pEthernet = NULL;
-            return false;
-        }
-        
-        //  Connect to the network using DHCP
-        INFO("Connecting to the network using DHCP...");
-        if (m_pEthernet->connect() != 0) {
-            ERR("Failed to connect to the ethernet !");
-            delete m_pEthernet;
-            m_pEthernet = NULL;
-            return false;
-        }
-        
-        INFO("Connected IP %s", m_pEthernet->getIPAddress());
+        ERR("Socket is not opened!!\r\n");
         
     } else {
         //  In the case that the ethernet interface is provided, it is assumed that a connection has already been created.
-        INFO("Using connection IP %s", pEthernet->getIPAddress());
+        INFO("Using connection IP %s", pEthernet->get_ip_address());
     }
     
+    nsapi_error_t r;
+    const char* ip = pEthernet->get_ip_address();
+
+    /* Open the server on ethernet stack */
+    INFO("Opening server on the Ethernet stack ...");
+    r = m_Svr.open(pEthernet);
+    if (r != 0) {
+        INFO("Error! Opening server returned: %d\n", r);
+        error("Opening server");
+        return false;
+    }
+
     INFO("Binding to port %d...", port);
-    if (m_Svr.bind(port) < 0) {
+    if (m_Svr.bind(ip, port) < 0) {
         ERR("Failed to bind to port !\n");
         error("Binding");
         return false;
     }
 
-    INFO("Listening ...");
     if (m_Svr.listen(1) < 0) {
         ERR("Failed to listen !\n");
         error("Listening");
         return false;
     }
 
-    INFO("Connected !");
-    //  set into non blocking operation
-    m_Svr.set_blocking(false, 100);
-
+    INFO("Listening ...");
+    //  set into non blocking operation after timeout
+    m_Svr.set_timeout(1500);
+    
     return true;
 }
 
@@ -97,19 +82,28 @@
 {
     //  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;
-    if (m_Svr.accept(Clnt) < 0) {
+    nsapi_error_t   error;
+    SocketAddress   clntAddress;
+    TCPSocket*      clnt = m_Svr.accept(&error);
+    
+    if (clnt == NULL) {
         return -1;
     }
+    
+    if (error != 0) {
+        clnt->close();
+        return error;
+    }  
 
     //   a new connection was received
-    INFO("Client (IP=%s) is connected !\n", Clnt.get_address());
-    HTTPConnection con(Clnt);
+    clnt->getpeername(&clntAddress);
+    INFO("Client (IP=%s) is connected !\n", clntAddress.get_ip_address());
+    HTTPConnection con(clnt);
     int c = con.poll();
     if (c == 0) {
         //  Handle the request
         INFO("Handling request !");
-        HandleRequest(con.m_Msg, Clnt);
+        HandleRequest(con.m_Msg, clnt);
     }
     if (c == -1) {
 //        break;
@@ -119,10 +113,10 @@
     return 0;
 }
 
-void HTTPServer::HandleRequest(HTTPConnection::HTTPMessage& msg, TCPSocketConnection& tcp)
+void HTTPServer::HandleRequest(HTTPConnection::HTTPMessage& msg, TCPSocket* tcp)
 {
     std::string localPath;
-    std::map<std::string, HTTPRequestHandler*(*)(const char*, const char*, HTTPConnection::HTTPMessage&, TCPSocketConnection&), handlersComp>::const_iterator it;
+    std::map<std::string, HTTPRequestHandler*(*)(const char*, const char*, HTTPConnection::HTTPMessage&, TCPSocket*), handlersComp>::const_iterator it;
 
     //  Iterate through registered handlers and check if the handler's path is a subset of the requested uri.
     for (it = m_lpHandlers.begin() ; it != m_lpHandlers.end() ; it++) {