/** * @internal * * @param array $request * * @return array */ public function _invokeAsArray(array $request) { $factory = $this->factory; // Ensure headers are by reference. They're updated elsewhere. $result = $factory($request, curl_init()); $h = $result[0]; $hd =& $result[1]; $body = $result[2]; Core::doSleep($request); try { // override the default body stream with the request response $safecurl = new SafeCurl($h); $body = $safecurl->execute(Core::url($request)); } catch (Exception $e) { // URL wasn't safe, return empty content $body = ''; $safeCurlError = $e->getMessage(); } $response = ['transfer_stats' => curl_getinfo($h)]; $response['curl']['error'] = curl_error($h); $response['curl']['errno'] = curl_errno($h); $response['transfer_stats'] = array_merge($response['transfer_stats'], $response['curl']); curl_close($h); // override default error message in case of SafeCurl error if (isset($safeCurlError)) { $response['err_message'] = $safeCurlError; } return CurlFactory::createResponse([$this, '_invokeAsArray'], $request, $response, $hd, Stream::factory($body)); }
public function __invoke(array $request) { $factory = $this->factory; // Ensure headers are by reference. They're updated elsewhere. $result = $factory($request, $this->checkoutEasyHandle()); $h = $result[0]; $hd =& $result[1]; $bd = $result[2]; Core::doSleep($request); curl_exec($h); $response = ['transfer_stats' => curl_getinfo($h)]; $response['curl']['error'] = curl_error($h); $response['curl']['errno'] = curl_errno($h); $this->releaseEasyHandle($h); return new CompletedFutureArray(CurlFactory::createResponse($this, $request, $response, $hd, $bd)); }
private function processMessages() { while ($done = curl_multi_info_read($this->mh)) { $id = (int) $done['handle']; if (!isset($this->handles[$id])) { // Probably was cancelled. continue; } $entry = $this->handles[$id]; $entry['response']['transfer_stats'] = curl_getinfo($done['handle']); if ($done['result'] !== CURLM_OK) { $entry['response']['curl']['errno'] = $done['result']; if (function_exists('curl_strerror')) { $entry['response']['curl']['error'] = curl_strerror($done['result']); } } $result = CurlFactory::createResponse($this, $entry['request'], $entry['response'], $entry['headers'], $entry['body']); $this->removeProcessed($id); $entry['deferred']->resolve($result); } }
public function testFailsWhenRetryMoreThanThreeTimes() { $call = 0; $mock = new MockHandler(function (array $request) use(&$mock, &$call) { $call++; return CurlFactory::createResponse($mock, $request, [], [], null); }); $response = $mock(['http_method' => 'GET', 'body' => 'test']); $this->assertEquals(3, $call); $this->assertArrayHasKey('error', $response); $this->assertContains('The cURL request was retried 3 times', $response['error']->getMessage()); }