Dolda2000 GitWeb
/
ashd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fixed another htparser bug.
[ashd.git]
/
src
/
htparser.c
diff --git
a/src/htparser.c
b/src/htparser.c
index
c78f064
..
a96b7b4
100644
(file)
--- 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;
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);
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,17
+339,17
@@
static void serve(struct muth *muth, va_list args)
vavar(struct sockaddr_storage, name);
int cfd;
char old;
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;
struct charbuf inbuf, outbuf;
struct hthead *req, *resp;
off_t dlen, sent;
- size_t headoff;
+ s
s
ize_t headoff;
char nmbuf[256];
bufinit(inbuf);
bufinit(outbuf);
cfd = -1;
char nmbuf[256];
bufinit(inbuf);
bufinit(outbuf);
cfd = -1;
- req = NULL;
+ req =
resp =
NULL;
while(1) {
/*
* First, find and decode the header:
while(1) {
/*
* First, find and decode the header:
@@
-369,6
+369,13
@@
static void serve(struct muth *muth, va_list args)
goto out;
inbuf.b[headoff] = old;
bufeat(inbuf, headoff);
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
/*
* Add metainformation and then send the request to the root
@@
-381,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)));
}
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:
/*
* If there is message data, pass it:
@@
-391,12
+399,15
@@
static void serve(struct muth *muth, va_list args)
if(dlen > 0)
passdata(fd, cfd, &inbuf, dlen);
}
if(dlen > 0)
passdata(fd, cfd, &inbuf, dlen);
}
+ /* Make sure to send EOF */
+ shutdown(cfd, SHUT_WR);
/*
* Find and decode the response header:
*/
outbuf.d = 0;
/*
* 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)
hd = memcpy(smalloc(headoff + 1), outbuf.b, headoff);
hd[headoff] = 0;
if((resp = parserawresp(hd)) == NULL)