Code written by Paul Rabbat, Angel Daruna, Jarel Hawkins, and Cordel Williams

Dependencies:   4DGL-uLCD-SE EthernetInterface HTTPClient NTPClient PinDetect SDFileSystem mbed-rpc mbed-rtos mbed wave_player

Fork of ECE4180_FinalProject by Angel Daruna

Committer:
prabbat3
Date:
Sun Dec 07 20:53:05 2014 +0000
Revision:
12:a99989062fee
Parent:
0:0a99e3fc2a46
Code cleanup

Who changed what in which revision?

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