diff options
author | Eliot Horowitz <eliot@10gen.com> | 2008-12-30 21:58:36 -0500 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2008-12-30 21:58:36 -0500 |
commit | 9dde507fa75d8aeced86f979cb60da866d16c15d (patch) | |
tree | 10ec05423e897bc09a486ac96e137eb51545af27 /util | |
parent | 6993396fedc14755f644b7a261f02a5e0e97b777 (diff) | |
download | mongo-9dde507fa75d8aeced86f979cb60da866d16c15d.tar.gz |
better url parsing
Diffstat (limited to 'util')
-rw-r--r-- | util/miniwebserver.cpp | 33 | ||||
-rw-r--r-- | util/miniwebserver.h | 1 |
2 files changed, 27 insertions, 7 deletions
diff --git a/util/miniwebserver.cpp b/util/miniwebserver.cpp index d3c0ec43db8..16bd6bb3d6a 100644 --- a/util/miniwebserver.cpp +++ b/util/miniwebserver.cpp @@ -49,6 +49,31 @@ bool MiniWebServer::init(int port) { return true; } +string MiniWebServer::parseURL( char * buf ){ + char * urlStart = strstr( buf , " " ); + if ( ! urlStart ) + return "/"; + + urlStart++; + + char * end = strstr( urlStart , " " ); + if ( ! end ){ + end = strstr( urlStart , "\r" ); + if ( ! end ){ + end = strstr( urlStart , "\n" ); + } + } + + if ( ! end ) + return "/"; + + int diff = (int)(end-urlStart); + if ( diff < 0 || diff > 255 ) + return "/"; + + return string( urlStart , (int)(end-urlStart) ); +} + void MiniWebServer::accepted(int s) { char buf[4096]; int x = ::recv(s, buf, sizeof(buf)-1, 0); @@ -56,16 +81,10 @@ void MiniWebServer::accepted(int s) { return; buf[x] = 0; - string url = "/"; - - char * urlStart = strstr( buf , " " ) + 1; - if ( urlStart > buf && urlStart[0] != ' ' ) - url = string( urlStart , (int)(strstr( urlStart , " " ) - urlStart ) ); - string responseMsg; int responseCode = 599; vector<string> headers; - doRequest(buf, url, responseMsg, responseCode, headers); + doRequest(buf, parseURL( buf ), responseMsg, responseCode, headers); stringstream ss; ss << "HTTP/1.0 " << responseCode; diff --git a/util/miniwebserver.h b/util/miniwebserver.h index bb6bf4bf318..c7372acce47 100644 --- a/util/miniwebserver.h +++ b/util/miniwebserver.h @@ -38,6 +38,7 @@ public: private: void accepted(int s); + string parseURL( char * buf ); int sock; }; |