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
Diff: HTTPServer.cpp
- 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++) {