au wot hackathon0314 test program
Dependencies: NySNICInterface mbed-rtos mbed
Fork of RESTServer_team4 by
HTTPServer.cpp@1:e821c773d5f0, 2015-02-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |