470 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			470 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace GuzzleHttp\Tests\Psr7;
 | 
						|
 | 
						|
use GuzzleHttp\Psr7;
 | 
						|
use GuzzleHttp\Psr7\FnStream;
 | 
						|
use GuzzleHttp\Psr7\NoSeekStream;
 | 
						|
 | 
						|
class UtilsTest extends BaseTest
 | 
						|
{
 | 
						|
    public function testCopiesToString()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor('foobaz');
 | 
						|
        self::assertSame('foobaz', Psr7\Utils::copyToString($s));
 | 
						|
        $s->seek(0);
 | 
						|
        self::assertSame('foo', Psr7\Utils::copyToString($s, 3));
 | 
						|
        self::assertSame('baz', Psr7\Utils::copyToString($s, 3));
 | 
						|
        self::assertSame('', Psr7\Utils::copyToString($s));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCopiesToStringStopsWhenReadFails()
 | 
						|
    {
 | 
						|
        $s1 = Psr7\Utils::streamFor('foobaz');
 | 
						|
        $s1 = FnStream::decorate($s1, [
 | 
						|
            'read' => function () {
 | 
						|
                return '';
 | 
						|
            },
 | 
						|
        ]);
 | 
						|
        $result = Psr7\Utils::copyToString($s1);
 | 
						|
        self::assertSame('', $result);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCopiesToStream()
 | 
						|
    {
 | 
						|
        $s1 = Psr7\Utils::streamFor('foobaz');
 | 
						|
        $s2 = Psr7\Utils::streamFor('');
 | 
						|
        Psr7\Utils::copyToStream($s1, $s2);
 | 
						|
        self::assertSame('foobaz', (string)$s2);
 | 
						|
        $s2 = Psr7\Utils::streamFor('');
 | 
						|
        $s1->seek(0);
 | 
						|
        Psr7\Utils::copyToStream($s1, $s2, 3);
 | 
						|
        self::assertSame('foo', (string)$s2);
 | 
						|
        Psr7\Utils::copyToStream($s1, $s2, 3);
 | 
						|
        self::assertSame('foobaz', (string)$s2);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testStopsCopyToStreamWhenWriteFails()
 | 
						|
    {
 | 
						|
        $s1 = Psr7\Utils::streamFor('foobaz');
 | 
						|
        $s2 = Psr7\Utils::streamFor('');
 | 
						|
        $s2 = FnStream::decorate($s2, [
 | 
						|
            'write' => function () {
 | 
						|
                return 0;
 | 
						|
            },
 | 
						|
        ]);
 | 
						|
        Psr7\Utils::copyToStream($s1, $s2);
 | 
						|
        self::assertSame('', (string)$s2);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testStopsCopyToSteamWhenWriteFailsWithMaxLen()
 | 
						|
    {
 | 
						|
        $s1 = Psr7\Utils::streamFor('foobaz');
 | 
						|
        $s2 = Psr7\Utils::streamFor('');
 | 
						|
        $s2 = FnStream::decorate($s2, [
 | 
						|
            'write' => function () {
 | 
						|
                return 0;
 | 
						|
            },
 | 
						|
        ]);
 | 
						|
        Psr7\Utils::copyToStream($s1, $s2, 10);
 | 
						|
        self::assertSame('', (string)$s2);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCopyToStreamReadsInChunksInsteadOfAllInMemory()
 | 
						|
    {
 | 
						|
        $sizes = [];
 | 
						|
        $s1 = new Psr7\FnStream([
 | 
						|
            'eof' => function () {
 | 
						|
                return false;
 | 
						|
            },
 | 
						|
            'read' => function ($size) use (&$sizes) {
 | 
						|
                $sizes[] = $size;
 | 
						|
                return str_repeat('.', $size);
 | 
						|
            },
 | 
						|
        ]);
 | 
						|
        $s2 = Psr7\Utils::streamFor('');
 | 
						|
        Psr7\Utils::copyToStream($s1, $s2, 16394);
 | 
						|
        $s2->seek(0);
 | 
						|
        self::assertSame(16394, strlen($s2->getContents()));
 | 
						|
        self::assertSame(8192, $sizes[0]);
 | 
						|
        self::assertSame(8192, $sizes[1]);
 | 
						|
        self::assertSame(10, $sizes[2]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testStopsCopyToSteamWhenReadFailsWithMaxLen()
 | 
						|
    {
 | 
						|
        $s1 = Psr7\Utils::streamFor('foobaz');
 | 
						|
        $s1 = FnStream::decorate($s1, [
 | 
						|
            'read' => function () {
 | 
						|
                return '';
 | 
						|
            },
 | 
						|
        ]);
 | 
						|
        $s2 = Psr7\Utils::streamFor('');
 | 
						|
        Psr7\Utils::copyToStream($s1, $s2, 10);
 | 
						|
        self::assertSame('', (string)$s2);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testReadsLines()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor("foo\nbaz\nbar");
 | 
						|
        self::assertSame("foo\n", Psr7\Utils::readLine($s));
 | 
						|
        self::assertSame("baz\n", Psr7\Utils::readLine($s));
 | 
						|
        self::assertSame('bar', Psr7\Utils::readLine($s));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testReadsLinesUpToMaxLength()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor("12345\n");
 | 
						|
        self::assertSame('123', Psr7\Utils::readLine($s, 4));
 | 
						|
        self::assertSame("45\n", Psr7\Utils::readLine($s));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testReadLinesEof()
 | 
						|
    {
 | 
						|
        // Should return empty string on EOF
 | 
						|
        $s = Psr7\Utils::streamFor("foo\nbar");
 | 
						|
        while (!$s->eof()) {
 | 
						|
            Psr7\Utils::readLine($s);
 | 
						|
        }
 | 
						|
        self::assertSame('', Psr7\Utils::readLine($s));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testReadsLineUntilFalseReturnedFromRead()
 | 
						|
    {
 | 
						|
        $s = $this->getMockBuilder('GuzzleHttp\Psr7\Stream')
 | 
						|
            ->setMethods(['read', 'eof'])
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->getMock();
 | 
						|
        $s->expects(self::exactly(2))
 | 
						|
            ->method('read')
 | 
						|
            ->will(self::returnCallback(function () {
 | 
						|
                static $c = false;
 | 
						|
                if ($c) {
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
                $c = true;
 | 
						|
                return 'h';
 | 
						|
            }));
 | 
						|
        $s->expects(self::exactly(2))
 | 
						|
            ->method('eof')
 | 
						|
            ->will(self::returnValue(false));
 | 
						|
        self::assertSame('h', Psr7\Utils::readLine($s));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCalculatesHash()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor('foobazbar');
 | 
						|
        self::assertSame(md5('foobazbar'), Psr7\Utils::hash($s, 'md5'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCalculatesHashThrowsWhenSeekFails()
 | 
						|
    {
 | 
						|
        $s = new NoSeekStream(Psr7\Utils::streamFor('foobazbar'));
 | 
						|
        $s->read(2);
 | 
						|
 | 
						|
        $this->expectExceptionGuzzle('RuntimeException');
 | 
						|
 | 
						|
        Psr7\Utils::hash($s, 'md5');
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCalculatesHashSeeksToOriginalPosition()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor('foobazbar');
 | 
						|
        $s->seek(4);
 | 
						|
        self::assertSame(md5('foobazbar'), Psr7\Utils::hash($s, 'md5'));
 | 
						|
        self::assertSame(4, $s->tell());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testOpensFilesSuccessfully()
 | 
						|
    {
 | 
						|
        $r = Psr7\Utils::tryFopen(__FILE__, 'r');
 | 
						|
        $this->assertInternalTypeGuzzle('resource', $r);
 | 
						|
        fclose($r);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testThrowsExceptionNotWarning()
 | 
						|
    {
 | 
						|
        $this->expectExceptionGuzzle('RuntimeException', 'Unable to open "/path/to/does/not/exist" using mode "r"');
 | 
						|
 | 
						|
        Psr7\Utils::tryFopen('/path/to/does/not/exist', 'r');
 | 
						|
    }
 | 
						|
 | 
						|
    public function testThrowsExceptionNotValueError()
 | 
						|
    {
 | 
						|
        $this->expectExceptionGuzzle('RuntimeException', 'Unable to open "" using mode "r"');
 | 
						|
 | 
						|
        Psr7\Utils::tryFopen('', 'r');
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCreatesUriForValue()
 | 
						|
    {
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Uri', Psr7\Utils::uriFor('/foo'));
 | 
						|
        self::assertInstanceOf(
 | 
						|
            'GuzzleHttp\Psr7\Uri',
 | 
						|
            Psr7\Utils::uriFor(new Psr7\Uri('/foo'))
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testValidatesUri()
 | 
						|
    {
 | 
						|
        $this->expectExceptionGuzzle('InvalidArgumentException');
 | 
						|
 | 
						|
        Psr7\Utils::uriFor([]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testKeepsPositionOfResource()
 | 
						|
    {
 | 
						|
        $h = fopen(__FILE__, 'r');
 | 
						|
        fseek($h, 10);
 | 
						|
        $stream = Psr7\Utils::streamFor($h);
 | 
						|
        self::assertSame(10, $stream->tell());
 | 
						|
        $stream->close();
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCreatesWithFactory()
 | 
						|
    {
 | 
						|
        $stream = Psr7\Utils::streamFor('foo');
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Stream', $stream);
 | 
						|
        self::assertSame('foo', $stream->getContents());
 | 
						|
        $stream->close();
 | 
						|
    }
 | 
						|
 | 
						|
    public function testFactoryCreatesFromEmptyString()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor();
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testFactoryCreatesFromNull()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor(null);
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testFactoryCreatesFromResource()
 | 
						|
    {
 | 
						|
        $r = fopen(__FILE__, 'r');
 | 
						|
        $s = Psr7\Utils::streamFor($r);
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
 | 
						|
        self::assertSame(file_get_contents(__FILE__), (string)$s);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testFactoryCreatesFromObjectWithToString()
 | 
						|
    {
 | 
						|
        $r = new HasToString();
 | 
						|
        $s = Psr7\Utils::streamFor($r);
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Stream', $s);
 | 
						|
        self::assertSame('foo', (string)$s);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCreatePassesThrough()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor('foo');
 | 
						|
        self::assertSame($s, Psr7\Utils::streamFor($s));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testThrowsExceptionForUnknown()
 | 
						|
    {
 | 
						|
        $this->expectExceptionGuzzle('InvalidArgumentException');
 | 
						|
 | 
						|
        Psr7\Utils::streamFor(new \stdClass());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testReturnsCustomMetadata()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor('foo', ['metadata' => ['hwm' => 3]]);
 | 
						|
        self::assertSame(3, $s->getMetadata('hwm'));
 | 
						|
        self::assertArrayHasKey('hwm', $s->getMetadata());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCanSetSize()
 | 
						|
    {
 | 
						|
        $s = Psr7\Utils::streamFor('', ['size' => 10]);
 | 
						|
        self::assertSame(10, $s->getSize());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCanCreateIteratorBasedStream()
 | 
						|
    {
 | 
						|
        $a = new \ArrayIterator(['foo', 'bar', '123']);
 | 
						|
        $p = Psr7\Utils::streamFor($a);
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\PumpStream', $p);
 | 
						|
        self::assertSame('foo', $p->read(3));
 | 
						|
        self::assertFalse($p->eof());
 | 
						|
        self::assertSame('b', $p->read(1));
 | 
						|
        self::assertSame('a', $p->read(1));
 | 
						|
        self::assertSame('r12', $p->read(3));
 | 
						|
        self::assertFalse($p->eof());
 | 
						|
        self::assertSame('3', $p->getContents());
 | 
						|
        self::assertTrue($p->eof());
 | 
						|
        self::assertSame(9, $p->tell());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testConvertsRequestsToStrings()
 | 
						|
    {
 | 
						|
        $request = new Psr7\Request('PUT', 'http://foo.com/hi?123', [
 | 
						|
            'Baz' => 'bar',
 | 
						|
            'Qux' => 'ipsum',
 | 
						|
        ], 'hello', '1.0');
 | 
						|
        self::assertSame(
 | 
						|
            "PUT /hi?123 HTTP/1.0\r\nHost: foo.com\r\nBaz: bar\r\nQux: ipsum\r\n\r\nhello",
 | 
						|
            Psr7\Message::toString($request)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testConvertsResponsesToStrings()
 | 
						|
    {
 | 
						|
        $response = new Psr7\Response(200, [
 | 
						|
            'Baz' => 'bar',
 | 
						|
            'Qux' => 'ipsum',
 | 
						|
        ], 'hello', '1.0', 'FOO');
 | 
						|
        self::assertSame(
 | 
						|
            "HTTP/1.0 200 FOO\r\nBaz: bar\r\nQux: ipsum\r\n\r\nhello",
 | 
						|
            Psr7\Message::toString($response)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCorrectlyRendersSetCookieHeadersToString()
 | 
						|
    {
 | 
						|
        $response = new Psr7\Response(200, [
 | 
						|
            'Set-Cookie' => ['bar','baz','qux']
 | 
						|
        ], 'hello', '1.0', 'FOO');
 | 
						|
        self::assertSame(
 | 
						|
            "HTTP/1.0 200 FOO\r\nSet-Cookie: bar\r\nSet-Cookie: baz\r\nSet-Cookie: qux\r\n\r\nhello",
 | 
						|
            Psr7\Message::toString($response)
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCanModifyRequestWithUri()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, [
 | 
						|
            'uri' => new Psr7\Uri('http://www.foo.com'),
 | 
						|
        ]);
 | 
						|
        self::assertSame('http://www.foo.com', (string)$r2->getUri());
 | 
						|
        self::assertSame('www.foo.com', (string)$r2->getHeaderLine('host'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCanModifyRequestWithUriAndPort()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com:8000');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, [
 | 
						|
            'uri' => new Psr7\Uri('http://www.foo.com:8000'),
 | 
						|
        ]);
 | 
						|
        self::assertSame('http://www.foo.com:8000', (string)$r2->getUri());
 | 
						|
        self::assertSame('www.foo.com:8000', (string)$r2->getHeaderLine('host'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testCanModifyRequestWithCaseInsensitiveHeader()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com', ['User-Agent' => 'foo']);
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, ['set_headers' => ['User-agent' => 'bar']]);
 | 
						|
        self::assertSame('bar', $r2->getHeaderLine('User-Agent'));
 | 
						|
        self::assertSame('bar', $r2->getHeaderLine('User-agent'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testReturnsAsIsWhenNoChanges()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, []);
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Request', $r2);
 | 
						|
 | 
						|
        $r1 = new Psr7\ServerRequest('GET', 'http://foo.com');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, []);
 | 
						|
        self::assertInstanceOf('Psr\Http\Message\ServerRequestInterface', $r2);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testReturnsUriAsIsWhenNoChanges()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, ['set_headers' => ['foo' => 'bar']]);
 | 
						|
        self::assertNotSame($r1, $r2);
 | 
						|
        self::assertSame('bar', $r2->getHeaderLine('foo'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testRemovesHeadersFromMessage()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com', ['foo' => 'bar']);
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, ['remove_headers' => ['foo']]);
 | 
						|
        self::assertNotSame($r1, $r2);
 | 
						|
        self::assertFalse($r2->hasHeader('foo'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testAddsQueryToUri()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, ['query' => 'foo=bar']);
 | 
						|
        self::assertNotSame($r1, $r2);
 | 
						|
        self::assertSame('foo=bar', $r2->getUri()->getQuery());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testModifyRequestKeepInstanceOfRequest()
 | 
						|
    {
 | 
						|
        $r1 = new Psr7\Request('GET', 'http://foo.com');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, ['remove_headers' => ['non-existent']]);
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\Request', $r2);
 | 
						|
 | 
						|
        $r1 = new Psr7\ServerRequest('GET', 'http://foo.com');
 | 
						|
        $r2 = Psr7\Utils::modifyRequest($r1, ['remove_headers' => ['non-existent']]);
 | 
						|
        self::assertInstanceOf('Psr\Http\Message\ServerRequestInterface', $r2);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testModifyServerRequestWithUploadedFiles()
 | 
						|
    {
 | 
						|
        $request = new Psr7\ServerRequest('GET', 'http://example.com/bla');
 | 
						|
        $file = new Psr7\UploadedFile('Test', 100, \UPLOAD_ERR_OK);
 | 
						|
        $request = $request->withUploadedFiles([$file]);
 | 
						|
 | 
						|
        /** @var Psr7\ServerRequest $modifiedRequest */
 | 
						|
        $modifiedRequest = Psr7\Utils::modifyRequest($request, ['set_headers' => ['foo' => 'bar']]);
 | 
						|
 | 
						|
        self::assertCount(1, $modifiedRequest->getUploadedFiles());
 | 
						|
 | 
						|
        $files = $modifiedRequest->getUploadedFiles();
 | 
						|
        self::assertInstanceOf('GuzzleHttp\Psr7\UploadedFile', $files[0]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function testModifyServerRequestWithCookies()
 | 
						|
    {
 | 
						|
        $request = (new Psr7\ServerRequest('GET', 'http://example.com/bla'))
 | 
						|
            ->withCookieParams(['name' => 'value']);
 | 
						|
 | 
						|
        /** @var Psr7\ServerRequest $modifiedRequest */
 | 
						|
        $modifiedRequest = Psr7\Utils::modifyRequest($request, ['set_headers' => ['foo' => 'bar']]);
 | 
						|
 | 
						|
        self::assertSame(['name' => 'value'], $modifiedRequest->getCookieParams());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testModifyServerRequestParsedBody()
 | 
						|
    {
 | 
						|
        $request = (new Psr7\ServerRequest('GET', 'http://example.com/bla'))
 | 
						|
            ->withParsedBody(['name' => 'value']);
 | 
						|
 | 
						|
        /** @var Psr7\ServerRequest $modifiedRequest */
 | 
						|
        $modifiedRequest = Psr7\Utils::modifyRequest($request, ['set_headers' => ['foo' => 'bar']]);
 | 
						|
 | 
						|
        self::assertSame(['name' => 'value'], $modifiedRequest->getParsedBody());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testModifyServerRequestQueryParams()
 | 
						|
    {
 | 
						|
        $request = (new Psr7\ServerRequest('GET', 'http://example.com/bla'))
 | 
						|
            ->withQueryParams(['name' => 'value']);
 | 
						|
 | 
						|
        /** @var Psr7\ServerRequest $modifiedRequest */
 | 
						|
        $modifiedRequest = Psr7\Utils::modifyRequest($request, ['set_headers' => ['foo' => 'bar']]);
 | 
						|
 | 
						|
        self::assertSame(['name' => 'value'], $modifiedRequest->getQueryParams());
 | 
						|
    }
 | 
						|
 | 
						|
    public function testModifyServerRequestRetainsAttributes()
 | 
						|
    {
 | 
						|
        $request = (new Psr7\ServerRequest('GET', 'http://example.com/bla'))
 | 
						|
            ->withAttribute('foo', 'bar');
 | 
						|
 | 
						|
        /** @var Psr7\ServerRequest $modifiedRequest */
 | 
						|
        $modifiedRequest = Psr7\Utils::modifyRequest($request, []);
 | 
						|
 | 
						|
        self::assertSame(['foo' => 'bar'], $modifiedRequest->getAttributes());
 | 
						|
    }
 | 
						|
}
 |