NetServices Stack source
Dependents: HelloWorld ServoInterfaceBoardExample1 4180_Lab4
Diff: services/http/server/HTTPRequestDispatcher.cpp
- Revision:
- 2:a4f97773c90f
- Parent:
- 1:abb442332fa8
- Child:
- 3:95e0bc00a1bb
--- a/services/http/server/HTTPRequestDispatcher.cpp Mon Jun 14 10:33:54 2010 +0000 +++ b/services/http/server/HTTPRequestDispatcher.cpp Fri Jun 18 09:22:54 2010 +0000 @@ -41,14 +41,13 @@ void HTTPRequestDispatcher::dispatchRequest() { - string rootPath; - string subPath; + string path; string meth; HTTP_METH methCode; - DBG("\r\nDispatching req\r\n"); + DBG("Dispatching req\r\n"); - if( !getRequest(&rootPath, &subPath, &meth ) ) + if( !getRequest(&path, &meth ) ) { close(); return; //Invalid request @@ -72,23 +71,47 @@ return; } - DBG("\r\nLooking for a handler\r\n"); + DBG("Looking for a handler\r\n"); map< string, HTTPRequestHandler*(*)(const char*, const char*, TCPSocket*) >::iterator it; - it = m_pSvr->m_lpHandlers.find(rootPath); //We are friends so we can do that - if(it == m_pSvr->m_lpHandlers.end()) +// it = m_pSvr->m_lpHandlers.find(rootPath); //We are friends so we can do that +// NEW CODE START: + int root_len = 0; + for (it = m_pSvr->m_lpHandlers.begin(); it != m_pSvr->m_lpHandlers.end(); it++) { - it = m_pSvr->m_lpHandlers.find(""); //Use default handler if it exists + DBG("Checking %s...\n", (*it).first.c_str()); + root_len = (*it).first.length(); + if ( root_len && + !path.compare( 0, root_len, (*it).first ) && + (path[root_len] == '/' || path[root_len] == '\0')) + { + DBG("Found (%s)\n", (*it).first.c_str()); + // Found! + break; // for + } + } +// NEW CODE END + if((it == m_pSvr->m_lpHandlers.end()) && !(m_pSvr->m_lpHandlers.empty())) + { + DBG("Using default handler\n"); + it = m_pSvr->m_lpHandlers.end(); + it--; //Get the last element + if( ! (((*it).first.length() == 0) || (*it).first.compare("/")) ) //This is not the default handler + it = m_pSvr->m_lpHandlers.end(); + root_len = 0; } if(it == m_pSvr->m_lpHandlers.end()) { + DBG("No handler found\n"); close(); //No handler found return; } - DBG("\r\nHandler found.\r\n"); + DBG("Handler found.\r\n"); - HTTPRequestHandler* pHdlr = (*it).second(rootPath.c_str(), subPath.c_str(), m_pTCPSocket); +//HTTPRequestHandler* pHdlr = (*it).second(rootPath.c_str(), subPath.c_str(), m_pTCPSocket); +//NEW CODE 1 LINE: + HTTPRequestHandler* pHdlr = (*it).second((*it).first.c_str(), path.c_str() + root_len, m_pTCPSocket); m_pTCPSocket = NULL; //We don't own it anymore switch(methCode) @@ -104,7 +127,7 @@ break; } - DBG("\r\nReq handled (or being handled)\r\n"); + DBG("Req handled (or being handled)\r\n"); close(); } @@ -129,7 +152,7 @@ close(); } -bool HTTPRequestDispatcher::getRequest(string* rootPath, string* subPath, string* meth) +bool HTTPRequestDispatcher::getRequest(string* path, string* meth) { char req[128]; char c_path[128]; @@ -162,40 +185,18 @@ } *p = 0; - DBG("\r\nParsing request : %s\r\n", req); + DBG("Parsing request : %s\r\n", req); ret = sscanf(req, "%s %s HTTP/%*d.%*d", c_meth, c_path); if(ret !=2) return false; *meth = string(c_meth); - *subPath = string(c_path); - - c_path[0]= '/'; - if(!strchr(c_path+1, '/')) - { - //Not found, so this is the root path - c_path[1]=0; - *rootPath = string(c_path); - } - else - { - ret = sscanf(req, "%*s /%[^/ ]/%*s HTTP/%*d.%*d", c_path+1); - if(ret !=1) - { - //This is the root path - DBG("Default path\n"); - } - *rootPath = string(c_path); - subPath->erase(0,rootPath->length()); - } - - - DBG("\r\nParse OK :\r\nRoot Path: %s\r\nSub Path: %s\r\nMethod: %s\r\n", rootPath->c_str(), subPath->c_str(), meth->c_str()); - +// NEW CODE (old code removed): + *path = string(c_path); return true; +} -} void HTTPRequestDispatcher::onTCPSocketEvent(TCPSocketEvent e)