htparser: Enforce no more than Content-Length bytes are passed to the client.
[ashd.git] / src / htparser.c
index 4325e97..d1b0a1c 100644 (file)
@@ -272,6 +272,9 @@ 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);
@@ -280,8 +283,8 @@ void serve(FILE *in, struct conn *conn)
                if(!hasheader(req, "connection", "keep-alive"))
                    break;
            } else if((hd = getheader(resp, "content-length")) != NULL) {
-               dlen = passdata(out, in, -1);
-               if(dlen != atoo(hd))
+               dlen = atoo(hd);
+               if(passdata(out, in, dlen) != dlen)
                    break;
                if(!hasheader(req, "connection", "keep-alive"))
                    break;
@@ -298,8 +301,8 @@ void serve(FILE *in, struct conn *conn)
            } 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");