123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\HttpFoundation\Tests;
- use Symfony\Component\HttpFoundation\BinaryFileResponse;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\ResponseHeaderBag;
- class BinaryFileResponseTest extends ResponseTestCase
- {
- public function testConstruction()
- {
- $response = new BinaryFileResponse('README.md', 404, array('X-Header' => 'Foo'), true, null, true, true);
- $this->assertEquals(404, $response->getStatusCode());
- $this->assertEquals('Foo', $response->headers->get('X-Header'));
- $this->assertTrue($response->headers->has('ETag'));
- $this->assertTrue($response->headers->has('Last-Modified'));
- $this->assertFalse($response->headers->has('Content-Disposition'));
- $response = BinaryFileResponse::create('README.md', 404, array(), true, ResponseHeaderBag::DISPOSITION_INLINE);
- $this->assertEquals(404, $response->getStatusCode());
- $this->assertFalse($response->headers->has('ETag'));
- $this->assertEquals('inline; filename="README.md"', $response->headers->get('Content-Disposition'));
- }
- /**
- * @expectedException \LogicException
- */
- public function testSetContent()
- {
- $response = new BinaryFileResponse('README.md');
- $response->setContent('foo');
- }
- public function testGetContent()
- {
- $response = new BinaryFileResponse('README.md');
- $this->assertFalse($response->getContent());
- }
- /**
- * @dataProvider provideRanges
- */
- public function testRequests($requestRange, $offset, $length, $responseRange)
- {
- $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif')->setAutoEtag();
- // do a request to get the ETag
- $request = Request::create('/');
- $response->prepare($request);
- $etag = $response->headers->get('ETag');
- // prepare a request for a range of the testing file
- $request = Request::create('/');
- $request->headers->set('If-Range', $etag);
- $request->headers->set('Range', $requestRange);
- $file = fopen(__DIR__.'/File/Fixtures/test.gif', 'r');
- fseek($file, $offset);
- $data = fread($file, $length);
- fclose($file);
- $this->expectOutputString($data);
- $response = clone $response;
- $response->prepare($request);
- $response->sendContent();
- $this->assertEquals(206, $response->getStatusCode());
- $this->assertEquals('binary', $response->headers->get('Content-Transfer-Encoding'));
- $this->assertEquals($responseRange, $response->headers->get('Content-Range'));
- }
- public function provideRanges()
- {
- return array(
- array('bytes=1-4', 1, 4, 'bytes 1-4/35'),
- array('bytes=-5', 30, 5, 'bytes 30-34/35'),
- array('bytes=-35', 0, 35, 'bytes 0-34/35'),
- array('bytes=-40', 0, 35, 'bytes 0-34/35'),
- array('bytes=30-', 30, 5, 'bytes 30-34/35'),
- array('bytes=30-30', 30, 1, 'bytes 30-30/35'),
- array('bytes=30-34', 30, 5, 'bytes 30-34/35'),
- array('bytes=30-40', 30, 5, 'bytes 30-34/35')
- );
- }
- public function testXSendfile()
- {
- $request = Request::create('/');
- $request->headers->set('X-Sendfile-Type', 'X-Sendfile');
- BinaryFileResponse::trustXSendfileTypeHeader();
- $response = BinaryFileResponse::create('README.md');
- $response->prepare($request);
- $this->expectOutputString('');
- $response->sendContent();
- $this->assertContains('README.md', $response->headers->get('X-Sendfile'));
- }
- /**
- * @dataProvider getSampleXAccelMappings
- */
- public function testXAccelMapping($realpath, $mapping, $virtual)
- {
- $request = Request::create('/');
- $request->headers->set('X-Sendfile-Type', 'X-Accel-Redirect');
- $request->headers->set('X-Accel-Mapping', $mapping);
- $file = $this->getMockBuilder('Symfony\Component\HttpFoundation\File\File')
- ->disableOriginalConstructor()
- ->getMock();
- $file->expects($this->any())
- ->method('getRealPath')
- ->will($this->returnValue($realpath));
- $file->expects($this->any())
- ->method('isReadable')
- ->will($this->returnValue(true));
- BinaryFileResponse::trustXSendFileTypeHeader();
- $response = new BinaryFileResponse('README.md');
- $reflection = new \ReflectionObject($response);
- $property = $reflection->getProperty('file');
- $property->setAccessible(true);
- $property->setValue($response, $file);
- $response->prepare($request);
- $this->assertEquals($virtual, $response->headers->get('X-Accel-Redirect'));
- }
- public function getSampleXAccelMappings()
- {
- return array(
- array('/var/www/var/www/files/foo.txt', '/files/=/var/www/', '/files/var/www/files/foo.txt'),
- array('/home/foo/bar.txt', '/files/=/var/www/,/baz/=/home/foo/', '/baz/bar.txt'),
- );
- }
- protected function provideResponse()
- {
- return new BinaryFileResponse('README.md');
- }
- }
|