WIZwikiREST ver1.0 (Memory problem)
Dependencies: MbedJSONValue WIZnetInterface mbed
HTTPServer.cpp@0:5886f525a4ad, 2016-03-02 (annotated)
- Committer:
- joon874
- Date:
- Wed Mar 02 03:28:08 2016 +0000
- Revision:
- 0:5886f525a4ad
WIZwikiREST ver1 (Memory problem)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
joon874 | 0:5886f525a4ad | 1 | #include <string.h> |
joon874 | 0:5886f525a4ad | 2 | #include "HTTPServer.h" |
joon874 | 0:5886f525a4ad | 3 | #include "MbedJSONValue.h" |
joon874 | 0:5886f525a4ad | 4 | |
joon874 | 0:5886f525a4ad | 5 | extern MbedJSONValue WIZwikiREST; |
joon874 | 0:5886f525a4ad | 6 | |
joon874 | 0:5886f525a4ad | 7 | bool cmp(char* a, char* b) |
joon874 | 0:5886f525a4ad | 8 | { |
joon874 | 0:5886f525a4ad | 9 | return strcmp(a,b) < 0; |
joon874 | 0:5886f525a4ad | 10 | } |
joon874 | 0:5886f525a4ad | 11 | |
joon874 | 0:5886f525a4ad | 12 | HTTPServer::HTTPServer(): |
joon874 | 0:5886f525a4ad | 13 | socket(), |
joon874 | 0:5886f525a4ad | 14 | handlers(&cmp) |
joon874 | 0:5886f525a4ad | 15 | { |
joon874 | 0:5886f525a4ad | 16 | } |
joon874 | 0:5886f525a4ad | 17 | |
joon874 | 0:5886f525a4ad | 18 | HTTPServer::~HTTPServer() |
joon874 | 0:5886f525a4ad | 19 | { |
joon874 | 0:5886f525a4ad | 20 | for(std::map<char*, RequestHandler*>::iterator itor = handlers.begin(); |
joon874 | 0:5886f525a4ad | 21 | itor != handlers.end(); |
joon874 | 0:5886f525a4ad | 22 | ++itor) |
joon874 | 0:5886f525a4ad | 23 | delete itor->second; |
joon874 | 0:5886f525a4ad | 24 | } |
joon874 | 0:5886f525a4ad | 25 | |
joon874 | 0:5886f525a4ad | 26 | bool HTTPServer::init(int port) |
joon874 | 0:5886f525a4ad | 27 | { |
joon874 | 0:5886f525a4ad | 28 | socket.set_blocking(true); |
joon874 | 0:5886f525a4ad | 29 | if(socket.bind(port)) |
joon874 | 0:5886f525a4ad | 30 | { |
joon874 | 0:5886f525a4ad | 31 | printf("Could not bind on port %d.\n", port); |
joon874 | 0:5886f525a4ad | 32 | return false; |
joon874 | 0:5886f525a4ad | 33 | } |
joon874 | 0:5886f525a4ad | 34 | |
joon874 | 0:5886f525a4ad | 35 | if(socket.listen()) |
joon874 | 0:5886f525a4ad | 36 | { |
joon874 | 0:5886f525a4ad | 37 | printf("Could not listen %d\n", port); |
joon874 | 0:5886f525a4ad | 38 | return false; |
joon874 | 0:5886f525a4ad | 39 | } |
joon874 | 0:5886f525a4ad | 40 | |
joon874 | 0:5886f525a4ad | 41 | return true; |
joon874 | 0:5886f525a4ad | 42 | } |
joon874 | 0:5886f525a4ad | 43 | |
joon874 | 0:5886f525a4ad | 44 | void HTTPServer::run() |
joon874 | 0:5886f525a4ad | 45 | { |
joon874 | 0:5886f525a4ad | 46 | TCPSocketConnection c; |
joon874 | 0:5886f525a4ad | 47 | while(true) |
joon874 | 0:5886f525a4ad | 48 | { |
joon874 | 0:5886f525a4ad | 49 | while(socket.accept(c)); |
joon874 | 0:5886f525a4ad | 50 | c.set_blocking(false, 1000); |
joon874 | 0:5886f525a4ad | 51 | while(c.is_connected()) |
joon874 | 0:5886f525a4ad | 52 | { |
joon874 | 0:5886f525a4ad | 53 | |
joon874 | 0:5886f525a4ad | 54 | int n = c.receive_all(HTTPBUF, sizeof(HTTPBUF)-1); |
joon874 | 0:5886f525a4ad | 55 | |
joon874 | 0:5886f525a4ad | 56 | if(n == 0) |
joon874 | 0:5886f525a4ad | 57 | { |
joon874 | 0:5886f525a4ad | 58 | c.close(); |
joon874 | 0:5886f525a4ad | 59 | break; |
joon874 | 0:5886f525a4ad | 60 | } |
joon874 | 0:5886f525a4ad | 61 | else if(n != -1) |
joon874 | 0:5886f525a4ad | 62 | { |
joon874 | 0:5886f525a4ad | 63 | printf("Received data : %d\r\n",n); |
joon874 | 0:5886f525a4ad | 64 | |
joon874 | 0:5886f525a4ad | 65 | HTTPBUF[n] = '\0'; |
joon874 | 0:5886f525a4ad | 66 | if(handle_request(HTTPBUF) == HTTP_SUCCESS) |
joon874 | 0:5886f525a4ad | 67 | { |
joon874 | 0:5886f525a4ad | 68 | c.send(rest_result, strlen(rest_result)); |
joon874 | 0:5886f525a4ad | 69 | //c.send((char*)rest_result.c_str(), 159); |
joon874 | 0:5886f525a4ad | 70 | } |
joon874 | 0:5886f525a4ad | 71 | else |
joon874 | 0:5886f525a4ad | 72 | { |
joon874 | 0:5886f525a4ad | 73 | //printf("send fail : %s\r\n",(char*)rest_result.c_str()); |
joon874 | 0:5886f525a4ad | 74 | c.send(rest_result, strlen(rest_result)); |
joon874 | 0:5886f525a4ad | 75 | } |
joon874 | 0:5886f525a4ad | 76 | } |
joon874 | 0:5886f525a4ad | 77 | else |
joon874 | 0:5886f525a4ad | 78 | printf("Error while receiving data\n"); |
joon874 | 0:5886f525a4ad | 79 | |
joon874 | 0:5886f525a4ad | 80 | } |
joon874 | 0:5886f525a4ad | 81 | } |
joon874 | 0:5886f525a4ad | 82 | } |
joon874 | 0:5886f525a4ad | 83 | |
joon874 | 0:5886f525a4ad | 84 | |
joon874 | 0:5886f525a4ad | 85 | HTTP_RESULT HTTPServer::handle_request(char *buffer) |
joon874 | 0:5886f525a4ad | 86 | { |
joon874 | 0:5886f525a4ad | 87 | char *request_type; |
joon874 | 0:5886f525a4ad | 88 | char *request; |
joon874 | 0:5886f525a4ad | 89 | |
joon874 | 0:5886f525a4ad | 90 | //{"Name":"WIZwiki-REST-01","Network":{"IP":"192.168.100.100","SN":"255.255.255.0","GW":"192.168.100.1"},"User":{"Name":"Lawrence","ID":"law","PSWD":"law1234"}} 159 |
joon874 | 0:5886f525a4ad | 91 | if(buffer) |
joon874 | 0:5886f525a4ad | 92 | { |
joon874 | 0:5886f525a4ad | 93 | // buffer check |
joon874 | 0:5886f525a4ad | 94 | printf("*******************************************************\r\n"); |
joon874 | 0:5886f525a4ad | 95 | printf("buffer=%s\r\n",buffer); |
joon874 | 0:5886f525a4ad | 96 | printf("*******************************************************\r\n"); |
joon874 | 0:5886f525a4ad | 97 | |
joon874 | 0:5886f525a4ad | 98 | // type parsing |
joon874 | 0:5886f525a4ad | 99 | request_type = strtok(buffer," \r\n"); |
joon874 | 0:5886f525a4ad | 100 | printf("Type = %s\r\n", request_type); |
joon874 | 0:5886f525a4ad | 101 | |
joon874 | 0:5886f525a4ad | 102 | if(request_type) |
joon874 | 0:5886f525a4ad | 103 | { |
joon874 | 0:5886f525a4ad | 104 | request = strtok(NULL, " \r\n"); // corrested " " -> " /" : /Name -> Name |
joon874 | 0:5886f525a4ad | 105 | if(request) |
joon874 | 0:5886f525a4ad | 106 | { |
joon874 | 0:5886f525a4ad | 107 | printf("URI = %s\r\n", request); |
joon874 | 0:5886f525a4ad | 108 | } |
joon874 | 0:5886f525a4ad | 109 | else |
joon874 | 0:5886f525a4ad | 110 | { |
joon874 | 0:5886f525a4ad | 111 | strcpy(rest_result, "Invaild URI"); |
joon874 | 0:5886f525a4ad | 112 | printf("%s\r\n",rest_result); |
joon874 | 0:5886f525a4ad | 113 | return HTTP_INVALID_URI; |
joon874 | 0:5886f525a4ad | 114 | } |
joon874 | 0:5886f525a4ad | 115 | } |
joon874 | 0:5886f525a4ad | 116 | } |
joon874 | 0:5886f525a4ad | 117 | |
joon874 | 0:5886f525a4ad | 118 | std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type); |
joon874 | 0:5886f525a4ad | 119 | if(itor == handlers.end()) |
joon874 | 0:5886f525a4ad | 120 | { |
joon874 | 0:5886f525a4ad | 121 | strcpy(rest_result, "No request handler found for this type of request."); |
joon874 | 0:5886f525a4ad | 122 | return HTTP_INVALID_HANDLE; |
joon874 | 0:5886f525a4ad | 123 | } |
joon874 | 0:5886f525a4ad | 124 | //if(itor != NULL) |
joon874 | 0:5886f525a4ad | 125 | //itor->handle(request, rest_result.c_str()); |
joon874 | 0:5886f525a4ad | 126 | if(itor->second != NULL) |
joon874 | 0:5886f525a4ad | 127 | itor->second->handle(request, rest_result); |
joon874 | 0:5886f525a4ad | 128 | else |
joon874 | 0:5886f525a4ad | 129 | { |
joon874 | 0:5886f525a4ad | 130 | strcpy(rest_result, "Invalid request handler"); |
joon874 | 0:5886f525a4ad | 131 | return HTTP_INVALID_HANDLE; |
joon874 | 0:5886f525a4ad | 132 | } |
joon874 | 0:5886f525a4ad | 133 | return HTTP_SUCCESS; |
joon874 | 0:5886f525a4ad | 134 | } |
joon874 | 0:5886f525a4ad | 135 | |
joon874 | 0:5886f525a4ad | 136 | void HTTPServer::add_request_handler(char *name, RequestHandler* handler) |
joon874 | 0:5886f525a4ad | 137 | { |
joon874 | 0:5886f525a4ad | 138 | handlers[name] = handler; |
joon874 | 0:5886f525a4ad | 139 | } |
joon874 | 0:5886f525a4ad | 140 |