scratch

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 86  →  ?path2? @ 87
/vendor/guzzlehttp/guzzle/tests/Adapter/StreamAdapterTest.php
@@ -0,0 +1,440 @@
<?php
namespace GuzzleHttp\Tests\Adapter;
 
use GuzzleHttp\Adapter\StreamAdapter;
use GuzzleHttp\Client;
use GuzzleHttp\Event\ErrorEvent;
use GuzzleHttp\Message\MessageFactory;
use GuzzleHttp\Message\Response;
use GuzzleHttp\Stream\Stream;
use GuzzleHttp\Tests\Server;
 
/**
* @covers GuzzleHttp\Adapter\StreamAdapter
*/
class StreamAdapterTest extends \PHPUnit_Framework_TestCase
{
public function testReturnsResponseForSuccessfulRequest()
{
Server::flush();
Server::enqueue(
"HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 2\r\n\r\nhi"
);
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$response = $client->get('/', ['headers' => ['Foo' => 'Bar']]);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals('OK', $response->getReasonPhrase());
$this->assertEquals('Bar', $response->getHeader('Foo'));
$this->assertEquals('2', $response->getHeader('Content-Length'));
$this->assertEquals('hi', $response->getBody());
$sent = Server::received(true)[0];
$this->assertEquals('GET', $sent->getMethod());
$this->assertEquals('/', $sent->getResource());
$this->assertEquals('127.0.0.1:8125', $sent->getHeader('host'));
$this->assertEquals('Bar', $sent->getHeader('foo'));
$this->assertTrue($sent->hasHeader('user-agent'));
}
 
/**
* @expectedException \GuzzleHttp\Exception\RequestException
* @expectedExceptionMessage Error creating resource. [url] http://localhost:123 [proxy] tcp://localhost:1234
*/
public function testThrowsExceptionsCaughtDuringTransfer()
{
Server::flush();
$client = new Client([
'adapter' => new StreamAdapter(new MessageFactory()),
]);
$client->get('http://localhost:123', [
'timeout' => 0.01,
'proxy' => 'tcp://localhost:1234'
]);
}
 
/**
* @expectedException \GuzzleHttp\Exception\RequestException
* @expectedExceptionMessage URL is invalid: ftp://localhost:123
*/
public function testEnsuresTheHttpProtocol()
{
Server::flush();
$client = new Client([
'adapter' => new StreamAdapter(new MessageFactory()),
]);
$client->get('ftp://localhost:123');
}
 
public function testCanHandleExceptionsUsingEvents()
{
Server::flush();
$client = new Client([
'adapter' => new StreamAdapter(new MessageFactory())
]);
$request = $client->createRequest('GET', Server::$url);
$mockResponse = new Response(200);
$request->getEmitter()->on(
'error',
function (ErrorEvent $e) use ($mockResponse) {
$e->intercept($mockResponse);
}
);
$this->assertSame($mockResponse, $client->send($request));
}
 
public function testEmitsAfterSendEvent()
{
$ee = null;
Server::flush();
Server::enqueue(
"HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 8\r\n\r\nhi there"
);
$client = new Client(['adapter' => new StreamAdapter(new MessageFactory())]);
$request = $client->createRequest('GET', Server::$url);
$request->getEmitter()->on('complete', function ($e) use (&$ee) {
$ee = $e;
});
$client->send($request);
$this->assertInstanceOf('GuzzleHttp\Event\CompleteEvent', $ee);
$this->assertSame($request, $ee->getRequest());
$this->assertEquals(200, $ee->getResponse()->getStatusCode());
}
 
public function testStreamAttributeKeepsStreamOpen()
{
Server::flush();
Server::enqueue(
"HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 8\r\n\r\nhi there"
);
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$response = $client->put('/foo', [
'headers' => ['Foo' => 'Bar'],
'body' => 'test',
'stream' => true
]);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals('OK', $response->getReasonPhrase());
$this->assertEquals('8', $response->getHeader('Content-Length'));
$body = $response->getBody();
if (defined('HHVM_VERSION')) {
$this->markTestIncomplete('HHVM has not implemented this?');
}
$this->assertEquals('http', $body->getMetadata()['wrapper_type']);
$this->assertEquals(Server::$url . 'foo', $body->getMetadata()['uri']);
$this->assertEquals('hi', $body->read(2));
$body->close();
 
$sent = Server::received(true)[0];
$this->assertEquals('PUT', $sent->getMethod());
$this->assertEquals('/foo', $sent->getResource());
$this->assertEquals('127.0.0.1:8125', $sent->getHeader('host'));
$this->assertEquals('Bar', $sent->getHeader('foo'));
$this->assertTrue($sent->hasHeader('user-agent'));
}
 
public function testDrainsResponseIntoTempStream()
{
Server::flush();
Server::enqueue("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 8\r\n\r\nhi there");
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$response = $client->get('/');
$body = $response->getBody();
$this->assertEquals('php://temp', $body->getMetadata()['uri']);
$this->assertEquals('hi', $body->read(2));
$body->close();
}
 
public function testDrainsResponseIntoSaveToBody()
{
$r = fopen('php://temp', 'r+');
Server::flush();
Server::enqueue("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 8\r\n\r\nhi there");
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$response = $client->get('/', ['save_to' => $r]);
$body = $response->getBody();
$this->assertEquals('php://temp', $body->getMetadata()['uri']);
$this->assertEquals('hi', $body->read(2));
$this->assertEquals(' there', stream_get_contents($r));
$body->close();
}
 
public function testDrainsResponseIntoSaveToBodyAtPath()
{
$tmpfname = tempnam('/tmp', 'save_to_path');
Server::flush();
Server::enqueue("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 8\r\n\r\nhi there");
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$response = $client->get('/', ['save_to' => $tmpfname]);
$body = $response->getBody();
$this->assertEquals($tmpfname, $body->getMetadata()['uri']);
$this->assertEquals('hi', $body->read(2));
$body->close();
unlink($tmpfname);
}
 
public function testAutomaticallyDecompressGzip()
{
Server::flush();
$content = gzencode('test');
$message = "HTTP/1.1 200 OK\r\n"
. "Foo: Bar\r\n"
. "Content-Encoding: gzip\r\n"
. "Content-Length: " . strlen($content) . "\r\n\r\n"
. $content;
Server::enqueue($message);
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$response = $client->get('/', ['stream' => true]);
$body = $response->getBody();
$this->assertEquals('guzzle://stream', $body->getMetadata()['uri']);
$this->assertEquals('test', (string) $body);
}
 
public function testDoesNotForceDecode()
{
Server::flush();
$content = gzencode('test');
$message = "HTTP/1.1 200 OK\r\n"
. "Foo: Bar\r\n"
. "Content-Encoding: gzip\r\n"
. "Content-Length: " . strlen($content) . "\r\n\r\n"
. $content;
Server::enqueue($message);
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$response = $client->get('/', [
'decode_content' => false,
'stream' => true
]);
$body = $response->getBody();
$this->assertSame($content, (string) $body);
}
 
protected function getStreamFromBody(Stream $body)
{
$r = new \ReflectionProperty($body, 'stream');
$r->setAccessible(true);
 
return $r->getValue($body);
}
 
protected function getSendResult(array $opts)
{
Server::enqueue("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 8\r\n\r\nhi there");
$client = new Client(['adapter' => new StreamAdapter(new MessageFactory())]);
 
return $client->get(Server::$url, $opts);
}
 
public function testAddsProxy()
{
$body = $this->getSendResult(['stream' => true, 'proxy' => '127.0.0.1:8125'])->getBody();
$opts = stream_context_get_options($this->getStreamFromBody($body));
$this->assertEquals('127.0.0.1:8125', $opts['http']['proxy']);
}
 
public function testAddsTimeout()
{
$body = $this->getSendResult(['stream' => true, 'timeout' => 200])->getBody();
$opts = stream_context_get_options($this->getStreamFromBody($body));
$this->assertEquals(200, $opts['http']['timeout']);
}
 
/**
* @expectedException \RuntimeException
* @expectedExceptionMessage SSL certificate authority file not found: /does/not/exist
*/
public function testVerifiesVerifyIsValidIfPath()
{
(new Client([
'adapter' => new StreamAdapter(new MessageFactory()),
'base_url' => Server::$url,
'defaults' => ['verify' => '/does/not/exist']
]))->get('/');
}
 
public function testVerifyCanBeDisabled()
{
Server::enqueue("HTTP/1.1 200\r\nContent-Length: 0\r\n\r\n");
(new Client([
'adapter' => new StreamAdapter(new MessageFactory()),
'base_url' => Server::$url,
'defaults' => ['verify' => false]
]))->get('/');
}
 
public function testVerifyCanBeSetToPath()
{
$path = __DIR__ . '/../../src/cacert.pem';
$this->assertFileExists($path);
$body = $this->getSendResult(['stream' => true, 'verify' => $path])->getBody();
$opts = stream_context_get_options($this->getStreamFromBody($body));
$this->assertEquals(true, $opts['http']['verify_peer']);
$this->assertEquals($path, $opts['http']['cafile']);
$this->assertTrue(file_exists($opts['http']['cafile']));
}
 
/**
* @expectedException \RuntimeException
* @expectedExceptionMessage SSL certificate not found: /does/not/exist
*/
public function testVerifiesCertIfValidPath()
{
(new Client([
'adapter' => new StreamAdapter(new MessageFactory()),
'base_url' => Server::$url,
'defaults' => ['cert' => '/does/not/exist']
]))->get('/');
}
 
public function testCanSetPasswordWhenSettingCert()
{
$path = __DIR__ . '/../../src/cacert.pem';
$body = $this->getSendResult(['stream' => true, 'cert' => [$path, 'foo']])->getBody();
$opts = stream_context_get_options($this->getStreamFromBody($body));
$this->assertEquals($path, $opts['http']['local_cert']);
$this->assertEquals('foo', $opts['http']['passphrase']);
}
 
public function testDebugAttributeWritesStreamInfoToTempBufferByDefault()
{
if (defined('HHVM_VERSION')) {
$this->markTestSkipped('HHVM has not implemented this?');
return;
}
 
Server::flush();
Server::enqueue("HTTP/1.1 200 OK\r\nFoo: Bar\r\nContent-Length: 8\r\n\r\nhi there");
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$fp = fopen('php://temp', 'w');
$client->get('/', ['debug' => $fp]);
fseek($fp, 0);
$contents = stream_get_contents($fp);
$this->assertContains('<http://127.0.0.1:8125/> [CONNECT]', $contents);
$this->assertContains('<http://127.0.0.1:8125/> [FILE_SIZE_IS]', $contents);
$this->assertContains('<http://127.0.0.1:8125/> [PROGRESS]', $contents);
}
 
public function testDebugAttributeWritesStreamInfoToBuffer()
{
if (defined('HHVM_VERSION')) {
$this->markTestSkipped('HHVM has not implemented this?');
return;
}
 
$buffer = fopen('php://temp', 'r+');
Server::flush();
Server::enqueue("HTTP/1.1 200 OK\r\nContent-Length: 8\r\nContent-Type: text/plain\r\n\r\nhi there");
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$client->get('/', ['debug' => $buffer]);
fseek($buffer, 0);
$contents = stream_get_contents($buffer);
$this->assertContains('<http://127.0.0.1:8125/> [CONNECT]', $contents);
$this->assertContains('<http://127.0.0.1:8125/> [FILE_SIZE_IS] message: "Content-Length: 8"', $contents);
$this->assertContains('<http://127.0.0.1:8125/> [PROGRESS] bytes_max: "8"', $contents);
$this->assertContains('<http://127.0.0.1:8125/> [MIME_TYPE_IS] message: "text/plain"', $contents);
}
 
public function testAddsProxyByProtocol()
{
$url = str_replace('http', 'tcp', Server::$url);
$body = $this->getSendResult(['stream' => true, 'proxy' => ['http' => $url]])->getBody();
$opts = stream_context_get_options($this->getStreamFromBody($body));
$this->assertEquals($url, $opts['http']['proxy']);
}
 
public function testPerformsShallowMergeOfCustomContextOptions()
{
$body = $this->getSendResult([
'stream' => true,
'config' => [
'stream_context' => [
'http' => [
'request_fulluri' => true,
'method' => 'HEAD'
],
'socket' => [
'bindto' => '127.0.0.1:0'
],
'ssl' => [
'verify_peer' => false
]
]
]
])->getBody();
 
$opts = stream_context_get_options($this->getStreamFromBody($body));
$this->assertEquals('HEAD', $opts['http']['method']);
$this->assertTrue($opts['http']['request_fulluri']);
$this->assertFalse($opts['ssl']['verify_peer']);
$this->assertEquals('127.0.0.1:0', $opts['socket']['bindto']);
}
 
/**
* @expectedException \GuzzleHttp\Exception\RequestException
* @expectedExceptionMessage stream_context must be an array
*/
public function testEnsuresThatStreamContextIsAnArray()
{
$this->getSendResult([
'stream' => true,
'config' => ['stream_context' => 'foo']
]);
}
 
/**
* @ticket https://github.com/guzzle/guzzle/issues/725
*/
public function testHandlesMultipleHeadersOfSameName()
{
$a = new StreamAdapter(new MessageFactory());
$ref = new \ReflectionMethod($a, 'headersFromLines');
$ref->setAccessible(true);
$this->assertEquals([
'foo' => ['bar', 'bam'],
'abc' => ['123']
], $ref->invoke($a, [
'foo: bar',
'foo: bam',
'abc: 123'
]));
}
 
public function testDoesNotAddContentTypeByDefault()
{
Server::flush();
Server::enqueue("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
$client = new Client([
'base_url' => Server::$url,
'adapter' => new StreamAdapter(new MessageFactory())
]);
$client->put('/', ['body' => 'foo']);
$requests = Server::received(true);
$this->assertEquals('', $requests[0]->getHeader('Content-Type'));
$this->assertEquals(3, $requests[0]->getHeader('Content-Length'));
}
}