OK florian@
or I can commit it if someone gives me an OK

On Fri, Sep 07, 2018 at 03:08:53AM +1200, Carlin Bingham wrote:
> If httpd is configured to do "block return" with a 1xx or 204 status, it
> sends a response with a Content-Length header and a body, which per RFC
> 7230 it must not.
> 
> The use case for this is a webapp which wants the webserver itself to be
> configured to return a 204 response for certain requests. I'm running
> httpd behind relayd, and relayd doesn't accept the 204 responses httpd
> returns.
> 
> Here's a possible patch.
> 
> 
> --
> Carlin
> 
> 
> Index: usr.sbin/httpd/server_http.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/httpd/server_http.c,v
> retrieving revision 1.122
> diff -u -p -u -r1.122 server_http.c
> --- usr.sbin/httpd/server_http.c      20 Jun 2018 16:43:05 -0000      1.122
> +++ usr.sbin/httpd/server_http.c      5 Sep 2018 16:37:35 -0000
> @@ -846,6 +846,7 @@ server_abort_http(struct client *clt, un
>       const char              *httperr = NULL, *style;
>       char                    *httpmsg, *body = NULL, *extraheader = NULL;
>       char                     tmbuf[32], hbuf[128], *hstsheader = NULL;
> +     char                    *clenheader = NULL;
>       char                     buf[IBUF_READ_SIZE];
>       char                    *escapedmsg = NULL;
>       int                      bodylen;
> @@ -961,6 +962,16 @@ server_abort_http(struct client *clt, un
>               }
>       }
>  
> +     if ((code >= 100 && code < 200) || code == 204)
> +             clenheader = NULL;
> +     else {
> +             if (asprintf(&clenheader,
> +                 "Content-Length: %d\r\n", bodylen) == -1) {
> +                     clenheader = NULL;
> +                     goto done;
> +             }
> +     }
> +
>       /* Add basic HTTP headers */
>       if (asprintf(&httpmsg,
>           "HTTP/1.0 %03d %s\r\n"
> @@ -968,15 +979,17 @@ server_abort_http(struct client *clt, un
>           "Server: %s\r\n"
>           "Connection: close\r\n"
>           "Content-Type: text/html\r\n"
> -         "Content-Length: %d\r\n"
> +         "%s"
>           "%s"
>           "%s"
>           "\r\n"
>           "%s",
> -         code, httperr, tmbuf, HTTPD_SERVERNAME, bodylen,
> +         code, httperr, tmbuf, HTTPD_SERVERNAME,
> +         clenheader == NULL ? "" : clenheader,
>           extraheader == NULL ? "" : extraheader,
>           hstsheader == NULL ? "" : hstsheader,
> -         desc->http_method == HTTP_METHOD_HEAD ? "" : body) == -1)
> +         desc->http_method == HTTP_METHOD_HEAD || clenheader == NULL ?
> +         "" : body) == -1)
>               goto done;
>  
>       /* Dump the message without checking for success */
> @@ -987,6 +1000,7 @@ server_abort_http(struct client *clt, un
>       free(body);
>       free(extraheader);
>       free(hstsheader);
> +     free(clenheader);
>       if (msg == NULL)
>               msg = "\"\"";
>       if (asprintf(&httpmsg, "%s (%03d %s)", msg, code, httperr) == -1) {
> 

-- 
I'm not entirely sure you are real.

Reply via email to