Adaptation of the HttpServer by user yueee_yt. This version has improved handling of the HTTP headers (**NOTE**: There are limitations with this implementation and it is not fully functional. Use it only as a starting point.)

Dependents:   DMSupport DMSupport DMSupport DMSupport

Fork of DM_HttpServer by EmbeddedArtists AB

Files at this revision

API Documentation at this revision

Comitter:
embeddedartists
Date:
Tue Dec 02 15:04:43 2014 +0000
Parent:
5:b8f6a11c70db
Child:
7:ee7af5de4b95
Commit message:
Fixed stack sizes so that FSHandler works. Changed printfs to RtosLog. Changed sprintf to snprintf to prevent overwrite.

Changed in this revision

HTTPRequestHandler.cpp Show annotated file Show diff for this revision Revisions of this file
HTTPServer.h Show annotated file Show diff for this revision Revisions of this file
Handler/FSHandler.cpp Show annotated file Show diff for this revision Revisions of this file
Handler/RPCHandler.cpp Show annotated file Show diff for this revision Revisions of this file
Handler/SimpleHandler.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/HTTPRequestHandler.cpp	Sat Feb 22 05:51:59 2014 +0000
+++ b/HTTPRequestHandler.cpp	Tue Dec 02 15:04:43 2014 +0000
@@ -22,6 +22,7 @@
 #endif
 
 #include "HTTPRequestHandler.h"
+#include "DMBoard.h"
 
 #include <string.h>
 
@@ -36,14 +37,14 @@
     m_rootPath(rootPath), m_path(path), m_errc(200), m_closed(false), m_headersSent(false)
 {
 #ifdef _DEBUG_REQUEST_HANDLER
-    printf("+++(HTTPRequestHandler) init \r\n");
+    DMBoard::instance().logger()->printf("+++(HTTPRequestHandler) init \r\n");
 #endif
     //Read & parse headers
     readHeaders();
 //*  m_pTCPSocket->setOnEvent(this, &HTTPRequestHandler::onTCPSocketEvent);
 //*  setTimeout(HTTP_REQUEST_TIMEOUT);
 #ifdef _DEBUG_REQUEST_HANDLER
-    printf("+++(HTTPRequestHandler) init end \r\n");
+    DMBoard::instance().logger()->printf("+++(HTTPRequestHandler) init end \r\n");
 #endif
 }
 
@@ -51,7 +52,7 @@
 {
     close();
 #ifdef _DEBUG_REQUEST_HANDLER
-    printf("+++(HTTPRequestHandler) Destroy end\r\n");
+    DMBoard::instance().logger()->printf("+++(HTTPRequestHandler) Destroy end\r\n");
 #endif
 }
 
@@ -111,7 +112,7 @@
 void HTTPRequestHandler::setContentLen(int len)
 {
     char len_str[6] = {0};
-    sprintf(len_str, "%d", len);
+    snprintf(len_str, 6, "%d", len);
     respHeaders()["Content-Length"] = len_str;
 }
 
@@ -152,7 +153,7 @@
         int n = sscanf(line, "%[^:]: %[^\n]", key, value);
         if ( n == 2 ) {
 #ifdef _DEBUG_REQUEST_HANDLER
-            printf("\r\n+++(HTTPRequestHandler)Read header : %s : %s\r\n", key, value);
+            DMBoard::instance().logger()->printf("\r\n+++(HTTPRequestHandler)Read header : %s : %s\r\n", key, value);
 #endif
             m_reqHeaders[key] = value;
         }
@@ -165,15 +166,15 @@
     static char line[128];
 
     //Response line
-    sprintf(line, "HTTP/1.1 %d MbedInfo\r\n", m_errc); //Not a violation of the standard not to include the descriptive text
+    snprintf(line, 128, "HTTP/1.1 %d MbedInfo\r\n", m_errc); //Not a violation of the standard not to include the descriptive text
     m_pTCPSocketConnection->send(line, strlen(line));
 
     map<string,string>::iterator it;
     while( !m_respHeaders.empty() ) {
         it = m_respHeaders.begin();
-        sprintf(line, "%s: %s\r\n", (*it).first.c_str(), (*it).second.c_str() );
+        snprintf(line, 128, "%s: %s\r\n", (*it).first.c_str(), (*it).second.c_str() );
 #ifdef _DEBUG_REQUEST_HANDLER
-        printf("\r\n+++(HTTPRequestHandler)%s", line);
+        DMBoard::instance().logger()->printf("\r\n+++(HTTPRequestHandler)%s", line);
 #endif
         m_pTCPSocketConnection->send(line, strlen(line));
         m_respHeaders.erase(it);
@@ -236,4 +237,4 @@
     break;
   }
 }
-**/
\ No newline at end of file
+**/
--- a/HTTPServer.h	Sat Feb 22 05:51:59 2014 +0000
+++ b/HTTPServer.h	Tue Dec 02 15:04:43 2014 +0000
@@ -250,7 +250,7 @@
                 if (threads[t]) {
                     threads[t]->signal_set(1);
                 } else {
-                    threads[t] = new Thread(HTTPServerChild, (void*)&clients[t]);
+                    threads[t] = new Thread(HTTPServerChild, (void*)&clients[t], osPriorityNormal, DEFAULT_STACK_SIZE*2);
                 }
 #ifdef _DEBUG_HTTP_SERVER_H
                 printf("Forked %d\r\n", t);
@@ -262,7 +262,7 @@
                 if (xthread) {
                     xthread->signal_set(1);
                 } else {
-                    xthread = new Thread(HTTPServerCloser, (void*)&xclient);
+                    xthread = new Thread(HTTPServerCloser, (void*)&xclient, osPriorityNormal, DEFAULT_STACK_SIZE*2);
                 }
 #ifdef _DEBUG_HTTP_SERVER_H
                 printf("Connection full\r\n");
--- a/Handler/FSHandler.cpp	Sat Feb 22 05:51:59 2014 +0000
+++ b/Handler/FSHandler.cpp	Tue Dec 02 15:04:43 2014 +0000
@@ -20,6 +20,7 @@
 //#define _DEBUG_FS_HANDLER
 
 #include "FSHandler.h"
+#include "DMBoard.h"
 
 #define CHUNK_SIZE 128
 
@@ -32,20 +33,20 @@
 FSHandler::~FSHandler()
 {
 #ifdef _DEBUG_FS_HANDLER
-    printf("\r\n+++FSHandler destroy\r\n");
+   DMBoard::instance().logger()-> printf("\r\n+++FSHandler destroy\r\n");
 #endif
     if(m_fp){
 #ifdef _DEBUG_FS_HANDLER
-    printf("\r\n+++FSHandler fclose start\r\n");
+    DMBoard::instance().logger()->printf("\r\n+++FSHandler fclose start\r\n");
 #endif
         fclose(m_fp);
 #ifdef _DEBUG_FS_HANDLER
-    printf("\r\n+++FSHandler fclose end\r\n");
+    DMBoard::instance().logger()->printf("\r\n+++FSHandler fclose end\r\n");
 #endif
        
         }
 #ifdef _DEBUG_FS_HANDLER
-    printf("\r\nHandler destroyed\r\n");
+    DMBoard::instance().logger()->printf("\r\nHandler destroyed\r\n");
 #endif
 }
 
@@ -60,7 +61,7 @@
 void FSHandler::doGet()
 {
 #ifdef _DEBUG_FS_HANDLER
-    printf("\r\nIn FSHandler::doGet() - rootPath=%s, path=%s\r\n", rootPath().c_str(), path().c_str());
+    DMBoard::instance().logger()->printf("\r\nIn FSHandler::doGet() - rootPath=%s, path=%s\r\n", rootPath().c_str(), path().c_str());
 #endif
     //FIXME: Translate path to local/path
     string checkedRootPath = rootPath();
@@ -73,7 +74,7 @@
         filePath += DEFAULT_PAGE;
     }
 #ifdef _DEBUG_FS_HANDLER
-    printf("Trying to open %s\n", filePath.c_str());
+    DMBoard::instance().logger()->printf("Trying to open %s\n", filePath.c_str());
 #endif
     m_fp = fopen(filePath.c_str(), "r"); //FIXME: if null, error 404
 
@@ -85,7 +86,7 @@
         respHeaders()["Content-Type"] = "text/html";
         respHeaders()["Connection"] = "close";
         writeData(msg,strlen(msg)); //Only send header
-        printf("\r\nExit FSHandler::doGet() w Error 404\r\n");
+        DMBoard::instance().logger()->printf("\r\nExit FSHandler::doGet() w Error 404\r\n");
         return;
     }
 
@@ -97,7 +98,7 @@
     respHeaders()["Connection"] = "close";
     onWriteable();
 #ifdef _DEBUG_FS_HANDLER
-    printf("\r\nExit SimpleHandler::doGet()\r\n");
+    DMBoard::instance().logger()->printf("\r\nExit SimpleHandler::doGet()\r\n");
 #endif
 }
 
@@ -119,7 +120,7 @@
 void FSHandler::onWriteable() //Data has been written & buf is free
 {
 #ifdef _DEBUG_FS_HANDLER
-    printf("\r\nFSHandler::onWriteable() event\r\n");
+    DMBoard::instance().logger()->printf("\r\nFSHandler::onWriteable() event\r\n");
 #endif
     if(m_err404) {
         //Error has been served, now exit
@@ -134,7 +135,7 @@
             int writtenLen = writeData(rBuf, len);
             if(writtenLen < 0) { //Socket error
 #ifdef _DEBUG_FS_HANDLER
-                printf("FSHandler: Socket error %d\n", writtenLen);
+                DMBoard::instance().logger()->printf("FSHandler: Socket error %d\n", writtenLen);
 #endif
                 /**  Not Work
                                 if(writtenLen == TCPSOCKET_MEM) {
@@ -161,6 +162,7 @@
 
 void FSHandler::onClose() //Connection is closing
 {
+    DMBoard::instance().logger()->printf("FSHandler: onClose() event\r\n");
     /**
 #ifdef _DEBUG_FS_HANDLER
         printf("FSHandler: onClose start \r\n");
--- a/Handler/RPCHandler.cpp	Sat Feb 22 05:51:59 2014 +0000
+++ b/Handler/RPCHandler.cpp	Tue Dec 02 15:04:43 2014 +0000
@@ -22,6 +22,7 @@
 
 #include "RPCHandler.h"
 #include "mbed_rpc.h"
+#include "DMBoard.h"
 
 #define RPC_DATA_LEN 128
 
@@ -31,36 +32,36 @@
 RPCHandler::~RPCHandler()
 {
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)Handler destroyed\r\n");
+   DMBoard::instance().logger()-> printf("++++(RPC Handler)Handler destroyed\r\n");
 #endif
 }
 
 void RPCHandler::doGet()
 {
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)doGet\r\n");
+    DMBoard::instance().logger()->printf("++++(RPC Handler)doGet\r\n");
 #endif
     char resp[RPC_DATA_LEN] = {0};
     char req[RPC_DATA_LEN] = {0};
 
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)Path : %s\r\n", path().c_str());
-    printf("++++(RPC Handler)Root Path : %s\r\n", rootPath().c_str());
+    DMBoard::instance().logger()->printf("++++(RPC Handler)Path : %s\r\n", path().c_str());
+    DMBoard::instance().logger()->printf("++++(RPC Handler)Root Path : %s\r\n", rootPath().c_str());
 #endif
     //Remove path
     strncpy(req, path().c_str(), RPC_DATA_LEN-1);
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)RPC req(before) : %s\r\n", req);
+    DMBoard::instance().logger()->printf("++++(RPC Handler)RPC req(before) : %s\r\n", req);
 #endif
     //Remove "%20", "+", "," from req
     cleanReq(req);
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)RPC req(after) : %s\r\n", req);
+    DMBoard::instance().logger()->printf("++++(RPC Handler)RPC req(after) : %s\r\n", req);
 #endif
     //Do RPC Call
     RPC::call(req, resp); //FIXME: Use bool result
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)Response %s \r\n",resp);
+    DMBoard::instance().logger()->printf("++++(RPC Handler)Response %s \r\n",resp);
 #endif
     //Response
     setContentLen( strlen(resp) );
@@ -74,7 +75,7 @@
     respHeaders()["Connection"] = "close";
     writeData(resp, strlen(resp));
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)Exit RPCHandler::doGet()\r\n");
+    DMBoard::instance().logger()->printf("++++(RPC Handler)Exit RPCHandler::doGet()\r\n");
 #endif
 }
 
@@ -97,7 +98,7 @@
 void RPCHandler::onWriteable() //Data has been written & buf is free
 {
 #ifdef _DEBUG_RPC_HANDLER
-    printf("++++(RPC Handler)onWriteable event\r\n");
+    DMBoard::instance().logger()->printf("++++(RPC Handler)onWriteable event\r\n");
 #endif
    // close(); //Data written, we can close the connection
 }
--- a/Handler/SimpleHandler.cpp	Sat Feb 22 05:51:59 2014 +0000
+++ b/Handler/SimpleHandler.cpp	Tue Dec 02 15:04:43 2014 +0000
@@ -22,60 +22,73 @@
 #define _DEBUG_SIMPLE_HANDLER
 
 #include "SimpleHandler.h"
+#include "DMBoard.h"
 
 SimpleHandler::SimpleHandler(const char* rootPath, const char* path, TCPSocketConnection* pTCPSocketConnection) : HTTPRequestHandler(rootPath, path, pTCPSocketConnection)
 {
 #ifdef _DEBUG_SIMPLE_HANDLER
-    printf("++++(SimpleHeader)Initialize\r\n");
+    DMBoard::instance().logger()->printf("++++(SimpleHeader)Initialize\r\n");
 #endif
 }
 
 SimpleHandler::~SimpleHandler()
 {
 #ifdef _DEBUG_SIMPLE_HANDLER
-    printf("++++(SimpleHeader)Handler destroyed\r\n");
+    DMBoard::instance().logger()->printf("++++(SimpleHeader)Handler destroyed\r\n");
 #endif
 }
 
 void SimpleHandler::doGet()
 {
 #ifdef _DEBUG_SIMPLE_HANDLER
-    printf("++++(SimpleHeader) doGet()\r\n");
+    DMBoard::instance().logger()->printf("++++(SimpleHeader) doGet()\r\n");
 #endif
     const char* resp = "Hello world !";
     setContentLen( strlen(resp) );
     respHeaders()["Connection"] = "close";
     writeData(resp, strlen(resp));
 #ifdef _DEBUG_SIMPLE_HANDLER
-    printf("++++(SimpleHeader) doGet Exit\r\n");
+    DMBoard::instance().logger()->printf("++++(SimpleHeader) doGet Exit\r\n");
 #endif
 }
 
 void SimpleHandler::doPost()
 {
+#ifdef _DEBUG_SIMPLE_HANDLER
+    DMBoard::instance().logger()->printf("\r\n++++SimpleHandler::doPost()\r\n");
+#endif
 
 }
 
 void SimpleHandler::doHead()
 {
+#ifdef _DEBUG_SIMPLE_HANDLER
+    DMBoard::instance().logger()->printf("\r\n++++SimpleHandler::doHead()\r\n");
+#endif
 
 }
 
 
 void SimpleHandler::onReadable() //Data has been read
 {
+#ifdef _DEBUG_SIMPLE_HANDLER
+    DMBoard::instance().logger()->printf("\r\n++++SimpleHandler::onReadable() event\r\n");
+#endif
 
 }
 
 void SimpleHandler::onWriteable() //Data has been written & buf is free
 {
 #ifdef _DEBUG_SIMPLE_HANDLER
-    printf("\r\n++++SimpleHandler::onWriteable() event\r\n");
+    DMBoard::instance().logger()->printf("\r\n++++SimpleHandler::onWriteable() event\r\n");
 #endif
 //    close(); //Data written, we can close the connection
 }
 
 void SimpleHandler::onClose() //Connection is closing
 {
+#ifdef _DEBUG_SIMPLE_HANDLER
+    DMBoard::instance().logger()->printf("\r\n++++SimpleHandler::onClose() event\r\n");
+#endif
     //Nothing to do
 }