X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fhtparser.c;h=92445d7bf85f7554a7a6ef0066d28314963f63f7;hb=b71ad67f41a9e99bd243d57b5038de28f1696f27;hp=8d0b515ec072de95902b7497484401ff371a3e23;hpb=8e9ec020b45b2f43b0f44249037da82470a5446f;p=ashd.git diff --git a/src/htparser.c b/src/htparser.c index 8d0b515..92445d7 100644 --- a/src/htparser.c +++ b/src/htparser.c @@ -280,15 +280,35 @@ static int http10keep(struct hthead *req, struct hthead *resp) } } +static char *connid(void) +{ + static struct charbuf cur; + int i; + char *ret; + + for(i = 0; i < cur.d; i++) { + if((++cur.b[i]) > 'Z') + cur.b[i] = 'A'; + else + goto done; + } + bufadd(cur, 'A'); +done: + ret = memcpy(smalloc(cur.d + 1), cur.b, cur.d); + ret[cur.d] = 0; + return(ret); +} + void serve(FILE *in, struct conn *conn) { int pfds[2]; FILE *out; struct hthead *req, *resp; - char *hd; + char *hd, *id; off_t dlen; int keep; + id = connid(); out = NULL; req = resp = NULL; while(plex >= 0) { @@ -297,6 +317,7 @@ void serve(FILE *in, struct conn *conn) if(!canonreq(req)) break; + headappheader(req, "X-Ash-Connection-ID", id); if((conn->initreq != NULL) && conn->initreq(conn, req)) break; @@ -307,7 +328,7 @@ void serve(FILE *in, struct conn *conn) if(sendreq(plex, req, pfds[0])) break; close(pfds[0]); - out = mtstdopen(pfds[1], 1, 600, "r+"); + out = mtstdopen(pfds[1], 1, 600, "r+", NULL); if(getheader(req, "content-type") != NULL) { if((hd = getheader(req, "content-length")) != NULL) { @@ -399,14 +420,16 @@ void serve(FILE *in, struct conn *conn) if(resp != NULL) freehthead(resp); fclose(in); + free(id); } static void plexwatch(struct muth *muth, va_list args) { vavar(int, fd); char *buf; - int i, ret; + int i, s, ret; + s = 0; while(1) { if(block(fd, EV_READ, 0) == 0) break; @@ -416,6 +439,7 @@ static void plexwatch(struct muth *muth, va_list args) flog(LOG_WARNING, "received error on rootplex read channel: %s", strerror(errno)); exit(1); } else if(ret == 0) { + s = 1; free(buf); break; } @@ -423,15 +447,16 @@ static void plexwatch(struct muth *muth, va_list args) * some day... */ free(buf); } - close(plex); - plex = -1; + shutdown(plex, SHUT_RDWR); for(i = 0; i < listeners.d; i++) { if(listeners.b[i] == muth) bufdel(listeners, i); } - flog(LOG_INFO, "root handler exited, so shutting down listening..."); - while(listeners.d > 0) - resume(listeners.b[0], 0); + if(s) { + flog(LOG_INFO, "root handler exited, so shutting down listening..."); + while(listeners.d > 0) + resume(listeners.b[0], 0); + } } static void initroot(void *uu)