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:
10:4a48594c2f44
Parent:
8:b013075de2e4
Child:
12:c926d680f339
--- a/HTTP_SERVER.cpp	Tue Dec 06 07:29:01 2016 +0000
+++ b/HTTP_SERVER.cpp	Thu Dec 08 05:56:53 2016 +0000
@@ -1,15 +1,39 @@
 #include "HTTP_SERVER.h"
 #include "string"
 #ifndef DEBUG
-#define DEBUG
+//#define DEBUG
 #endif
 
+namespace HTTP_SERVER
+{
 void DEBUG_PRINT_LINE(const char* arg_line)
 {
 #ifdef DEBUG
-    printf("%s",arg_line);
+    printf("(HTTP_SERVER) ")
+    printf(arg_line);
+    printf("\r\n");
 #endif
 }
+template<typename T>
+void DEBUG_PRINT_LINE(const char* arg_line, T arg_t)
+{
+#ifdef DEBUG
+    printf("(HTTP_SERVER) ");
+    printf(arg_line, arg_t);
+    printf("\r\n");
+#endif
+}
+template<typename T1, typename T2>
+void DEBUG_PRINT_LINE(const char* arg_line, T1 arg_t1, T2 arg_t2)
+{
+#ifdef DEBUG
+    printf("(HTTP_SERVER) ");
+    printf(arg_line, arg_t1, arg_t2);
+    printf("\r\n");
+#endif
+}
+}
+using namespace HTTP_SERVER;
 
 HttpServer::HttpServer()
 {
@@ -76,7 +100,7 @@
         }
         //  When conected
         while(tcpcon.is_connected()) {
-            DEBUG_PRINT_LINE("(HTTP_SERVER) connected\r\n");
+            printf("(HTTP_SERVER) connected\r\n");
 
             char buffer[1024]   = {0};
             char* httpmethod    = NULL;
@@ -88,92 +112,94 @@
             //
             //  Request Analysis
             //
-            DEBUG_PRINT_LINE("(HTTP_SERVER) DEBUG MODE\r\n");
+            DEBUG_PRINT_LINE("DEBUG MODE");
             switch(tcpcon.receive(buffer, 1023)) {
                 case 0:
-                    printf("(HTTP_SERVER) recieved buffer is empty.\r\n");
+                    DEBUG_PRINT_LINE("recieved buffer is empty.");
                     msger.setStatusLine(400, "No Request");
-                    if(msger.setHeaderField("Connection", "Close"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
+                    if(msger.setHeaderField("Connection", "Close"))DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
                     httpmethod    = NULL;
                     filepath      = NULL;
                     http_ver      = NULL;
                     break;
                 case -1:
-                    printf("(HTTP_SERVER) failed to read data from client.\r\n");
+                    DEBUG_PRINT_LINE("failed to read data from client.");
                     msger.setStatusLine(500, "Internal Server Error");
-                    if(msger.setHeaderField("Connection", "Close"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
+                    if(msger.setHeaderField("Connection", "Close"))DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
                     httpmethod    = NULL;
                     filepath      = NULL;
                     http_ver      = NULL;
                     break;
                 default:
-                    printf("(HTTP_SERVER) Recieved Data: %d\r\n-->\r\n%.*s[End of Request]\r\n",strlen(buffer),strlen(buffer),buffer);
-                    //  get HTTP method
+                    DEBUG_PRINT_LINE("Recieved Data: %d",strlen(buffer));
+                    DEBUG_PRINT_LINE("-->\r\n");
+                    DEBUG_PRINT_LINE("%.*s[End of Request]",strlen(buffer),buffer);
+                    //  get HTTP method, File path, HTTP version
                     httpmethod = strtok(buffer," ");
-                    //  get File path
                     filepath = strtok(NULL, " ");
-                    //  get HTTP version
                     http_ver = strtok(NULL, "\r\n");
-#ifdef DEBUG
-                    printf("(HTTP_SERVER) httpmethod: %s\r\n", httpmethod);
-                    printf("(HTTP_SERVER) file path:  %s\r\n", filepath);
-                    printf("(HTTP_SERVER) http ver :  %s\r\n", http_ver);
-#endif
+                    DEBUG_PRINT_LINE("httpmethod: %s", httpmethod);
+                    DEBUG_PRINT_LINE("file path:  %s", filepath);
+                    DEBUG_PRINT_LINE("http ver :  %s", http_ver);
                     break;
             }
-            DEBUG_PRINT_LINE("\r\n"
-                             "(HTTP_SERVER) debug before response\r\n");
 
             //
             //  Response
             //
             if (strcmp(httpmethod,"GET") == 0 ) {
-                printf("(HTTP_SERVER) GET request incomming.\r\n");
+                DEBUG_PRINT_LINE("GET request incomming.");
 
                 //  file calibration
-                DEBUG_PRINT_LINE("(HTTP_SERVER) file opening\r\n");
+                DEBUG_PRINT_LINE("file opening");
                 fhandl.open(filepath,"rb");
                 if(fhandl.arrival()) {
                     msger.setStatusLine(200, "OK");
-                    if(msger.setHeaderField("Content-Length", fhandl.getFileSize()))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
-                    if(msger.setHeaderField("Connection", "keep-alive"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
+                    if(msger.setHeaderField("Content-Length", fhandl.getFileSize()))    DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
+                    if(msger.setHeaderField("Connection", "keep-alive"))                DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
                 } else {
-                    if(msger.setStatusLine(404, "NOT FOUND"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
-                    if(msger.setHeaderField("Connection", "Close"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
-                    DEBUG_PRINT_LINE("(HTTP_SERVER) NOT FOUND\r\n");
+                    if(msger.setStatusLine(404, "NOT FOUND"))                           DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
+                    if(msger.setHeaderField("Connection", "Close"))                     DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
+                    DEBUG_PRINT_LINE("NOT FOUND");
                 }
-                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("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
-                } else if(!strcmp(fhandl.getSuffix(), "js" )){
-                    if(msger.setHeaderField("Content-Type", "text/javascript"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
-                } else if (!strcmp(fhandl.getSuffix(), "ico" )  ) {
-                    if(msger.setHeaderField("Content-Type", "image/png"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
+                if(         !strcmp(fhandl.getSuffix(), "htm" ) ||
+                            !strcmp(fhandl.getSuffix(), "HTM" ) ||
+                            !strcmp(fhandl.getSuffix(), "html") ||
+                            !strcmp(fhandl.getSuffix(), "HTML")){
+                    if(msger.setHeaderField("Content-Type", "text/html"))               DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
+                } else if(  !strcmp(fhandl.getSuffix(), "js"  )){
+                    if(msger.setHeaderField("Content-Type", "text/javascript"))         DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
+                } else if ( !strcmp(fhandl.getSuffix(), "ico" )){
+                    if(msger.setHeaderField("Content-Type", "image/png"))               DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
+                } else if ( !strcmp(fhandl.getSuffix(), "png" ) ||
+                            !strcmp(fhandl.getSuffix(), "PNG" )){
+                    if(msger.setHeaderField("Content-Type", "image/png"))               DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
+                } else if ( !strcmp(fhandl.getSuffix(), "jpg" ) ||
+                            !strcmp(fhandl.getSuffix(), "JPG" )){
+                    if(msger.setHeaderField("Content-Type", "image/jpg"))               DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
                 } else {
                     msger.setStatusLine(406, "not acceptable");
                 }
 
                 //  Connection timeout field
-                if(msger.setHeaderField("Keep-Alive", "timeouit=15"))printf("(HTTP_SERVER)buffer over flow @ ResponseMessenger");
+                if(msger.setHeaderField("Keep-Alive", "timeouit=15"))                   DEBUG_PRINT_LINE("buffer over flow @ ResponseMessenger");
 
                 //  send response
                 msger.sendHTTPResponse(tcpcon, fhandl);
 
                 //file close
                 if( fhandl.close()== 0)
-                    DEBUG_PRINT_LINE("(HTTP_SERVER) file has closed\r\n");
+                    DEBUG_PRINT_LINE("file has closed");
                 else if(EOF)
-                    DEBUG_PRINT_LINE("(HTTP_SERVER) failed to close the file\r\n");
+                    DEBUG_PRINT_LINE("failed to close the file");
                     
                 msger.resetHeader();
-                printf("(HTTP_SERVER) echo back done.\r\n");
+                DEBUG_PRINT_LINE("echo back done.");
             }
             if (httpmethod == NULL) {
                 msger.sendHTTPResponse(tcpcon);
                 msger.resetHeader();
-                printf("(HTTP_SERVER) echo back done.\r\n");
+                DEBUG_PRINT_LINE("echo back done.");
             }
             printf("(HTTP_SERVER) Response to Request has done\r\n");
             //