Fix works for me, too. Thanks.

It now sets the "Content-Length: 0" header for ALL traffic that
is not chunk-encoded. But chunk-encoding may be disabled already
(e.g. for http/1.0). I'd therefore suggest to move the fix to where
the handling of zero-length bodies actually takes place.


--- usr.sbin/httpd/server_fcgi.c        Thu May 20 05:57:23 2021
+++ usr.sbin/httpd/server_fcgi.c        Thu May 20 06:03:40 2021
@@ -620,6 +620,12 @@
            EVBUFFER_LENGTH(clt->clt_srvevb) == 0) {
                /* Can't chunk encode an empty body. */
                clt->clt_fcgi.chunked = 0;
+               key.kv_key = "Content-Length";
+               if ((kv = kv_find(&resp->http_headers, &key)) == NULL) {
+                       if (kv_add(&resp->http_headers,
+                           "Content-Length", "0") == NULL)
+                               return (-1);
+               }
        }
 
        /* Set chunked encoding */
@@ -636,13 +642,6 @@
                if (kv_add(&resp->http_headers,
                    "Transfer-Encoding", "chunked") == NULL)
                        return (-1);
-       } else {
-               key.kv_key = "Content-Length";
-               if ((kv = kv_find(&resp->http_headers, &key)) == NULL) {
-                       if (kv_add(&resp->http_headers,
-                           "Content-Length", "0") == NULL)
-                               return (-1);
-               }
        }
 
        /* Is it a persistent connection? */


On 2021-05-19 20:44, Florian Obser wrote:
> The whole point of using Transfer-Encoding: chunked for fastcgi was so
> that we do not need to provide a Content-Length header if upstream
> doesn't give us one. (We'd need to slurp in all the data ugh).
> 
> Now turns out that if we disable chunked encoding for zero sized bodies
> some browsers are picky and want a Content-Length: 0 (Firefox, Safari)
> or they'll just sit there and wait for the connection to close.
> 
> Problem reported by Matthias Pressfreund with wordpress.
> Debugged with the help of weerd@ who pointed out that the problem is
> actually browser dependent. From there it was pretty clear what the
> problem was.
> 
> OK?
> 
> diff --git server_fcgi.c server_fcgi.c
> index 31d7322e9f7..b9dc4f6fe04 100644
> --- server_fcgi.c
> +++ server_fcgi.c
> @@ -636,6 +636,13 @@ server_fcgi_header(struct client *clt, unsigned int code)
>               if (kv_add(&resp->http_headers,
>                   "Transfer-Encoding", "chunked") == NULL)
>                       return (-1);
> +     } else {
> +             key.kv_key = "Content-Length";
> +             if ((kv = kv_find(&resp->http_headers, &key)) == NULL) {
> +                     if (kv_add(&resp->http_headers,
> +                         "Content-Length", "0") == NULL)
> +                             return (-1);
> +             }
>       }
>  
>       /* Is it a persistent connection? */
> 

Reply via email to