Mbed asked me to commit the library. Probably because it's an older version

Dependents:   ece4180_project

Fork of HTTPServer by Sarah Marsh

Committer:
dotunhunter
Date:
Thu May 04 12:09:12 2017 +0000
Revision:
18:0d9ea97a13f9
Parent:
16:cc3f5c53d0d5
Commit for HTTPServer. Mbed asked me to commit it probably because it may be an old version. I'm not sure why.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leihen 0:7a2421e63e74 1 #include "mbed.h"
leihen 0:7a2421e63e74 2 #include "HTTPServer.h"
leihen 13:aa5338a5e452 3 #define DEBUG
leihen 16:cc3f5c53d0d5 4 #include "hl_debug.h"
leihen 4:d065642c32cc 5
leihen 0:7a2421e63e74 6
leihen 4:d065642c32cc 7
leihen 4:d065642c32cc 8 /* Constructor */
leihen 4:d065642c32cc 9 /* initialize all members and set the standard error handler. */
leihen 13:aa5338a5e452 10 HTTPServer::HTTPServer()
leihen 14:011edcd33e86 11 : m_pEthernet(NULL)
leihen 0:7a2421e63e74 12 {
leihen 9:c2a1462b9b71 13 m_pErrorHandler = StdErrorHandler;
leihen 0:7a2421e63e74 14 }
leihen 0:7a2421e63e74 15
leihen 0:7a2421e63e74 16 HTTPServer::~HTTPServer()
leihen 0:7a2421e63e74 17 {
leihen 14:011edcd33e86 18 if (m_pEthernet == NULL) {
leihen 14:011edcd33e86 19 INFO("Deleting EthernetInterface Object.\n");
leihen 14:011edcd33e86 20 delete m_pEthernet;
leihen 14:011edcd33e86 21 }
leihen 0:7a2421e63e74 22 }
leihen 0:7a2421e63e74 23
leihen 4:d065642c32cc 24 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";
leihen 2:8653bbcf7e58 25
leihen 3:d6224049b3bf 26 void HTTPServer::StdErrorHandler(HTTPConnection::HTTPMessage& msg, TCPSocketConnection& tcp)
leihen 2:8653bbcf7e58 27 {
leihen 4:d065642c32cc 28 char echoHeader[256];
leihen 2:8653bbcf7e58 29 tcp.set_blocking(true, 1500);
leihen 11:3943841e1798 30 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));
leihen 2:8653bbcf7e58 31 tcp.send(echoHeader, strlen(echoHeader));
leihen 2:8653bbcf7e58 32 tcp.send((char*)szStdErrorPage, strlen(szStdErrorPage));
leihen 2:8653bbcf7e58 33 }
leihen 2:8653bbcf7e58 34
leihen 2:8653bbcf7e58 35
leihen 14:011edcd33e86 36 bool HTTPServer::start(int port, EthernetInterface* pEthernet)
leihen 0:7a2421e63e74 37 {
leihen 14:011edcd33e86 38 // If no ethernet interface is provided, instantiate own on the heap. This has to be deleted later in the destructor.
leihen 14:011edcd33e86 39 // If a valid pointer to an thernet interface is proveded, we can simply use it.
leihen 14:011edcd33e86 40 if (pEthernet == NULL) {
leihen 14:011edcd33e86 41 INFO("Creating EthernetInterface object\n");
leihen 14:011edcd33e86 42 m_pEthernet = new EthernetInterface();
leihen 14:011edcd33e86 43
leihen 14:011edcd33e86 44 if (m_pEthernet == NULL) {
leihen 14:011edcd33e86 45 ERR("Out of memory, unable to instantiate an EthernetInterface object.");
leihen 14:011edcd33e86 46 return false;
leihen 14:011edcd33e86 47 }
leihen 9:c2a1462b9b71 48
leihen 14:011edcd33e86 49 // Initiaize the network
leihen 14:011edcd33e86 50 INFO("Initializing network\n");
leihen 14:011edcd33e86 51 if (m_pEthernet->init() != 0) {
leihen 14:011edcd33e86 52 ERR("Failed to initialize the ethernet interface !");
leihen 14:011edcd33e86 53 delete m_pEthernet;
leihen 14:011edcd33e86 54 m_pEthernet = NULL;
leihen 14:011edcd33e86 55 return false;
leihen 14:011edcd33e86 56 }
leihen 14:011edcd33e86 57
leihen 14:011edcd33e86 58 // Connect to the network using DHCP
leihen 14:011edcd33e86 59 INFO("Connecting to the network using DHCP...");
leihen 14:011edcd33e86 60 if (m_pEthernet->connect() != 0) {
leihen 14:011edcd33e86 61 ERR("Failed to connect to the ethernet !");
leihen 14:011edcd33e86 62 delete m_pEthernet;
leihen 14:011edcd33e86 63 m_pEthernet = NULL;
leihen 14:011edcd33e86 64 return false;
leihen 14:011edcd33e86 65 }
leihen 14:011edcd33e86 66
dotunhunter 18:0d9ea97a13f9 67 wait(10.0);
leihen 14:011edcd33e86 68 INFO("Connected IP %s", m_pEthernet->getIPAddress());
leihen 14:011edcd33e86 69
leihen 14:011edcd33e86 70 } else {
leihen 14:011edcd33e86 71 // In the case that the ethernet interface is provided, it is assumed that a connection has already been created.
leihen 14:011edcd33e86 72 INFO("Using connection IP %s", pEthernet->getIPAddress());
leihen 14:011edcd33e86 73 }
leihen 14:011edcd33e86 74
leihen 13:aa5338a5e452 75 INFO("Binding to port %d...", port);
leihen 13:aa5338a5e452 76 if (m_Svr.bind(port) < 0) {
leihen 13:aa5338a5e452 77 ERR("Failed to bind to port !\n");
leihen 13:aa5338a5e452 78 error("Binding");
leihen 13:aa5338a5e452 79 return false;
leihen 0:7a2421e63e74 80 }
leihen 0:7a2421e63e74 81
leihen 13:aa5338a5e452 82 INFO("Listening ...");
leihen 13:aa5338a5e452 83 if (m_Svr.listen(1) < 0) {
leihen 13:aa5338a5e452 84 ERR("Failed to listen !\n");
leihen 13:aa5338a5e452 85 error("Listening");
leihen 13:aa5338a5e452 86 return false;
leihen 0:7a2421e63e74 87 }
leihen 0:7a2421e63e74 88
leihen 16:cc3f5c53d0d5 89 INFO("Connected !");
leihen 0:7a2421e63e74 90 // set into non blocking operation
leihen 13:aa5338a5e452 91 m_Svr.set_blocking(false, 100);
leihen 13:aa5338a5e452 92
leihen 13:aa5338a5e452 93 return true;
leihen 0:7a2421e63e74 94 }
leihen 0:7a2421e63e74 95
leihen 0:7a2421e63e74 96
leihen 6:fe661fa9d18a 97 int HTTPServer::poll(bool blocking)
leihen 13:aa5338a5e452 98 {
leihen 0:7a2421e63e74 99 // This thread basically checks if there is a new incoming connection.
leihen 0:7a2421e63e74 100 // If so , a new HTTPConnection is created and the connection thread is started.
leihen 0:7a2421e63e74 101 TCPSocketConnection Clnt;
leihen 13:aa5338a5e452 102 if (m_Svr.accept(Clnt) < 0) {
leihen 0:7a2421e63e74 103 return -1;
leihen 0:7a2421e63e74 104 }
leihen 13:aa5338a5e452 105
leihen 13:aa5338a5e452 106 // a new connection was received
leihen 13:aa5338a5e452 107 INFO("Client (IP=%s) is connected !\n", Clnt.get_address());
leihen 13:aa5338a5e452 108 HTTPConnection con(Clnt);
leihen 13:aa5338a5e452 109 int c = con.poll();
leihen 13:aa5338a5e452 110 if (c == 0) {
leihen 13:aa5338a5e452 111 // Handle the request
leihen 13:aa5338a5e452 112 INFO("Handling request !");
leihen 13:aa5338a5e452 113 HandleRequest(con.m_Msg, Clnt);
leihen 0:7a2421e63e74 114 }
leihen 13:aa5338a5e452 115 if (c == -1) {
leihen 13:aa5338a5e452 116 // break;
leihen 13:aa5338a5e452 117 }
leihen 13:aa5338a5e452 118
leihen 0:7a2421e63e74 119 INFO("Leaving polling thread");
leihen 0:7a2421e63e74 120 return 0;
leihen 1:6b7472d5e9ee 121 }
leihen 1:6b7472d5e9ee 122
leihen 3:d6224049b3bf 123 void HTTPServer::HandleRequest(HTTPConnection::HTTPMessage& msg, TCPSocketConnection& tcp)
leihen 3:d6224049b3bf 124 {
leihen 3:d6224049b3bf 125 std::string localPath;
leihen 3:d6224049b3bf 126 std::map<std::string, HTTPRequestHandler*(*)(const char*, const char*, HTTPConnection::HTTPMessage&, TCPSocketConnection&), handlersComp>::const_iterator it;
leihen 3:d6224049b3bf 127
leihen 4:d065642c32cc 128 // Iterate through registered handlers and check if the handler's path is a subset of the requested uri.
leihen 3:d6224049b3bf 129 for (it = m_lpHandlers.begin() ; it != m_lpHandlers.end() ; it++) {
leihen 3:d6224049b3bf 130 // check if this entries' path is fully contained at the beginning of the requested path
leihen 3:d6224049b3bf 131 std::string curpth = it->first;
leihen 3:d6224049b3bf 132
leihen 3:d6224049b3bf 133 if (msg.uri.find(curpth) == 0) {
leihen 4:d065642c32cc 134 // firts matching handler found, we just take it and we'll be happy
leihen 3:d6224049b3bf 135 localPath = msg.uri.substr(curpth.length());
leihen 3:d6224049b3bf 136 break;
leihen 3:d6224049b3bf 137 }
leihen 3:d6224049b3bf 138 }
leihen 13:aa5338a5e452 139
leihen 3:d6224049b3bf 140 if (it == m_lpHandlers.end()) {
leihen 3:d6224049b3bf 141 // There is no such handler, so return invalid
leihen 3:d6224049b3bf 142
leihen 13:aa5338a5e452 143 m_pErrorHandler(msg, tcp);
leihen 3:d6224049b3bf 144 INFO("Webrequest left unhandled.");
leihen 13:aa5338a5e452 145 } else {
leihen 4:d065642c32cc 146 // Valid handler was found
leihen 3:d6224049b3bf 147 INFO("Routing webrequest !");
leihen 4:d065642c32cc 148 // Instantiate the handler object (handling will be done from withing the object's constructor
leihen 3:d6224049b3bf 149 HTTPRequestHandler *phdl = (*it->second)(it->first.c_str(), localPath.c_str(), msg, tcp);
leihen 4:d065642c32cc 150 // now we can delete the object, because handling is completed.
leihen 3:d6224049b3bf 151 if (phdl != NULL)
leihen 3:d6224049b3bf 152 delete phdl;
leihen 3:d6224049b3bf 153 }
leihen 3:d6224049b3bf 154 }