Changes made for RPC

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?

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 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 }