Single instance HTTP Server using new Ethernet Interface with bug fix for URL arguments

Fork of HTTPServer by Henry Leinen

Committer:
leihen
Date:
Tue May 28 01:56:14 2013 +0000
Revision:
3:d6224049b3bf
Parent:
1:6b7472d5e9ee
Child:
4:d065642c32cc
First beta version

Who changed what in which revision?

UserRevisionLine numberNew 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 3:d6224049b3bf 5 #if (1 && !defined(TARGET_LPC11U24))
leihen 3:d6224049b3bf 6 #define INFO(x, ...) std::printf("[HTTPRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__);
leihen 3:d6224049b3bf 7 #define WARN(x, ...) std::printf("[HTTPRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__);
leihen 3:d6224049b3bf 8 #define ERR(x, ...) std::printf("[HTTPRequestHandler : DBG]"x"\r\n", ##__VA_ARGS__);
leihen 3:d6224049b3bf 9 #else
leihen 3:d6224049b3bf 10 #define INFO(x, ...)
leihen 3:d6224049b3bf 11 #define WARN(x, ...)
leihen 3:d6224049b3bf 12 #define ERR(x, ...)
leihen 3:d6224049b3bf 13 #endif
leihen 1:6b7472d5e9ee 14
leihen 3:d6224049b3bf 15 static char buffer[128];
leihen 3:d6224049b3bf 16
leihen 3:d6224049b3bf 17 HTTPRequestHandler::HTTPRequestHandler(HTTPConnection::HTTPMessage& Msg, TCPSocketConnection& Tcp)
leihen 3:d6224049b3bf 18 : msg(Msg), tcp(Tcp)
leihen 1:6b7472d5e9ee 19 {
leihen 3:d6224049b3bf 20 msg = Msg;
leihen 3:d6224049b3bf 21 tcp = Tcp;
leihen 1:6b7472d5e9ee 22 }
leihen 1:6b7472d5e9ee 23
leihen 1:6b7472d5e9ee 24 HTTPRequestHandler::~HTTPRequestHandler()
leihen 1:6b7472d5e9ee 25 {
leihen 3:d6224049b3bf 26 }
leihen 3:d6224049b3bf 27
leihen 3:d6224049b3bf 28 void HTTPRequestHandler::handleRequest()
leihen 3:d6224049b3bf 29 {
leihen 3:d6224049b3bf 30 int err = 0;
leihen 3:d6224049b3bf 31
leihen 3:d6224049b3bf 32 switch (msg.request) {
leihen 3:d6224049b3bf 33 case HTTP_RT_GET:
leihen 3:d6224049b3bf 34 INFO("Dispatching GET Request.");
leihen 3:d6224049b3bf 35 err = handleGetRequest();
leihen 3:d6224049b3bf 36 break;
leihen 3:d6224049b3bf 37
leihen 3:d6224049b3bf 38 // case HTTP_RT_POST:
leihen 3:d6224049b3bf 39 // err = handlePostRequest();
leihen 3:d6224049b3bf 40 // break;
leihen 3:d6224049b3bf 41
leihen 3:d6224049b3bf 42 // case HTTP_RT_PUT:
leihen 3:d6224049b3bf 43 // err = handlePutRequest();
leihen 3:d6224049b3bf 44 // break;
leihen 3:d6224049b3bf 45
leihen 3:d6224049b3bf 46 default:
leihen 3:d6224049b3bf 47 INFO("Error in handleRequest, unhandled request type.");
leihen 3:d6224049b3bf 48 err = 404;
leihen 3:d6224049b3bf 49 break;
leihen 3:d6224049b3bf 50 }
leihen 3:d6224049b3bf 51
leihen 3:d6224049b3bf 52 // if any of these functions returns a negative number, call the error handler
leihen 3:d6224049b3bf 53 if (err > 0) {
leihen 3:d6224049b3bf 54 handleError(err);
leihen 3:d6224049b3bf 55 }
leihen 3:d6224049b3bf 56 }
leihen 3:d6224049b3bf 57
leihen 3:d6224049b3bf 58 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 59
leihen 3:d6224049b3bf 60 void HTTPRequestHandler::handleError(int errorCode, HTTPHeaders* header)
leihen 3:d6224049b3bf 61 {
leihen 3:d6224049b3bf 62 INFO("Handling error !");
leihen 3:d6224049b3bf 63 tcp.set_blocking(true, 1500);
leihen 3:d6224049b3bf 64 sprintf(buffer,"HTTP/1.1 %d Error\r\n", errorCode);
leihen 3:d6224049b3bf 65 tcp.send(buffer, strlen(buffer));
leihen 3:d6224049b3bf 66 sprintf(buffer, "Content-Length: %d\r\n", strlen(szErrorPage));
leihen 3:d6224049b3bf 67 tcp.send(buffer, strlen(buffer));
leihen 3:d6224049b3bf 68 if (header == NULL) {
leihen 3:d6224049b3bf 69 sprintf(buffer, "Content-Type: text/html\r\nServer: mbed embedded\r\n\n\r");
leihen 3:d6224049b3bf 70 tcp.send(buffer, strlen(buffer));
leihen 3:d6224049b3bf 71 }
leihen 3:d6224049b3bf 72 else {
leihen 3:d6224049b3bf 73 for ( map<const char*, const char*>::iterator cIter = header->begin() ; cIter != header->end() ; cIter ++) {
leihen 3:d6224049b3bf 74 tcp.send((char*)cIter->first, strlen(cIter->first));
leihen 3:d6224049b3bf 75 tcp.send(": ", 2);
leihen 3:d6224049b3bf 76 tcp.send((char*)cIter->second, strlen(cIter->second));
leihen 3:d6224049b3bf 77 tcp.send("\r\n",2);
leihen 3:d6224049b3bf 78 }
leihen 3:d6224049b3bf 79 tcp.send("\r\n",2);
leihen 3:d6224049b3bf 80 }
leihen 3:d6224049b3bf 81 tcp.send((char*)szErrorPage, strlen(szErrorPage));
leihen 3:d6224049b3bf 82 }
leihen 3:d6224049b3bf 83
leihen 3:d6224049b3bf 84
leihen 3:d6224049b3bf 85 void HTTPRequestHandler::startResponse(int returnCode, int nLen, HTTPHeaders* header)
leihen 3:d6224049b3bf 86 {
leihen 3:d6224049b3bf 87 INFO("Starting response !");
leihen 3:d6224049b3bf 88 tcp.set_blocking(true, 1500);
leihen 3:d6224049b3bf 89 sprintf(buffer, "HTTP/1.1 %d OK\r\n", returnCode);
leihen 3:d6224049b3bf 90 tcp.send(buffer, strlen(buffer));
leihen 3:d6224049b3bf 91 sprintf(buffer, "Content-Length: %d\r\n", nLen + 2); // Add 2 chars for the terminating CR+LF
leihen 3:d6224049b3bf 92 tcp.send(buffer, strlen(buffer));
leihen 3:d6224049b3bf 93 if (header == NULL) {
leihen 3:d6224049b3bf 94 sprintf(buffer, "Content-Type: text/html\r\nServer: mbed embedded\r\n\r\n");
leihen 3:d6224049b3bf 95 tcp.send(buffer, strlen(buffer));
leihen 3:d6224049b3bf 96 }
leihen 3:d6224049b3bf 97 else {
leihen 3:d6224049b3bf 98 for ( map<const char*, const char*>::iterator cIter = header->begin() ; cIter != header->end() ; cIter ++) {
leihen 3:d6224049b3bf 99 tcp.send((char*)cIter->first, strlen(cIter->first));
leihen 3:d6224049b3bf 100 tcp.send(": ", 2);
leihen 3:d6224049b3bf 101 tcp.send((char*)cIter->second, strlen(cIter->second));
leihen 3:d6224049b3bf 102 tcp.send("\r\n\r\n",2);
leihen 3:d6224049b3bf 103 }
leihen 3:d6224049b3bf 104 tcp.send("\r\n", 2);
leihen 3:d6224049b3bf 105 }
leihen 3:d6224049b3bf 106 // other content must be sent using the 'processResponse' function
leihen 3:d6224049b3bf 107 }
leihen 3:d6224049b3bf 108
leihen 3:d6224049b3bf 109 void HTTPRequestHandler::processResponse(int nLen, char* body)
leihen 3:d6224049b3bf 110 {
leihen 3:d6224049b3bf 111 INFO("Processing Response !");
leihen 3:d6224049b3bf 112 tcp.send(body, nLen);
leihen 3:d6224049b3bf 113 }
leihen 3:d6224049b3bf 114
leihen 3:d6224049b3bf 115 void HTTPRequestHandler::endResponse()
leihen 3:d6224049b3bf 116 {
leihen 3:d6224049b3bf 117 INFO("Ending Response !");
leihen 3:d6224049b3bf 118 tcp.send("\r\n", 2);
leihen 3:d6224049b3bf 119 }
leihen 3:d6224049b3bf 120