Hello,

I noticed a change in behavior when going from Apache/2.4.16 to
Apache/2.4.33 when sending a 204 Response that the header
Content-Length 0 is removed by Apache when it is included in 204
Response.

This looks to be the correct behavior based on the RFC spec

https://tools.ietf.org/html/rfc7230#section-3.3.2

“A server MUST NOT send a Content-Length header field in any response
with a status code of 1xx (Informational) or 204 (No Content).”

However, what I am also noticing is a delay in the 204 Response being
sent to the client in Apache/2.4.33.

The use case is that this is a PHP script on the server that is
sending the 204 Response immediately and the continuing to do work.

In Apache/2.4.16 the 204 Response is sent immediately, in
Apache/2.4.33 the response is sent only after the PHP script exits.

My best guess is that the stripping of the Content-Length 0 header is
causing Apache to not flush the socket right away, but it now waits
for the PHP script to exit.

If I send a 200 Response instead, with a Content-Length 0, then there
is no delay in Apache/2.4.33

I checked the bugs database and couldn't find anything, so am checking
here to see if it is maybe an apache bug.

I confirmed the issue still exists in Apache/2.4.41. Below are my
steps to test and the results.

Thanks,

Todd


https://github.com/docker-library/php/tree/master/7.4/buster/apache

changed debian:buster-slim to debian:unstable-slim to get latest apache

docker build -t php-docker-apache-example .

docker run -d -p 8080:80 php-docker-apache-example

First experiment,  returning 204

php.index

<?php
header("HTTP/1.1 204 No Content");
        ob_end_clean();

        header('Connection: close');
        ob_start();
        $size = ob_get_length();
        header("Content-Length: $size");
        ob_end_flush();
        flush();
sleep(5);
exit;
?>


~/php-docker-apache-example $ time curl -v http://127.0.0.1:8080
* Rebuilt URL to: http://127.0.0.1:8080/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 204 No Content
< Date: Thu, 06 Feb 2020 14:22:36 GMT
< Server: Apache/2.4.41 (Debian)
< X-Powered-By: PHP/7.4.2
< Connection: close
<
* Closing connection 0

real 0m5.020s
user 0m0.005s
sys 0m0.007s


and the apache logs for that are

$ docker logs --follow
62046b36868209242de8cf681f0711f811a86ffa5adf66c31865928204acdbe9
AH00558: apache2: Could not reliably determine the server's fully
qualified domain name, using 172.17.0.2. Set the 'ServerName'
directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully
qualified domain name, using 172.17.0.2. Set the 'ServerName'
directive globally to suppress this message
[Thu Feb 06 14:37:27.367142 2020] [mpm_prefork:notice] [pid 1]
AH00163: Apache/2.4.41 (Debian) PHP/7.4.2 configured -- resuming
normal operations
[Thu Feb 06 14:37:27.367234 2020] [core:notice] [pid 1] AH00094:
Command line: 'apache2 -D FOREGROUND'
172.17.0.1 - - [06/Feb/2020:14:37:59 +0000] "GET / HTTP/1.1" 204 140
"-" "curl/7.54.0"


Second experiment, returning 200 Response

index.php

<?php
header("HTTP/1.1 200 OK");
        ob_end_clean();

        header('Connection: close');
        ob_start();
        $size = ob_get_length();
        header("Content-Length: $size");
        ob_end_flush();
        flush();
sleep(5);
exit;
?>


~/php-docker-apache-example $ time curl -v http://127.0.0.1:8080
* Rebuilt URL to: http://127.0.0.1:8080/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Thu, 06 Feb 2020 14:26:29 GMT
< Server: Apache/2.4.41 (Debian)
< X-Powered-By: PHP/7.4.2
< Connection: close
< Content-Length: 0
< Vary: Accept-Encoding
< Content-Type: text/html; charset=UTF-8
<
* Closing connection 0

real 0m0.026s
user 0m0.005s
sys 0m0.008s

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@httpd.apache.org
For additional commands, e-mail: users-h...@httpd.apache.org

Reply via email to