au wot hackathon0314 test program

Dependencies:   NySNICInterface mbed-rtos mbed

Fork of RESTServer_team4 by y ishida

Committer:
yi
Date:
Sun Feb 15 00:54:43 2015 +0000
Revision:
2:2f187e09bdb0
Parent:
1:e821c773d5f0
Child:
5:70c9f6045f2d
arranged the code (control_motors.cpp, control_motors.h)

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 2:2f187e09bdb0 4 #include "control_motors.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 2:2f187e09bdb0 97 // リクエストされたURLをパースしてモーターを制御
yi 1:e821c773d5f0 98 parse_request(request);
yi 1:e821c773d5f0 99
yi 1:e821c773d5f0 100
yi 1:e821c773d5f0 101 /*
yi 1:e821c773d5f0 102
komoritan 0:998e2e00df0c 103 if(!object.decode(request, reply)){
komoritan 0:998e2e00df0c 104 return;
komoritan 0:998e2e00df0c 105 }
komoritan 0:998e2e00df0c 106
komoritan 0:998e2e00df0c 107 std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type);
komoritan 0:998e2e00df0c 108 if(itor == handlers.end())
komoritan 0:998e2e00df0c 109 {
komoritan 0:998e2e00df0c 110 printf("No request handler found for this type of request.\r\n");
komoritan 0:998e2e00df0c 111 return;
komoritan 0:998e2e00df0c 112 }
komoritan 0:998e2e00df0c 113 if(itor->second != NULL)
komoritan 0:998e2e00df0c 114 response_code = itor->second->handle(object, reply);
komoritan 0:998e2e00df0c 115 else
komoritan 0:998e2e00df0c 116 printf("Invalid request handler\r\n");
yi 1:e821c773d5f0 117 */
komoritan 0:998e2e00df0c 118 }
komoritan 0:998e2e00df0c 119
komoritan 0:998e2e00df0c 120
komoritan 0:998e2e00df0c 121 void HTTPServer::create_response(char *buffer)
komoritan 0:998e2e00df0c 122 {
komoritan 0:998e2e00df0c 123 char content_length[30] = "";
komoritan 0:998e2e00df0c 124 buffer[0] = '\0';
komoritan 0:998e2e00df0c 125
komoritan 0:998e2e00df0c 126 /* HTTP Status Code */
komoritan 0:998e2e00df0c 127 strcat(buffer, "HTTP/1.1 ");
komoritan 0:998e2e00df0c 128 switch(response_code){
komoritan 0:998e2e00df0c 129 case HTTP_200_OK:
komoritan 0:998e2e00df0c 130 strcat(buffer, "200 OK\r\n");
komoritan 0:998e2e00df0c 131 break;
komoritan 0:998e2e00df0c 132 case HTTP_404_NOTFOUND:
komoritan 0:998e2e00df0c 133 strcat(buffer, "404 Not Found\r\n");
komoritan 0:998e2e00df0c 134 break;
komoritan 0:998e2e00df0c 135 default:
komoritan 0:998e2e00df0c 136 strcat(buffer, "500 Internal Server Error\r\n");
komoritan 0:998e2e00df0c 137 break;
komoritan 0:998e2e00df0c 138 }
komoritan 0:998e2e00df0c 139
komoritan 0:998e2e00df0c 140 /* add header */
komoritan 0:998e2e00df0c 141 strcat(buffer, "Access-Control-Allow-Origin: *\r\n");
komoritan 0:998e2e00df0c 142 sprintf(content_length, "Content-Length: %d\r\n", strlen(reply));
komoritan 0:998e2e00df0c 143 strncat(buffer, content_length, strlen(content_length));
komoritan 0:998e2e00df0c 144 strcat(buffer, "Content-Type: text/plain\r\n\r\n");
komoritan 0:998e2e00df0c 145
komoritan 0:998e2e00df0c 146 /* add content */
komoritan 0:998e2e00df0c 147 strcat(buffer, reply);
komoritan 0:998e2e00df0c 148 }
komoritan 0:998e2e00df0c 149
komoritan 0:998e2e00df0c 150
komoritan 0:998e2e00df0c 151 void HTTPServer::add_request_handler(char *name, RequestHandler* handler)
komoritan 0:998e2e00df0c 152 {
komoritan 0:998e2e00df0c 153 handlers[name] = handler;
komoritan 0:998e2e00df0c 154 printf("%s request hander.\r\n", name);
komoritan 0:998e2e00df0c 155 }