see

https://marc.info/?t=152088166500003&r=1&w=2

Unfortunatly the diff i came up with is wrong (attached again i case it
helps someone).

I had to back it out again:

https://marc.info/?t=153920273300001&r=1&w=2



Ted Unangst([email protected]) on 2019.01.01 22:06:05 -0500:
> HTTP/1.1 connections stay alive by default, unless the client or server
> indicates it will close with the Connection: close header. After a timeout,
> the connection typically closes anyway.
> 
> httpd in this case sends back a 408 Request Timeout response. This is unusual.
> 
> I did not exhaustively study the RFCs, but 408 seems primarily for indicating
> that the client is sending the request too slowly. If the server has already
> finished the request, then 408 would not apply.
> 
> Other servers don't seem to send 408 either. When they have decided that a
> keepalive connection is too old, they simply close it.
> 
> In my case, I'm not running httpd server, but the go http client complains
> about receiving unexpected data.
> 


Author: benno <benno>
Date:   Mon Oct 1 19:24:10 2018 +0000

    Only send 408 Timeout responses when we have seen at least part of a
    request.  Without a request, just close the connection when we hit
    request timeout.
    Prompted by a bug report from Nikola Kolev, thanks.
    ok reyk@ and some suggestions from claudio@ and bluhm@

diff --git usr.sbin/httpd/httpd.h usr.sbin/httpd/httpd.h
index 4b1d9d72237..67cb45e138d 100644
--- usr.sbin/httpd/httpd.h
+++ usr.sbin/httpd/httpd.h
@@ -1,4 +1,4 @@
-/*     $OpenBSD: httpd.h,v 1.140 2018/09/09 21:06:51 bluhm Exp $       */
+/*     $OpenBSD: httpd.h,v 1.141 2018/10/01 19:24:09 benno Exp $       */
 
 /*
  * Copyright (c) 2006 - 2015 Reyk Floeter <[email protected]>
@@ -100,10 +100,11 @@
 
 enum httpchunk {
        TOREAD_UNLIMITED                = -1,
-       TOREAD_HTTP_HEADER              = -2,
-       TOREAD_HTTP_CHUNK_LENGTH        = -3,
-       TOREAD_HTTP_CHUNK_TRAILER       = -4,
-       TOREAD_HTTP_NONE                = -5,
+       TOREAD_HTTP_INIT                = -2,
+       TOREAD_HTTP_HEADER              = -3,
+       TOREAD_HTTP_CHUNK_LENGTH        = -4,
+       TOREAD_HTTP_CHUNK_TRAILER       = -5,
+       TOREAD_HTTP_NONE                = -6,
        TOREAD_HTTP_RANGE               = TOREAD_HTTP_CHUNK_LENGTH
 };
 
diff --git usr.sbin/httpd/server.c usr.sbin/httpd/server.c
index 5f4304705d8..ef4aa6a2a93 100644
--- usr.sbin/httpd/server.c
+++ usr.sbin/httpd/server.c
@@ -1,4 +1,4 @@
-/*     $OpenBSD: server.c,v 1.114 2018/05/19 13:56:56 jsing Exp $      */
+/*     $OpenBSD: server.c,v 1.115 2018/10/01 19:24:09 benno Exp $      */
 
 /*
  * Copyright (c) 2006 - 2015 Reyk Floeter <[email protected]>
@@ -901,7 +901,6 @@ server_input(struct client *clt)
                return;
        }
 
-       clt->clt_toread = TOREAD_HTTP_HEADER;
        inrd = server_read_http;
 
        slen = sizeof(clt->clt_sndbufsiz);
@@ -1019,7 +1018,10 @@ server_error(struct bufferevent *bev, short error, void 
*arg)
        struct evbuffer         *dst;
 
        if (error & EVBUFFER_TIMEOUT) {
-               server_abort_http(clt, 408, "timeout");
+               if (clt->clt_toread != TOREAD_HTTP_INIT)
+                       server_abort_http(clt, 408, "timeout");
+               else
+                       server_abort_http(clt, 0, "timeout");
                return;
        }
        if (error & EVBUFFER_ERROR) {
diff --git usr.sbin/httpd/server_http.c usr.sbin/httpd/server_http.c
index 9306082edaf..c61e4128bf1 100644
--- usr.sbin/httpd/server_http.c
+++ usr.sbin/httpd/server_http.c
@@ -1,4 +1,4 @@
-/*     $OpenBSD: server_http.c,v 1.123 2018/09/07 09:31:13 florian Exp $       
*/
+/*     $OpenBSD: server_http.c,v 1.124 2018/10/01 19:24:09 benno Exp $ */
 
 /*
  * Copyright (c) 2006 - 2018 Reyk Floeter <[email protected]>
@@ -88,6 +88,7 @@ server_httpdesc_init(struct client *clt)
        }
        RB_INIT(&desc->http_headers);
        clt->clt_descresp = desc;
+       clt->clt_toread = TOREAD_HTTP_INIT;
 
        return (0);
 }
@@ -211,6 +212,10 @@ server_read_http(struct bufferevent *bev, void *arg)
        size = EVBUFFER_LENGTH(src);
        DPRINTF("%s: session %d: size %lu, to read %lld",
            __func__, clt->clt_id, size, clt->clt_toread);
+
+       if (clt->clt_toread == TOREAD_HTTP_INIT)
+               clt->clt_toread = TOREAD_HTTP_HEADER;
+
        if (!size) {
                clt->clt_toread = TOREAD_HTTP_HEADER;
                goto done;
@@ -734,6 +739,7 @@ server_reset_http(struct client *clt)
        server_httpdesc_free(clt->clt_descresp);
        clt->clt_headerlen = 0;
        clt->clt_headersdone = 0;
+       clt->clt_toread = TOREAD_HTTP_INIT;
        clt->clt_done = 0;
        clt->clt_line = 0;
        clt->clt_chunk = 0;

Reply via email to