php-src/ext/standard/tests/http/bug65634.phpt
Adam Harvey 8983a38d51 Request non-keep-alive connections by default in HTTP 1.1 requests.
As noted in FR #65634, at present we don't send a Connection request header
when the protocol version is set to 1.1, which means that RFC-compliant Web
servers should respond with keep-alive connections. Since there's no way of
reusing the HTTP connection at present, this simply means that PHP will appear
to hang until the remote server hits its connection timeout, which may be quite
some time.

This commit sends a "Connection: close" header by default when HTTP 1.1 (or
later) is requested by the user via the context options. It can be overridden
by specifying a Connection header in the context options. It isn't possible to
disable sending of the Connection header, but given "Connection: keep-alive" is
the same as the default HTTP 1.1 behaviour, I don't see this as a significant
issue — users who want to opt in for that still can.

As a note, although I've removed an efree(protocol_version), this doesn't
result in a memory leak: protocol_version is freed in the out: block at the end
of the function anyway, and there are no returns between the removed efree()
and the later call. Yes, I ran the tests with valgrind to check that. ☺

Implements FR #65634 (HTTP wrapper is very slow with protocol_version 1.1).
2013-09-11 14:11:29 -07:00

82 lines
1.7 KiB
PHP

--TEST--
Bug #65634 (HTTP wrapper is very slow with protocol_version 1.1)
--INI--
allow_url_fopen=1
--SKIPIF--
<?php require 'server.inc'; http_server_skipif('tcp://127.0.0.1:12342'); ?>
--FILE--
<?php
require 'server.inc';
function do_test($version, $connection) {
$options = [
'http' => [
'protocol_version' => $version,
],
];
if ($connection) {
$options['http']['header'] = "Connection: $connection";
}
$ctx = stream_context_create($options);
$responses = ["data://text/plain,HTTP/$version 204 No Content\r\n\r\n"];
$pid = http_server('tcp://127.0.0.1:12342', $responses, $output);
$fd = fopen('http://127.0.0.1:12342/', 'rb', false, $ctx);
fseek($output, 0, SEEK_SET);
echo stream_get_contents($output);
http_server_kill($pid);
}
echo "HTTP/1.0, default behaviour:\n";
do_test('1.0', null);
echo "HTTP/1.0, connection: close:\n";
do_test('1.0', 'close');
echo "HTTP/1.0, connection: keep-alive:\n";
do_test('1.0', 'keep-alive');
echo "HTTP/1.1, default behaviour:\n";
do_test('1.1', null);
echo "HTTP/1.1, connection: close:\n";
do_test('1.1', 'close');
echo "HTTP/1.1, connection: keep-alive:\n";
do_test('1.1', 'keep-alive');
?>
--EXPECT--
HTTP/1.0, default behaviour:
GET / HTTP/1.0
Host: 127.0.0.1:12342
HTTP/1.0, connection: close:
GET / HTTP/1.0
Host: 127.0.0.1:12342
Connection: close
HTTP/1.0, connection: keep-alive:
GET / HTTP/1.0
Host: 127.0.0.1:12342
Connection: keep-alive
HTTP/1.1, default behaviour:
GET / HTTP/1.1
Host: 127.0.0.1:12342
Connection: close
HTTP/1.1, connection: close:
GET / HTTP/1.1
Host: 127.0.0.1:12342
Connection: close
HTTP/1.1, connection: keep-alive:
GET / HTTP/1.1
Host: 127.0.0.1:12342
Connection: keep-alive