htparser: Enforce no more than Content-Length bytes are passed to the client.
[ashd.git] / src / htparser.c
index 0824902..d1b0a1c 100644 (file)
@@ -22,6 +22,7 @@
 #include <string.h>
 #include <sys/socket.h>
 #include <pwd.h>
+#include <sys/signal.h>
 #include <errno.h>
 
 #ifdef HAVE_CONFIG_H
@@ -271,13 +272,19 @@ void serve(FILE *in, struct conn *conn)
        if((resp = parseresp(out)) == NULL)
            break;
        replstr(&resp->ver, req->ver);
+       
+       if(!getheader(resp, "server"))
+           headappheader(resp, "Server", sprintf3("ashd/%s", VERSION));
 
        if(!strcmp(req->ver, "HTTP/1.0")) {
            writeresp(in, resp);
            fprintf(in, "\r\n");
-           if((hd = getheader(resp, "content-length")) != NULL) {
-               dlen = passdata(out, in, -1);
-               if(dlen != atoo(hd))
+           if(!strcasecmp(req->method, "head")) {
+               if(!hasheader(req, "connection", "keep-alive"))
+                   break;
+           } else if((hd = getheader(resp, "content-length")) != NULL) {
+               dlen = atoo(hd);
+               if(passdata(out, in, dlen) != dlen)
                    break;
                if(!hasheader(req, "connection", "keep-alive"))
                    break;
@@ -288,11 +295,14 @@ void serve(FILE *in, struct conn *conn)
            if(hasheader(req, "connection", "close") || hasheader(resp, "connection", "close"))
                break;
        } else if(!strcmp(req->ver, "HTTP/1.1")) {
-           if((hd = getheader(resp, "content-length")) != NULL) {
+           if(!strcasecmp(req->method, "head")) {
+               writeresp(in, resp);
+               fprintf(in, "\r\n");
+           } else if((hd = getheader(resp, "content-length")) != NULL) {
                writeresp(in, resp);
                fprintf(in, "\r\n");
-               dlen = passdata(out, in, -1);
-               if(dlen != atoo(hd))
+               dlen = atoo(hd);
+               if(passdata(out, in, dlen) != dlen)
                    break;
            } else if(!getheader(resp, "transfer-encoding")) {
                headappheader(resp, "Transfer-Encoding", "chunked");
@@ -453,7 +463,7 @@ int main(int argc, char **argv)
        usage(stderr);
        exit(1);
     }
-    if((plex = stdmkchild(argv + ++i)) < 0) {
+    if((plex = stdmkchild(argv + ++i, NULL, NULL)) < 0) {
        flog(LOG_ERR, "could not spawn root multiplexer: %s", strerror(errno));
        return(1);
     }
@@ -483,6 +493,7 @@ int main(int argc, char **argv)
            exit(1);
        }
     }
+    signal(SIGPIPE, SIG_IGN);
     if(daemonize) {
        daemon(0, 0);
     }