‪TYPO3CMS  11.5
MessageTest.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 
22 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
23 
29 class ‪MessageTest extends UnitTestCase
30 {
31  protected ?‪Stream ‪$stream;
32  protected ?‪Message ‪$message;
33 
34  protected function ‪setUp(): void
35  {
36  parent::setUp();
37  $this->stream = new ‪Stream('php://memory', 'wb+');
38  $this->message = (new ‪Message())->withBody($this->stream);
39  }
40 
44  public function ‪protocolHasAcceptableDefault(): void
45  {
46  self::assertEquals('1.1', $this->message->getProtocolVersion());
47  }
48 
53  {
54  ‪$message = $this->message->‪withProtocolVersion('1.0');
55  self::assertNotSame($this->message, ‪$message);
56  self::assertEquals('1.0', ‪$message->‪getProtocolVersion());
57  }
58 
63  {
64  self::assertSame($this->stream, $this->message->getBody());
65  }
66 
70  public function ‪bodyMutatorReturnsCloneWithChanges(): void
71  {
72  ‪$stream = new ‪Stream('php://memory', 'wb+');
73  ‪$message = $this->message->‪withBody(‪$stream);
74  self::assertNotSame($this->message, ‪$message);
75  self::assertSame(‪$stream, ‪$message->‪getBody());
76  }
77 
81  public function ‪getHeaderReturnsHeaderValueAsArray(): void
82  {
83  ‪$message = $this->message->‪withHeader('X-Foo', ['Foo', 'Bar']);
84  self::assertNotSame($this->message, ‪$message);
85  self::assertEquals(['Foo', 'Bar'], ‪$message->‪getHeader('X-Foo'));
86  }
87 
92  {
93  ‪$message = $this->message->‪withHeader('X-Foo', ['Foo', 'Bar']);
94  self::assertNotSame($this->message, ‪$message);
95  self::assertEquals('Foo,Bar', ‪$message->‪getHeaderLine('X-Foo'));
96  }
97 
102  {
103  ‪$message = $this->message->‪withHeader('X-Foo', ['Foo', 'Bar']);
104  self::assertNotSame($this->message, ‪$message);
105  self::assertEquals(['X-Foo' => ['Foo', 'Bar']], ‪$message->‪getHeaders());
106  }
107 
112  {
113  ‪$message = $this->message
114  ->‪withHeader('X-Foo', 'Foo')
115  ->withAddedHeader('x-foo', 'Bar');
116  self::assertNotSame($this->message, ‪$message);
117  self::assertEquals(['X-Foo' => ['Foo', 'Bar']], ‪$message->‪getHeaders());
118  }
119 
124  {
125  self::assertFalse($this->message->hasHeader('X-Foo'));
126  }
127 
132  {
133  ‪$message = $this->message->‪withHeader('X-Foo', 'Foo');
134  self::assertNotSame($this->message, ‪$message);
135  self::assertTrue(‪$message->‪hasHeader('X-Foo'));
136  }
137 
141  public function ‪addHeaderAppendsToExistingHeader(): void
142  {
143  ‪$message = $this->message->‪withHeader('X-Foo', 'Foo');
144  self::assertNotSame($this->message, ‪$message);
145  $message2 = ‪$message->‪withAddedHeader('X-Foo', 'Bar');
146  self::assertNotSame(‪$message, $message2);
147  self::assertEquals('Foo,Bar', $message2->getHeaderLine('X-Foo'));
148  }
149 
153  public function ‪canRemoveHeaders(): void
154  {
155  ‪$message = $this->message->‪withHeader('X-Foo', 'Foo');
156  self::assertNotSame($this->message, ‪$message);
157  self::assertTrue(‪$message->‪hasHeader('x-foo'));
158  $message2 = ‪$message->‪withoutHeader('x-foo');
159  self::assertNotSame($this->message, $message2);
160  self::assertNotSame(‪$message, $message2);
161  self::assertFalse($message2->hasHeader('X-Foo'));
162  }
163 
167  public function ‪headerRemovalIsCaseInsensitive(): void
168  {
169  ‪$message = $this->message
170  ->‪withHeader('X-Foo', 'Foo')
171  ->withAddedHeader('x-foo', 'Bar')
172  ->withAddedHeader('X-FOO', 'Baz');
173  self::assertNotSame($this->message, ‪$message);
174  self::assertTrue(‪$message->‪hasHeader('x-foo'));
175  $message2 = ‪$message->‪withoutHeader('x-foo');
176  self::assertNotSame($this->message, $message2);
177  self::assertNotSame(‪$message, $message2);
178  self::assertFalse($message2->hasHeader('X-Foo'));
179  $headers = $message2->getHeaders();
180  self::assertCount(0, $headers);
181  }
182 
187  {
188  return [
189  'null' => [null],
190  'true' => [true],
191  'false' => [false],
192  'int' => [1],
193  'float' => [1.1],
194  'array' => [['foo' => ['bar']]],
195  'object' => [(object)['foo' => 'bar']],
196  ];
197  }
198 
204  {
205  $this->expectException(\InvalidArgumentException::class);
206  $this->expectExceptionCode(1436717266);
207  $this->message->withHeader('X-Foo', [$value]);
208  }
209 
213  public function ‪invalidHeaderValuesDataProvider(): array
214  {
215  return [
216  'null' => [null],
217  'true' => [true],
218  'false' => [false],
219  'int' => [1],
220  'float' => [1.1],
221  'object' => [(object)['foo' => 'bar']],
222  ];
223  }
224 
229  {
230  $this->expectException(\InvalidArgumentException::class);
231  $this->expectExceptionCode(1436717266);
232  $this->message->withHeader('X-Foo', $value);
233  }
234 
239  {
240  $this->expectException(\InvalidArgumentException::class);
241  $this->expectExceptionCode(1436717267);
242  $this->message->withAddedHeader('X-Foo', $value);
243  }
244 
249  {
250  self::assertFalse($this->message->hasHeader('X-Foo'));
251  ‪$message = $this->message->‪withoutHeader('X-Foo');
252  self::assertNotSame($this->message, ‪$message);
253  self::assertFalse(‪$message->‪hasHeader('X-Foo'));
254  }
255 
260  {
261  self::assertSame([], $this->message->getHeader('X-Foo-Bar'));
262  }
263 
268  {
269  self::assertSame('', $this->message->getHeaderLine('X-Foo-Bar'));
270  }
271 
276  {
277  return [
278  'name-with-cr' => ["X-Foo\r-Bar", 'value'],
279  'name-with-lf' => ["X-Foo\n-Bar", 'value'],
280  'name-with-crlf' => ["X-Foo\r\n-Bar", 'value'],
281  'name-with-2crlf' => ["X-Foo\r\n\r\n-Bar", 'value'],
282  'value-with-cr' => ['X-Foo-Bar', "value\rinjection"],
283  'value-with-lf' => ['X-Foo-Bar', "value\ninjection"],
284  'value-with-crlf' => ['X-Foo-Bar', "value\r\ninjection"],
285  'value-with-2crlf' => ['X-Foo-Bar', "value\r\n\r\ninjection"],
286  'array-value-with-cr' => ['X-Foo-Bar', ["value\rinjection"]],
287  'array-value-with-lf' => ['X-Foo-Bar', ["value\ninjection"]],
288  'array-value-with-crlf' => ['X-Foo-Bar', ["value\r\ninjection"]],
289  'array-value-with-2crlf' => ['X-Foo-Bar', ["value\r\n\r\ninjection"]],
290  'multi-line-header-space' => ['X-Foo-Bar', "value\r\n injection"],
291  'multi-line-header-tab' => ['X-Foo-Bar', "value\r\n\tinjection"],
292  'value-with-EOT' => ['X-Foo-Bar', "value\x03injection"],
293  'value-with-vert-tab' => ['X-Foo-Bar', "value\x11injection"],
294  'value-with-form-feed' => ['X-Foo-Bar', "value\x12injection"],
295  'value-with-null-byte' => ['X-Foo-Bar', "value\x00injection"],
296  'value-with-del-byte' => ['X-Foo-Bar', "value\x7finjection"],
297  ];
298  }
299 
304  public function ‪doesNotAllowCRLFInjectionWhenCallingWithHeader($name, $value): void
305  {
306  $this->expectException(\InvalidArgumentException::class);
307  $this->message->withHeader($name, $value);
308  }
309 
314  public function ‪doesNotAllowCRLFInjectionWhenCallingWithAddedHeader($name, $value): void
315  {
316  $this->expectException(\InvalidArgumentException::class);
317  $this->message->withAddedHeader($name, $value);
318  }
319 }
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\hasHeaderReturnsTrueIfHeaderIsPresent
‪hasHeaderReturnsTrueIfHeaderIsPresent()
Definition: MessageTest.php:131
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\addHeaderAppendsToExistingHeader
‪addHeaderAppendsToExistingHeader()
Definition: MessageTest.php:141
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\withAddedHeaderRaisesExceptionForNonStringNonArrayValue
‪withAddedHeaderRaisesExceptionForNonStringNonArrayValue($value)
Definition: MessageTest.php:238
‪TYPO3\CMS\Core\Http\Message\getHeaders
‪array getHeaders()
Definition: Message.php:110
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\bodyMutatorReturnsCloneWithChanges
‪bodyMutatorReturnsCloneWithChanges()
Definition: MessageTest.php:70
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\withHeaderRaisesExceptionForInvalidNestedHeaderValue
‪withHeaderRaisesExceptionForInvalidNestedHeaderValue($value)
Definition: MessageTest.php:203
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\invalidHeaderValuesDataProvider
‪array invalidHeaderValuesDataProvider()
Definition: MessageTest.php:213
‪TYPO3\CMS\Core\Tests\Unit\Http
Definition: ApplicationTypeTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\canRemoveHeaders
‪canRemoveHeaders()
Definition: MessageTest.php:153
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeaderReturnsAnEmptyArrayWhenHeaderDoesNotExist
‪getHeaderReturnsAnEmptyArrayWhenHeaderDoesNotExist()
Definition: MessageTest.php:259
‪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:167
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\$stream
‪Stream $stream
Definition: MessageTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest
Definition: MessageTest.php:30
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\protocolMutatorReturnsCloneWithChanges
‪protocolMutatorReturnsCloneWithChanges()
Definition: MessageTest.php:52
‪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:62
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\doesNotAllowCRLFInjectionWhenCallingWithHeader
‪doesNotAllowCRLFInjectionWhenCallingWithHeader($name, $value)
Definition: MessageTest.php:304
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\invalidGeneralHeaderValuesDataProvider
‪array invalidGeneralHeaderValuesDataProvider()
Definition: MessageTest.php:186
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\protocolHasAcceptableDefault
‪protocolHasAcceptableDefault()
Definition: MessageTest.php:44
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\withoutHeaderDoesNothingIfHeaderDoesNotExist
‪withoutHeaderDoesNothingIfHeaderDoesNotExist()
Definition: MessageTest.php:248
‪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:267
‪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:34
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\headersWithInjectionVectorsDataProvider
‪array headersWithInjectionVectorsDataProvider()
Definition: MessageTest.php:275
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeadersReturnsCaseWithWhichHeaderFirstRegistered
‪getHeadersReturnsCaseWithWhichHeaderFirstRegistered()
Definition: MessageTest.php:111
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeadersKeepsHeaderCaseSensitivity
‪getHeadersKeepsHeaderCaseSensitivity()
Definition: MessageTest.php:101
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\doesNotAllowCRLFInjectionWhenCallingWithAddedHeader
‪doesNotAllowCRLFInjectionWhenCallingWithAddedHeader($name, $value)
Definition: MessageTest.php:314
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\withHeaderRaisesExceptionForInvalidValueType
‪withHeaderRaisesExceptionForInvalidValueType($value)
Definition: MessageTest.php:228
‪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:91
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\hasHeaderReturnsFalseIfHeaderIsNotPresent
‪hasHeaderReturnsFalseIfHeaderIsNotPresent()
Definition: MessageTest.php:123
‪TYPO3\CMS\Core\Tests\Unit\Http\MessageTest\getHeaderReturnsHeaderValueAsArray
‪getHeaderReturnsHeaderValueAsArray()
Definition: MessageTest.php:81
‪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:32
‪TYPO3\CMS\Core\Http\Message\withProtocolVersion
‪static withProtocolVersion($version)
Definition: Message.php:78