X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fhtparser.c;h=184e7b9cdf69599967d4d7c49a4e93bc354f3370;hb=d93d9a056098f74e2efe5064c41dc3f6ef5926b4;hp=57b7a2612cdee26ad7b1ef745a1b68476b1f4038;hpb=9d87a1194d09845d8bff81297593097aa786862f;p=ashd.git diff --git a/src/htparser.c b/src/htparser.c index 57b7a26..184e7b9 100644 --- a/src/htparser.c +++ b/src/htparser.c @@ -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); @@ -342,8 +342,8 @@ static void serve(struct muth *muth, va_list args) char *hd; 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,10 @@ 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. */ + if(req->rest[0] == '/') + replrest(req, req->rest + 1); /* * Add metainformation and then send the request to the root @@ -382,6 +386,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: