Fx0 hackathon team4

Dependencies:   NySNICInterface mbed-rtos mbed

Fork of RESTServerSample by KDDI Fx0 hackathon

Committer:
yi
Date:
Sun Feb 15 00:18:07 2015 +0000
Revision:
1:e821c773d5f0
Parent:
0:998e2e00df0c
Child:
2:2f187e09bdb0
add parse_request()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
komoritan 0:998e2e00df0c 1 #include "HTTPServer.h"
komoritan 0:998e2e00df0c 2 #include "mbed.h"
komoritan 0:998e2e00df0c 3
yi 1:e821c773d5f0 4 #include "parse_request.h"
yi 1:e821c773d5f0 5
komoritan 0:998e2e00df0c 6
komoritan 0:998e2e00df0c 7 bool cmp(char* a, char* b)
komoritan 0:998e2e00df0c 8 {
komoritan 0:998e2e00df0c 9 return strcmp(a,b) < 0;
komoritan 0:998e2e00df0c 10 }
komoritan 0:998e2e00df0c 11
komoritan 0:998e2e00df0c 12
komoritan 0:998e2e00df0c 13 HTTPServer::HTTPServer():
komoritan 0:998e2e00df0c 14 handlers(&cmp),
komoritan 0:998e2e00df0c 15 reply()
komoritan 0:998e2e00df0c 16 {
komoritan 0:998e2e00df0c 17 }
komoritan 0:998e2e00df0c 18
komoritan 0:998e2e00df0c 19
komoritan 0:998e2e00df0c 20 HTTPServer::~HTTPServer()
komoritan 0:998e2e00df0c 21 {
komoritan 0:998e2e00df0c 22 }
komoritan 0:998e2e00df0c 23
komoritan 0:998e2e00df0c 24
komoritan 0:998e2e00df0c 25 bool HTTPServer::init(int port)
komoritan 0:998e2e00df0c 26 {
komoritan 0:998e2e00df0c 27 DigitalOut led4(LED4);
komoritan 0:998e2e00df0c 28
komoritan 0:998e2e00df0c 29 socketserver.set_blocking(true);
komoritan 0:998e2e00df0c 30 if(socketserver.bind(port))
komoritan 0:998e2e00df0c 31 {
komoritan 0:998e2e00df0c 32 printf("Could not bind on port %d.\n", port);
komoritan 0:998e2e00df0c 33 return false;
komoritan 0:998e2e00df0c 34 }
komoritan 0:998e2e00df0c 35
komoritan 0:998e2e00df0c 36 if(socketserver.listen())
komoritan 0:998e2e00df0c 37 {
komoritan 0:998e2e00df0c 38 printf("Could not listen %d.\n", port);
komoritan 0:998e2e00df0c 39 return false;
komoritan 0:998e2e00df0c 40 }
komoritan 0:998e2e00df0c 41
komoritan 0:998e2e00df0c 42 led4 = 1; // server is ready
komoritan 0:998e2e00df0c 43
komoritan 0:998e2e00df0c 44 return true;
komoritan 0:998e2e00df0c 45 }
komoritan 0:998e2e00df0c 46
komoritan 0:998e2e00df0c 47
komoritan 0:998e2e00df0c 48 void HTTPServer::run()
komoritan 0:998e2e00df0c 49 {
komoritan 0:998e2e00df0c 50 char buffer[1024];
komoritan 0:998e2e00df0c 51 TCPSocketConnection c;
komoritan 0:998e2e00df0c 52
komoritan 0:998e2e00df0c 53 while(true)
komoritan 0:998e2e00df0c 54 {
komoritan 0:998e2e00df0c 55 while(socketserver.accept(&c));
komoritan 0:998e2e00df0c 56 c.set_blocking(false, 1000);
yi 1:e821c773d5f0 57
komoritan 0:998e2e00df0c 58 while(c.is_connected())
komoritan 0:998e2e00df0c 59 {
komoritan 0:998e2e00df0c 60 int n = c.receive(buffer, sizeof(buffer)-1);
yi 1:e821c773d5f0 61
komoritan 0:998e2e00df0c 62 if(n == 0)
komoritan 0:998e2e00df0c 63 {
komoritan 0:998e2e00df0c 64 c.close();
komoritan 0:998e2e00df0c 65 break;
komoritan 0:998e2e00df0c 66 }
komoritan 0:998e2e00df0c 67 else if(n != -1)
komoritan 0:998e2e00df0c 68 {
komoritan 0:998e2e00df0c 69 buffer[n] = '\0';
komoritan 0:998e2e00df0c 70 printf("Received data -- %s --. \r\n", buffer);
komoritan 0:998e2e00df0c 71 handle_request(buffer);
komoritan 0:998e2e00df0c 72 create_response(buffer);
komoritan 0:998e2e00df0c 73 printf("Sending data -- %s --. \r\n", buffer);
komoritan 0:998e2e00df0c 74 c.send_all(buffer, strlen(buffer));
komoritan 0:998e2e00df0c 75 printf("done. \r\n");
komoritan 0:998e2e00df0c 76 c.close();
komoritan 0:998e2e00df0c 77 break;
komoritan 0:998e2e00df0c 78 }
komoritan 0:998e2e00df0c 79 else {
komoritan 0:998e2e00df0c 80 printf("Error while receiving data. \r\n");
komoritan 0:998e2e00df0c 81 c.close();
komoritan 0:998e2e00df0c 82 break;
komoritan 0:998e2e00df0c 83 }
komoritan 0:998e2e00df0c 84 }
komoritan 0:998e2e00df0c 85 }
komoritan 0:998e2e00df0c 86 }
komoritan 0:998e2e00df0c 87
komoritan 0:998e2e00df0c 88
komoritan 0:998e2e00df0c 89 void HTTPServer::handle_request(char *buffer)
komoritan 0:998e2e00df0c 90 {
komoritan 0:998e2e00df0c 91 char* request_type = strtok(buffer, " ");
komoritan 0:998e2e00df0c 92 char* request = strtok(NULL, " ");
komoritan 0:998e2e00df0c 93
komoritan 0:998e2e00df0c 94 reply[0] = '\0';
komoritan 0:998e2e00df0c 95 response_code = HTTP_404_NOTFOUND;
komoritan 0:998e2e00df0c 96
yi 1:e821c773d5f0 97 // 追加 20150214
yi 1:e821c773d5f0 98 printf("%s\n",request);
yi 1:e821c773d5f0 99
yi 1:e821c773d5f0 100 parse_request(request);
yi 1:e821c773d5f0 101
yi 1:e821c773d5f0 102
yi 1:e821c773d5f0 103 /*
yi 1:e821c773d5f0 104
komoritan 0:998e2e00df0c 105 if(!object.decode(request, reply)){
komoritan 0:998e2e00df0c 106 return;
komoritan 0:998e2e00df0c 107 }
komoritan 0:998e2e00df0c 108
komoritan 0:998e2e00df0c 109 std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type);
komoritan 0:998e2e00df0c 110 if(itor == handlers.end())
komoritan 0:998e2e00df0c 111 {
komoritan 0:998e2e00df0c 112 printf("No request handler found for this type of request.\r\n");
komoritan 0:998e2e00df0c 113 return;
komoritan 0:998e2e00df0c 114 }
komoritan 0:998e2e00df0c 115 if(itor->second != NULL)
komoritan 0:998e2e00df0c 116 response_code = itor->second->handle(object, reply);
komoritan 0:998e2e00df0c 117 else
komoritan 0:998e2e00df0c 118 printf("Invalid request handler\r\n");
yi 1:e821c773d5f0 119 */
komoritan 0:998e2e00df0c 120 }
komoritan 0:998e2e00df0c 121
komoritan 0:998e2e00df0c 122
komoritan 0:998e2e00df0c 123 void HTTPServer::create_response(char *buffer)
komoritan 0:998e2e00df0c 124 {
komoritan 0:998e2e00df0c 125 char content_length[30] = "";
komoritan 0:998e2e00df0c 126 buffer[0] = '\0';
komoritan 0:998e2e00df0c 127
komoritan 0:998e2e00df0c 128 /* HTTP Status Code */
komoritan 0:998e2e00df0c 129 strcat(buffer, "HTTP/1.1 ");
komoritan 0:998e2e00df0c 130 switch(response_code){
komoritan 0:998e2e00df0c 131 case HTTP_200_OK:
komoritan 0:998e2e00df0c 132 strcat(buffer, "200 OK\r\n");
komoritan 0:998e2e00df0c 133 break;
komoritan 0:998e2e00df0c 134 case HTTP_404_NOTFOUND:
komoritan 0:998e2e00df0c 135 strcat(buffer, "404 Not Found\r\n");
komoritan 0:998e2e00df0c 136 break;
komoritan 0:998e2e00df0c 137 default:
komoritan 0:998e2e00df0c 138 strcat(buffer, "500 Internal Server Error\r\n");
komoritan 0:998e2e00df0c 139 break;
komoritan 0:998e2e00df0c 140 }
komoritan 0:998e2e00df0c 141
komoritan 0:998e2e00df0c 142 /* add header */
komoritan 0:998e2e00df0c 143 strcat(buffer, "Access-Control-Allow-Origin: *\r\n");
komoritan 0:998e2e00df0c 144 sprintf(content_length, "Content-Length: %d\r\n", strlen(reply));
komoritan 0:998e2e00df0c 145 strncat(buffer, content_length, strlen(content_length));
komoritan 0:998e2e00df0c 146 strcat(buffer, "Content-Type: text/plain\r\n\r\n");
komoritan 0:998e2e00df0c 147
komoritan 0:998e2e00df0c 148 /* add content */
komoritan 0:998e2e00df0c 149 strcat(buffer, reply);
komoritan 0:998e2e00df0c 150 }
komoritan 0:998e2e00df0c 151
komoritan 0:998e2e00df0c 152
komoritan 0:998e2e00df0c 153 void HTTPServer::add_request_handler(char *name, RequestHandler* handler)
komoritan 0:998e2e00df0c 154 {
komoritan 0:998e2e00df0c 155 handlers[name] = handler;
komoritan 0:998e2e00df0c 156 printf("%s request hander.\r\n", name);
komoritan 0:998e2e00df0c 157 }