Modified to run on Renesas GR Peach board

Dependents:   GR-PeachAHRSWeb

Fork of HTTP-Server by Francois Berder

Committer:
feb11
Date:
Wed Jul 17 15:00:24 2013 +0000
Revision:
4:624527ebc0fa
Parent:
0:9e4bcb10b3e3
Child:
7:838d7ea07e18
Fixed bug in InteractiveHTMLFormatter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 0:9e4bcb10b3e3 1 #include "HTTPServer.h"
feb11 0:9e4bcb10b3e3 2
feb11 0:9e4bcb10b3e3 3 #define INVALID_FORMATTER "No valid formatter specified"
feb11 0:9e4bcb10b3e3 4
feb11 0:9e4bcb10b3e3 5 bool cmp(char* a, char* b)
feb11 0:9e4bcb10b3e3 6 {
feb11 0:9e4bcb10b3e3 7 return strcmp(a,b) < 0;
feb11 0:9e4bcb10b3e3 8 }
feb11 4:624527ebc0fa 9
feb11 0:9e4bcb10b3e3 10 HTTPServer::HTTPServer(Formatter *f):
feb11 0:9e4bcb10b3e3 11 socket(),
feb11 0:9e4bcb10b3e3 12 handlers(&cmp),
feb11 0:9e4bcb10b3e3 13 formatter(f),
feb11 0:9e4bcb10b3e3 14 reply(),
feb11 0:9e4bcb10b3e3 15 command()
feb11 0:9e4bcb10b3e3 16 {
feb11 0:9e4bcb10b3e3 17 }
feb11 0:9e4bcb10b3e3 18
feb11 0:9e4bcb10b3e3 19 HTTPServer::~HTTPServer()
feb11 0:9e4bcb10b3e3 20 {
feb11 0:9e4bcb10b3e3 21 for(std::map<char*, RequestHandler*>::iterator itor = handlers.begin();
feb11 0:9e4bcb10b3e3 22 itor != handlers.end();
feb11 0:9e4bcb10b3e3 23 ++itor)
feb11 0:9e4bcb10b3e3 24 delete itor->second;
feb11 0:9e4bcb10b3e3 25
feb11 0:9e4bcb10b3e3 26 if(formatter)
feb11 0:9e4bcb10b3e3 27 delete formatter;
feb11 0:9e4bcb10b3e3 28 }
feb11 0:9e4bcb10b3e3 29
feb11 0:9e4bcb10b3e3 30 bool HTTPServer::init(int port)
feb11 0:9e4bcb10b3e3 31 {
feb11 0:9e4bcb10b3e3 32 socket.set_blocking(true);
feb11 0:9e4bcb10b3e3 33 return !socket.bind(port) && !socket.listen();
feb11 0:9e4bcb10b3e3 34 }
feb11 0:9e4bcb10b3e3 35
feb11 0:9e4bcb10b3e3 36 void HTTPServer::run()
feb11 0:9e4bcb10b3e3 37 {
feb11 0:9e4bcb10b3e3 38 TCPSocketConnection c;
feb11 0:9e4bcb10b3e3 39 while(true)
feb11 0:9e4bcb10b3e3 40 {
feb11 0:9e4bcb10b3e3 41 while(socket.accept(c));
feb11 0:9e4bcb10b3e3 42 c.set_blocking(false, 1000);
feb11 0:9e4bcb10b3e3 43 while(c.is_connected())
feb11 0:9e4bcb10b3e3 44 {
feb11 0:9e4bcb10b3e3 45 char buffer[512];
feb11 0:9e4bcb10b3e3 46 int n = c.receive_all(buffer, sizeof(buffer)-1);
feb11 0:9e4bcb10b3e3 47 if(n == 0)
feb11 0:9e4bcb10b3e3 48 {
feb11 0:9e4bcb10b3e3 49 c.close();
feb11 0:9e4bcb10b3e3 50 break;
feb11 0:9e4bcb10b3e3 51 }
feb11 0:9e4bcb10b3e3 52 else if(n != -1)
feb11 0:9e4bcb10b3e3 53 {
feb11 0:9e4bcb10b3e3 54 buffer[n] = '\0';
feb11 0:9e4bcb10b3e3 55 handle_request(buffer);
feb11 0:9e4bcb10b3e3 56 if(formatter != NULL)
feb11 0:9e4bcb10b3e3 57 {
feb11 0:9e4bcb10b3e3 58 char *page = formatter->get_page(reply);
feb11 0:9e4bcb10b3e3 59 do
feb11 0:9e4bcb10b3e3 60 {
feb11 0:9e4bcb10b3e3 61 c.send(page, strlen(page)+1);
feb11 0:9e4bcb10b3e3 62 page = formatter->get_page(reply);
feb11 0:9e4bcb10b3e3 63 }while(strlen(page)>0);
feb11 0:9e4bcb10b3e3 64 }
feb11 0:9e4bcb10b3e3 65 else
feb11 0:9e4bcb10b3e3 66 c.send(INVALID_FORMATTER, strlen(INVALID_FORMATTER)+1);
feb11 0:9e4bcb10b3e3 67 }
feb11 0:9e4bcb10b3e3 68 }
feb11 0:9e4bcb10b3e3 69 }
feb11 0:9e4bcb10b3e3 70 }
feb11 0:9e4bcb10b3e3 71
feb11 0:9e4bcb10b3e3 72 void HTTPServer::handle_request(char *buffer)
feb11 0:9e4bcb10b3e3 73 {
feb11 0:9e4bcb10b3e3 74 char *request_type = strtok(buffer, " ");
feb11 0:9e4bcb10b3e3 75 char *request = strtok(NULL, " ");
feb11 0:9e4bcb10b3e3 76
feb11 0:9e4bcb10b3e3 77 reply[0] = '\0';
feb11 0:9e4bcb10b3e3 78 if(!strcmp(request, "/"))
feb11 0:9e4bcb10b3e3 79 return;
feb11 0:9e4bcb10b3e3 80
feb11 0:9e4bcb10b3e3 81 if(!command.decode(request))
feb11 0:9e4bcb10b3e3 82 {
feb11 0:9e4bcb10b3e3 83 strcat(reply, "Malformed request");
feb11 0:9e4bcb10b3e3 84 return;
feb11 0:9e4bcb10b3e3 85 }
feb11 0:9e4bcb10b3e3 86
feb11 0:9e4bcb10b3e3 87 std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type);
feb11 0:9e4bcb10b3e3 88 if(itor == handlers.end())
feb11 0:9e4bcb10b3e3 89 {
feb11 0:9e4bcb10b3e3 90 strcat(reply, "Only PUT, DELETE and GET requests are accepted.");
feb11 0:9e4bcb10b3e3 91 return;
feb11 0:9e4bcb10b3e3 92 }
feb11 0:9e4bcb10b3e3 93 if(itor->second != NULL)
feb11 0:9e4bcb10b3e3 94 itor->second->handle(command, reply);
feb11 0:9e4bcb10b3e3 95 else
feb11 0:9e4bcb10b3e3 96 strcat(reply, "Invalid request handler");
feb11 0:9e4bcb10b3e3 97 }
feb11 0:9e4bcb10b3e3 98
feb11 0:9e4bcb10b3e3 99 void HTTPServer::add_request_handler(char *name, RequestHandler* handler)
feb11 0:9e4bcb10b3e3 100 {
feb11 0:9e4bcb10b3e3 101 handlers[name] = handler;
feb11 0:9e4bcb10b3e3 102 }
feb11 0:9e4bcb10b3e3 103