Fx0 hackathon team4

Dependencies:   NySNICInterface mbed-rtos mbed

Fork of RESTServerSample by KDDI Fx0 hackathon

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 #include "control_motors.h"
00005 
00006 
00007 bool cmp(char* a, char* b)
00008 {
00009     return strcmp(a,b) < 0;
00010 }
00011 
00012 
00013 HTTPServer::HTTPServer():
00014 reply()
00015 {
00016 }
00017 
00018 
00019 HTTPServer::~HTTPServer()
00020 {
00021 }
00022 
00023 
00024 bool HTTPServer::init(int port)
00025 {    
00026     DigitalOut led4(LED4);
00027     
00028     socketserver.set_blocking(true);
00029     if(socketserver.bind(port))
00030     {
00031         printf("Could not bind on port %d.\n", port);
00032         return false; 
00033     }
00034     
00035     if(socketserver.listen())
00036     {
00037         printf("Could not listen %d.\n", port);
00038         return false;
00039     }
00040     
00041     led4 = 1;  // server is ready
00042     
00043     return true;
00044 }
00045 
00046 
00047 void HTTPServer::run()
00048 {
00049     char buffer[1024];
00050     TCPSocketConnection c;
00051     
00052     while(true)
00053     {
00054         while(socketserver.accept(&c));
00055         c.set_blocking(false, 1000);
00056 
00057         while(c.is_connected())
00058         {
00059             int n = c.receive(buffer, sizeof(buffer)-1);
00060 
00061             if(n == 0)
00062             {
00063                 c.close();
00064                 break;
00065             }
00066             else if(n != -1)
00067             {
00068                 buffer[n] = '\0';
00069                 //printf("Received data -- %s --. \r\n", buffer);
00070                 handle_request(buffer);
00071                 create_response(buffer);
00072                 //printf("Sending data -- %s --. \r\n", buffer);
00073                 c.send_all(buffer, strlen(buffer));
00074                 //printf("done. \r\n");
00075                 c.close();
00076                 break;
00077             }
00078             else {
00079                 printf("Error while receiving data. \r\n");
00080                 c.close();
00081                 break;
00082             }
00083         }
00084     }
00085 }
00086 
00087 
00088 void HTTPServer::handle_request(char *buffer)
00089 {
00090     char* request_type = strtok(buffer, " ");
00091     char* request = strtok(NULL, " ");
00092 
00093     // リクエストされたURLをパースし、モーターを制御
00094     bool ret = parse_request(request);
00095     if(ret){
00096         response_code = HTTP_200_OK;    
00097     }else{
00098         response_code = HTTP_404_NOTFOUND;
00099     }
00100 
00101     reply[0] = '\0';
00102 }
00103 
00104 void HTTPServer::create_response(char *buffer)
00105 {
00106     char content_length[30] = "";
00107     buffer[0] = '\0';
00108     
00109     /* HTTP Status Code */
00110     strcat(buffer, "HTTP/1.1 ");    
00111     switch(response_code){
00112     case HTTP_200_OK:
00113         strcat(buffer, "200 OK\r\n");
00114         break;
00115     case HTTP_404_NOTFOUND:
00116         strcat(buffer, "404 Not Found\r\n");
00117         break;
00118     default:
00119         strcat(buffer, "500 Internal Server Error\r\n");
00120         break;  
00121     }
00122     
00123     /* add header */
00124     strcat(buffer, "Access-Control-Allow-Origin: *\r\n");
00125     sprintf(content_length, "Content-Length: %d\r\n", strlen(reply));
00126     strncat(buffer, content_length, strlen(content_length));
00127     strcat(buffer, "Content-Type: text/plain\r\n\r\n"); 
00128     
00129     /* add content */
00130     strcat(buffer, reply);
00131 }