各ピンへのread/writeを提供するサーバサンプル
Dependencies: NySNICInterface mbed-rtos mbed
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 }
Generated on Sun Jul 17 2022 16:34:37 by 1.7.2