28 protected function setUp()
41 $this->assertInternalType(
'resource', $this->multi->getHandle());
42 $this->assertEquals(
'curl_multi', get_resource_type($this->multi->getHandle()));
47 $handle = $this->multi->getHandle();
48 $this->multi->__destruct();
49 $this->assertFalse(is_resource($handle));
55 $request1 =
new Request(
'GET',
'http://www.google.com/');
56 $multi->add($request1);
57 $this->assertEquals(array($request1), $multi->all());
58 $request2 =
new Request(
'POST',
'http://www.google.com/');
59 $multi->add($request2);
60 $this->assertEquals(array($request1, $request2), $multi->all());
61 $this->assertEquals(2, count($multi));
66 $request1 =
new Request(
'GET',
'http://www.google.com/');
67 $this->multi->add($request1);
68 $request2 =
new Request(
'PUT',
'http://www.google.com/');
69 $this->multi->add($request2);
70 $this->assertEquals(array($request1, $request2), $this->multi->all());
71 $this->assertTrue($this->multi->remove($request1));
72 $this->assertFalse($this->multi->remove($request1));
73 $this->assertEquals(array($request2), $this->multi->all());
78 $this->multi->add(
new Request(
'GET',
'http://www.google.com/'));
79 $this->multi->reset();
80 $this->assertEquals(array(), $this->multi->all());
86 "HTTP/1.1 204 No content\r\n" .
87 "Content-Length: 0\r\n" .
88 "Server: Jetty(6.1.3)\r\n\r\n",
89 "HTTP/1.1 200 OK\r\n" .
90 "Content-Type: text/html; charset=utf-8\r\n" .
91 "Content-Length: 4\r\n" .
92 "Server: Jetty(6.1.3)\r\n\r\n" .
98 $this->multi->add($request1);
99 $this->multi->add($request2);
100 $this->multi->send();
102 $response1 = $request1->getResponse();
103 $response2 = $request2->getResponse();
104 $this->assertInstanceOf(
'Guzzle\\Http\\Message\\Response', $response1);
105 $this->assertInstanceOf(
'Guzzle\\Http\\Message\\Response', $response2);
107 $this->assertTrue($response1->getBody(
true) ==
'data' || $response2->getBody(
true) ==
'data');
108 $this->assertTrue($response1->getBody(
true) ==
'' || $response2->getBody(
true) ==
'');
109 $this->assertTrue($response1->getStatusCode() ==
'204' || $response2->getStatusCode() ==
'204');
110 $this->assertNotEquals((
string) $response1, (
string) $response2);
116 "HTTP/1.1 200 OK\r\n" .
117 "Content-Type: text/html; charset=utf-8\r\n" .
118 "Content-Length: 4\r\n" .
119 "Server: Jetty(6.1.3)\r\n" .
122 "HTTP/1.1 204 No content\r\n" .
123 "Content-Length: 0\r\n" .
124 "Server: Jetty(6.1.3)\r\n" .
126 "HTTP/1.1 404 Not Found\r\n" .
127 "Content-Length: 0\r\n" .
134 $this->multi->add($request1);
135 $this->multi->add($request2);
136 $this->multi->add($request3);
139 $this->multi->send();
140 $this->fail(
'MultiTransferException not thrown when aggregating request exceptions');
146 $this->assertInstanceOf(
'ArrayIterator', $e->
getIterator());
147 $this->assertEquals(1, count($e));
150 $response1 = $request1->getResponse();
151 $response2 = $request2->getResponse();
152 $response3 = $request3->getResponse();
154 $this->assertNotEquals((
string) $response1, (
string) $response2);
155 $this->assertNotEquals((
string) $response3, (
string) $response1);
156 $this->assertInstanceOf(
'Guzzle\\Http\\Message\\Response', $response1);
157 $this->assertInstanceOf(
'Guzzle\\Http\\Message\\Response', $response2);
158 $this->assertInstanceOf(
'Guzzle\\Http\\Message\\Response', $response3);
160 $failed = $exceptions[0]->getResponse();
161 $this->assertEquals(404, $failed->getStatusCode());
162 $this->assertEquals(1, count($e));
165 foreach ($e as $except) {
166 $this->assertEquals($failed, $except->getResponse());
177 $this->
getServer()->enqueue(
"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
180 $request->setClient(
new Client());
181 $request->getCurlOptions()->set(CURLOPT_FRESH_CONNECT,
true);
182 $request->getCurlOptions()->set(CURLOPT_FORBID_REUSE,
true);
183 $request->getCurlOptions()->set(CURLOPT_CONNECTTIMEOUT_MS, 5);
185 $this->fail(
'CurlException not thrown');
187 $m = $e->getMessage();
188 $this->assertContains(
'[curl] ', $m);
189 $this->assertContains(
'[url] http://127.0.0.1:9876/', $m);
190 $this->assertInternalType(
'array', $e->
getCurlInfo());
198 $request->setClient(
new Client());
199 $request->setResponse($r,
true);
200 $this->multi->add($request);
201 $this->multi->send();
202 $this->assertSame($r, $request->getResponse());
208 $this->
getServer()->enqueue(array(
"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"));
211 $r->getEventDispatcher()->addListener(
'request.receive.status_line',
function (
Event $event) use ($client) {
213 $request = $client->get()->setResponse(
new Response(200),
true);
217 $this->assertEquals(1, count($this->
getServer()->getReceivedRequests(
false)));
224 $client->setCurlMulti($multi);
225 $request = $client->get();
226 $request->getEventDispatcher()->addListener(
'request.before_send',
function() {
227 throw new \RuntimeException(
'Testing!');
231 $this->fail(
'Did not throw');
234 $this->assertEquals(0, count($multi));
244 $client =
new Client($this->
getServer()->getUrl());
245 $request = $client->get();
246 $request->getEventDispatcher()->addListener(
'request.before_send',
function() {
247 throw new \RuntimeException(
'Thrown before sending!');
249 $client->send(array($request));
254 $this->
getServer()->enqueue(
"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
257 $r->getEventDispatcher()->addListener(
'request.sent',
function() use ($client) {
259 $client->get()->setResponse(
new Response(404),
true)->send();
263 $this->fail(
'Did not throw');
265 $this->assertCount(0, $client->getCurlMulti());
271 $this->
getServer()->enqueue(
"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
274 $r->getEventDispatcher()->addListener(
'request.before_send',
function() use ($client) {
276 $client->get()->setResponse(
new Response(404),
true)->send();
280 $this->fail(
'Did not throw');
282 $this->assertCount(0, $client->getCurlMulti());
292 $client =
new Client($this->
getServer()->getUrl());
293 $multi = $this->getMock(
'Guzzle\\Http\\Curl\\CurlMulti', array(
'perform'));
294 $multi->expects($this->once())
297 $multi->add($client->get());
303 if (!defined(
'CURLOPT_TIMEOUT_MS')) {
304 $this->markTestSkipped(
'Update curl');
308 $client =
new Client(
'http://127.0.0.1:123', array(
309 'curl.CURLOPT_PORT' => 123,
310 'curl.CURLOPT_CONNECTTIMEOUT_MS' => 1,
313 $request = $client->get();
315 $multi->add($request);
320 $request->getEventDispatcher()->addListener(
'request.exception',
function(
Event $event) use ($multi) {
321 $retries = $event[
'request']->getParams()->
get(
'retries');
324 $event[
'request']->setState(
'transfer');
325 $event[
'request']->getParams()->
set(
'retries', 1);
327 $multi->remove($event[
'request']);
328 $multi->add($event[
'request']);
334 $this->fail(
'Did not throw an exception at all!?!');
335 }
catch (\Exception $e) {
336 $this->assertEquals(1, $request->getParams()->get(
'retries'));
344 $request = $client->get();
345 $request->getEventDispatcher()->addListener(
'request.before_send',
function(
Event $event) {
346 $event[
'request']->setResponse(
new Response(200));
350 $multi->add($request);
352 $this->assertEquals(0, count($this->
getServer()->getReceivedRequests(
false)));
358 $client =
new Client(
'http://127.0.0.1:123');
359 $request = $client->get();
361 $request->getCurlOptions()->set(CURLOPT_TIMEOUT_MS, 1)->set(CURLOPT_CONNECTTIMEOUT_MS, 1);
363 $request->getEventDispatcher()->addListener(
'request.exception',
function(
Event $event) use (&$count) {
364 $event[
'request']->setResponse(
new Response(200));
368 $multi->add($request);
372 $this->assertEquals(200, $request->getResponse()->getStatusCode());
378 "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n",
379 "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"
382 $stream = fopen(
'php://temp',
'w+');
384 $client->getConfig()->set(
'curl.CURLOPT_VERBOSE',
true)->set(
'curl.CURLOPT_STDERR', $stream);
386 $request = $client->get();
388 $multi->add($request);
391 $multi->add($request);
395 $this->assertNotContains(
'Re-using existing connection', stream_get_contents($stream));
403 $reflector = new \ReflectionMethod(
'Guzzle\Http\Curl\CurlMulti',
'checkCurlResult');
404 $reflector->setAccessible(
true);
407 $reflector->invoke($multi, 0);
411 $reflector->invoke($multi, CURLM_BAD_HANDLE);
412 $this->fail(
'Expected an exception here');
414 $this->assertContains(
'The passed-in handle is not a valid CURLM handle.', $e->getMessage());
415 $this->assertContains(
'CURLM_BAD_HANDLE', $e->getMessage());
416 $this->assertContains(strval(CURLM_BAD_HANDLE), $e->getMessage());
421 $reflector->invoke($multi, 255);
422 $this->fail(
'Expected an exception here');
423 }
catch (CurlException $e) {
424 $this->assertEquals(
'Unexpected cURL error: 255', $e->getMessage());
430 $this->
getServer()->enqueue(
"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n");
433 $request->getEventDispatcher()->addListener(
'request.before_send',
function ($event) use ($that) {
434 $that->assertEquals(0, $event[
'request']->getHeader(
'Content-Length'));
436 $this->multi->add($request);
437 $this->multi->send();
444 "HTTP/1.1 200 OK\r\nContent-Length: 4\r\n\r\ntest",
445 "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"
448 $request = $client->put(
'/',
null, fopen($this->
getServer()->getUrl(),
'r'));
449 $request->setHeader(
'Content-Length', 4);
451 $received = $this->
getServer()->getReceivedRequests(
true);
452 $this->assertFalse($received[1]->hasHeader(
'Transfer-Encoding'));
453 $this->assertEquals(4, (
string) $received[1]->getHeader(
'Content-Length'));