Single instance HTTP Server using new Ethernet Interface with bug fix for URL arguments
Fork of HTTPServer by
HTTPRequestHandler.cpp@11:3943841e1798, 2013-06-02 (annotated)
- Committer:
- leihen
- Date:
- Sun Jun 02 22:59:51 2013 +0000
- Revision:
- 11:3943841e1798
- Parent:
- 10:cbde7929db7f
- Child:
- 12:ba81cc117fb6
A few bugfixes
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 | 11:3943841e1798 | 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 | 11:3943841e1798 | 19 | |
leihen | 11:3943841e1798 | 20 | const char hdrDNT[] = "DNT: 1\r\n"; |
leihen | 11:3943841e1798 | 21 | const char hdrMaxAge[] = "MaxAge: 0\r\n"; |
leihen | 11:3943841e1798 | 22 | const char hdrConClose[] = "Connection: Keep-Alive\r\n"; |
leihen | 11:3943841e1798 | 23 | const char hdrContent[] = "Content-Type: text/html\r\n"; |
leihen | 11:3943841e1798 | 24 | const char hdrServer[] = "Server: mbed embedded\r\n"; |
leihen | 11:3943841e1798 | 25 | const char hdrEndl[] = "\r\n"; |
leihen | 11:3943841e1798 | 26 | |
leihen | 3:d6224049b3bf | 27 | HTTPRequestHandler::HTTPRequestHandler(HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp) |
leihen | 3:d6224049b3bf | 28 | : msg(Msg), tcp(Tcp) |
leihen | 1:6b7472d5e9ee | 29 | { |
leihen | 3:d6224049b3bf | 30 | msg = Msg; |
leihen | 3:d6224049b3bf | 31 | tcp = Tcp; |
leihen | 1:6b7472d5e9ee | 32 | } |
leihen | 1:6b7472d5e9ee | 33 | |
leihen | 1:6b7472d5e9ee | 34 | HTTPRequestHandler::~HTTPRequestHandler() |
leihen | 1:6b7472d5e9ee | 35 | { |
leihen | 3:d6224049b3bf | 36 | } |
leihen | 3:d6224049b3bf | 37 | |
leihen | 3:d6224049b3bf | 38 | void HTTPRequestHandler::handleRequest() |
leihen | 3:d6224049b3bf | 39 | { |
leihen | 3:d6224049b3bf | 40 | int err = 0; |
leihen | 3:d6224049b3bf | 41 | |
leihen | 3:d6224049b3bf | 42 | switch (msg.request) { |
leihen | 3:d6224049b3bf | 43 | case HTTP_RT_GET: |
leihen | 3:d6224049b3bf | 44 | INFO("Dispatching GET Request."); |
leihen | 3:d6224049b3bf | 45 | err = handleGetRequest(); |
leihen | 3:d6224049b3bf | 46 | break; |
leihen | 3:d6224049b3bf | 47 | |
leihen | 4:d065642c32cc | 48 | case HTTP_RT_POST: |
leihen | 4:d065642c32cc | 49 | INFO("Dispatching POST request."); |
leihen | 4:d065642c32cc | 50 | err = handlePostRequest(); |
leihen | 4:d065642c32cc | 51 | break; |
leihen | 3:d6224049b3bf | 52 | |
leihen | 4:d065642c32cc | 53 | case HTTP_RT_PUT: |
leihen | 4:d065642c32cc | 54 | INFO("Dispatching PUT request."); |
leihen | 4:d065642c32cc | 55 | err = handlePutRequest(); |
leihen | 4:d065642c32cc | 56 | break; |
leihen | 3:d6224049b3bf | 57 | |
leihen | 3:d6224049b3bf | 58 | default: |
leihen | 3:d6224049b3bf | 59 | INFO("Error in handleRequest, unhandled request type."); |
leihen | 9:c2a1462b9b71 | 60 | err = HTTP_NotImplemented; |
leihen | 3:d6224049b3bf | 61 | break; |
leihen | 3:d6224049b3bf | 62 | } |
leihen | 3:d6224049b3bf | 63 | |
leihen | 3:d6224049b3bf | 64 | // if any of these functions returns a negative number, call the error handler |
leihen | 3:d6224049b3bf | 65 | if (err > 0) { |
leihen | 3:d6224049b3bf | 66 | handleError(err); |
leihen | 3:d6224049b3bf | 67 | } |
leihen | 3:d6224049b3bf | 68 | } |
leihen | 3:d6224049b3bf | 69 | |
leihen | 3:d6224049b3bf | 70 | 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 | 71 | |
leihen | 3:d6224049b3bf | 72 | void HTTPRequestHandler::handleError(int errorCode, HTTPHeaders* header) |
leihen | 3:d6224049b3bf | 73 | { |
leihen | 3:d6224049b3bf | 74 | INFO("Handling error !"); |
leihen | 3:d6224049b3bf | 75 | tcp.set_blocking(true, 1500); |
leihen | 11:3943841e1798 | 76 | sprintf(buffer,"HTTP/1.1 %d Error\r\n", errorCode); |
leihen | 3:d6224049b3bf | 77 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 78 | sprintf(buffer, "Content-Length: %d\r\n", strlen(szErrorPage)); |
leihen | 3:d6224049b3bf | 79 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 80 | if (header == NULL) { |
leihen | 3:d6224049b3bf | 81 | sprintf(buffer, "Content-Type: text/html\r\nServer: mbed embedded\r\n\n\r"); |
leihen | 3:d6224049b3bf | 82 | tcp.send(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 83 | } |
leihen | 3:d6224049b3bf | 84 | else { |
leihen | 3:d6224049b3bf | 85 | for ( map<const char*, const char*>::iterator cIter = header->begin() ; cIter != header->end() ; cIter ++) { |
leihen | 3:d6224049b3bf | 86 | tcp.send((char*)cIter->first, strlen(cIter->first)); |
leihen | 3:d6224049b3bf | 87 | tcp.send(": ", 2); |
leihen | 3:d6224049b3bf | 88 | tcp.send((char*)cIter->second, strlen(cIter->second)); |
leihen | 3:d6224049b3bf | 89 | tcp.send("\r\n",2); |
leihen | 3:d6224049b3bf | 90 | } |
leihen | 3:d6224049b3bf | 91 | tcp.send("\r\n",2); |
leihen | 3:d6224049b3bf | 92 | } |
leihen | 3:d6224049b3bf | 93 | tcp.send((char*)szErrorPage, strlen(szErrorPage)); |
leihen | 3:d6224049b3bf | 94 | } |
leihen | 3:d6224049b3bf | 95 | |
leihen | 3:d6224049b3bf | 96 | |
leihen | 7:cb7fec1265b5 | 97 | void HTTPRequestHandler::startResponse(int returnCode, long nLen, HTTPHeaders* header) |
leihen | 3:d6224049b3bf | 98 | { |
leihen | 7:cb7fec1265b5 | 99 | INFO("Starting response (%ld bytes in total)!", nLen); |
leihen | 3:d6224049b3bf | 100 | tcp.set_blocking(true, 1500); |
leihen | 11:3943841e1798 | 101 | sprintf(buffer, "HTTP/1.1 %d OK\r\n", returnCode); |
leihen | 11:3943841e1798 | 102 | tcp.send_all(buffer, strlen(buffer)); |
leihen | 11:3943841e1798 | 103 | tcp.send_all((char*)hdrConClose, strlen(hdrConClose)); |
leihen | 7:cb7fec1265b5 | 104 | sprintf(buffer, "Content-Length: %ld\r\n", nLen); // Add 2 chars for the terminating CR+LF |
leihen | 11:3943841e1798 | 105 | tcp.send_all(buffer, strlen(buffer)); |
leihen | 3:d6224049b3bf | 106 | if (header == NULL) { |
leihen | 11:3943841e1798 | 107 | tcp.send_all((char*)hdrDNT, strlen(hdrDNT)); |
leihen | 11:3943841e1798 | 108 | tcp.send_all((char*)hdrMaxAge, strlen(hdrMaxAge)); |
leihen | 11:3943841e1798 | 109 | tcp.send_all((char*)hdrContent, strlen(hdrContent)); |
leihen | 11:3943841e1798 | 110 | tcp.send_all((char*)hdrServer, strlen(hdrServer)); |
leihen | 11:3943841e1798 | 111 | tcp.send_all((char*)hdrEndl, strlen(hdrEndl)); |
leihen | 3:d6224049b3bf | 112 | } |
leihen | 3:d6224049b3bf | 113 | else { |
leihen | 3:d6224049b3bf | 114 | for ( map<const char*, const char*>::iterator cIter = header->begin() ; cIter != header->end() ; cIter ++) { |
leihen | 3:d6224049b3bf | 115 | tcp.send((char*)cIter->first, strlen(cIter->first)); |
leihen | 3:d6224049b3bf | 116 | tcp.send(": ", 2); |
leihen | 3:d6224049b3bf | 117 | tcp.send((char*)cIter->second, strlen(cIter->second)); |
leihen | 3:d6224049b3bf | 118 | tcp.send("\r\n\r\n",2); |
leihen | 3:d6224049b3bf | 119 | } |
leihen | 11:3943841e1798 | 120 | tcp.send_all("\r\n", 2); |
leihen | 3:d6224049b3bf | 121 | } |
leihen | 3:d6224049b3bf | 122 | // other content must be sent using the 'processResponse' function |
leihen | 3:d6224049b3bf | 123 | } |
leihen | 3:d6224049b3bf | 124 | |
leihen | 3:d6224049b3bf | 125 | void HTTPRequestHandler::processResponse(int nLen, char* body) |
leihen | 3:d6224049b3bf | 126 | { |
leihen | 7:cb7fec1265b5 | 127 | INFO("Processing Response (%d bytes)!\n",nLen); |
leihen | 11:3943841e1798 | 128 | tcp.send_all(body, nLen); |
leihen | 3:d6224049b3bf | 129 | } |
leihen | 3:d6224049b3bf | 130 | |
leihen | 3:d6224049b3bf | 131 | void HTTPRequestHandler::endResponse() |
leihen | 3:d6224049b3bf | 132 | { |
leihen | 3:d6224049b3bf | 133 | INFO("Ending Response !"); |
leihen | 11:3943841e1798 | 134 | // tcp.send("\r\n\r\n", 4); |
leihen | 3:d6224049b3bf | 135 | } |