X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=lib%2Freq.c;h=da8e3f0d8ffb463082a314762f4e1635bc2bc809;hp=8ea2fbc0241e2552d9cd7b51a45a9b215533dbca;hb=90b0ba0f9d93e454cc08a566b718abdcbfd0d9f6;hpb=5fc1bf9ffd24123e1fafbfc8b58c4338521ec0e6 diff --git a/lib/req.c b/lib/req.c index 8ea2fbc..da8e3f0 100644 --- a/lib/req.c +++ b/lib/req.c @@ -23,6 +23,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -97,19 +98,24 @@ static void trim(struct charbuf *buf) for(p = buf->b; (p - buf->b < buf->d) && isspace(*p); p++); memmove(buf->b, p, buf->d -= (p - buf->b)); - for(p = buf->b + buf->d - 1; (p > buf->b) && isspace(*p); p--, buf->d--); + if(buf->d > 0) + for(p = buf->b + buf->d - 1; (p > buf->b) && isspace(*p); p--, buf->d--); } int parseheaders(struct hthead *head, FILE *in) { int c, state; struct charbuf name, val; + size_t tsz; bufinit(name); bufinit(val); state = 0; + tsz = 0; while(1) { c = fgetc(in); + if(++tsz >= 65536) + goto fail; again: if(state == 0) { if(c == '\r') { @@ -190,6 +196,21 @@ void headappheader(struct hthead *head, const char *name, const char *val) head->headers[i][1] = sstrdup(val); } +void headrmheader(struct hthead *head, const char *name) +{ + int i; + + for(i = 0; i < head->noheaders; i++) { + if(!strcasecmp(head->headers[i][0], name)) { + free(head->headers[i][0]); + free(head->headers[i][1]); + free(head->headers[i]); + memmove(head->headers + i, head->headers + i + 1, sizeof(head->headers) * (--head->noheaders - i)); + return; + } + } +} + int writeresp(FILE *out, struct hthead *resp) { int i; @@ -238,6 +259,7 @@ int recvreq(int sock, struct hthead **reqp) if((fd = recvfd(sock, &buf.b, &buf.d)) < 0) { return(-1); } + fcntl(fd, F_SETFD, FD_CLOEXEC); buf.s = buf.d; p = buf.b; l = buf.d; @@ -268,3 +290,37 @@ fail: errno = EPROTO; return(-1); } + +char *unquoteurl(char *in) +{ + struct charbuf buf; + char *p; + int c; + + bufinit(buf); + p = in; + while(*p) { + if(*p == '%') { + if(!p[1] || !p[2]) + goto fail; + c = 0; + if((p[1] >= '0') && (p[1] <= '9')) c |= (p[1] - '0') << 4; + else if((p[1] >= 'a') && (p[1] <= 'f')) c |= (p[1] - 'a' + 10) << 4; + else if((p[1] >= 'A') && (p[1] <= 'F')) c |= (p[1] - 'A' + 10) << 4; + else goto fail; + if((p[2] >= '0') && (p[2] <= '9')) c |= (p[2] - '0'); + else if((p[2] >= 'a') && (p[2] <= 'f')) c |= (p[2] - 'a' + 10); + else if((p[2] >= 'A') && (p[2] <= 'F')) c |= (p[2] - 'A' + 10); + else goto fail; + bufadd(buf, c); + p += 3; + } else { + bufadd(buf, *(p++)); + } + } + bufadd(buf, 0); + return(buf.b); +fail: + buffree(buf); + return(NULL); +}