Added a tokenizer util function.
[ashd.git] / src / htparser.c
index 184e7b9..a96b7b4 100644 (file)
@@ -339,7 +339,7 @@ static void serve(struct muth *muth, va_list args)
     vavar(struct sockaddr_storage, name);
     int cfd;
     char old;
-    char *hd;
+    char *hd, *p;
     struct charbuf inbuf, outbuf;
     struct hthead *req, *resp;
     off_t dlen, sent;
@@ -349,7 +349,7 @@ static void serve(struct muth *muth, va_list args)
     bufinit(inbuf);
     bufinit(outbuf);
     cfd = -1;
-    req = NULL;
+    req = resp = NULL;
     while(1) {
        /*
         * First, find and decode the header:
@@ -369,10 +369,13 @@ static void serve(struct muth *muth, va_list args)
            goto out;
        inbuf.b[headoff] = old;
        bufeat(inbuf, headoff);
-       /* We strip off the leading slash from the rest string, so
-        * that multiplexers can parse coherently. */
+       /* We strip off the leading slash and any param string from
+        * the rest string, so that multiplexers can parse
+        * coherently. */
        if(req->rest[0] == '/')
            replrest(req, req->rest + 1);
+       if((p = strchr(req->rest, '?')) != NULL)
+           *p = 0;
        
        /*
         * Add metainformation and then send the request to the root
@@ -385,7 +388,8 @@ static void serve(struct muth *muth, va_list args)
            headappheader(req, "X-Ash-Address", inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&name)->sin6_addr, nmbuf, sizeof(nmbuf)));
            headappheader(req, "X-Ash-Port", sprintf3("%i", ntohs(((struct sockaddr_in6 *)&name)->sin6_port)));
        }
-       cfd = sendreq(plex, req);
+       if((cfd = sendreq(plex, req)) < 0)
+           goto out;
 
        /*
         * If there is message data, pass it:
@@ -402,7 +406,8 @@ static void serve(struct muth *muth, va_list args)
         * Find and decode the response header:
         */
        outbuf.d = 0;
-       headoff = readhead(cfd, &outbuf);
+       if((headoff = readhead(cfd, &outbuf)) < 0)
+           goto out;
        hd = memcpy(smalloc(headoff + 1), outbuf.b, headoff);
        hd[headoff] = 0;
        if((resp = parserawresp(hd)) == NULL)