‪TYPO3CMS  11.5
RequestTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
23 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
24 
30 class ‪RequestTest extends UnitTestCase
31 {
32  protected ?‪Request ‪$request;
33 
34  protected function ‪setUp(): void
35  {
36  parent::setUp();
37  $this->request = new ‪Request();
38  }
39 
43  public function ‪getMethodIsGetByDefault(): void
44  {
45  self::assertEquals('GET', $this->request->getMethod());
46  }
47 
52  {
53  ‪$request = $this->request->‪withMethod('GET');
54  self::assertNotSame($this->request, ‪$request);
55  self::assertEquals('GET', ‪$request->‪getMethod());
56  }
57 
61  public function ‪getUriIsNullByDefault(): void
62  {
63  self::assertNull($this->request->getUri());
64  }
65 
70  {
71  $this->expectException(\InvalidArgumentException::class);
72  new ‪Request(['TOTALLY INVALID']);
73  }
74 
79  {
80  ‪$request = $this->request->‪withUri(new ‪Uri('https://example.com:10082/foo/bar?baz=bat'));
81  self::assertNotSame($this->request, ‪$request);
82  $request2 = ‪$request->‪withUri(new ‪Uri('/baz/bat?foo=bar'));
83  self::assertNotSame($this->request, $request2);
84  self::assertNotSame(‪$request, $request2);
85  self::assertEquals('/baz/bat?foo=bar', (string)$request2->getUri());
86  }
87 
92  {
93  $uri = new ‪Uri('http://example.com/');
94  $body = new ‪Stream('php://memory');
95  $headers = [
96  'x-foo' => ['bar'],
97  ];
98  ‪$request = new ‪Request(
99  $uri,
100  'POST',
101  $body,
102  $headers
103  );
104 
105  self::assertSame($uri, ‪$request->‪getUri());
106  self::assertEquals('POST', ‪$request->‪getMethod());
107  self::assertSame($body, ‪$request->‪getBody());
108  $testHeaders = ‪$request->‪getHeaders();
109  foreach ($headers as $key => $value) {
110  self::assertArrayHasKey($key, $testHeaders);
111  self::assertEquals($value, $testHeaders[$key]);
112  }
113  }
114 
118  public function ‪invalidRequestUriDataProvider(): array
119  {
120  return [
121  'true' => [true],
122  'false' => [false],
123  'int' => [1],
124  'float' => [1.1],
125  'array' => [['http://example.com']],
126  'stdClass' => [(object)['href' => 'http://example.com']],
127  ];
128  }
129 
134  public function ‪constructorRaisesExceptionForInvalidUri($uri): void
135  {
136  $this->expectException(\InvalidArgumentException::class);
137  $this->expectExceptionCode(1436717272);
138  new ‪Request($uri);
139  }
140 
144  public function ‪invalidRequestMethodDataProvider(): array
145  {
146  return [
147  'true' => [true],
148  'false' => [false],
149  'int' => [1],
150  'float' => [1.1],
151  'array' => [['POST']],
152  'stdClass' => [(object)['method' => 'POST']],
153  ];
154  }
155 
161  {
162  $this->expectException(\InvalidArgumentException::class);
163  $this->expectExceptionCode(1436717274);
164  new ‪Request(null, $method);
165  }
166 
171  {
172  $this->expectException(\InvalidArgumentException::class);
173  $this->expectExceptionCode(1436717275);
174  new ‪Request(null, 'BOGUS-METHOD');
175  }
176 
180  public function ‪invalidRequestBodyDataProvider(): array
181  {
182  return [
183  'true' => [true],
184  'false' => [false],
185  'int' => [1],
186  'float' => [1.1],
187  'array' => [['BODY']],
188  'stdClass' => [(object)['body' => 'BODY']],
189  ];
190  }
191 
196  public function ‪constructorRaisesExceptionForInvalidBody($body): void
197  {
198  $this->expectException(\InvalidArgumentException::class);
199  $this->expectExceptionCode(1436717271);
200  new ‪Request(null, null, $body);
201  }
202 
206  public function ‪constructorIgnoresInvalidHeaders(): void
207  {
208  $headers = [
209  ['INVALID'],
210  'x-invalid-null' => null,
211  'x-invalid-object' => (object)['INVALID'],
212  'x-valid-true' => true,
213  'x-valid-false' => false,
214  'x-valid-int' => 1,
215  'x-valid-float' => 1.5,
216  'x-valid-string' => 'VALID',
217  'x-valid-array' => ['VALID'],
218  ];
219  $expected = [
220  'x-valid-true' => ['1'],
221  'x-valid-false' => [''],
222  'x-valid-int' => ['1'],
223  'x-valid-float' => ['1.5'],
224  'x-valid-string' => ['VALID'],
225  'x-valid-array' => ['VALID'],
226  ];
227  ‪$request = new ‪Request(null, null, 'php://memory', $headers);
228  self::assertEquals($expected, ‪$request->‪getHeaders());
229  }
230 
235  {
236  ‪$request = new ‪Request();
237  self::assertEquals('/', ‪$request->‪getRequestTarget());
238  }
239 
244  {
245  ‪$request = (new ‪Request())
246  ->withUri(new ‪Uri('http://example.com'));
247  self::assertEquals('/', ‪$request->‪getRequestTarget());
248  }
249 
253  public function ‪requestsWithUriDataProvider(): array
254  {
255  return [
256  'absolute-uri' => [
257  (new ‪Request())
258  ->withUri(new ‪Uri('https://api.example.com/user'))
259  ->withMethod('POST'),
260  '/user',
261  ],
262  'absolute-uri-with-query' => [
263  (new ‪Request())
264  ->withUri(new ‪Uri('https://api.example.com/user?foo=bar'))
265  ->withMethod('POST'),
266  '/user?foo=bar',
267  ],
268  'relative-uri' => [
269  (new ‪Request())
270  ->withUri(new ‪Uri('/user'))
271  ->withMethod('GET'),
272  '/user',
273  ],
274  'relative-uri-with-query' => [
275  (new ‪Request())
276  ->withUri(new ‪Uri('/user?foo=bar'))
277  ->withMethod('GET'),
278  '/user?foo=bar',
279  ],
280  ];
281  }
282 
287  public function ‪getRequestTargetWhenUriIsPresent(‪$request, $expected): void
288  {
289  self::assertEquals($expected, ‪$request->‪getRequestTarget());
290  }
291 
295  public function ‪validRequestTargetsDataProvider(): array
296  {
297  return [
298  'asterisk-form' => ['*'],
299  'authority-form' => ['api.example.com'],
300  'absolute-form' => ['https://api.example.com/users'],
301  'absolute-form-query' => ['https://api.example.com/users?foo=bar'],
302  'origin-form-path-only' => ['/users'],
303  'origin-form' => ['/users?id=foo'],
304  ];
305  }
306 
311  public function ‪getRequestTargetCanProvideARequestTarget($requestTarget): void
312  {
313  ‪$request = (new ‪Request())->withRequestTarget($requestTarget);
314  self::assertEquals($requestTarget, ‪$request->‪getRequestTarget());
315  }
316 
321  {
322  ‪$request = new ‪Request();
323  $this->expectException(\InvalidArgumentException::class);
324  $this->expectExceptionCode(1436717273);
325  ‪$request->‪withRequestTarget('foo bar baz');
326  }
327 
332  {
333  ‪$request = (new ‪Request())->withUri(new ‪Uri('https://example.com/foo/bar'));
334  $original = ‪$request->‪getRequestTarget();
335  $newRequest = ‪$request->‪withUri(new ‪Uri('http://mwop.net/bar/baz'));
336  self::assertNotEquals($original, $newRequest->getRequestTarget());
337  }
338 
342  public function ‪getRequestTargetIsResetWithNewUri(): void
343  {
344  ‪$request = (new ‪Request())->withUri(new ‪Uri('https://example.com/foo/bar'));
346  ‪$request->‪withUri(new ‪Uri('http://mwop.net/bar/baz'));
347  }
348 
353  {
354  ‪$request = new ‪Request('http://example.com');
355  $headers = ‪$request->‪getHeaders();
356  self::assertArrayHasKey('host', $headers);
357  self::assertContains('example.com', $headers['host']);
358  }
359 
364  {
365  ‪$request = new ‪Request();
366  $headers = ‪$request->‪getHeaders();
367  self::assertArrayNotHasKey('host', $headers);
368  }
369 
374  {
375  ‪$request = new ‪Request(new ‪Uri());
376  $headers = ‪$request->‪getHeaders();
377  self::assertArrayNotHasKey('host', $headers);
378  }
379 
384  {
385  ‪$request = new ‪Request('http://example.com');
386  $header = ‪$request->‪getHeader('host');
387  self::assertEquals(['example.com'], $header);
388  }
389 
394  {
395  ‪$request = new ‪Request();
396  self::assertSame([], ‪$request->‪getHeader('host'));
397  }
398 
403  {
404  ‪$request = new ‪Request(new ‪Uri());
405  self::assertSame([], ‪$request->‪getHeader('host'));
406  }
407 
412  {
413  ‪$request = new ‪Request('http://example.com');
414  $header = ‪$request->‪getHeaderLine('host');
415  self::assertStringContainsString('example.com', $header);
416  }
417 
422  {
423  ‪$request = new ‪Request();
424  self::assertSame('', ‪$request->‪getHeaderLine('host'));
425  }
426 
431  {
432  ‪$request = new ‪Request(new ‪Uri());
433  self::assertSame('', ‪$request->‪getHeaderLine('host'));
434  }
435 
440  {
441  ‪$request = (new ‪Request())
442  ->withAddedHeader('Host', 'example.com');
443 
444  $uri = (new ‪Uri())->withHost('www.example.com');
445  $new = ‪$request->‪withUri($uri, true);
446 
447  self::assertEquals('example.com', $new->getHeaderLine('Host'));
448  }
449 
454  {
455  ‪$request = (new ‪Request())
456  ->withAddedHeader('Host', 'example.com');
457 
458  $uri = new ‪Uri();
459  $new = ‪$request->‪withUri($uri);
460 
461  self::assertEquals('example.com', $new->getHeaderLine('Host'));
462  }
463 
468  {
469  ‪$request = (new ‪Request())
470  ->withAddedHeader('Host', 'example.com');
471 
472  $uri = (new ‪Uri())
473  ->withHost('www.example.com')
474  ->withPort(10081);
475  $new = ‪$request->‪withUri($uri);
476 
477  self::assertEquals('www.example.com:10081', $new->getHeaderLine('Host'));
478  }
479 
484  {
485  // 'name' => [$headerName, $headerValue, $expectedValue]
486  return [
487  'Foo' => ['Foo', 'bar', 'bar'],
488  'foo' => ['foo', 'bar', 'bar'],
489  'Foo-with-array' => ['Foo', ['bar'], 'bar'],
490  'foo-with-array' => ['foo', ['bar'], 'bar'],
491  ];
492  }
493 
498  public function ‪headerCanBeRetrieved($header, $value, $expected): void
499  {
500  ‪$request = new ‪Request(null, null, 'php://memory', [$header => $value]);
501  self::assertEquals([$expected], ‪$request->‪getHeader(strtolower($header)));
502  self::assertEquals([$expected], ‪$request->‪getHeader(strtoupper($header)));
503  }
504 
509  {
510  return [
511  'name-with-cr' => ["X-Foo\r-Bar", 'value'],
512  'name-with-lf' => ["X-Foo\n-Bar", 'value'],
513  'name-with-crlf' => ["X-Foo\r\n-Bar", 'value'],
514  'name-with-2crlf' => ["X-Foo\r\n\r\n-Bar", 'value'],
515  'value-with-cr' => ['X-Foo-Bar', "value\rinjection"],
516  'value-with-lf' => ['X-Foo-Bar', "value\ninjection"],
517  'value-with-crlf' => ['X-Foo-Bar', "value\r\ninjection"],
518  'value-with-2crlf' => ['X-Foo-Bar', "value\r\n\r\ninjection"],
519  'array-value-with-cr' => ['X-Foo-Bar', ["value\rinjection"]],
520  'array-value-with-lf' => ['X-Foo-Bar', ["value\ninjection"]],
521  'array-value-with-crlf' => ['X-Foo-Bar', ["value\r\ninjection"]],
522  'array-value-with-2crlf' => ['X-Foo-Bar', ["value\r\n\r\ninjection"]],
523  ];
524  }
525 
530  public function ‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value): void
531  {
532  $this->expectException(\InvalidArgumentException::class);
533  new ‪Request(null, null, 'php://memory', [$name => $value]);
534  }
535 
539  public function ‪supportedRequestMethodsWork(): void
540  {
541  ‪$request = new ‪Request('some-uri', 'PURGE');
542  self::assertEquals('PURGE', ‪$request->‪getMethod());
543  }
544 
549  {
550  $this->expectException(\InvalidArgumentException::class);
551  new ‪Request('some-uri', 'UNSUPPORTED');
552  }
553 }
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\setUp
‪setUp()
Definition: RequestTest.php:34
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getUriIsNullByDefault
‪getUriIsNullByDefault()
Definition: RequestTest.php:61
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetIsResetWithNewUri
‪getRequestTargetIsResetWithNewUri()
Definition: RequestTest.php:342
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetIsSlashWhenUriHasNoPathOrQuery
‪getRequestTargetIsSlashWhenUriHasNoPathOrQuery()
Definition: RequestTest.php:243
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest
Definition: RequestTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeadersContainsNoHostHeaderIfUriDoesNotContainHost
‪getHeadersContainsNoHostHeaderIfUriDoesNotContainHost()
Definition: RequestTest.php:373
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:18
‪TYPO3\CMS\Core\Http\Request\getHeader
‪string[] getHeader($header)
Definition: Request.php:164
‪TYPO3\CMS\Core\Http\Request\withUri
‪static withUri(UriInterface $uri, $preserveHost=false)
Definition: Request.php:325
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getMethodIsGetByDefault
‪getMethodIsGetByDefault()
Definition: RequestTest.php:43
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostDoesNotTakePrecedenceOverHostWithPortFromUri
‪getHeaderLineWithHostDoesNotTakePrecedenceOverHostWithPortFromUri()
Definition: RequestTest.php:467
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorRaisesExceptionForInvalidStream
‪constructorRaisesExceptionForInvalidStream()
Definition: RequestTest.php:69
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostReturnsEmptyStringIfNoUriPresent
‪getHeaderLineWithHostReturnsEmptyStringIfNoUriPresent()
Definition: RequestTest.php:421
‪TYPO3\CMS\Core\Http\Request\withRequestTarget
‪static withRequestTarget($requestTarget)
Definition: Request.php:238
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\headersWithUpperAndLowerCaseValuesDataProvider
‪array headersWithUpperAndLowerCaseValuesDataProvider()
Definition: RequestTest.php:483
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorCanAcceptAllMessageParts
‪constructorCanAcceptAllMessageParts()
Definition: RequestTest.php:91
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorRaisesExceptionForInvalidMethodByString
‪constructorRaisesExceptionForInvalidMethodByString()
Definition: RequestTest.php:170
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\validRequestTargetsDataProvider
‪array validRequestTargetsDataProvider()
Definition: RequestTest.php:295
‪TYPO3\CMS\Core\Http\Uri
Definition: Uri.php:29
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\invalidRequestBodyDataProvider
‪array invalidRequestBodyDataProvider()
Definition: RequestTest.php:180
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\headerCanBeRetrieved
‪headerCanBeRetrieved($header, $value, $expected)
Definition: RequestTest.php:498
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderWithHostReturnsEmptyArrayIfNoUriPresent
‪getHeaderWithHostReturnsEmptyArrayIfNoUriPresent()
Definition: RequestTest.php:393
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetCanProvideARequestTarget
‪getRequestTargetCanProvideARequestTarget($requestTarget)
Definition: RequestTest.php:311
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorRaisesExceptionForHeadersWithCRLFVectors
‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value)
Definition: RequestTest.php:530
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\withRequestTargetCannotContainWhitespace
‪withRequestTargetCannotContainWhitespace()
Definition: RequestTest.php:320
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeadersContainsHostHeaderIfUriWithHostIsPresent
‪getHeadersContainsHostHeaderIfUriWithHostIsPresent()
Definition: RequestTest.php:352
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\invalidRequestUriDataProvider
‪array invalidRequestUriDataProvider()
Definition: RequestTest.php:118
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeadersContainsNoHostHeaderIfNoUriPresent
‪getHeadersContainsNoHostHeaderIfNoUriPresent()
Definition: RequestTest.php:363
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\nonSupportedRequestMethodsRaisesException
‪nonSupportedRequestMethodsRaisesException()
Definition: RequestTest.php:548
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:29
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\supportedRequestMethodsWork
‪supportedRequestMethodsWork()
Definition: RequestTest.php:539
‪TYPO3\CMS\Core\Http\Request\getMethod
‪string getMethod()
Definition: Request.php:253
‪TYPO3\CMS\Core\Http\Request\withMethod
‪static withMethod($method)
Definition: Request.php:273
‪TYPO3\CMS\Core\Http\Message\getBody
‪Psr Http Message StreamInterface getBody()
Definition: Message.php:283
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetDoesNotCacheBetweenInstances
‪getRequestTargetDoesNotCacheBetweenInstances()
Definition: RequestTest.php:331
‪TYPO3\CMS\Core\Http\Request\getHeaders
‪array getHeaders()
Definition: Request.php:141
‪TYPO3\CMS\Core\Http\Request\getUri
‪Psr Http Message UriInterface getUri()
Definition: Request.php:289
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetWhenUriIsPresent
‪getRequestTargetWhenUriIsPresent($request, $expected)
Definition: RequestTest.php:287
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\$request
‪Request $request
Definition: RequestTest.php:32
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostReturnsEmptyStringIfUriDoesNotContainHost
‪getHeaderLineWithHostReturnsEmptyStringIfUriDoesNotContainHost()
Definition: RequestTest.php:430
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderWithHostReturnsUriHostWhenPresent
‪getHeaderWithHostReturnsUriHostWhenPresent()
Definition: RequestTest.php:383
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorRaisesExceptionForInvalidBody
‪constructorRaisesExceptionForInvalidBody($body)
Definition: RequestTest.php:196
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorRaisesExceptionForInvalidMethodByType
‪constructorRaisesExceptionForInvalidMethodByType($method)
Definition: RequestTest.php:160
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\headersWithInjectionVectorsDataProvider
‪array headersWithInjectionVectorsDataProvider()
Definition: RequestTest.php:508
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderWithHostReturnsEmptyArrayIfUriDoesNotContainHost
‪getHeaderWithHostReturnsEmptyArrayIfUriDoesNotContainHost()
Definition: RequestTest.php:402
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostReturnsUriHostWhenPresent
‪getHeaderLineWithHostReturnsUriHostWhenPresent()
Definition: RequestTest.php:411
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostTakesPrecedenceOverModifiedUri
‪getHeaderLineWithHostTakesPrecedenceOverModifiedUri()
Definition: RequestTest.php:439
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\withUriReturnsNewInstanceWithNewUri
‪withUriReturnsNewInstanceWithNewUri()
Definition: RequestTest.php:78
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\invalidRequestMethodDataProvider
‪array invalidRequestMethodDataProvider()
Definition: RequestTest.php:144
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorIgnoresInvalidHeaders
‪constructorIgnoresInvalidHeaders()
Definition: RequestTest.php:206
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\requestsWithUriDataProvider
‪array requestsWithUriDataProvider()
Definition: RequestTest.php:253
‪TYPO3\CMS\Core\Http\Request
Definition: Request.php:33
‪TYPO3\CMS\Core\Http\Request\getRequestTarget
‪string getRequestTarget()
Definition: Request.php:200
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetIsSlashWhenNoUriPresent
‪getRequestTargetIsSlashWhenNoUriPresent()
Definition: RequestTest.php:234
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorRaisesExceptionForInvalidUri
‪constructorRaisesExceptionForInvalidUri($uri)
Definition: RequestTest.php:134
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getMethodMutatorReturnsCloneWithChangedMethod
‪getMethodMutatorReturnsCloneWithChangedMethod()
Definition: RequestTest.php:51
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostTakesPrecedenceOverEmptyUri
‪getHeaderLineWithHostTakesPrecedenceOverEmptyUri()
Definition: RequestTest.php:453
‪TYPO3\CMS\Core\Http\Message\getHeaderLine
‪string getHeaderLine($name)
Definition: Message.php:174