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
Diff: HTTP_SERVER.cpp
- Revision:
- 0:cc483bea4fe3
- Child:
- 1:3a1fe94c6e42
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTP_SERVER.cpp Tue Feb 16 10:59:31 2016 +0000 @@ -0,0 +1,208 @@ +#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; +} \ No newline at end of file