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
Revision 6:7b3320c34654, committed 2014-12-02
- 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
--- 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 }