示例#1
0
 /**
  * @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));
 }
示例#2
0
 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));
 }
示例#3
0
 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);
     }
 }
示例#4
0
 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());
 }