/**
  * Guesses the best matching adapter.
  *
  * @param string|array $preferred The preferred adapters.
  *
  * @throws \Ivory\HttpAdapter\HttpAdapterException If no adapters can be guessed.
  *
  * @return \Ivory\HttpAdapter\HttpAdapterInterface The guessed adapter.
  */
 public static function guess($preferred = array())
 {
     $adapters = self::$adapters;
     foreach ((array) $preferred as $preference) {
         if (self::capable($preference)) {
             return self::create($preference);
         }
         unset($adapters[$preference]);
     }
     foreach (array_keys($adapters) as $name) {
         if (self::capable($name)) {
             return self::create($name);
         }
     }
     throw HttpAdapterException::httpAdaptersAreNotUsable();
 }
예제 #2
0
 /**
  * Fetches a response from an URL.
  *
  * @param string   $url      The url to fetch.
  * @param array    $headers  The http headers.
  * @param callable $callable A callable function executed before fetching the url.
  *
  * @return \Widop\HttpAdapter\HttpResponse The response.
  */
 private function execute($url, array $headers = array(), $callable = null)
 {
     $curl = curl_init();
     curl_setopt($curl, CURLOPT_URL, $this->fixUrl($url));
     curl_setopt($curl, CURLOPT_HEADER, true);
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     if ($this->getMaxRedirects() > 0) {
         curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
         curl_setopt($curl, CURLOPT_MAXREDIRS, $this->getMaxRedirects());
     }
     if (!empty($headers)) {
         curl_setopt($curl, CURLOPT_HTTPHEADER, $this->fixHeaders($headers));
     }
     if ($callable !== null) {
         call_user_func($callable, $curl);
     }
     if (($response = curl_exec($curl)) === false) {
         $error = curl_error($curl);
         curl_close($curl);
         throw HttpAdapterException::cannotFetchUrl($url, $this->getName(), $error);
     }
     $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
     $headersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
     $effectiveUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
     curl_close($curl);
     $headers = substr($response, 0, $headersSize);
     $body = substr($response, $headersSize);
     return $this->createResponse($statusCode, $url, $headers, $body, $effectiveUrl);
 }