Single instance HTTP Server using new Ethernet Interface. Blocking mode only; this improved stability, but the HTTP server must be started from a separate thread.
Fork of HTTPServer by
HTTPRequestHandler.cpp@9:c2a1462b9b71, 2013-06-02 (annotated)
- Committer:
- leihen
- Date:
- Sun Jun 02 00:33:56 2013 +0000
- Revision:
- 9:c2a1462b9b71
- Parent:
- 7:cb7fec1265b5
- Child:
- 10:cbde7929db7f
Some small simplifications and improvements.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leihen | 1:6b7472d5e9ee | 1 | /* HTTPRequestHandler.cpp */ |
leihen | 1:6b7472d5e9ee | 2 | #include "mbed.h" |
leihen | 1:6b7472d5e9ee | 3 | #include "HTTPRequestHandler.h" |
leihen | 1:6b7472d5e9ee | 4 | |
leihen | 6:fe661fa9d18a | 5 | #define _DEBUG 0 |
leihen | 6:fe661fa9d18a | 6 | |
leihen | 6:fe661fa9d18a | 7 | #if (_DEBUG && !defined(TARGET_LPC11U24)) |
leihen | 3:d6224049b3bf | 8 | #define INFO(x, ...) std::printf("[HTTPRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__); |
leihen | 3:d6224049b3bf | 9 | #define WARN(x, ...) std::printf("[HTTPRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__); |
leihen | 3:d6224049b3bf | 10 | #define ERR(x, ...) std::printf("[HTTPRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__); |
leihen | 3:d6224049b3bf | 11 | #else |
leihen | 3:d6224049b3bf | 12 | #define INFO(x, ...) |
leihen | 3:d6224049b3bf | 13 | #define WARN(x, ...) |
leihen | 3:d6224049b3bf | 14 | #define ERR(x, ...) |
leihen | 3:d6224049b3bf | 15 | #endif |
leihen | 1:6b7472d5e9ee | 16 | |
leihen | 3:d6224049b3bf | 17 | static char buffer[128]; |
leihen | 3:d6224049b3bf | 18 | |
leihen | 3:d6224049b3bf | 19 | HTTPRequestHandler::HTTPRequestHandler(HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp) |
leihen | 3:d6224049b3bf | 20 | : msg(Msg), tcp(Tcp) |
leihen | 1:6b7472d5e9ee | 21 | { |
leihen | 3:d6224049b3bf | 22 | msg = Msg; |
leihen | 3:d6224049b3bf | 23 | tcp = Tcp; |
leihen | 1:6b7472d5e9ee | 24 | } |
leihen | 1:6b7472d5e9ee | 25 | |
leihen | 1:6b7472d5e9ee | 26 | HTTPRequestHandler::~HTTPRequestHandler() |
leihen | 1:6b7472d5e9ee | 27 | { |
leihen | 3:d6224049b3bf | 28 | } |
leihen | 3:d6224049b3bf | 29 | |
leihen | 3:d6224049b3bf | 30 | void HTTPRequestHandler::handleRequest() |
leihen | 3:d6224049b3bf | 31 | { |
leihen | 3:d6224049b3bf | 32 | int err = 0; |
leihen | 3:d6224049b3bf | 33 | |
leihen | 3:d6224049b3bf | 34 | switch (msg.request) { |
leihen | 3:d6224049b3bf | 35 | case HTTP_RT_GET: |
leihen | 3:d6224049b3bf | 36 | INFO("Dispatching GET Request."); |
leihen | 3:d6224049b3bf | 37 | err = handleGetRequest(); |
leihen | 3:d6224049b3bf | 38 | break; |
leihen | 3:d6224049b3bf | 39 | |
leihen | 4:d065642c32cc | 40 | case HTTP_RT_POST: |
leihen | 4:d065642c32cc | 41 | INFO("Dispatching POST request."); |
leihen | 4:d065642c32cc | 42 | err = handlePostRequest(); |
leihen | 4:d065642c32cc | 43 | break; |
leihen | 3:d6224049b3bf | 44 | |
leihen | 4:d065642c32cc | 45 | case HTTP_RT_PUT: |
leihen | 4:d065642c32cc | 46 | INFO("Dispatching PUT request."); |
leihen | 4:d065642c32cc | 47 | err = handlePutRequest(); |
leihen | 4:d065642c32cc | 48 | break; |
leihen | 3:d6224049b3bf | 49 | |
leihen | 3:d6224049b3bf | 50 | default: |
leihen | 3:d6224049b3bf | 51 | INFO("Error in handleRequest, unhandled request type."); |
leihen | 9:c2a1462b9b71 | 52 | err = HTTP_NotImplemented; |
leihen | 3:d6224049b3bf | 53 | break; |
leihen | 3:d6224049b3bf | 54 | } |
leihen | 3:d6224049b3bf | 55 | |
leihen | 3:d6224049b3bf | 56 | // if any of these functions returns a negative number, call the error handler |
leihen | 3:d6224049b3bf | 57 | if (err > 0) { |
leihen | 3:d6224049b3bf | 58 | handleError(err); |
leihen | 3:d6224049b3bf | 59 | } |
leihen | 3:d6224049b3bf | 60 | } |
leihen | 3:d6224049b3bf | 61 | |
leihen | 3:d6224049b3bf | 62 | static const char* szErrorPage = "<HTML><HEAD><META content=\"text/html\" http-equiv=Content-Type></HEAD><BODY><h1>Error %d</h1><P>HTTPServer Error<P></BODY></HTML>\r\n\r\n"; |
leihen | 3:d6224049b3bf | 63 | |
leihen | 3:d6224049b3bf | 64 | void HTTPRequestHandler::handleError(int errorCode, HTTPHeaders* header) |
leihen | 3:d6224049b3bf | 65 | { |
leihen | 3:d6224049b3bf | 66 | INFO("Handling error !"); |
leihen | 3:d6224049b3bf | 67 | tcp.set_blocking(true, 1500); |
leihen | 9:c2a1462b9b71 | 68 | sprintf(buffer,"HTTP/1.0 %d Error\r\n", errorCode); |
leihen | 3:d6224049b3bf | 69 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 70 | sprintf(buffer, "Content-Length: %d\r\n", strlen(szErrorPage)); |
leihen | 3:d6224049b3bf | 71 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 72 | if (header == NULL) { |
leihen | 3:d6224049b3bf | 73 | sprintf(buffer, "Content-Type: text/html\r\nServer: mbed embedded\r\n\n\r"); |
leihen | 3:d6224049b3bf | 74 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 75 | } |
leihen | 3:d6224049b3bf | 76 | else { |
leihen | 3:d6224049b3bf | 77 | for ( map<const char*, const char*>::iterator cIter = header->begin() ; cIter != header->end() ; cIter ++) { |
leihen | 3:d6224049b3bf | 78 | tcp.send((char*)cIter->first, strlen(cIter->first)); |
leihen | 3:d6224049b3bf | 79 | tcp.send(": ", 2); |
leihen | 3:d6224049b3bf | 80 | tcp.send((char*)cIter->second, strlen(cIter->second)); |
leihen | 3:d6224049b3bf | 81 | tcp.send("\r\n",2); |
leihen | 3:d6224049b3bf | 82 | } |
leihen | 3:d6224049b3bf | 83 | tcp.send("\r\n",2); |
leihen | 3:d6224049b3bf | 84 | } |
leihen | 3:d6224049b3bf | 85 | tcp.send((char*)szErrorPage, strlen(szErrorPage)); |
leihen | 3:d6224049b3bf | 86 | } |
leihen | 3:d6224049b3bf | 87 | |
leihen | 3:d6224049b3bf | 88 | |
leihen | 7:cb7fec1265b5 | 89 | void HTTPRequestHandler::startResponse(int returnCode, long nLen, HTTPHeaders* header) |
leihen | 3:d6224049b3bf | 90 | { |
leihen | 7:cb7fec1265b5 | 91 | INFO("Starting response (%ld bytes in total)!", nLen); |
leihen | 3:d6224049b3bf | 92 | tcp.set_blocking(true, 1500); |
leihen | 9:c2a1462b9b71 | 93 | sprintf(buffer, "HTTP/1.0 %d OK\r\n", returnCode); |
leihen | 3:d6224049b3bf | 94 | tcp.send(buffer, strlen(buffer)); |
leihen | 7:cb7fec1265b5 | 95 | sprintf(buffer, "Content-Length: %ld\r\n", nLen); // Add 2 chars for the terminating CR+LF |
leihen | 3:d6224049b3bf | 96 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 97 | if (header == NULL) { |
leihen | 3:d6224049b3bf | 98 | sprintf(buffer, "Content-Type: text/html\r\nServer: mbed embedded\r\n\r\n"); |
leihen | 3:d6224049b3bf | 99 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 100 | } |
leihen | 3:d6224049b3bf | 101 | else { |
leihen | 3:d6224049b3bf | 102 | for ( map<const char*, const char*>::iterator cIter = header->begin() ; cIter != header->end() ; cIter ++) { |
leihen | 3:d6224049b3bf | 103 | tcp.send((char*)cIter->first, strlen(cIter->first)); |
leihen | 3:d6224049b3bf | 104 | tcp.send(": ", 2); |
leihen | 3:d6224049b3bf | 105 | tcp.send((char*)cIter->second, strlen(cIter->second)); |
leihen | 3:d6224049b3bf | 106 | tcp.send("\r\n\r\n",2); |
leihen | 3:d6224049b3bf | 107 | } |
leihen | 3:d6224049b3bf | 108 | tcp.send("\r\n", 2); |
leihen | 3:d6224049b3bf | 109 | } |
leihen | 3:d6224049b3bf | 110 | // other content must be sent using the 'processResponse' function |
leihen | 3:d6224049b3bf | 111 | } |
leihen | 3:d6224049b3bf | 112 | |
leihen | 3:d6224049b3bf | 113 | void HTTPRequestHandler::processResponse(int nLen, char* body) |
leihen | 3:d6224049b3bf | 114 | { |
leihen | 7:cb7fec1265b5 | 115 | INFO("Processing Response (%d bytes)!\n",nLen); |
leihen | 3:d6224049b3bf | 116 | tcp.send(body, nLen); |
leihen | 3:d6224049b3bf | 117 | } |
leihen | 3:d6224049b3bf | 118 | |
leihen | 3:d6224049b3bf | 119 | void HTTPRequestHandler::endResponse() |
leihen | 3:d6224049b3bf | 120 | { |
leihen | 3:d6224049b3bf | 121 | INFO("Ending Response !"); |
leihen | 3:d6224049b3bf | 122 | tcp.send("\r\n", 2); |
leihen | 3:d6224049b3bf | 123 | } |