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

Dependencies:   NySNICInterface mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers HTTPServer.cpp Source File

HTTPServer.cpp

00001 #include "HTTPServer.h"
00002 #include "mbed.h"
00003 
00004 
00005 bool cmp(char* a, char* b)
00006 {
00007     return strcmp(a,b) < 0;
00008 }
00009 
00010 
00011 HTTPServer::HTTPServer():
00012 handlers(&cmp),
00013 reply()
00014 {
00015 }
00016 
00017 
00018 HTTPServer::~HTTPServer()
00019 {
00020 }
00021 
00022 
00023 bool HTTPServer::init(int port)
00024 {    
00025     DigitalOut led4(LED4);
00026     
00027     socketserver.set_blocking(true);
00028     if(socketserver.bind(port))
00029     {
00030         printf("Could not bind on port %d.\n", port);
00031         return false; 
00032     }
00033     
00034     if(socketserver.listen())
00035     {
00036         printf("Could not listen %d.\n", port);
00037         return false;
00038     }
00039     
00040     led4 = 1;  // server is ready
00041     
00042     return true;
00043 }
00044 
00045 
00046 void HTTPServer::run()
00047 {
00048     char buffer[1024];
00049     TCPSocketConnection c;
00050     
00051     while(true)
00052     {
00053         while(socketserver.accept(&c));
00054         c.set_blocking(false, 1000);
00055         
00056         while(c.is_connected())
00057         {
00058             int n = c.receive(buffer, sizeof(buffer)-1);
00059             if(n == 0)
00060             {
00061                 c.close();
00062                 break;
00063             }
00064             else if(n != -1)
00065             {
00066                 buffer[n] = '\0';
00067                 printf("Received data -- %s --. \r\n", buffer);
00068                 handle_request(buffer);
00069                 create_response(buffer);
00070                 printf("Sending data -- %s --. \r\n", buffer);
00071                 c.send_all(buffer, strlen(buffer));
00072                 printf("done. \r\n");
00073                 c.close();
00074                 break;
00075             }
00076             else {
00077                 printf("Error while receiving data. \r\n");
00078                 c.close();
00079                 break;
00080             }
00081         }
00082     }
00083 }
00084 
00085 
00086 void HTTPServer::handle_request(char *buffer)
00087 {
00088     char* request_type = strtok(buffer, " ");
00089     char* request = strtok(NULL, " ");
00090 
00091     reply[0] = '\0';
00092     response_code = HTTP_404_NOTFOUND;
00093 
00094     if(!object.decode(request, reply)){
00095         return;
00096     }
00097 
00098     std::map<char*, RequestHandler*>::iterator itor = handlers.find(request_type);
00099     if(itor == handlers.end())
00100     {
00101         printf("No request handler found for this type of request.\r\n");
00102         return;
00103     }
00104     if(itor->second != NULL)
00105         response_code = itor->second->handle(object, reply);
00106     else
00107         printf("Invalid request handler\r\n");
00108 }
00109 
00110 
00111 void HTTPServer::create_response(char *buffer)
00112 {
00113     char content_length[30] = "";
00114     buffer[0] = '\0';
00115     
00116     /* HTTP Status Code */
00117     strcat(buffer, "HTTP/1.1 ");    
00118     switch(response_code){
00119     case HTTP_200_OK:
00120         strcat(buffer, "200 OK\r\n");
00121         break;
00122     case HTTP_404_NOTFOUND:
00123         strcat(buffer, "404 Not Found\r\n");
00124         break;
00125     default:
00126         strcat(buffer, "500 Internal Server Error\r\n");
00127         break;  
00128     }
00129     
00130     /* add header */
00131     strcat(buffer, "Access-Control-Allow-Origin: *\r\n");
00132     sprintf(content_length, "Content-Length: %d\r\n", strlen(reply));
00133     strncat(buffer, content_length, strlen(content_length));
00134     strcat(buffer, "Content-Type: text/plain\r\n\r\n"); 
00135     
00136     /* add content */
00137     strcat(buffer, reply);
00138 }
00139 
00140 
00141 void HTTPServer::add_request_handler(char *name, RequestHandler* handler)
00142 {
00143     handlers[name] = handler;
00144     printf("%s request hander.\r\n", name);
00145 }