htparser: Handle HEAD requests properly.
[ashd.git] / src / htparser.c
index 17ad93a..4325e97 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
@@ -275,7 +276,10 @@ void serve(FILE *in, struct conn *conn)
        if(!strcmp(req->ver, "HTTP/1.0")) {
            writeresp(in, resp);
            fprintf(in, "\r\n");
-           if((hd = getheader(resp, "content-length")) != NULL) {
+           if(!strcasecmp(req->method, "head")) {
+               if(!hasheader(req, "connection", "keep-alive"))
+                   break;
+           } else if((hd = getheader(resp, "content-length")) != NULL) {
                dlen = passdata(out, in, -1);
                if(dlen != atoo(hd))
                    break;
@@ -288,7 +292,10 @@ 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);
@@ -453,7 +460,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,12 +490,14 @@ int main(int argc, char **argv)
            exit(1);
        }
     }
+    signal(SIGPIPE, SIG_IGN);
     if(daemonize) {
        daemon(0, 0);
     }
-    if(pidout != NULL)
+    if(pidout != NULL) {
        fprintf(pidout, "%i\n", getpid());
-    fclose(pidout);
+       fclose(pidout);
+    }
     ioloop();
     return(0);
 }