Open Journal Systems  3.3.0
BinaryFileResponseTest.php
1 <?php
2 
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11 
13 
19 
21 {
22  public function testConstruction()
23  {
24  $file = __DIR__.'/../README.md';
25  $response = new BinaryFileResponse($file, 404, array('X-Header' => 'Foo'), true, null, true, true);
26  $this->assertEquals(404, $response->getStatusCode());
27  $this->assertEquals('Foo', $response->headers->get('X-Header'));
28  $this->assertTrue($response->headers->has('ETag'));
29  $this->assertTrue($response->headers->has('Last-Modified'));
30  $this->assertFalse($response->headers->has('Content-Disposition'));
31 
32  $response = BinaryFileResponse::create($file, 404, array(), true, ResponseHeaderBag::DISPOSITION_INLINE);
33  $this->assertEquals(404, $response->getStatusCode());
34  $this->assertFalse($response->headers->has('ETag'));
35  $this->assertEquals('inline; filename="README.md"', $response->headers->get('Content-Disposition'));
36  }
37 
39  {
40  touch(sys_get_temp_dir().'/fööö.html');
41 
42  $response = new BinaryFileResponse(sys_get_temp_dir().'/fööö.html', 200, array(), true, 'attachment');
43 
44  @unlink(sys_get_temp_dir().'/fööö.html');
45 
46  $this->assertSame('fööö.html', $response->getFile()->getFilename());
47  }
48 
52  public function testSetContent()
53  {
54  $response = new BinaryFileResponse(__FILE__);
55  $response->setContent('foo');
56  }
57 
58  public function testGetContent()
59  {
60  $response = new BinaryFileResponse(__FILE__);
61  $this->assertFalse($response->getContent());
62  }
63 
65  {
66  $response = new BinaryFileResponse(__FILE__);
67  $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'föö.html');
68 
69  $this->assertSame('attachment; filename="f__.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html', $response->headers->get('Content-Disposition'));
70  }
71 
75  public function testRequests($requestRange, $offset, $length, $responseRange)
76  {
77  $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'))->setAutoEtag();
78 
79  // do a request to get the ETag
80  $request = Request::create('/');
81  $response->prepare($request);
82  $etag = $response->headers->get('ETag');
83 
84  // prepare a request for a range of the testing file
85  $request = Request::create('/');
86  $request->headers->set('If-Range', $etag);
87  $request->headers->set('Range', $requestRange);
88 
89  $file = fopen(__DIR__.'/File/Fixtures/test.gif', 'r');
90  fseek($file, $offset);
91  $data = fread($file, $length);
92  fclose($file);
93 
94  $this->expectOutputString($data);
95  $response = clone $response;
96  $response->prepare($request);
97  $response->sendContent();
98 
99  $this->assertEquals(206, $response->getStatusCode());
100  $this->assertEquals($responseRange, $response->headers->get('Content-Range'));
101  $this->assertSame($length, $response->headers->get('Content-Length'));
102  }
103 
107  public function testRequestsWithoutEtag($requestRange, $offset, $length, $responseRange)
108  {
109  $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'));
110 
111  // do a request to get the LastModified
112  $request = Request::create('/');
113  $response->prepare($request);
114  $lastModified = $response->headers->get('Last-Modified');
115 
116  // prepare a request for a range of the testing file
117  $request = Request::create('/');
118  $request->headers->set('If-Range', $lastModified);
119  $request->headers->set('Range', $requestRange);
120 
121  $file = fopen(__DIR__.'/File/Fixtures/test.gif', 'r');
122  fseek($file, $offset);
123  $data = fread($file, $length);
124  fclose($file);
125 
126  $this->expectOutputString($data);
127  $response = clone $response;
128  $response->prepare($request);
129  $response->sendContent();
130 
131  $this->assertEquals(206, $response->getStatusCode());
132  $this->assertEquals($responseRange, $response->headers->get('Content-Range'));
133  }
134 
135  public function provideRanges()
136  {
137  return array(
138  array('bytes=1-4', 1, 4, 'bytes 1-4/35'),
139  array('bytes=-5', 30, 5, 'bytes 30-34/35'),
140  array('bytes=30-', 30, 5, 'bytes 30-34/35'),
141  array('bytes=30-30', 30, 1, 'bytes 30-30/35'),
142  array('bytes=30-34', 30, 5, 'bytes 30-34/35'),
143  );
144  }
145 
147  {
148  // prevent auto last modified
149  $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'), true, null, false, false);
150 
151  // prepare a request for a range of the testing file
152  $request = Request::create('/');
153  $request->headers->set('If-Range', date('D, d M Y H:i:s').' GMT');
154  $request->headers->set('Range', 'bytes=1-4');
155 
156  $this->expectOutputString(file_get_contents(__DIR__.'/File/Fixtures/test.gif'));
157  $response = clone $response;
158  $response->prepare($request);
159  $response->sendContent();
160 
161  $this->assertEquals(200, $response->getStatusCode());
162  $this->assertNull($response->headers->get('Content-Range'));
163  }
164 
168  public function testFullFileRequests($requestRange)
169  {
170  $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'))->setAutoEtag();
171 
172  // prepare a request for a range of the testing file
173  $request = Request::create('/');
174  $request->headers->set('Range', $requestRange);
175 
176  $file = fopen(__DIR__.'/File/Fixtures/test.gif', 'r');
177  $data = fread($file, 35);
178  fclose($file);
179 
180  $this->expectOutputString($data);
181  $response = clone $response;
182  $response->prepare($request);
183  $response->sendContent();
184 
185  $this->assertEquals(200, $response->getStatusCode());
186  }
187 
188  public function provideFullFileRanges()
189  {
190  return array(
191  array('bytes=0-'),
192  array('bytes=0-34'),
193  array('bytes=-35'),
194  // Syntactical invalid range-request should also return the full resource
195  array('bytes=20-10'),
196  array('bytes=50-40'),
197  );
198  }
199 
203  public function testInvalidRequests($requestRange)
204  {
205  $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'))->setAutoEtag();
206 
207  // prepare a request for a range of the testing file
208  $request = Request::create('/');
209  $request->headers->set('Range', $requestRange);
210 
211  $response = clone $response;
212  $response->prepare($request);
213  $response->sendContent();
214 
215  $this->assertEquals(416, $response->getStatusCode());
216  $this->assertEquals('bytes */35', $response->headers->get('Content-Range'));
217  }
218 
219  public function provideInvalidRanges()
220  {
221  return array(
222  array('bytes=-40'),
223  array('bytes=30-40'),
224  );
225  }
226 
230  public function testXSendfile($file)
231  {
232  $request = Request::create('/');
233  $request->headers->set('X-Sendfile-Type', 'X-Sendfile');
234 
236  $response = BinaryFileResponse::create($file, 200, array('Content-Type' => 'application/octet-stream'));
237  $response->prepare($request);
238 
239  $this->expectOutputString('');
240  $response->sendContent();
241 
242  $this->assertContains('README.md', $response->headers->get('X-Sendfile'));
243  }
244 
245  public function provideXSendfileFiles()
246  {
247  return array(
248  array(__DIR__.'/../README.md'),
249  array('file://'.__DIR__.'/../README.md'),
250  );
251  }
252 
256  public function testXAccelMapping($realpath, $mapping, $virtual)
257  {
258  $request = Request::create('/');
259  $request->headers->set('X-Sendfile-Type', 'X-Accel-Redirect');
260  $request->headers->set('X-Accel-Mapping', $mapping);
261 
262  $file = new FakeFile($realpath, __DIR__.'/File/Fixtures/test');
263 
265  $response = new BinaryFileResponse($file, 200, array('Content-Type' => 'application/octet-stream'));
266  $reflection = new \ReflectionObject($response);
267  $property = $reflection->getProperty('file');
268  $property->setAccessible(true);
269  $property->setValue($response, $file);
270 
271  $response->prepare($request);
272  $this->assertEquals($virtual, $response->headers->get('X-Accel-Redirect'));
273  }
274 
275  public function testDeleteFileAfterSend()
276  {
277  $request = Request::create('/');
278 
279  $path = __DIR__.'/File/Fixtures/to_delete';
280  touch($path);
281  $realPath = realpath($path);
282  $this->assertFileExists($realPath);
283 
284  $response = new BinaryFileResponse($realPath, 200, array('Content-Type' => 'application/octet-stream'));
285  $response->deleteFileAfterSend(true);
286 
287  $response->prepare($request);
288  $response->sendContent();
289 
290  $this->assertFileNotExists($path);
291  }
292 
294  {
295  $request = Request::create('/', 'POST');
296  $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'));
297  $response->prepare($request);
298 
299  $this->assertEquals('none', $response->headers->get('Accept-Ranges'));
300  }
301 
302  public function testAcceptRangeNotOverriden()
303  {
304  $request = Request::create('/', 'POST');
305  $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'));
306  $response->headers->set('Accept-Ranges', 'foo');
307  $response->prepare($request);
308 
309  $this->assertEquals('foo', $response->headers->get('Accept-Ranges'));
310  }
311 
312  public function getSampleXAccelMappings()
313  {
314  return array(
315  array('/var/www/var/www/files/foo.txt', '/var/www/=/files/', '/files/var/www/files/foo.txt'),
316  array('/home/foo/bar.txt', '/var/www/=/files/,/home/foo/=/baz/', '/baz/bar.txt'),
317  );
318  }
319 
320  public function testStream()
321  {
322  $request = Request::create('/');
323  $response = new BinaryFileResponse(new Stream(__DIR__.'/../README.md'), 200, array('Content-Type' => 'text/plain'));
324  $response->prepare($request);
325 
326  $this->assertNull($response->headers->get('Content-Length'));
327  }
328 
329  protected function provideResponse()
330  {
331  return new BinaryFileResponse(__DIR__.'/../README.md', 200, array('Content-Type' => 'application/octet-stream'));
332  }
333 
334  public static function tearDownAfterClass()
335  {
336  $path = __DIR__.'/../Fixtures/to_delete';
337  if (file_exists($path)) {
338  @unlink($path);
339  }
340  }
341 }
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testGetContent
testGetContent()
Definition: BinaryFileResponseTest.php:58
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\provideXSendfileFiles
provideXSendfileFiles()
Definition: BinaryFileResponseTest.php:245
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testDeleteFileAfterSend
testDeleteFileAfterSend()
Definition: BinaryFileResponseTest.php:275
Symfony\Component\HttpFoundation\Tests\File\FakeFile
Definition: FakeFile.php:16
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testRangeRequestsWithoutLastModifiedDate
testRangeRequestsWithoutLastModifiedDate()
Definition: BinaryFileResponseTest.php:146
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testInvalidRequests
testInvalidRequests($requestRange)
Definition: BinaryFileResponseTest.php:203
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testXSendfile
testXSendfile($file)
Definition: BinaryFileResponseTest.php:230
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testConstructWithNonAsciiFilename
testConstructWithNonAsciiFilename()
Definition: BinaryFileResponseTest.php:38
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\tearDownAfterClass
static tearDownAfterClass()
Definition: BinaryFileResponseTest.php:334
Symfony\Component\HttpFoundation\BinaryFileResponse\create
static create($file=null, $status=200, $headers=array(), $public=true, $contentDisposition=null, $autoEtag=false, $autoLastModified=true)
Definition: lib/vendor/symfony/http-foundation/BinaryFileResponse.php:74
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\getSampleXAccelMappings
getSampleXAccelMappings()
Definition: BinaryFileResponseTest.php:312
Symfony\Component\HttpFoundation\Request
Definition: lib/vendor/symfony/http-foundation/Request.php:31
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\provideRanges
provideRanges()
Definition: BinaryFileResponseTest.php:135
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\provideFullFileRanges
provideFullFileRanges()
Definition: BinaryFileResponseTest.php:188
Symfony\Component\HttpFoundation\File\Stream
Definition: lib/vendor/symfony/http-foundation/File/Stream.php:19
Symfony\Component\HttpFoundation\BinaryFileResponse\trustXSendfileTypeHeader
static trustXSendfileTypeHeader()
Definition: lib/vendor/symfony/http-foundation/BinaryFileResponse.php:345
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest
Definition: BinaryFileResponseTest.php:20
Symfony\Component\HttpFoundation\BinaryFileResponse
Definition: lib/vendor/symfony/http-foundation/BinaryFileResponse.php:26
Symfony\Component\HttpFoundation\Tests\ResponseTestCase
Definition: ResponseTestCase.php:17
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testAcceptRangeNotOverriden
testAcceptRangeNotOverriden()
Definition: BinaryFileResponseTest.php:302
Symfony\Component\HttpFoundation\ResponseHeaderBag\DISPOSITION_INLINE
const DISPOSITION_INLINE
Definition: lib/vendor/symfony/http-foundation/ResponseHeaderBag.php:25
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\provideInvalidRanges
provideInvalidRanges()
Definition: BinaryFileResponseTest.php:219
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testFullFileRequests
testFullFileRequests($requestRange)
Definition: BinaryFileResponseTest.php:168
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testXAccelMapping
testXAccelMapping($realpath, $mapping, $virtual)
Definition: BinaryFileResponseTest.php:256
Symfony\Component\HttpFoundation\ResponseHeaderBag
Definition: lib/vendor/symfony/http-foundation/ResponseHeaderBag.php:19
Symfony\Component\HttpFoundation\ResponseHeaderBag\DISPOSITION_ATTACHMENT
const DISPOSITION_ATTACHMENT
Definition: lib/vendor/symfony/http-foundation/ResponseHeaderBag.php:24
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testSetContentDispositionGeneratesSafeFallbackFilename
testSetContentDispositionGeneratesSafeFallbackFilename()
Definition: BinaryFileResponseTest.php:64
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testSetContent
testSetContent()
Definition: BinaryFileResponseTest.php:52
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\provideResponse
provideResponse()
Definition: BinaryFileResponseTest.php:329
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testConstruction
testConstruction()
Definition: BinaryFileResponseTest.php:22
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testRequestsWithoutEtag
testRequestsWithoutEtag($requestRange, $offset, $length, $responseRange)
Definition: BinaryFileResponseTest.php:107
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testRequests
testRequests($requestRange, $offset, $length, $responseRange)
Definition: BinaryFileResponseTest.php:75
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testStream
testStream()
Definition: BinaryFileResponseTest.php:320
Symfony\Component\HttpFoundation\Tests\BinaryFileResponseTest\testAcceptRangeOnUnsafeMethods
testAcceptRangeOnUnsafeMethods()
Definition: BinaryFileResponseTest.php:293
Symfony\Component\HttpFoundation\Tests
Definition: AcceptHeaderItemTest.php:12
Symfony\Component\HttpFoundation\Request\create
static create($uri, $method='GET', $parameters=array(), $cookies=array(), $files=array(), $server=array(), $content=null)
Definition: lib/vendor/symfony/http-foundation/Request.php:408