diff -Nru /n/sources/plan9/sys/src/libhttpd/parsereq.c /sys/src/libhttpd/parsereq.c --- /n/sources/plan9/sys/src/libhttpd/parsereq.c Thu Jul 15 21:53:39 2010 +++ /sys/src/libhttpd/parsereq.c Tue Jul 27 00:00:00 2010 @@ -17,6 +17,57 @@ static Strings parseuri(HConnect *c, char*); static Strings stripsearch(char*); +int +hparseuri(HConnect *c, char *uri) +{ + Strings ss; + char *search, *origuri; + + /* + * the fragment is not supposed to be sent + * strip it 'cause some clients send it + */ + origuri = uri; + uri = strchr(origuri, '#'); + if(uri != nil) + *uri = 0; + + /* + * http/1.1 requires the server to accept absolute + * or relative uri's. convert to relative with an absolute path + */ + if(http11(c)){ + ss = parseuri(c, origuri); + uri = ss.s1; + c->req.urihost = ss.s2; + if(uri == nil){ + hfail(c, HBadReq, uri); + return -1; + } + origuri = uri; + } + + /* + * munge uri for search, protection, and magic + */ + ss = stripsearch(origuri); + origuri = ss.s1; + search = ss.s2; + uri = hurlunesc(c, origuri); + uri = abspath(c, uri, "/"); + if(uri == nil || uri[0] == '\0'){ + hfail(c, HNotFound, "no object specified"); + return -1; + } + + c->req.uri = uri; + c->req.search = search; + if(search) + c->req.searchpairs = hparsequery(c, hstrdup(c, search)); + + return 1; +} + /* * parse the next request line * returns: @@ -27,8 +78,7 @@ int hparsereq(HConnect *c, int timeout) { - Strings ss; - char *vs, *v, *search, *uri, *origuri, *extra; + char *vs, *v, *uri, *extra; if(c->bin != nil){ hfail(c, HInternal); @@ -90,50 +140,7 @@ return -1; } } - - /* - * the fragment is not supposed to be sent - * strip it 'cause some clients send it - */ - origuri = uri; - uri = strchr(origuri, '#'); - if(uri != nil) - *uri = 0; - - /* - * http/1.1 requires the server to accept absolute - * or relative uri's. convert to relative with an absolute path - */ - if(http11(c)){ - ss = parseuri(c, origuri); - uri = ss.s1; - c->req.urihost = ss.s2; - if(uri == nil){ - hfail(c, HBadReq, uri); - return -1; - } - origuri = uri; - } - - /* - * munge uri for search, protection, and magic - */ - ss = stripsearch(origuri); - origuri = ss.s1; - search = ss.s2; - uri = hurlunesc(c, origuri); - uri = abspath(c, uri, "/"); - if(uri == nil || uri[0] == '\0'){ - hfail(c, HNotFound, "no object specified"); - return -1; - } - - c->req.uri = uri; - c->req.search = search; - if(search) - c->req.searchpairs = hparsequery(c, hstrdup(c, search)); - - return 1; + return hparseuri(c, uri); } static Strings --- /n/sources/plan9/sys/include/httpd.h Thu Jul 15 21:42:09 2010 +++ /sys/include/httpd.h Fri Nov 11 00:00:00 2016 @@ -249,6 +249,7 @@ int hparseheaders(HConnect*, int timeout); HSPairs *hparsequery(HConnect *c, char *search); int hparsereq(HConnect *c, int timeout); +int hparseuri(HConnect*, char*); int hprint(Hio*, char*, ...); int hputc(Hio*, int); void *hreadbuf(Hio *h, void *vsave);