‪TYPO3CMS  10.4
MessageTest.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 
20 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
21 
27 class ‪MessageTest extends UnitTestCase
28 {
32  protected ‪$stream;
33 
37  protected ‪$message;
38 
39  protected function ‪setUp(): void
40  {
41  parent::setUp();
42  $this->stream = new ‪Stream('php://memory', 'wb+');
43  $this->message = (new ‪Message())->withBody($this->stream);
44  }
45 
49  public function ‪protocolHasAcceptableDefault()
50  {
51  self::assertEquals('1.1', $this->message->getProtocolVersion());
52  }
53 
58  {
59  ‪$message = $this->message->‪withProtocolVersion('1.0');
60  self::assertNotSame($this->message, ‪$message);
61  self::assertEquals('1.0', ‪$message->‪getProtocolVersion());
62  }
63 
68  {
69  self::assertSame($this->stream, $this->message->getBody());
70  }
71 
76  {
77  ‪$stream = new Stream('php://memory', 'wb+');
78  ‪$message = $this->message->‪withBody(‪$stream);
79  self::assertNotSame($this->message, ‪$message);
80  self::assertSame(‪$stream, ‪$message->‪getBody());
81  }
82 
87  {
88  ‪$message = $this->message->‪withHeader('X-Foo', ['Foo', 'Bar']);
89  self::assertNotSame($this->message, ‪$message);
90  self::assertEquals(['Foo', 'Bar'], ‪$message->‪getHeader('X-Foo'));
91  }
92 
97  {
98  ‪$message = $this->message->‪withHeader('X-Foo', ['Foo', 'Bar']);
99  self::assertNotSame($this->message, ‪$message);
100  self::assertEquals('Foo,Bar', ‪$message->‪getHeaderLine('X-Foo'));
101  }
102 
107  {
108  ‪$message = $this->message->‪withHeader('X-Foo', ['Foo', 'Bar']);
109  self::assertNotSame($this->message, ‪$message);
110  self::assertEquals(['X-Foo' => ['Foo', 'Bar']], ‪$message->‪getHeaders());
111  }
112 
117  {
118  ‪$message = $this->message
119  ->‪withHeader('X-Foo', 'Foo')
120  ->withAddedHeader('x-foo', 'Bar');
121  self::assertNotSame($this->message, ‪$message);
122  self::assertEquals(['X-Foo' => ['Foo', 'Bar']], ‪$message->‪getHeaders());
123  }
124 
129  {
130  self::assertFalse($this->message->hasHeader('X-Foo'));
131  }
132 
137  {
138  ‪$message = $this->message->‪withHeader('X-Foo', 'Foo');
139  self::assertNotSame($this->message, ‪$message);
140  self::assertTrue(‪$message->‪hasHeader('X-Foo'));
141  }
142 
146  public function ‪addHeaderAppendsToExistingHeader()
147  {
148  ‪$message = $this->message->‪withHeader('X-Foo', 'Foo');
149  self::assertNotSame($this->message, ‪$message);
150  $message2 = ‪$message->‪withAddedHeader('X-Foo', 'Bar');
151  self::assertNotSame(‪$message, $message2);
152  self::assertEquals('Foo,Bar', $message2->getHeaderLine('X-Foo'));
153  }
154 
158  public function ‪canRemoveHeaders()
159  {
160  ‪$message = $this->message->‪withHeader('X-Foo', 'Foo');
161  self::assertNotSame($this->message, ‪$message);
162  self::assertTrue(‪$message->‪hasHeader('x-foo'));
163  $message2 = ‪$message->‪withoutHeader('x-foo');
164  self::assertNotSame($this->message, $message2);
165  self::assertNotSame(‪$message, $message2);
166  self::assertFalse($message2->hasHeader('X-Foo'));
167  }
168 
172  public function ‪headerRemovalIsCaseInsensitive()
173  {
174  ‪$message = $this->message
175  ->‪withHeader('X-Foo', 'Foo')
176  ->withAddedHeader('x-foo', 'Bar')
177  ->withAddedHeader('X-FOO', 'Baz');
178  self::assertNotSame($this->message, ‪$message);
179  self::assertTrue(‪$message->‪hasHeader('x-foo'));
180  $message2 = ‪$message->‪withoutHeader('x-foo');
181  self::assertNotSame($this->message, $message2);
182  self::assertNotSame(‪$message, $message2);
183  self::assertFalse($message2->hasHeader('X-Foo'));
184  $headers = $message2->getHeaders();
185  self::assertEquals(0, count($headers));
186  }
187 
192  {
193  return [
194  'null' => [null],
195  'true' => [true],
196  'false' => [false],
197  'int' => [1],
198  'float' => [1.1],
199  'array' => [['foo' => ['bar']]],
200  'object' => [(object)['foo' => 'bar']],
201  ];
202  }
203 
208  {
209  $this->expectException(\InvalidArgumentException::class);
210  $this->expectExceptionCode(1436717266);
211  $this->message->withHeader('X-Foo', [$value]);
212  }
213 
217  public function ‪invalidHeaderValuesDataProvider()
218  {
219  return [
220  'null' => [null],
221  'true' => [true],
222  'false' => [false],
223  'int' => [1],
224  'float' => [1.1],
225  'object' => [(object)['foo' => 'bar']],
226  ];
227  }
228 
233  {
234  $this->expectException(\InvalidArgumentException::class);
235  $this->expectExceptionCode(1436717266);
236  $this->message->withHeader('X-Foo', $value);
237  }
238 
243  {
244  $this->expectException(\InvalidArgumentException::class);
245  $this->expectExceptionCode(1436717267);
246  $this->message->withAddedHeader('X-Foo', $value);
247  }
248 
253  {
254  self::assertFalse($this->message->hasHeader('X-Foo'));
255  ‪$message = $this->message->‪withoutHeader('X-Foo');
256  self::assertNotSame($this->message, ‪$message);
257  self::assertFalse(‪$message->‪hasHeader('X-Foo'));
258  }
259 
264  {
265  self::assertSame([], $this->message->getHeader('X-Foo-Bar'));
266  }
267 
272  {
273  self::assertSame('', $this->message->getHeaderLine('X-Foo-Bar'));
274  }
275 
280  {
281  return [
282  'name-with-cr' => ["X-Foo\r-Bar", 'value'],
283  'name-with-lf' => ["X-Foo\n-Bar", 'value'],
284  'name-with-crlf' => ["X-Foo\r\n-Bar", 'value'],
285  'name-with-2crlf' => ["X-Foo\r\n\r\n-Bar", 'value'],
286  'value-with-cr' => ['X-Foo-Bar', "value\rinjection"],
287  'value-with-lf' => ['X-Foo-Bar', "value\ninjection"],
288  'value-with-crlf' => ['X-Foo-Bar', "value\r\ninjection"],
289  'value-with-2crlf' => ['X-Foo-Bar', "value\r\n\r\ninjection"],
290  'array-value-with-cr' => ['X-Foo-Bar', ["value\rinjection"]],
291  'array-value-with-lf' => ['X-Foo-Bar', ["value\ninjection"]],
292  'array-value-with-crlf' => ['X-Foo-Bar', ["value\r\ninjection"]],
293  'array-value-with-2crlf' => ['X-Foo-Bar', ["value\r\n\r\ninjection"]],
294  'multi-line-header-space' => ['X-Foo-Bar', "value\r\n injection"],
295  'multi-line-header-tab' => ['X-Foo-Bar', "value\r\n\tinjection"],
296  'value-with-EOT' => ['X-Foo-Bar', "value\x03injection"],
297  'value-with-vert-tab' => ['X-Foo-Bar', "value\x11injection"],
298  'value-with-form-feed' => ['X-Foo-Bar', "value\x12injection"],
299  'value-with-null-byte' => ['X-Foo-Bar', "value\x00injection"],
300  'value-with-del-byte' => ['X-Foo-Bar', "value\x7finjection"],
301  ];
302  }
303 
308  public function ‪doesNotAllowCRLFInjectionWhenCallingWithHeader($name, $value)
309  {
310  $this->expectException(\InvalidArgumentException::class);
311  $this->message->withHeader($name, $value);
312  }
313 
318  public function ‪doesNotAllowCRLFInjectionWhenCallingWithAddedHeader($name, $value)
319  {
320  $this->expectException(\InvalidArgumentException::class);
321  $this->message->withAddedHeader($name, $value);
322  }
323 }
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\hasHeaderReturnsTrueIfHeaderIsPresent
‪hasHeaderReturnsTrueIfHeaderIsPresent()
Definition: MessageTest.php:134
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\addHeaderAppendsToExistingHeader
‪addHeaderAppendsToExistingHeader()
Definition: MessageTest.php:144
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\withAddedHeaderRaisesExceptionForNonStringNonArrayValue
‪withAddedHeaderRaisesExceptionForNonStringNonArrayValue($value)
Definition: MessageTest.php:240
‪TYPO3\CMS\Core\Http\Message\getHeaders
‪array getHeaders()
Definition: Message.php:110
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\bodyMutatorReturnsCloneWithChanges
‪bodyMutatorReturnsCloneWithChanges()
Definition: MessageTest.php:73
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\invalidHeaderValuesDataProvider
‪array invalidHeaderValuesDataProvider()
Definition: MessageTest.php:215
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\testWithHeaderRaisesExceptionForInvalidNestedHeaderValue
‪testWithHeaderRaisesExceptionForInvalidNestedHeaderValue($value)
Definition: MessageTest.php:205
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:16
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\canRemoveHeaders
‪canRemoveHeaders()
Definition: MessageTest.php:156
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeaderReturnsAnEmptyArrayWhenHeaderDoesNotExist
‪getHeaderReturnsAnEmptyArrayWhenHeaderDoesNotExist()
Definition: MessageTest.php:261
‪TYPO3\CMS\Core\Http\Message\withHeader
‪static withHeader($name, $value)
Definition: Message.php:198
‪TYPO3\CMS\Core\Http\Message\hasHeader
‪bool hasHeader($name)
Definition: Message.php:123
‪TYPO3\CMS\Core\Http\Message
Definition: Message.php:30
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\headerRemovalIsCaseInsensitive
‪headerRemovalIsCaseInsensitive()
Definition: MessageTest.php:170
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\$stream
‪Stream $stream
Definition: MessageTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest
Definition: MessageTest.php:28
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\protocolMutatorReturnsCloneWithChanges
‪protocolMutatorReturnsCloneWithChanges()
Definition: MessageTest.php:55
‪TYPO3\CMS\Core\Http\Message\getHeader
‪string[] getHeader($name)
Definition: Message.php:142
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\usesStreamProvidedInConstructorAsBody
‪usesStreamProvidedInConstructorAsBody()
Definition: MessageTest.php:65
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\doesNotAllowCRLFInjectionWhenCallingWithHeader
‪doesNotAllowCRLFInjectionWhenCallingWithHeader($name, $value)
Definition: MessageTest.php:306
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\invalidGeneralHeaderValuesDataProvider
‪array invalidGeneralHeaderValuesDataProvider()
Definition: MessageTest.php:189
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\protocolHasAcceptableDefault
‪protocolHasAcceptableDefault()
Definition: MessageTest.php:47
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\withoutHeaderDoesNothingIfHeaderDoesNotExist
‪withoutHeaderDoesNothingIfHeaderDoesNotExist()
Definition: MessageTest.php:250
‪TYPO3\CMS\Core\Http\Message\withoutHeader
‪static withoutHeader($name)
Definition: Message.php:265
‪TYPO3\CMS\Core\Http\Stream
Definition: Stream.php:29
‪TYPO3\CMS\Core\Http\Message\getBody
‪Psr Http Message StreamInterface getBody()
Definition: Message.php:283
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeaderLineReturnsEmptyStringWhenHeaderDoesNotExist
‪getHeaderLineReturnsEmptyStringWhenHeaderDoesNotExist()
Definition: MessageTest.php:269
‪TYPO3\CMS\Core\Http\Message\withAddedHeader
‪static withAddedHeader($name, $value)
Definition: Message.php:234
‪TYPO3\CMS\Core\Http\Message\getProtocolVersion
‪string getProtocolVersion()
Definition: Message.php:60
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\setUp
‪setUp()
Definition: MessageTest.php:37
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\headersWithInjectionVectorsDataProvider
‪array headersWithInjectionVectorsDataProvider()
Definition: MessageTest.php:277
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeadersReturnsCaseWithWhichHeaderFirstRegistered
‪getHeadersReturnsCaseWithWhichHeaderFirstRegistered()
Definition: MessageTest.php:114
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeadersKeepsHeaderCaseSensitivity
‪getHeadersKeepsHeaderCaseSensitivity()
Definition: MessageTest.php:104
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\doesNotAllowCRLFInjectionWhenCallingWithAddedHeader
‪doesNotAllowCRLFInjectionWhenCallingWithAddedHeader($name, $value)
Definition: MessageTest.php:316
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\withHeaderRaisesExceptionForInvalidValueType
‪withHeaderRaisesExceptionForInvalidValueType($value)
Definition: MessageTest.php:230
‪TYPO3\CMS\Core\Http\Message\withBody
‪static withBody(StreamInterface $body)
Definition: Message.php:304
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeaderLineReturnsHeaderValueAsCommaConcatenatedString
‪getHeaderLineReturnsHeaderValueAsCommaConcatenatedString()
Definition: MessageTest.php:94
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\hasHeaderReturnsFalseIfHeaderIsNotPresent
‪hasHeaderReturnsFalseIfHeaderIsNotPresent()
Definition: MessageTest.php:126
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeaderReturnsHeaderValueAsArray
‪getHeaderReturnsHeaderValueAsArray()
Definition: MessageTest.php:84
‪TYPO3\CMS\Core\Http\Message\getHeaderLine
‪string getHeaderLine($name)
Definition: Message.php:174
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\$message
‪Message $message
Definition: MessageTest.php:35
‪TYPO3\CMS\Core\Http\Message\withProtocolVersion
‪static withProtocolVersion($version)
Definition: Message.php:78