Make htparser strip the param string from the rest string.
[ashd.git] / src / htparser.c
index 57b7a26..88c8e6d 100644 (file)
@@ -296,7 +296,7 @@ static off_t passdata(int src, int dst, struct charbuf *buf, off_t max)
 
     sent = 0;
     eof = 0;
-    while(!eof || (buf->d > 0)) {
+    while((!eof || (buf->d > 0)) && ((max < 0) || (sent < max))) {
        if(!eof && (buf->d < buf->s) && ((max < 0) || (sent + buf->d < max))) {
            while(1) {
                ret = recv(src, buf->b + buf->d, buf->s - buf->d, MSG_DONTWAIT);
@@ -339,11 +339,11 @@ 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 sent;
-    size_t headoff;
+    off_t dlen, sent;
+    ssize_t headoff;
     char nmbuf[256];
     
     bufinit(inbuf);
@@ -369,6 +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 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
@@ -382,6 +389,17 @@ static void serve(struct muth *muth, va_list args)
            headappheader(req, "X-Ash-Port", sprintf3("%i", ntohs(((struct sockaddr_in6 *)&name)->sin6_port)));
        }
        cfd = sendreq(plex, req);
+
+       /*
+        * If there is message data, pass it:
+        */
+       if((hd = getheader(req, "content-length")) != NULL) {
+           dlen = atoo(hd);
+           if(dlen > 0)
+               passdata(fd, cfd, &inbuf, dlen);
+       }
+       /* Make sure to send EOF */
+       shutdown(cfd, SHUT_WR);
        
        /*
         * Find and decode the response header: