The lib with which to make LPC1768 a simple HTTP server. This have not yet implemented. fopen() DOESN'T WORK after EthernetInterface::connect() is called as using mbed-os 5.4~. See also https://os.mbed.com/questions/80658/HardFault-occurs-when-fopen-is-called-af/ or https://github.com/ARMmbed/mbed-os/issues/6578 and https://github.com/ARMmbed/mbed-os/issues/6624
Fork of HTTP_SERVER by
HTTP_SERVER.cpp
- Committer:
- aktk
- Date:
- 2016-02-16
- Revision:
- 0:cc483bea4fe3
- Child:
- 1:3a1fe94c6e42
File content as of revision 0:cc483bea4fe3:
#include "HTTP_SERVER.h" #define DEBUG HttpServer::HttpServer() { keep_alive = (false); listening_flag = (false); req_buf[0] = '\0'; } HttpServer::~HttpServer() { } bool HttpServer::init() { // Ethernet Initialization if(eth.init()) { printf("Error!@EthernetInterface::init()\r\n"); return false; } // Ethernet Connecting setup if(eth.connect()) { printf("Error!@EthernetInterface::connect()\r\n"); return false; } else { printf("IP Address is %s\r\n", eth.getIPAddress()); } // TCP Socket setup // To open Server-side PORT if(tcpsvr.bind(TCP_PORT)< 0) { printf("Error!@TCPSocketServer::bind()\r\n"); return false; } else { printf("TCP Server has bounden!\r\n"); } // Server start listening Request from a web browser. if(tcpsvr.listen(1) < 0) { printf("tcp server listen failed.\r\n"); return false; } else { listening_flag = true; printf("tcp server is listening...\r\n"); } return true; } bool HttpServer::run() { DigitalOut led1(LED1); DigitalOut led2(LED1); while (listening_flag) { led1 = true; // blocking mode (never timeout) // waiting client connection printf("\r\nwait connection\r\n"); if(tcpsvr.accept(tcpcon) < 0) { printf("failed to accept connection.\r\n"); return -1; } else { printf("connection success!\r\nIP: %s\r\n",tcpcon.get_address()); led2 = true; } //while(client.is_connected()) { while(tcpcon.is_connected()) { #ifdef DEBUG printf("being connected\r\n"); #endif char buffer[1024] = {0}; char* httpmethod = NULL; char* filepath = NULL; char* http_ver = NULL; char* header_field_name = NULL; char* header_field_val = NULL; // // Request Analysis // #ifdef DEBUG printf("debug\r\n"); #endif switch(tcpcon.receive(buffer, 1023)) { case 0: printf("recieved buffer is empty.\r\n"); msger.setStatusLine(400, "No Request"); httpmethod = NULL; filepath = NULL; http_ver = NULL; break; case -1: printf("failed to read data from client.\r\n"); msger.setStatusLine(500, "Internal Server Error"); httpmethod = NULL; filepath = NULL; http_ver = NULL; break; default: printf("Recieved Data: %d\r\n\r\n%.*s\r\n",strlen(buffer),strlen(buffer),buffer); // get HTTP method httpmethod = strtok(buffer," "); // get File path filepath = strtok(NULL, " "); // get HTTP version http_ver = strtok(NULL, "\r\n"); #ifdef DEBUG printf("httpmethod: %s\r\n", httpmethod); printf("file path: %s\r\n", filepath); printf("http ver : %s\r\n", http_ver); #endif break; } #ifdef DEBUG printf("debug before response\r\n"); #endif // // Response // if (strcmp(httpmethod,"GET") == 0 ) { printf("GET request incomming.\r\n"); // file calibration #ifdef DEBUG printf("file opening\r\n"); #endif fhandl.open(filepath,"rb"); if(fhandl.arrival()) { msger.setStatusLine(200, "OK"); if(msger.setHeaderField("Content-Length", fhandl.getFileSize()))printf("buffer over flow"); if(msger.setHeaderField("Connection", "keep-alive"))printf("buffer over flow"); } else { if(msger.setStatusLine(404, "NOT FOUND"))printf("buffer over flow"); if(msger.setHeaderField("Connection", "close"))printf("buffer over flow"); #ifdef DEBUG printf("NOT FOUND\r\n"); #endif } if(! ( strcmp(fhandl.getSuffix(), "htm" ) && strcmp(fhandl.getSuffix(), "HTM" ) && strcmp(fhandl.getSuffix(), "html") && strcmp(fhandl.getSuffix(), "HTML") )) { if(msger.setHeaderField("Content-Type", "text/html"))printf("buffer over flow"); } else if (!strcmp(fhandl.getSuffix(), "ico" ) ) { if(msger.setHeaderField("Content-Type", "image/png"))printf("buffer over flow"); } else { msger.setStatusLine(406, "not acceptable"); } // Connection timeout field if(msger.setHeaderField("Keep-Alive", "timeouit=15"))printf("buffer over flow"); /* // Apply request header field to response header field do { //strtok(NULL, "\r\n"); header_field_name = strtok(NULL, ":"); header_field_name++; //strtok(NULL, " "); header_field_val = strtok(NULL, "\r\n"); header_field_val++; #ifdef DEBUG printf("header_field_name adr: %d %s\r\n", header_field_name - 1, header_field_name); printf("header_field_val adr: %d %s\r\n", header_field_val - 1, header_field_val); #endif if(header_field_name - 1 != NULL) { //if(strcmp(header_field_name,"Connection") == 0) { // if(msger.setHeaderField(header_field_name, "close"))printf("buffer over flow"); //} else { if(msger.setHeaderField(header_field_name, header_field_val))printf("buffer over flow"); //} } else { break; } } while(1); */ #ifdef DEBUG //printf("status code : %d\r\n", status_code); //printf("content type: %s\r\n", content_type); #endif // send response msger.sendHTTPResponse(tcpcon, fhandl); //file close #ifdef DEBUG if( #endif fhandl.close() #ifndef DEBUG ; #endif #ifdef DEBUG == 0) printf("file has closed\r\n"); else if(EOF) printf("failed to close the file\r\n"); #endif msger.resetHeader(); printf("echo back done.\r\n"); } printf("Response to Request has done\r\n"); } printf("close connection.\r\ntcp server is listening...\r\n"); tcpcon.close(); tcpsvr.close(); led2 = false; } led1 = false; return 0; }