summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2008-12-30 21:58:36 -0500
committerEliot Horowitz <eliot@10gen.com>2008-12-30 21:58:36 -0500
commit9dde507fa75d8aeced86f979cb60da866d16c15d (patch)
tree10ec05423e897bc09a486ac96e137eb51545af27 /util
parent6993396fedc14755f644b7a261f02a5e0e97b777 (diff)
downloadmongo-9dde507fa75d8aeced86f979cb60da866d16c15d.tar.gz
better url parsing
Diffstat (limited to 'util')
-rw-r--r--util/miniwebserver.cpp33
-rw-r--r--util/miniwebserver.h1
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;
};