MurataTypeYD_RPC_Sample fixed version for 050314
Dependencies: PowerControl SNICInterface_mod2 mbed-rtos mbed
Fork of HTTPClient_WiFi_HelloWorld by
Diff: HTTPServer.cpp
- Revision:
- 6:6c49fdc29825
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPServer.cpp Thu Mar 12 12:27:31 2015 +0000 @@ -0,0 +1,159 @@ +#include "HTTPServer.h" +#include "mbed.h" + + +bool cmp(char* a, char* b) +{ + return strcmp(a,b) < 0; +} + + +HTTPServer::HTTPServer(): +handlers(&cmp), +reply() +{ +} + + +HTTPServer::~HTTPServer() +{ +} + + +bool HTTPServer::init(int port) +{ + DigitalOut led4(LED4); + + socketserver.set_blocking(true); + if(socketserver.bind(port)) + { + printf("Could not bind on port %d.\n", port); + return false; + } + + if(socketserver.listen()) + { + printf("Could not listen %d.\n", port); + return false; + } + + led4 = 1; // server is ready + + return true; +} + + +void HTTPServer::run() +{ + char buffer[1024]; + TCPSocketConnection c; + + while(true) + { +// KTEC MOD START + // SNICInterface_modとNySNICInterfaceのIF差分が存在するため、変更 + //while(socketserver.accept(&c)); + while(socketserver.accept(c)); +// KTEC MOD END + c.set_blocking(false, 1000); + + while(c.is_connected()) + { + int n = c.receive(buffer, sizeof(buffer)-1); + if(n == 0) + { + c.close(); + break; + } + else if(n != -1) + { + buffer[n] = '\0'; + printf("Received data -- %s --. \r\n", buffer); + handle_request(buffer); + create_response(buffer); + printf("Sending data -- %s --. \r\n", buffer); + c.send_all(buffer, strlen(buffer)); + printf("done. \r\n"); + c.close(); + break; + } + else { + printf("Error while receiving data. \r\n"); + c.close(); + break; + } + } + } +} + + +void HTTPServer::handle_request(char *buffer) +{ + char* request_type = strtok(buffer, " "); + char* request = strtok(NULL, " "); + + reply[0] = '\0'; + response_code = HTTP_404_NOTFOUND; + + if(!object.decode(request, reply)){ +// KTEC MOD START + // レスポンスコードを設定 + response_code = HTTP_200_OK; + return; + } else { + response_code = HTTP_400_BADREQUEST; + return; + } +// KTEC MOD END + +// KTEC DEL START +/* + std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type); + if(itor == handlers.end()) + { + printf("No request handler found for this type of request.\r\n"); + return; + } + if(itor->second != NULL) + response_code = itor->second->handle(object, reply); + else + printf("Invalid request handler\r\n"); +*/ +// KTEC DEL END +} + +void HTTPServer::create_response(char *buffer) +{ + char content_length[30] = ""; + buffer[0] = '\0'; + + /* HTTP Status Code */ + strcat(buffer, "HTTP/1.1 "); + switch(response_code){ + case HTTP_200_OK: + strcat(buffer, "200 OK\r\n"); + break; + case HTTP_404_NOTFOUND: + strcat(buffer, "404 Not Found\r\n"); + break; + default: + strcat(buffer, "500 Internal Server Error\r\n"); + break; + } + + /* add header */ + strcat(buffer, "Access-Control-Allow-Origin: *\r\n"); + sprintf(content_length, "Content-Length: %d\r\n", strlen(reply)); + strncat(buffer, content_length, strlen(content_length)); + strcat(buffer, "Content-Type: text/plain\r\n\r\n"); + + /* add content */ + strcat(buffer, reply); +} + + +void HTTPServer::add_request_handler(char *name, RequestHandler* handler) +{ + handlers[name] = handler; + printf("%s request hander.\r\n", name); +}