‪TYPO3CMS  10.4
RequestTest.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
21 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
22 
28 class ‪RequestTest extends UnitTestCase
29 {
33  protected ‪$request;
34 
35  protected function ‪setUp(): void
36  {
37  parent::setUp();
38  $this->request = new ‪Request();
39  }
40 
44  public function ‪getMethodIsGetByDefault()
45  {
46  self::assertEquals('GET', $this->request->getMethod());
47  }
48 
53  {
54  ‪$request = $this->request->‪withMethod('GET');
55  self::assertNotSame($this->request, ‪$request);
56  self::assertEquals('GET', ‪$request->‪getMethod());
57  }
58 
62  public function ‪getUriIsNullByDefault()
63  {
64  self::assertNull($this->request->getUri());
65  }
66 
71  {
72  $this->expectException(\InvalidArgumentException::class);
73  new Request(['TOTALLY INVALID']);
74  }
75 
80  {
81  ‪$request = $this->request->‪withUri(new Uri('https://example.com:10082/foo/bar?baz=bat'));
82  self::assertNotSame($this->request, ‪$request);
83  $request2 = ‪$request->‪withUri(new Uri('/baz/bat?foo=bar'));
84  self::assertNotSame($this->request, $request2);
85  self::assertNotSame(‪$request, $request2);
86  self::assertEquals('/baz/bat?foo=bar', (string)$request2->getUri());
87  }
88 
93  {
94  $uri = new Uri('http://example.com/');
95  $body = new Stream('php://memory');
96  $headers = [
97  'x-foo' => ['bar'],
98  ];
99  ‪$request = new Request(
100  $uri,
101  'POST',
102  $body,
103  $headers
104  );
105 
106  self::assertSame($uri, ‪$request->‪getUri());
107  self::assertEquals('POST', ‪$request->‪getMethod());
108  self::assertSame($body, ‪$request->‪getBody());
109  $testHeaders = ‪$request->‪getHeaders();
110  foreach ($headers as $key => $value) {
111  self::assertArrayHasKey($key, $testHeaders);
112  self::assertEquals($value, $testHeaders[$key]);
113  }
114  }
115 
119  public function ‪invalidRequestUriDataProvider()
120  {
121  return [
122  'true' => [true],
123  'false' => [false],
124  'int' => [1],
125  'float' => [1.1],
126  'array' => [['http://example.com']],
127  'stdClass' => [(object)['href' => 'http://example.com']],
128  ];
129  }
130 
135  public function ‪constructorRaisesExceptionForInvalidUri($uri)
136  {
137  $this->expectException(\InvalidArgumentException::class);
138  $this->expectExceptionCode(1436717272);
139  new Request($uri);
140  }
141 
145  public function ‪invalidRequestMethodDataProvider()
146  {
147  return [
148  'true' => [true],
149  'false' => [false],
150  'int' => [1],
151  'float' => [1.1],
152  'array' => [['POST']],
153  'stdClass' => [(object)['method' => 'POST']],
154  ];
155  }
156 
162  {
163  $this->expectException(\InvalidArgumentException::class);
164  $this->expectExceptionCode(1436717274);
165  new Request(null, $method);
166  }
167 
172  {
173  $this->expectException(\InvalidArgumentException::class);
174  $this->expectExceptionCode(1436717275);
175  new Request(null, 'BOGUS-METHOD');
176  }
177 
181  public function ‪invalidRequestBodyDataProvider()
182  {
183  return [
184  'true' => [true],
185  'false' => [false],
186  'int' => [1],
187  'float' => [1.1],
188  'array' => [['BODY']],
189  'stdClass' => [(object)['body' => 'BODY']],
190  ];
191  }
192 
197  public function ‪constructorRaisesExceptionForInvalidBody($body)
198  {
199  $this->expectException(\InvalidArgumentException::class);
200  $this->expectExceptionCode(1436717271);
201  new Request(null, null, $body);
202  }
203 
207  public function ‪constructorIgnoresInvalidHeaders()
208  {
209  $headers = [
210  ['INVALID'],
211  'x-invalid-null' => null,
212  'x-invalid-true' => true,
213  'x-invalid-false' => false,
214  'x-invalid-int' => 1,
215  'x-invalid-object' => (object)['INVALID'],
216  'x-valid-string' => 'VALID',
217  'x-valid-array' => ['VALID'],
218  ];
219  $expected = [
220  'x-valid-string' => ['VALID'],
221  'x-valid-array' => ['VALID'],
222  ];
223  ‪$request = new Request(null, null, 'php://memory', $headers);
224  self::assertEquals($expected, ‪$request->‪getHeaders());
225  }
226 
231  {
232  ‪$request = new Request();
233  self::assertEquals('/', ‪$request->‪getRequestTarget());
234  }
235 
240  {
241  ‪$request = (new Request())
242  ->withUri(new Uri('http://example.com'));
243  self::assertEquals('/', ‪$request->‪getRequestTarget());
244  }
245 
249  public function ‪requestsWithUriDataProvider()
250  {
251  return [
252  'absolute-uri' => [
253  (new Request())
254  ->withUri(new Uri('https://api.example.com/user'))
255  ->withMethod('POST'),
256  '/user'
257  ],
258  'absolute-uri-with-query' => [
259  (new Request())
260  ->withUri(new Uri('https://api.example.com/user?foo=bar'))
261  ->withMethod('POST'),
262  '/user?foo=bar'
263  ],
264  'relative-uri' => [
265  (new Request())
266  ->withUri(new Uri('/user'))
267  ->withMethod('GET'),
268  '/user'
269  ],
270  'relative-uri-with-query' => [
271  (new Request())
272  ->withUri(new Uri('/user?foo=bar'))
273  ->withMethod('GET'),
274  '/user?foo=bar'
275  ],
276  ];
277  }
278 
283  public function ‪getRequestTargetWhenUriIsPresent(‪$request, $expected)
284  {
285  self::assertEquals($expected, ‪$request->‪getRequestTarget());
286  }
287 
291  public function ‪validRequestTargetsDataProvider()
292  {
293  return [
294  'asterisk-form' => ['*'],
295  'authority-form' => ['api.example.com'],
296  'absolute-form' => ['https://api.example.com/users'],
297  'absolute-form-query' => ['https://api.example.com/users?foo=bar'],
298  'origin-form-path-only' => ['/users'],
299  'origin-form' => ['/users?id=foo'],
300  ];
301  }
302 
307  public function ‪getRequestTargetCanProvideARequestTarget($requestTarget)
308  {
309  ‪$request = (new Request())->withRequestTarget($requestTarget);
310  self::assertEquals($requestTarget, ‪$request->‪getRequestTarget());
311  }
312 
317  {
318  ‪$request = new Request();
319  $this->expectException(\InvalidArgumentException::class);
320  $this->expectExceptionCode(1436717273);
321  ‪$request->‪withRequestTarget('foo bar baz');
322  }
323 
328  {
329  ‪$request = (new Request())->withUri(new Uri('https://example.com/foo/bar'));
330  $original = ‪$request->‪getRequestTarget();
331  $newRequest = ‪$request->‪withUri(new Uri('http://mwop.net/bar/baz'));
332  self::assertNotEquals($original, $newRequest->getRequestTarget());
333  }
334 
338  public function ‪getRequestTargetIsResetWithNewUri()
339  {
340  ‪$request = (new Request())->withUri(new Uri('https://example.com/foo/bar'));
342  ‪$request->‪withUri(new Uri('http://mwop.net/bar/baz'));
343  }
344 
349  {
350  ‪$request = new Request('http://example.com');
351  $headers = ‪$request->‪getHeaders();
352  self::assertArrayHasKey('host', $headers);
353  self::assertTrue(in_array('example.com', $headers['host']));
354  }
355 
360  {
361  ‪$request = new Request();
362  $headers = ‪$request->‪getHeaders();
363  self::assertArrayNotHasKey('host', $headers);
364  }
365 
370  {
371  ‪$request = new Request(new Uri());
372  $headers = ‪$request->‪getHeaders();
373  self::assertArrayNotHasKey('host', $headers);
374  }
375 
380  {
381  ‪$request = new Request('http://example.com');
382  $header = ‪$request->‪getHeader('host');
383  self::assertEquals(['example.com'], $header);
384  }
385 
390  {
391  ‪$request = new Request();
392  self::assertSame([], ‪$request->‪getHeader('host'));
393  }
394 
399  {
400  ‪$request = new Request(new Uri());
401  self::assertSame([], ‪$request->‪getHeader('host'));
402  }
403 
408  {
409  ‪$request = new Request('http://example.com');
410  $header = ‪$request->‪getHeaderLine('host');
411  self::assertStringContainsString('example.com', $header);
412  }
413 
418  {
419  ‪$request = new Request();
420  self::assertSame('', ‪$request->‪getHeaderLine('host'));
421  }
422 
427  {
428  ‪$request = new Request(new Uri());
429  self::assertSame('', ‪$request->‪getHeaderLine('host'));
430  }
431 
436  {
437  ‪$request = (new Request())
438  ->withAddedHeader('Host', 'example.com');
439 
440  $uri = (new Uri())->withHost('www.example.com');
441  $new = ‪$request->‪withUri($uri, true);
442 
443  self::assertEquals('example.com', $new->getHeaderLine('Host'));
444  }
445 
450  {
451  ‪$request = (new Request())
452  ->withAddedHeader('Host', 'example.com');
453 
454  $uri = new Uri();
455  $new = ‪$request->‪withUri($uri);
456 
457  self::assertEquals('example.com', $new->getHeaderLine('Host'));
458  }
459 
464  {
465  ‪$request = (new Request())
466  ->withAddedHeader('Host', 'example.com');
467 
468  $uri = (new Uri())
469  ->withHost('www.example.com')
470  ->withPort(10081);
471  $new = ‪$request->‪withUri($uri);
472 
473  self::assertEquals('www.example.com:10081', $new->getHeaderLine('Host'));
474  }
475 
480  {
481  // 'name' => [$headerName, $headerValue, $expectedValue]
482  return [
483  'Foo' => ['Foo', 'bar', 'bar'],
484  'foo' => ['foo', 'bar', 'bar'],
485  'Foo-with-array' => ['Foo', ['bar'], 'bar'],
486  'foo-with-array' => ['foo', ['bar'], 'bar'],
487  ];
488  }
489 
494  public function ‪headerCanBeRetrieved($header, $value, $expected)
495  {
496  ‪$request = new Request(null, null, 'php://memory', [$header => $value]);
497  self::assertEquals([$expected], ‪$request->‪getHeader(strtolower($header)));
498  self::assertEquals([$expected], ‪$request->‪getHeader(strtoupper($header)));
499  }
500 
505  {
506  return [
507  'name-with-cr' => ["X-Foo\r-Bar", 'value'],
508  'name-with-lf' => ["X-Foo\n-Bar", 'value'],
509  'name-with-crlf' => ["X-Foo\r\n-Bar", 'value'],
510  'name-with-2crlf' => ["X-Foo\r\n\r\n-Bar", 'value'],
511  'value-with-cr' => ['X-Foo-Bar', "value\rinjection"],
512  'value-with-lf' => ['X-Foo-Bar', "value\ninjection"],
513  'value-with-crlf' => ['X-Foo-Bar', "value\r\ninjection"],
514  'value-with-2crlf' => ['X-Foo-Bar', "value\r\n\r\ninjection"],
515  'array-value-with-cr' => ['X-Foo-Bar', ["value\rinjection"]],
516  'array-value-with-lf' => ['X-Foo-Bar', ["value\ninjection"]],
517  'array-value-with-crlf' => ['X-Foo-Bar', ["value\r\ninjection"]],
518  'array-value-with-2crlf' => ['X-Foo-Bar', ["value\r\n\r\ninjection"]],
519  ];
520  }
521 
526  public function ‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value)
527  {
528  $this->expectException(\InvalidArgumentException::class);
529  new Request(null, null, 'php://memory', [$name => $value]);
530  }
531 
535  public function ‪supportedRequestMethodsWork(): void
536  {
537  ‪$request = new Request('some-uri', 'PURGE');
538  self::assertEquals('PURGE', ‪$request->‪getMethod());
539  }
540 
544  public function ‪nonSupportedRequestMethodsRaisesException(): void
545  {
546  $this->expectException(\InvalidArgumentException::class);
547  new Request('some-uri', 'UNSUPPORTED');
548  }
549 }
‪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:337
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetIsSlashWhenUriHasNoPathOrQuery
‪getRequestTargetIsSlashWhenUriHasNoPathOrQuery()
Definition: RequestTest.php:238
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest
Definition: RequestTest.php:29
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeadersContainsNoHostHeaderIfUriDoesNotContainHost
‪getHeadersContainsNoHostHeaderIfUriDoesNotContainHost()
Definition: RequestTest.php:368
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:16
‪TYPO3\CMS\Core\Http\Request\getHeader
‪string[] getHeader($header)
Definition: Request.php:165
‪TYPO3\CMS\Core\Http\Request\withUri
‪static withUri(UriInterface $uri, $preserveHost=false)
Definition: Request.php:326
‪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:462
‪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:416
‪TYPO3\CMS\Core\Http\Request\withRequestTarget
‪static withRequestTarget($requestTarget)
Definition: Request.php:239
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\headersWithUpperAndLowerCaseValuesDataProvider
‪array headersWithUpperAndLowerCaseValuesDataProvider()
Definition: RequestTest.php:478
‪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:290
‪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:493
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderWithHostReturnsEmptyArrayIfNoUriPresent
‪getHeaderWithHostReturnsEmptyArrayIfNoUriPresent()
Definition: RequestTest.php:388
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetCanProvideARequestTarget
‪getRequestTargetCanProvideARequestTarget($requestTarget)
Definition: RequestTest.php:306
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\constructorRaisesExceptionForHeadersWithCRLFVectors
‪constructorRaisesExceptionForHeadersWithCRLFVectors($name, $value)
Definition: RequestTest.php:525
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\withRequestTargetCannotContainWhitespace
‪withRequestTargetCannotContainWhitespace()
Definition: RequestTest.php:315
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeadersContainsHostHeaderIfUriWithHostIsPresent
‪getHeadersContainsHostHeaderIfUriWithHostIsPresent()
Definition: RequestTest.php:347
‪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:358
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\nonSupportedRequestMethodsRaisesException
‪nonSupportedRequestMethodsRaisesException()
Definition: RequestTest.php:543
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:29
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\supportedRequestMethodsWork
‪supportedRequestMethodsWork()
Definition: RequestTest.php:534
‪TYPO3\CMS\Core\Http\Request\getMethod
‪string getMethod()
Definition: Request.php:254
‪TYPO3\CMS\Core\Http\Request\withMethod
‪static withMethod($method)
Definition: Request.php:274
‪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:326
‪TYPO3\CMS\Core\Http\Request\getHeaders
‪array getHeaders()
Definition: Request.php:142
‪TYPO3\CMS\Core\Http\Request\getUri
‪Psr Http Message UriInterface getUri()
Definition: Request.php:290
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetWhenUriIsPresent
‪getRequestTargetWhenUriIsPresent($request, $expected)
Definition: RequestTest.php:282
‪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:425
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderWithHostReturnsUriHostWhenPresent
‪getHeaderWithHostReturnsUriHostWhenPresent()
Definition: RequestTest.php:378
‪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:503
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderWithHostReturnsEmptyArrayIfUriDoesNotContainHost
‪getHeaderWithHostReturnsEmptyArrayIfUriDoesNotContainHost()
Definition: RequestTest.php:397
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostReturnsUriHostWhenPresent
‪getHeaderLineWithHostReturnsUriHostWhenPresent()
Definition: RequestTest.php:406
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getHeaderLineWithHostTakesPrecedenceOverModifiedUri
‪getHeaderLineWithHostTakesPrecedenceOverModifiedUri()
Definition: RequestTest.php:434
‪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:248
‪TYPO3\CMS\Core\Http\Request
Definition: Request.php:33
‪TYPO3\CMS\Core\Http\Request\getRequestTarget
‪string getRequestTarget()
Definition: Request.php:201
‪TYPO3\CMS\Core\Tests\Unit\Http\RequestTest\getRequestTargetIsSlashWhenNoUriPresent
‪getRequestTargetIsSlashWhenNoUriPresent()
Definition: RequestTest.php:229
‪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:448
‪TYPO3\CMS\Core\Http\Message\getHeaderLine
‪string getHeaderLine($name)
Definition: Message.php:174