各ピンへのread/writeを提供するサーバサンプル

Dependencies:   NySNICInterface mbed-rtos mbed

Fork of RESTServerSample2 by KDDI Fx0 hackathon

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