X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fhtparser.c;h=88c8e6d8330d5d0400ee9ee7f373bea5105a7beb;hb=edad3c6ac0bf754458f386b2c540276b83e83020;hp=c78f064c33f7775e1e7882586a510dc76876830b;hpb=a0327573bb6032e02e988a0d0aed709b4be7a422;p=ashd.git diff --git a/src/htparser.c b/src/htparser.c index c78f064..88c8e6d 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); @@ -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 dlen, sent; - size_t headoff; + 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 @@ -391,6 +398,8 @@ static void serve(struct muth *muth, va_list args) if(dlen > 0) passdata(fd, cfd, &inbuf, dlen); } + /* Make sure to send EOF */ + shutdown(cfd, SHUT_WR); /* * Find and decode the response header: