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());
|
||
|
}
|
||
|
}
|