3
// Override curl_setopt_array() to get the last set curl options
4
namespace GuzzleHttp\Adapter\Curl
6
function curl_setopt_array($handle, array $options)
8
if (array_values($options) != [null, null, null, null]) {
9
$_SERVER['last_curl'] = $options;
11
\curl_setopt_array($handle, $options);
15
namespace GuzzleHttp\Tests\Adapter\Curl {
17
use GuzzleHttp\Adapter\Curl\CurlFactory;
18
use GuzzleHttp\Adapter\Curl\MultiAdapter;
19
use GuzzleHttp\Adapter\Transaction;
20
use GuzzleHttp\Client;
21
use GuzzleHttp\Event\BeforeEvent;
22
use GuzzleHttp\Exception\ServerException;
23
use GuzzleHttp\Message\MessageFactory;
24
use GuzzleHttp\Message\Request;
25
use GuzzleHttp\Message\RequestInterface;
26
use GuzzleHttp\Stream\Stream;
27
use GuzzleHttp\Tests\Server;
30
* @covers GuzzleHttp\Adapter\Curl\CurlFactory
32
class CurlFactoryTest extends \PHPUnit_Framework_TestCase
34
/** @var \GuzzleHttp\Tests\Server */
37
public static function setUpBeforeClass()
39
unset($_SERVER['last_curl']);
42
public static function tearDownAfterClass()
44
unset($_SERVER['last_curl']);
47
public function testCreatesCurlHandle()
50
Server::enqueue(["HTTP/1.1 200 OK\r\nFoo: Bar\r\n Baz: bam\r\nContent-Length: 2\r\n\r\nhi"]);
51
$request = new Request(
53
Server::$url . 'haha',
55
Stream::factory('testing')
57
$stream = Stream::factory();
58
$request->getConfig()->set('save_to', $stream);
59
$request->getConfig()->set('verify', true);
60
$this->emit($request);
62
$t = new Transaction(new Client(), $request);
63
$f = new CurlFactory();
64
$h = $f($t, new MessageFactory());
65
$this->assertInternalType('resource', $h);
67
$response = $t->getResponse();
68
$this->assertInstanceOf('GuzzleHttp\Message\ResponseInterface', $response);
69
$this->assertEquals('hi', $response->getBody());
70
$this->assertEquals('Bar', $response->getHeader('Foo'));
71
$this->assertEquals('bam', $response->getHeader('Baz'));
74
$sent = Server::received(true)[0];
75
$this->assertEquals('PUT', $sent->getMethod());
76
$this->assertEquals('/haha', $sent->getPath());
77
$this->assertEquals('123', $sent->getHeader('Hi'));
78
$this->assertEquals('7', $sent->getHeader('Content-Length'));
79
$this->assertEquals('testing', $sent->getBody());
80
$this->assertEquals('1.1', $sent->getProtocolVersion());
81
$this->assertEquals('hi', (string) $stream);
83
$this->assertEquals(true, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYPEER]);
84
$this->assertEquals(2, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYHOST]);
87
public function testSendsHeadRequests()
90
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\n"]);
91
$request = new Request('HEAD', Server::$url);
92
$this->emit($request);
94
$t = new Transaction(new Client(), $request);
95
$f = new CurlFactory();
96
$h = $f($t, new MessageFactory());
99
$response = $t->getResponse();
100
$this->assertEquals('2', $response->getHeader('Content-Length'));
101
$this->assertEquals('', $response->getBody());
103
$sent = Server::received(true)[0];
104
$this->assertEquals('HEAD', $sent->getMethod());
105
$this->assertEquals('/', $sent->getPath());
108
public function testSendsPostRequestWithNoBody()
111
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"]);
112
$request = new Request('POST', Server::$url);
113
$this->emit($request);
114
$t = new Transaction(new Client(), $request);
115
$f = new CurlFactory();
116
$h = $f($t, new MessageFactory());
119
$sent = Server::received(true)[0];
120
$this->assertEquals('POST', $sent->getMethod());
121
$this->assertEquals('', $sent->getBody());
124
public function testSendsChunkedRequests()
126
$stream = $this->getMockBuilder('GuzzleHttp\Stream\Stream')
127
->setConstructorArgs([fopen('php://temp', 'r+')])
128
->setMethods(['getSize'])
130
$stream->expects($this->any())
132
->will($this->returnValue(null));
133
$stream->write('foo');
137
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"]);
138
$request = new Request('PUT', Server::$url, [], $stream);
139
$this->emit($request);
140
$this->assertNull($request->getBody()->getSize());
141
$t = new Transaction(new Client(), $request);
142
$f = new CurlFactory();
143
$h = $f($t, new MessageFactory());
146
$sent = Server::received(false)[0];
147
$this->assertContains('PUT / HTTP/1.1', $sent);
148
$this->assertContains('transfer-encoding: chunked', strtolower($sent));
149
$this->assertContains("\r\n\r\nfoo", $sent);
152
public function testDecodesGzippedResponses()
155
$content = gzencode('test');
156
$message = "HTTP/1.1 200 OK\r\n"
157
. "Content-Encoding: gzip\r\n"
158
. "Content-Length: " . strlen($content) . "\r\n\r\n"
160
Server::enqueue($message);
161
$client = new Client();
162
$request = $client->createRequest('GET', Server::$url);
163
$this->emit($request);
164
$t = new Transaction($client, $request);
165
$f = new CurlFactory();
166
$h = $f($t, new MessageFactory());
169
$sent = Server::received(true)[0];
170
$this->assertSame('', $sent->getHeader('Accept-Encoding'));
171
$this->assertEquals('test', (string) $t->getResponse()->getBody());
174
public function testDecodesWithCustomAcceptHeader()
177
$content = gzencode('test');
178
$message = "HTTP/1.1 200 OK\r\n"
179
. "Content-Encoding: gzip\r\n"
180
. "Content-Length: " . strlen($content) . "\r\n\r\n"
182
Server::enqueue($message);
183
$client = new Client();
184
$request = $client->createRequest('GET', Server::$url, [
185
'decode_content' => 'gzip'
187
$this->emit($request);
188
$t = new Transaction($client, $request);
189
$f = new CurlFactory();
190
$h = $f($t, new MessageFactory());
193
$sent = Server::received(true)[0];
194
$this->assertSame('gzip', $sent->getHeader('Accept-Encoding'));
195
$this->assertEquals('test', (string) $t->getResponse()->getBody());
198
public function testDoesNotForceDecode()
201
$content = gzencode('test');
202
$message = "HTTP/1.1 200 OK\r\n"
203
. "Content-Encoding: gzip\r\n"
204
. "Content-Length: " . strlen($content) . "\r\n\r\n"
206
Server::enqueue($message);
207
$client = new Client();
208
$request = $client->createRequest('GET', Server::$url, [
209
'headers' => ['Accept-Encoding' => 'gzip'],
210
'decode_content' => false
212
$this->emit($request);
213
$t = new Transaction($client, $request);
214
$f = new CurlFactory();
215
$h = $f($t, new MessageFactory());
218
$sent = Server::received(true)[0];
219
$this->assertSame('gzip', $sent->getHeader('Accept-Encoding'));
220
$this->assertSame($content, (string) $t->getResponse()->getBody());
223
public function testAddsDebugInfoToBuffer()
225
$r = fopen('php://temp', 'r+');
227
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo"]);
228
$request = new Request('GET', Server::$url);
229
$request->getConfig()->set('debug', $r);
230
$this->emit($request);
231
$t = new Transaction(new Client(), $request);
232
$f = new CurlFactory();
233
$h = $f($t, new MessageFactory());
237
$this->assertNotEmpty(stream_get_contents($r));
240
public function testAddsProxyOptions()
242
$request = new Request('GET', Server::$url);
243
$this->emit($request);
244
$request->getConfig()->set('proxy', '123');
245
$request->getConfig()->set('connect_timeout', 1);
246
$request->getConfig()->set('timeout', 2);
247
$request->getConfig()->set('cert', __FILE__);
248
$request->getConfig()->set('ssl_key', [__FILE__, '123']);
249
$request->getConfig()->set('verify', false);
250
$t = new Transaction(new Client(), $request);
251
$f = new CurlFactory();
252
curl_close($f($t, new MessageFactory()));
253
$this->assertEquals('123', $_SERVER['last_curl'][CURLOPT_PROXY]);
254
$this->assertEquals(1000, $_SERVER['last_curl'][CURLOPT_CONNECTTIMEOUT_MS]);
255
$this->assertEquals(2000, $_SERVER['last_curl'][CURLOPT_TIMEOUT_MS]);
256
$this->assertEquals(__FILE__, $_SERVER['last_curl'][CURLOPT_SSLCERT]);
257
$this->assertEquals(__FILE__, $_SERVER['last_curl'][CURLOPT_SSLKEY]);
258
$this->assertEquals('123', $_SERVER['last_curl'][CURLOPT_SSLKEYPASSWD]);
259
$this->assertEquals(0, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYHOST]);
260
$this->assertEquals(false, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYPEER]);
264
* @expectedException \RuntimeException
266
public function testEnsuresCertExists()
268
$request = new Request('GET', Server::$url);
269
$this->emit($request);
270
$request->getConfig()->set('cert', __FILE__ . 'ewfwef');
271
$f = new CurlFactory();
272
$f(new Transaction(new Client(), $request), new MessageFactory());
276
* @expectedException \RuntimeException
278
public function testEnsuresKeyExists()
280
$request = new Request('GET', Server::$url);
281
$this->emit($request);
282
$request->getConfig()->set('ssl_key', __FILE__ . 'ewfwef');
283
$f = new CurlFactory();
284
$f(new Transaction(new Client(), $request), new MessageFactory());
288
* @expectedException \RuntimeException
290
public function testEnsuresCacertExists()
292
$request = new Request('GET', Server::$url);
293
$this->emit($request);
294
$request->getConfig()->set('verify', __FILE__ . 'ewfwef');
295
$f = new CurlFactory();
296
$f(new Transaction(new Client(), $request), new MessageFactory());
299
public function testClientUsesSslByDefault()
302
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\nfoo"]);
303
$f = new CurlFactory();
304
$client = new Client([
305
'base_url' => Server::$url,
306
'adapter' => new MultiAdapter(new MessageFactory(), ['handle_factory' => $f])
309
$this->assertEquals(2, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYHOST]);
310
$this->assertEquals(true, $_SERVER['last_curl'][CURLOPT_SSL_VERIFYPEER]);
311
$this->assertFileExists($_SERVER['last_curl'][CURLOPT_CAINFO]);
314
public function testConvertsConstantNameKeysToValues()
316
$request = new Request('GET', Server::$url);
317
$request->getConfig()->set('curl', ['CURLOPT_USERAGENT' => 'foo']);
318
$this->emit($request);
319
$f = new CurlFactory();
320
curl_close($f(new Transaction(new Client(), $request), new MessageFactory()));
321
$this->assertEquals('foo', $_SERVER['last_curl'][CURLOPT_USERAGENT]);
324
public function testStripsFragment()
326
$request = new Request('GET', Server::$url . '#foo');
327
$this->emit($request);
328
$f = new CurlFactory();
329
curl_close($f(new Transaction(new Client(), $request), new MessageFactory()));
330
$this->assertEquals(Server::$url, $_SERVER['last_curl'][CURLOPT_URL]);
333
public function testDoesNotSendSizeTwice()
335
$request = new Request('PUT', Server::$url, [], Stream::factory(str_repeat('a', 32769)));
336
$this->emit($request);
337
$f = new CurlFactory();
338
curl_close($f(new Transaction(new Client(), $request), new MessageFactory()));
339
$this->assertEquals(32769, $_SERVER['last_curl'][CURLOPT_INFILESIZE]);
340
$this->assertNotContains('Content-Length', implode(' ', $_SERVER['last_curl'][CURLOPT_HTTPHEADER]));
343
public function testCanSendPayloadWithGet()
346
Server::enqueue(["HTTP/1.1 200 OK\r\n\r\n"]);
347
$request = new Request(
351
Stream::factory('foo')
353
$this->emit($request);
354
$t = new Transaction(new Client(), $request);
355
$f = new CurlFactory();
356
$h = $f($t, new MessageFactory());
359
$sent = Server::received(true)[0];
360
$this->assertEquals('foo', (string) $sent->getBody());
361
$this->assertEquals(3, (string) $sent->getHeader('Content-Length'));
364
private function emit(RequestInterface $request)
366
$event = new BeforeEvent(new Transaction(new Client(), $request));
367
$request->getEmitter()->emit('before', $event);
370
public function testDoesNotAlwaysAddContentType()
373
Server::enqueue(["HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"]);
374
$client = new Client();
375
$client->put(Server::$url . '/foo', ['body' => 'foo']);
376
$request = Server::received(true)[0];
377
$this->assertEquals('', $request->getHeader('Content-Type'));
381
* @expectedException \GuzzleHttp\Exception\AdapterException
383
public function testThrowsForStreamOption()
385
$request = new Request('GET', Server::$url . 'haha');
386
$request->getConfig()->set('stream', true);
387
$t = new Transaction(new Client(), $request);
388
$f = new CurlFactory();
389
$f($t, new MessageFactory());