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 Akifumi Takahashi

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