ported HTTP-Server with W5500 Ethernet Shield

Dependencies:   W5500Interface mbed-rpc mbed

Fork of HTTP-Server by Francois Berder

Committer:
feb11
Date:
Thu Jul 18 08:30:11 2013 +0000
Revision:
8:464abd184b7b
Parent:
7:838d7ea07e18
Child:
9:a9bf63017854
Changed error message when no request handler is found

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 7:838d7ea07e18 54 printf("Received data\n");
feb11 0:9e4bcb10b3e3 55 buffer[n] = '\0';
feb11 0:9e4bcb10b3e3 56 handle_request(buffer);
feb11 0:9e4bcb10b3e3 57 if(formatter != NULL)
feb11 0:9e4bcb10b3e3 58 {
feb11 7:838d7ea07e18 59 printf("Sending data...");
feb11 0:9e4bcb10b3e3 60 char *page = formatter->get_page(reply);
feb11 0:9e4bcb10b3e3 61 do
feb11 0:9e4bcb10b3e3 62 {
feb11 0:9e4bcb10b3e3 63 c.send(page, strlen(page)+1);
feb11 0:9e4bcb10b3e3 64 page = formatter->get_page(reply);
feb11 0:9e4bcb10b3e3 65 }while(strlen(page)>0);
feb11 7:838d7ea07e18 66 printf("done\n");
feb11 0:9e4bcb10b3e3 67 }
feb11 0:9e4bcb10b3e3 68 else
feb11 0:9e4bcb10b3e3 69 c.send(INVALID_FORMATTER, strlen(INVALID_FORMATTER)+1);
feb11 0:9e4bcb10b3e3 70 }
feb11 7:838d7ea07e18 71 else
feb11 7:838d7ea07e18 72 printf("Error while receiving data\n");
feb11 0:9e4bcb10b3e3 73 }
feb11 0:9e4bcb10b3e3 74 }
feb11 0:9e4bcb10b3e3 75 }
feb11 0:9e4bcb10b3e3 76
feb11 0:9e4bcb10b3e3 77 void HTTPServer::handle_request(char *buffer)
feb11 0:9e4bcb10b3e3 78 {
feb11 0:9e4bcb10b3e3 79 char *request_type = strtok(buffer, " ");
feb11 0:9e4bcb10b3e3 80 char *request = strtok(NULL, " ");
feb11 0:9e4bcb10b3e3 81
feb11 0:9e4bcb10b3e3 82 reply[0] = '\0';
feb11 0:9e4bcb10b3e3 83 if(!strcmp(request, "/"))
feb11 0:9e4bcb10b3e3 84 return;
feb11 0:9e4bcb10b3e3 85
feb11 0:9e4bcb10b3e3 86 if(!command.decode(request))
feb11 0:9e4bcb10b3e3 87 {
feb11 0:9e4bcb10b3e3 88 strcat(reply, "Malformed request");
feb11 0:9e4bcb10b3e3 89 return;
feb11 0:9e4bcb10b3e3 90 }
feb11 0:9e4bcb10b3e3 91
feb11 0:9e4bcb10b3e3 92 std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type);
feb11 0:9e4bcb10b3e3 93 if(itor == handlers.end())
feb11 0:9e4bcb10b3e3 94 {
feb11 8:464abd184b7b 95 strcat(reply, "No request handler found for this type of request.");
feb11 0:9e4bcb10b3e3 96 return;
feb11 0:9e4bcb10b3e3 97 }
feb11 0:9e4bcb10b3e3 98 if(itor->second != NULL)
feb11 0:9e4bcb10b3e3 99 itor->second->handle(command, reply);
feb11 0:9e4bcb10b3e3 100 else
feb11 0:9e4bcb10b3e3 101 strcat(reply, "Invalid request handler");
feb11 0:9e4bcb10b3e3 102 }
feb11 0:9e4bcb10b3e3 103
feb11 0:9e4bcb10b3e3 104 void HTTPServer::add_request_handler(char *name, RequestHandler* handler)
feb11 0:9e4bcb10b3e3 105 {
feb11 0:9e4bcb10b3e3 106 handlers[name] = handler;
feb11 0:9e4bcb10b3e3 107 }
feb11 0:9e4bcb10b3e3 108