Florian Obser([email protected]) on 2018.09.07 10:38:41 +0200:
> OK florian@
> or I can commit it if someone gives me an OK

go ahead, ok benno@
 
> 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