diff --git a/lib/public/AppFramework/Http/FileDisplayResponse.php b/lib/public/AppFramework/Http/FileDisplayResponse.php index c18404b7d9161..3cd3adf4bfa2f 100644 --- a/lib/public/AppFramework/Http/FileDisplayResponse.php +++ b/lib/public/AppFramework/Http/FileDisplayResponse.php @@ -48,8 +48,16 @@ public function __construct(File|ISimpleFile $file, int $statusCode = Http::STAT */ public function callback(IOutput $output) { if ($output->getHttpResponseCode() !== Http::STATUS_NOT_MODIFIED) { + $file = $this->file->read(); + + if ($file === false) { + $output->setHttpResponseCode(Http::STATUS_NOT_FOUND); + $output->setOutput(''); + return; + } + $output->setHeader('Content-Length: ' . $this->file->getSize()); - $output->setOutput($this->file->getContent()); + $output->setReadfile($file); } } } diff --git a/tests/lib/AppFramework/Http/FileDisplayResponseTest.php b/tests/lib/AppFramework/Http/FileDisplayResponseTest.php index 029ddaad7125b..3fc29cb8ac5b9 100644 --- a/tests/lib/AppFramework/Http/FileDisplayResponseTest.php +++ b/tests/lib/AppFramework/Http/FileDisplayResponseTest.php @@ -1,5 +1,7 @@ file = $this->getMockBuilder('OCP\Files\File') - ->getMock(); - + $this->file = $this->createMock(File::class); $this->file->expects($this->once()) ->method('getETag') ->willReturn('myETag'); @@ -52,7 +51,7 @@ public function testLastModified(): void { } public function test304(): void { - $output = $this->getMockBuilder('OCP\AppFramework\Http\IOutput') + $output = $this->getMockBuilder(IOutput::class) ->disableOriginalConstructor() ->getMock(); @@ -69,25 +68,50 @@ public function test304(): void { public function testNon304(): void { - $output = $this->getMockBuilder('OCP\AppFramework\Http\IOutput') + $resource = fopen('php://memory', "w+b"); + fwrite($resource, 'my data'); + rewind($resource); + + $this->file->expects($this->once()) + ->method('read') + ->willReturn($resource); + $this->file->expects($this->any()) + ->method('getSize') + ->willReturn(7); + + $output = $this->getMockBuilder(IOutput::class) ->disableOriginalConstructor() ->getMock(); - - $output->expects($this->any()) + $output->expects($this->once()) ->method('getHttpResponseCode') ->willReturn(Http::STATUS_OK); $output->expects($this->once()) - ->method('setOutput') - ->with($this->equalTo('my data')); + ->method('setReadFile') + ->with($this->equalTo($resource)); $output->expects($this->once()) ->method('setHeader') - ->with($this->equalTo('Content-Length: 42')); + ->with($this->equalTo('Content-Length: 7')); + + $this->response->callback($output); + } + + public function testFileNotFound(): void { $this->file->expects($this->once()) - ->method('getContent') - ->willReturn('my data'); - $this->file->expects($this->any()) - ->method('getSize') - ->willReturn(42); + ->method('read') + ->willReturn(false); + + $output = $this->getMockBuilder(IOutput::class) + ->disableOriginalConstructor() + ->getMock(); + $output->expects($this->once()) + ->method('getHttpResponseCode') + ->willReturn(Http::STATUS_OK); + $output->expects($this->once()) + ->method('setHttpResponseCode') + ->with($this->equalTo(Http::STATUS_NOT_FOUND)); + $output->expects($this->once()) + ->method('setOutput') + ->with($this->equalTo('')); $this->response->callback($output); }