Disregard for now. Carlin pointed out that this (unintentionally) stopped sending content length for head requests. While the RFC has content length optional (according to Carlin, didn't have time to check myself) we probably shouldn't just change behavior
On September 6, 2018 6:39:18 PM GMT+02:00, Florian Obser <[email protected]> wrote: >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 > >How about this one? That way we list all the reasons not to have a >body up front. > >diff --git server_http.c server_http.c >index 4c91dea2d16..72c67c46890 100644 >--- server_http.c >+++ server_http.c >@@ -846,9 +846,10 @@ server_abort_http(struct client *clt, unsigned int >code, const char *msg) > 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; >+ int bodylen = -1; > > if (code == 0) { > server_close(clt, "dropped"); >@@ -924,29 +925,34 @@ server_abort_http(struct client *clt, unsigned >int code, const char *msg) > > free(escapedmsg); > >- /* A CSS stylesheet allows minimal customization by the user */ >- style = "body { background-color: white; color: black; font-family: " >- "'Comic Sans MS', 'Chalkboard SE', 'Comic Neue', sans-serif; }\n" >- "hr { border: 0; border-bottom: 1px dashed; }\n"; >- >- /* Generate simple HTML error document */ >- if ((bodylen = asprintf(&body, >- "<!DOCTYPE html>\n" >- "<html>\n" >- "<head>\n" >- "<meta http-equiv=\"Content-Type\" content=\"text/html; " >- "charset=utf-8\"/>\n" >- "<title>%03d %s</title>\n" >- "<style type=\"text/css\"><!--\n%s\n--></style>\n" >- "</head>\n" >- "<body>\n" >- "<h1>%03d %s</h1>\n" >- "<hr>\n<address>%s</address>\n" >- "</body>\n" >- "</html>\n", >- code, httperr, style, code, httperr, HTTPD_SERVERNAME)) == -1) { >- body = NULL; >- goto done; >+ if (code >= 200 && code != 204 && desc->http_method != >+ HTTP_METHOD_HEAD) { >+ /* A CSS stylesheet allows minimal customization by the user */ >+ style = "body { background-color: white; color: black; " >+ "font-family: 'Comic Sans MS', 'Chalkboard SE', " >+ "'Comic Neue', sans-serif; }\n" >+ "hr { border: 0; border-bottom: 1px dashed; }\n"; >+ >+ /* Generate simple HTML error document */ >+ if ((bodylen = asprintf(&body, >+ "<!DOCTYPE html>\n" >+ "<html>\n" >+ "<head>\n" >+ "<meta http-equiv=\"Content-Type\" content=\"text/html; " >+ "charset=utf-8\"/>\n" >+ "<title>%03d %s</title>\n" >+ "<style type=\"text/css\"><!--\n%s\n--></style>\n" >+ "</head>\n" >+ "<body>\n" >+ "<h1>%03d %s</h1>\n" >+ "<hr>\n<address>%s</address>\n" >+ "</body>\n" >+ "</html>\n", >+ code, httperr, style, code, httperr, HTTPD_SERVERNAME)) == >+ -1) { >+ body = NULL; >+ goto done; >+ } > } > > if (srv_conf->flags & SRVFLAG_SERVER_HSTS) { >@@ -961,6 +967,14 @@ server_abort_http(struct client *clt, unsigned int >code, const char *msg) > } > } > >+ if (bodylen != -1) { >+ 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 +982,16 @@ server_abort_http(struct client *clt, unsigned >int code, const char *msg) > "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, >+ bodylen == -1 ? "" : clenheader, > extraheader == NULL ? "" : extraheader, > hstsheader == NULL ? "" : hstsheader, >- desc->http_method == HTTP_METHOD_HEAD ? "" : body) == -1) >+ bodylen == -1 ? "" : body) == -1) > goto done; > > /* Dump the message without checking for success */ >@@ -987,6 +1002,7 @@ server_abort_http(struct client *clt, unsigned int >code, const char *msg) > 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. -- Sent from my Android device with K-9 Mail. Please excuse my brevity.
