scratch

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ 86  →  ?path2? @ 87
/vendor/guzzlehttp/guzzle/tests/Adapter/Curl/CurlFactoryTest.php
@@ -0,0 +1,392 @@
<?php
 
// Override curl_setopt_array() to get the last set curl options
namespace GuzzleHttp\Adapter\Curl
{
function curl_setopt_array($handle, array $options)
{
if (array_values($options) != [null, null, null, null]) {
$_SERVER['last_curl'] = $options;
}
\curl_setopt_array($handle, $options);
}
}
 
namespace GuzzleHttp\Tests\Adapter\Curl {
 
use GuzzleHttp\Adapter\Curl\CurlFactory;
use GuzzleHttp\Adapter\Curl\MultiAdapter;
use GuzzleHttp\Adapter\Transaction;
use GuzzleHttp\Client;
use GuzzleHttp\Event\BeforeEvent;
use GuzzleHttp\Exception\ServerException;
use GuzzleHttp\Message\MessageFactory;
use GuzzleHttp\Message\Request;
use GuzzleHttp\Message\RequestInterface;
use GuzzleHttp\Stream\Stream;
use GuzzleHttp\Tests\Server;
 
/**
* @covers GuzzleHttp\Adapter\Curl\CurlFactory
*/
class CurlFactoryTest extends \PHPUnit_Framework_TestCase
{
/** @var \GuzzleHttp\Tests\Server */
static $server;
 
public static function setUpBeforeClass()
{
unset($_SERVER['last_curl']);
}
 
public static function tearDownAfterClass()
{
unset($_SERVER['last_curl']);
}
 
public function testCreatesCurlHandle()
{
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\nFoo: Bar\r\n Baz: bam\r\nContent-Length: 2\r\n\r\nhi"]);
$request = new Request(
'PUT',
Server::$url . 'haha',
['Hi' => ' 123'],
Stream::factory('testing')
);
$stream = Stream::factory();
$request->getConfig()->set('save_to', $stream);
$request->getConfig()->set('verify', true);
$this->emit($request);
 
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
$this->assertInternalType('resource', $h);
curl_exec($h);
$response = $t->getResponse();
$this->assertInstanceOf('GuzzleHttp\Message\ResponseInterface', $response);
$this->assertEquals('hi', $response->getBody());
$this->assertEquals('Bar', $response->getHeader('Foo'));
$this->assertEquals('bam', $response->getHeader('Baz'));
curl_close($h);
 
$sent = Server::received(true)[0];
$this->assertEquals('PUT', $sent->getMethod());
$this->assertEquals('/haha', $sent->getPath());
$this->assertEquals('123', $sent->getHeader('Hi'));
$this->assertEquals('7', $sent->getHeader('Content-Length'));
$this->assertEquals('testing', $sent->getBody());
$this->assertEquals('1.1', $sent->getProtocolVersion());
$this->assertEquals('hi', (string) $stream);
 
$this->assertEquals(true, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYPEER]);
$this->assertEquals(2, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYHOST]);
}
 
public function testSendsHeadRequests()
{
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\n"]);
$request = new Request('HEAD', Server::$url);
$this->emit($request);
 
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
$response = $t->getResponse();
$this->assertEquals('2', $response->getHeader('Content-Length'));
$this->assertEquals('', $response->getBody());
 
$sent = Server::received(true)[0];
$this->assertEquals('HEAD', $sent->getMethod());
$this->assertEquals('/', $sent->getPath());
}
 
public function testSendsPostRequestWithNoBody()
{
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"]);
$request = new Request('POST', Server::$url);
$this->emit($request);
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
$sent = Server::received(true)[0];
$this->assertEquals('POST', $sent->getMethod());
$this->assertEquals('', $sent->getBody());
}
 
public function testSendsChunkedRequests()
{
$stream = $this->getMockBuilder('GuzzleHttp\Stream\Stream')
->setConstructorArgs([fopen('php://temp', 'r+')])
->setMethods(['getSize'])
->getMock();
$stream->expects($this->any())
->method('getSize')
->will($this->returnValue(null));
$stream->write('foo');
$stream->seek(0);
 
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"]);
$request = new Request('PUT', Server::$url, [], $stream);
$this->emit($request);
$this->assertNull($request->getBody()->getSize());
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
$sent = Server::received(false)[0];
$this->assertContains('PUT / HTTP/1.1', $sent);
$this->assertContains('transfer-encoding: chunked', strtolower($sent));
$this->assertContains("\r\n\r\nfoo", $sent);
}
 
public function testDecodesGzippedResponses()
{
Server::flush();
$content = gzencode('test');
$message = "HTTP/1.1 200 OK\r\n"
. "Content-Encoding: gzip\r\n"
. "Content-Length: " . strlen($content) . "\r\n\r\n"
. $content;
Server::enqueue($message);
$client = new Client();
$request = $client->createRequest('GET', Server::$url);
$this->emit($request);
$t = new Transaction($client, $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
$sent = Server::received(true)[0];
$this->assertSame('', $sent->getHeader('Accept-Encoding'));
$this->assertEquals('test', (string) $t->getResponse()->getBody());
}
 
public function testDecodesWithCustomAcceptHeader()
{
Server::flush();
$content = gzencode('test');
$message = "HTTP/1.1 200 OK\r\n"
. "Content-Encoding: gzip\r\n"
. "Content-Length: " . strlen($content) . "\r\n\r\n"
. $content;
Server::enqueue($message);
$client = new Client();
$request = $client->createRequest('GET', Server::$url, [
'decode_content' => 'gzip'
]);
$this->emit($request);
$t = new Transaction($client, $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
$sent = Server::received(true)[0];
$this->assertSame('gzip', $sent->getHeader('Accept-Encoding'));
$this->assertEquals('test', (string) $t->getResponse()->getBody());
}
 
public function testDoesNotForceDecode()
{
Server::flush();
$content = gzencode('test');
$message = "HTTP/1.1 200 OK\r\n"
. "Content-Encoding: gzip\r\n"
. "Content-Length: " . strlen($content) . "\r\n\r\n"
. $content;
Server::enqueue($message);
$client = new Client();
$request = $client->createRequest('GET', Server::$url, [
'headers' => ['Accept-Encoding' => 'gzip'],
'decode_content' => false
]);
$this->emit($request);
$t = new Transaction($client, $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
$sent = Server::received(true)[0];
$this->assertSame('gzip', $sent->getHeader('Accept-Encoding'));
$this->assertSame($content, (string) $t->getResponse()->getBody());
}
 
public function testAddsDebugInfoToBuffer()
{
$r = fopen('php://temp', 'r+');
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo"]);
$request = new Request('GET', Server::$url);
$request->getConfig()->set('debug', $r);
$this->emit($request);
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
rewind($r);
$this->assertNotEmpty(stream_get_contents($r));
}
 
public function testAddsProxyOptions()
{
$request = new Request('GET', Server::$url);
$this->emit($request);
$request->getConfig()->set('proxy', '123');
$request->getConfig()->set('connect_timeout', 1);
$request->getConfig()->set('timeout', 2);
$request->getConfig()->set('cert', __FILE__);
$request->getConfig()->set('ssl_key', [__FILE__, '123']);
$request->getConfig()->set('verify', false);
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
curl_close($f($t, new MessageFactory()));
$this->assertEquals('123', $_SERVER['last_curl'][CURLOPT_PROXY]);
$this->assertEquals(1000, $_SERVER['last_curl'][CURLOPT_CONNECTTIMEOUT_MS]);
$this->assertEquals(2000, $_SERVER['last_curl'][CURLOPT_TIMEOUT_MS]);
$this->assertEquals(__FILE__, $_SERVER['last_curl'][CURLOPT_SSLCERT]);
$this->assertEquals(__FILE__, $_SERVER['last_curl'][CURLOPT_SSLKEY]);
$this->assertEquals('123', $_SERVER['last_curl'][CURLOPT_SSLKEYPASSWD]);
$this->assertEquals(0, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYHOST]);
$this->assertEquals(false, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYPEER]);
}
 
/**
* @expectedException \RuntimeException
*/
public function testEnsuresCertExists()
{
$request = new Request('GET', Server::$url);
$this->emit($request);
$request->getConfig()->set('cert', __FILE__ . 'ewfwef');
$f = new CurlFactory();
$f(new Transaction(new Client(), $request), new MessageFactory());
}
 
/**
* @expectedException \RuntimeException
*/
public function testEnsuresKeyExists()
{
$request = new Request('GET', Server::$url);
$this->emit($request);
$request->getConfig()->set('ssl_key', __FILE__ . 'ewfwef');
$f = new CurlFactory();
$f(new Transaction(new Client(), $request), new MessageFactory());
}
 
/**
* @expectedException \RuntimeException
*/
public function testEnsuresCacertExists()
{
$request = new Request('GET', Server::$url);
$this->emit($request);
$request->getConfig()->set('verify', __FILE__ . 'ewfwef');
$f = new CurlFactory();
$f(new Transaction(new Client(), $request), new MessageFactory());
}
 
public function testClientUsesSslByDefault()
{
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo"]);
$f = new CurlFactory();
$client = new Client([
'base_url' => Server::$url,
'adapter' => new MultiAdapter(new MessageFactory(), ['handle_factory' => $f])
]);
$client->get();
$this->assertEquals(2, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYHOST]);
$this->assertEquals(true, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYPEER]);
$this->assertFileExists($_SERVER['last_curl'][CURLOPT_CAINFO]);
}
 
public function testConvertsConstantNameKeysToValues()
{
$request = new Request('GET', Server::$url);
$request->getConfig()->set('curl', ['CURLOPT_USERAGENT' => 'foo']);
$this->emit($request);
$f = new CurlFactory();
curl_close($f(new Transaction(new Client(), $request), new MessageFactory()));
$this->assertEquals('foo', $_SERVER['last_curl'][CURLOPT_USERAGENT]);
}
 
public function testStripsFragment()
{
$request = new Request('GET', Server::$url . '#foo');
$this->emit($request);
$f = new CurlFactory();
curl_close($f(new Transaction(new Client(), $request), new MessageFactory()));
$this->assertEquals(Server::$url, $_SERVER['last_curl'][CURLOPT_URL]);
}
 
public function testDoesNotSendSizeTwice()
{
$request = new Request('PUT', Server::$url, [], Stream::factory(str_repeat('a', 32769)));
$this->emit($request);
$f = new CurlFactory();
curl_close($f(new Transaction(new Client(), $request), new MessageFactory()));
$this->assertEquals(32769, $_SERVER['last_curl'][CURLOPT_INFILESIZE]);
$this->assertNotContains('Content-Length', implode(' ', $_SERVER['last_curl'][CURLOPT_HTTPHEADER]));
}
 
public function testCanSendPayloadWithGet()
{
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\n\r\n"]);
$request = new Request(
'GET',
Server::$url,
[],
Stream::factory('foo')
);
$this->emit($request);
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
$h = $f($t, new MessageFactory());
curl_exec($h);
curl_close($h);
$sent = Server::received(true)[0];
$this->assertEquals('foo', (string) $sent->getBody());
$this->assertEquals(3, (string) $sent->getHeader('Content-Length'));
}
 
private function emit(RequestInterface $request)
{
$event = new BeforeEvent(new Transaction(new Client(), $request));
$request->getEmitter()->emit('before', $event);
}
 
public function testDoesNotAlwaysAddContentType()
{
Server::flush();
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"]);
$client = new Client();
$client->put(Server::$url . '/foo', ['body' => 'foo']);
$request = Server::received(true)[0];
$this->assertEquals('', $request->getHeader('Content-Type'));
}
 
/**
* @expectedException \GuzzleHttp\Exception\AdapterException
*/
public function testThrowsForStreamOption()
{
$request = new Request('GET', Server::$url . 'haha');
$request->getConfig()->set('stream', true);
$t = new Transaction(new Client(), $request);
$f = new CurlFactory();
$f($t, new MessageFactory());
}
}
}