From 36c2deda528d6a6996ee50b662261cade317fe57 Mon Sep 17 00:00:00 2001 From: Vlasta Vesely Date: Mon, 5 Feb 2018 09:20:17 +0100 Subject: [PATCH] FileResponse: strict type fix Since `4e6` is float and function `fread()` exects integer value for length, it caused a `TypeError` on bigger files. --- src/Application/Responses/FileResponse.php | 2 +- tests/Responses/FileResponse.full.phpt | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/Application/Responses/FileResponse.php b/src/Application/Responses/FileResponse.php index 3cbda3ef8..d43ff1807 100644 --- a/src/Application/Responses/FileResponse.php +++ b/src/Application/Responses/FileResponse.php @@ -117,7 +117,7 @@ public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $htt $httpResponse->setHeader('Content-Length', (string) $length); while (!feof($handle) && $length > 0) { - echo $s = fread($handle, min(4e6, $length)); + echo $s = fread($handle, min(4000000, $length)); $length -= strlen($s); } fclose($handle); diff --git a/tests/Responses/FileResponse.full.phpt b/tests/Responses/FileResponse.full.phpt index 51294625a..3c62a2525 100644 --- a/tests/Responses/FileResponse.full.phpt +++ b/tests/Responses/FileResponse.full.phpt @@ -14,6 +14,7 @@ use Tester\Assert; require __DIR__ . '/../bootstrap.php'; +/* A small file */ test(function () { $file = __FILE__; $fileResponse = new FileResponse($file); @@ -23,3 +24,22 @@ test(function () { $fileResponse->send(new Http\Request(new Http\UrlScript), new Http\Response); Assert::same($origData, ob_get_clean()); }); + +/* A big file */ +test(function () { + $file = Tester\FileMock::create(); + + $data = ''; + for ($i = 0; $i < 20000; $i++) { + $data .= 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi efficitur nisl mauris, ' . + 'sed bibendum leo tempor ornare. Etiam sodales enim sem. Proin lobortis metus at sagittis ' . + 'imperdiet. In non fringilla libero, ac porta purus. Nam gravida quis tellus quis semper.'; + } + + file_put_contents($file, $data); + $fileResponse = new FileResponse($file); + + ob_start(); + $fileResponse->send(new Http\Request(new Http\UrlScript), new Http\Response); + Assert::same($data, ob_get_clean()); +});