mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
b33fbbfe3d
It's possible that the server already sent in more data than just the headers. Since the stream only accepts progress increments after the headers are processed, the already read data is never added to the process. We account for this by adjusting the progress counter by the difference of already read header data and the body. For the test: Co-authored-by: aetonsi <18366087+aetonsi@users.noreply.github.com> Closes GH-10492.
53 lines
1.4 KiB
PHP
53 lines
1.4 KiB
PHP
--TEST--
|
|
GH-10031 ([Stream] STREAM_NOTIFY_PROGRESS over HTTP emitted irregularly for last chunk of data)
|
|
--SKIPIF--
|
|
<?php
|
|
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test");
|
|
?>
|
|
--INI--
|
|
allow_url_fopen=1
|
|
--CONFLICTS--
|
|
server
|
|
--FILE--
|
|
<?php
|
|
|
|
$serverCode = <<<'CODE'
|
|
$fsize = 1000;
|
|
$chunksize = 99;
|
|
$chunks = floor($fsize / $chunksize); // 10 chunks * 99 bytes
|
|
$lastchunksize = $fsize - $chunksize * $chunks; // 1 chunk * 10 bytes
|
|
|
|
header("Content-Length: " . $fsize);
|
|
flush();
|
|
for ($chunk = 1; $chunk <= $chunks; $chunk++) {
|
|
echo str_repeat('x', $chunksize);
|
|
@ob_flush();
|
|
usleep(50 * 1000);
|
|
}
|
|
|
|
echo str_repeat('x', $lastchunksize);
|
|
CODE;
|
|
|
|
include __DIR__."/../../../../sapi/cli/tests/php_cli_server.inc";
|
|
php_cli_server_start($serverCode, null, []);
|
|
|
|
$context = stream_context_create(['http' => ['ignore_errors' => true,]]);
|
|
$lastBytesTransferred = 0;
|
|
stream_context_set_params($context, ['notification' => function ($code, $s, $m, $mc, $bytes_transferred, $bytes_max)
|
|
use (&$lastBytesTransferred) {
|
|
if ($code === STREAM_NOTIFY_FILE_SIZE_IS) echo "expected filesize=$bytes_max".PHP_EOL;
|
|
$lastBytesTransferred = $bytes_transferred;
|
|
@ob_flush();
|
|
}]);
|
|
|
|
$get = file_get_contents("http://".PHP_CLI_SERVER_ADDRESS, false, $context);
|
|
|
|
echo "got filesize=" . strlen($get) . PHP_EOL;
|
|
var_dump($lastBytesTransferred);
|
|
|
|
?>
|
|
--EXPECT--
|
|
expected filesize=1000
|
|
got filesize=1000
|
|
int(1000)
|