Beispiel #1
0
 /**
  * {@inheritdoc}
  */
 protected function doSendInternalRequest(InternalRequestInterface $internalRequest)
 {
     $loop = EventLoopFactory::create();
     $dnsResolverFactory = new DnsResolverFactory();
     $httpClientFactory = new HttpClientFactory();
     $error = null;
     $response = null;
     $body = null;
     $request = $httpClientFactory->create($loop, $dnsResolverFactory->createCached('8.8.8.8', $loop))->request($internalRequest->getMethod(), $url = (string) $internalRequest->getUrl(), $this->prepareHeaders($internalRequest, true, true, true));
     $request->on('error', function (\Exception $onError) use(&$error) {
         $error = $onError;
     });
     $request->on('response', function (Response $onResponse) use(&$response, &$body) {
         $onResponse->on('data', function ($data) use(&$body) {
             $body .= $data;
         });
         $response = $onResponse;
     });
     $request->end($this->prepareBody($internalRequest));
     $loop->run();
     if ($error !== null) {
         throw HttpAdapterException::cannotFetchUrl($url, $this->getName(), $error->getMessage());
     }
     return $this->getConfiguration()->getMessageFactory()->createResponse((int) $response->getCode(), $response->getReasonPhrase(), $response->getVersion(), $response->getHeaders(), BodyNormalizer::normalize($body, $internalRequest->getMethod()));
 }
Beispiel #2
0
 /**
  * Prepares the request.
  *
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  * @param string                                              $path            The path.
  * @param string                                              $host            The host.
  * @param integer                                             $port            The port.
  *
  * @return string The prepared request.
  */
 private function prepareRequest(InternalRequestInterface $internalRequest, $path, $host, $port)
 {
     $request = $internalRequest->getMethod() . ' ' . $path . ' HTTP/' . $internalRequest->getProtocolVersion() . "\r\n";
     $request .= 'Host: ' . $host . ($port !== 80 ? ':' . $port : '') . "\r\n";
     $request .= implode("\r\n", $this->prepareHeaders($internalRequest, false, true, true)) . "\r\n\r\n";
     $request .= $this->prepareBody($internalRequest) . "\r\n";
     return $request;
 }
 /**
  * {@inheritdoc}
  */
 protected function doSendInternalRequest(InternalRequestInterface $internalRequest)
 {
     $context = stream_context_create(array('http' => array('follow_location' => false, 'max_redirects' => 1, 'ignore_errors' => true, 'timeout' => $this->getConfiguration()->getTimeout(), 'protocol_version' => $internalRequest->getProtocolVersion(), 'method' => $internalRequest->getMethod(), 'header' => $this->prepareHeaders($internalRequest, false), 'content' => $this->prepareBody($internalRequest))));
     list($body, $headers) = $this->process($url = (string) $internalRequest->getUrl(), $context);
     if ($body === false) {
         $error = error_get_last();
         throw HttpAdapterException::cannotFetchUrl($url, $this->getName(), $error['message']);
     }
     return $this->getConfiguration()->getMessageFactory()->createResponse(StatusCodeExtractor::extract($headers), ReasonPhraseExtractor::extract($headers), ProtocolVersionExtractor::extract($headers), HeadersNormalizer::normalize($headers), BodyNormalizer::normalize($body, $internalRequest->getMethod()));
 }
 /**
  * Prepares the request.
  *
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  *
  * @return string The prepared request.
  */
 private function prepareRequest(InternalRequestInterface $internalRequest)
 {
     $uri = $internalRequest->getUri();
     $path = $uri->getPath() . ($uri->getQuery() ? '?' . $uri->getQuery() : '');
     $request = $internalRequest->getMethod() . ' ' . $path . ' HTTP/' . $internalRequest->getProtocolVersion() . "\r\n";
     $request .= 'Host: ' . $uri->getHost() . ($uri->getPort() !== null ? ':' . $uri->getPort() : '') . "\r\n";
     $request .= implode("\r\n", $this->prepareHeaders($internalRequest, false, true, true)) . "\r\n\r\n";
     $request .= $this->prepareBody($internalRequest) . "\r\n";
     return $request;
 }
Beispiel #5
0
 /**
  * {@inheritdoc}
  */
 protected function doSendInternalRequest(InternalRequestInterface $internalRequest)
 {
     $this->client->resetParameters(true)->setConfig(array('httpversion' => $internalRequest->getProtocolVersion(), 'timeout' => $this->getConfiguration()->getTimeout(), 'maxredirects' => 0))->setUri($url = (string) $internalRequest->getUrl())->setMethod($internalRequest->getMethod())->setHeaders($this->prepareHeaders($internalRequest))->setRawData($this->prepareBody($internalRequest));
     try {
         $response = $this->client->request();
     } catch (\Exception $e) {
         throw HttpAdapterException::cannotFetchUrl($url, $this->getName(), $e->getMessage());
     }
     return $this->getConfiguration()->getMessageFactory()->createResponse($response->getStatus(), $response->getMessage(), $response->getVersion(), $response->getHeaders(), BodyNormalizer::normalize(function () use($response) {
         return $response instanceof \Zend_Http_Response_Stream ? $response->getStream() : $response->getBody();
     }, $internalRequest->getMethod()));
 }
 /**
  * Prepares the content.
  *
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  *
  * @return array|string The prepared content.
  */
 protected function prepareContent(InternalRequestInterface $internalRequest)
 {
     if (!$internalRequest->hasFiles()) {
         return $this->prepareBody($internalRequest);
     }
     $content = array();
     foreach ($internalRequest->getDatas() as $name => $data) {
         $content = array_merge($content, $this->prepareRawContent($name, $data));
     }
     foreach ($internalRequest->getFiles() as $name => $file) {
         $content = array_merge($content, $this->prepareRawContent($name, $file, true));
     }
     return $content;
 }
Beispiel #7
0
 /**
  * {@inheritdoc}
  */
 protected function doSendInternalRequest(InternalRequestInterface $internalRequest)
 {
     $this->httpSocket->config['timeout'] = $this->getConfiguration()->getTimeout();
     $request = array('version' => $this->getConfiguration()->getProtocolVersion(), 'redirect' => false, 'uri' => $url = (string) $internalRequest->getUrl(), 'method' => $internalRequest->getMethod(), 'header' => $this->prepareHeaders($internalRequest), 'body' => $this->prepareBody($internalRequest));
     try {
         $response = $this->httpSocket->request($request);
     } catch (\Exception $e) {
         throw HttpAdapterException::cannotFetchUrl($url, $this->getName(), $e->getMessage());
     }
     if (($error = $this->httpSocket->lastError()) !== null) {
         throw HttpAdapterException::cannotFetchUrl($url, $this->getName(), $error);
     }
     return $this->getConfiguration()->getMessageFactory()->createResponse((int) $response->code, $response->reasonPhrase, ProtocolVersionExtractor::extract($response->httpVersion), $response->headers, BodyNormalizer::normalize($response->body, $internalRequest->getMethod()));
 }
Beispiel #8
0
 /**
  * {@inheritdoc}
  */
 protected function sendInternalRequest(InternalRequestInterface $internalRequest)
 {
     $this->browser->getClient()->setTimeout($this->getConfiguration()->getTimeout());
     $this->browser->getClient()->setMaxRedirects(0);
     $request = $this->browser->getMessageFactory()->createRequest($internalRequest->getMethod(), $uri = (string) $internalRequest->getUri());
     $request->setProtocolVersion($internalRequest->getProtocolVersion());
     $request->setHeaders($this->prepareHeaders($internalRequest, false));
     $data = $this->browser->getClient() instanceof AbstractCurl ? $this->prepareContent($internalRequest) : $this->prepareBody($internalRequest);
     $request->setContent($data);
     try {
         $response = $this->browser->send($request);
     } catch (\Exception $e) {
         throw HttpAdapterException::cannotFetchUri($uri, $this->getName(), $e->getMessage());
     }
     return $this->getConfiguration()->getMessageFactory()->createResponse($response->getStatusCode(), (string) $response->getProtocolVersion(), HeadersNormalizer::normalize($response->getHeaders()), BodyNormalizer::normalize($response->getContent(), $internalRequest->getMethod()));
 }
 /**
  * {@inheritDoc}
  */
 protected function sendInternalRequest(InternalRequestInterface $internalRequest)
 {
     $url = (string) $internalRequest->getUri();
     if ($this->apiKey) {
         $url = str_replace($this->apiKey, '[apikey]', $url);
     }
     $file = sprintf('%s/%s/%s', realpath(__DIR__ . '/../../'), $this->cacheDir, sha1($url));
     if ($this->useCache && is_file($file) && is_readable($file)) {
         $content = unserialize(file_get_contents($file));
         if (!empty($content)) {
             return $this->adapter->getConfiguration()->getMessageFactory()->createResponse(200, RequestInterface::PROTOCOL_VERSION_1_1, [], $content);
         }
     }
     $response = $this->adapter->get($url);
     if ($this->useCache) {
         file_put_contents($file, serialize((string) $response->getBody()));
     }
     return $response;
 }
Beispiel #10
0
 /**
  * {@inheritdoc}
  */
 protected function doSendInternalRequest(InternalRequestInterface $internalRequest)
 {
     $request = Request::init($internalRequest->getMethod())->whenError(function () {
     })->addOnCurlOption(CURLOPT_HTTP_VERSION, $this->prepareProtocolVersion($internalRequest))->timeout($this->getConfiguration()->getTimeout())->uri($url = (string) $internalRequest->getUrl())->addHeaders($this->prepareHeaders($internalRequest))->body($this->prepareContent($internalRequest));
     if (defined('CURLOPT_CONNECTTIMEOUT_MS')) {
         $request->addOnCurlOption(CURLOPT_CONNECTTIMEOUT_MS, $this->getConfiguration()->getTimeout() * 1000);
     } else {
         // @codeCoverageIgnoreStart
         $request->addOnCurlOption(CURLOPT_CONNECTTIMEOUT, $this->getConfiguration()->getTimeout());
     }
     // @codeCoverageIgnoreEnd
     if ($internalRequest->hasFiles()) {
         $request->mime(Mime::UPLOAD);
     }
     try {
         $response = $request->send();
     } catch (\Exception $e) {
         throw HttpAdapterException::cannotFetchUrl($url, $this->getName(), $e->getMessage());
     }
     return $this->getConfiguration()->getMessageFactory()->createResponse($response->code, ReasonPhraseExtractor::extract($response->raw_headers), ProtocolVersionExtractor::extract($response->raw_headers), $response->headers->toArray(), BodyNormalizer::normalize($response->body, $internalRequest->getMethod()));
 }
Beispiel #11
0
 /**
  * {@inheritdoc}
  */
 public function stop(InternalRequestInterface $internalRequest)
 {
     if ($internalRequest->hasParameter(self::START_TIME) && !$internalRequest->hasParameter(self::TIME)) {
         return $internalRequest->withParameter(self::TIME, $this->getTime() - $internalRequest->getParameter(self::START_TIME));
     }
     return $internalRequest;
 }
 /**
  * Gets the stopwatch name.
  *
  * @param \Ivory\HttpAdapter\HttpAdapterInterface             $httpAdapter     The http adapter.
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  *
  * @return string The stopwatch name.
  */
 private function getStopwatchName(HttpAdapterInterface $httpAdapter, InternalRequestInterface $internalRequest)
 {
     return sprintf('ivory.http_adapter.%s (%s)', $httpAdapter->getName(), (string) $internalRequest->getUri());
 }
Beispiel #13
0
 /**
  * {@inheritdoc}
  */
 public function formatRequest(InternalRequestInterface $request)
 {
     return array('protocol_version' => $request->getProtocolVersion(), 'uri' => (string) $request->getUri(), 'method' => $request->getMethod(), 'headers' => $request->getHeaders(), 'body' => (string) $request->getBody(), 'datas' => $request->getDatas(), 'files' => $request->getFiles(), 'parameters' => $request->getParameters());
 }
Beispiel #14
0
 /**
  * {@inheritdoc}
  */
 private function getRootRequest(InternalRequestInterface $internalRequest)
 {
     if ($internalRequest->hasParameter(self::PARENT_REQUEST)) {
         return $this->getRootRequest($internalRequest->getParameter(self::PARENT_REQUEST));
     }
     return $internalRequest;
 }
Beispiel #15
0
 /**
  * {@inheritdoc}
  */
 public function match(InternalRequestInterface $request)
 {
     return $this->matchDomain($request->getUri()->getHost()) && $this->matchPath($request->getUri()->getPath()) && $this->matchScheme($request->getUri()->getScheme());
 }
Beispiel #16
0
 /**
  * {@inheritdoc}
  */
 public function extract(InternalRequestInterface $request, ResponseInterface $response)
 {
     foreach ($response->getHeader('Set-Cookie') as $header) {
         $cookie = $this->cookieFactory->parse($header);
         if (!$cookie->hasAttribute(CookieInterface::ATTR_DOMAIN)) {
             $cookie->setAttribute(CookieInterface::ATTR_DOMAIN, $request->getUri()->getHost());
         }
         $this->addCookie($cookie);
     }
 }
Beispiel #17
0
 /**
  * Prepares the body.
  *
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  *
  * @return string The prepared body.
  */
 protected function prepareBody(InternalRequestInterface $internalRequest)
 {
     if ($internalRequest->hasRawDatas()) {
         return $internalRequest->getRawDatas();
     }
     if (!$internalRequest->hasFiles()) {
         return http_build_query($internalRequest->getDatas(), null, '&');
     }
     $body = '';
     foreach ($internalRequest->getDatas() as $name => $value) {
         $body .= $this->prepareRawBody($name, $value);
     }
     foreach ($internalRequest->getFiles() as $name => $file) {
         $body .= $this->prepareRawBody($name, $file, true);
     }
     $body .= '--' . $this->configuration->getBoundary() . '--' . "\r\n";
     return $body;
 }
Beispiel #18
0
 /**
  * {@inheritdoc}
  */
 public function extract(InternalRequestInterface $request, ResponseInterface $response)
 {
     foreach ($response->getHeaderAsArray('Set-Cookie') as $header) {
         $cookie = $this->cookieFactory->parse($header);
         if (!$cookie->hasAttribute(CookieInterface::ATTR_DOMAIN)) {
             $cookie->setAttribute(CookieInterface::ATTR_DOMAIN, parse_url((string) $request->getUrl(), PHP_URL_HOST));
         }
         $this->addCookie($cookie);
     }
 }
Beispiel #19
0
 /**
  * Creates a request.
  *
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  * @param callable|null                                       $success         The success callable.
  * @param callable|null                                       $error           The error callable.
  *
  * @return \GuzzleHttp\Message\RequestInterface The request.
  */
 private function createRequest(InternalRequestInterface $internalRequest, $success = null, $error = null)
 {
     $request = $this->client->createRequest($internalRequest->getMethod(), (string) $internalRequest->getUrl(), array('exceptions' => false, 'allow_redirects' => false, 'timeout' => $this->getConfiguration()->getTimeout(), 'connect_timeout' => $this->getConfiguration()->getTimeout(), 'version' => $internalRequest->getProtocolVersion(), 'headers' => $this->prepareHeaders($internalRequest), 'body' => $this->prepareContent($internalRequest)));
     if (is_callable($success)) {
         $messageFactory = $this->getConfiguration()->getMessageFactory();
         $request->getEmitter()->on('complete', function (CompleteEvent $event) use($success, $internalRequest, $messageFactory) {
             $response = $messageFactory->createResponse((int) $event->getResponse()->getStatusCode(), $event->getResponse()->getReasonPhrase(), $event->getResponse()->getProtocolVersion(), $event->getResponse()->getHeaders(), BodyNormalizer::normalize(function () use($event) {
                 return new GuzzleHttpStream($event->getResponse()->getBody());
             }, $internalRequest->getMethod()));
             $response->setParameter('request', $internalRequest);
             call_user_func($success, $response);
         });
     }
     if (is_callable($error)) {
         $httpAdapterName = $this->getName();
         $request->getEmitter()->on('error', function (ErrorEvent $event) use($error, $internalRequest, $httpAdapterName) {
             $exception = HttpAdapterException::cannotFetchUrl($event->getException()->getRequest()->getUrl(), $httpAdapterName, $event->getException()->getMessage());
             $exception->setRequest($internalRequest);
             call_user_func($error, $exception);
         });
     }
     return $request;
 }
 /**
  * @param InternalRequestInterface $request
  *
  * @return array
  */
 public function internalRequestToArray(InternalRequestInterface $request)
 {
     /** @var InternalRequestInterface $r */
     $r = $request->withoutParameter('track');
     return ['uri' => (string) $r->getUri(), 'method' => $r->getMethod(), 'protocol_version' => $r->getProtocolVersion(), 'headers' => $r->getHeaders(), 'datas' => $r->getDatas(), 'files' => $r->getFiles(), 'parameters' => $r->getParameters()];
 }
Beispiel #21
0
 /**
  * Checks if the request matches the matcher.
  *
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $request The request.
  *
  * @return boolean TRUE if the request matches the matcher else FALSE.
  */
 private function match(InternalRequestInterface $request)
 {
     return !$this->hasMatcher() || is_string($this->matcher) && preg_match($this->matcher, (string) $request->getUrl()) || is_callable($this->matcher) && call_user_func($this->matcher, $request);
 }
 /**
  * Creates a status code exception.
  *
  * @param \Ivory\HttpAdapter\Message\ResponseInterface        $response        The response.
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  * @param \Ivory\HttpAdapter\HttpAdapterInterface             $httpAdapter     The http adapter.
  *
  * @return \Ivory\HttpAdapter\HttpAdapterException The status code exception.
  */
 private function createStatusCodeException(ResponseInterface $response, InternalRequestInterface $internalRequest, HttpAdapterInterface $httpAdapter)
 {
     $exception = HttpAdapterException::cannotFetchUri((string) $internalRequest->getUri(), $httpAdapter->getName(), sprintf('Status code: %d', $response->getStatusCode()));
     $exception->setRequest($internalRequest);
     $exception->setResponse($response);
     return $exception;
 }
 /**
  * Creates a response.
  *
  * @param resource                                            $curl            The curl resource.
  * @param string|boolean|null                                 $data            The data.
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  *
  * @throws \Ivory\HttpAdapter\HttpAdapterException If an error occurred.
  *
  * @return \Ivory\HttpAdapter\Message\ResponseInterface The response.
  */
 private function createResponse($curl, $data, InternalRequestInterface $internalRequest)
 {
     if (empty($data)) {
         throw HttpAdapterException::cannotFetchUri((string) $internalRequest->getUri(), $this->getName(), curl_error($curl));
     }
     $headers = substr($data, 0, $headersSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE));
     return $this->getConfiguration()->getMessageFactory()->createResponse(StatusCodeExtractor::extract($headers), ProtocolVersionExtractor::extract($headers), HeadersNormalizer::normalize($headers), BodyNormalizer::normalize(substr($data, $headersSize), $internalRequest->getMethod()));
 }
 /**
  * {@inheritdoc}
  */
 protected function doDelay(InternalRequestInterface $request)
 {
     return pow(2, $request->getParameter(RetryInterface::RETRY_COUNT));
 }
 /**
  * {@inheritdoc}
  */
 protected function doDelay(InternalRequestInterface $request)
 {
     return $this->getDelay() * $request->getParameter(RetryInterface::RETRY_COUNT);
 }
Beispiel #26
0
 /**
  * {@inheritdoc}
  */
 protected function doVerify(InternalRequestInterface $request)
 {
     return $request->getParameter(RetryInterface::RETRY_COUNT) < $this->limit;
 }
 /**
  * Creates a request.
  *
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest The internal request.
  * @param callable|null                                       $success         The success callable.
  * @param callable|null                                       $error           The error callable.
  *
  * @return \Ivory\HttpAdapter\Message\RequestInterface The request.
  */
 private function createRequest(InternalRequestInterface $internalRequest, $success = null, $error = null)
 {
     $request = $this->client->createRequest($internalRequest->getMethod(), (string) $internalRequest->getUri(), $this->prepareHeaders($internalRequest), $this->prepareContent($internalRequest), array('exceptions' => false, 'allow_redirects' => false, 'timeout' => $this->getConfiguration()->getTimeout(), 'connect_timeout' => $this->getConfiguration()->getTimeout()));
     $request->setProtocolVersion($internalRequest->getProtocolVersion());
     if (is_callable($success)) {
         $messageFactory = $this->getConfiguration()->getMessageFactory();
         $request->getEventDispatcher()->addListener('request.success', function (Event $event) use($messageFactory, $success, $internalRequest) {
             $response = $messageFactory->createResponse($event['response']->getStatusCode(), $event['response']->getProtocolVersion(), $event['response']->getHeaders()->toArray(), BodyNormalizer::normalize(function () use($event) {
                 $resource = $event['response']->getBody()->getStream();
                 $event['response']->getBody()->detachStream();
                 return $resource;
             }, $internalRequest->getMethod()));
             $response = $response->withParameter('request', $internalRequest);
             call_user_func($success, $response);
         });
     }
     if (is_callable($error)) {
         $httpAdapterName = $this->getName();
         $request->getEventDispatcher()->addListener('request.exception', function (Event $event) use($error, $internalRequest, $httpAdapterName) {
             $exception = HttpAdapterException::cannotFetchUri($event['exception']->getRequest()->getUrl(), $httpAdapterName, $event['exception']->getMessage());
             $exception->setRequest($internalRequest);
             call_user_func($error, $exception);
         });
     }
     return $request;
 }
 /**
  * @param \Ivory\HttpAdapter\Message\InternalRequestInterface $internalRequest
  *
  * @return \GuzzleHttp\Psr7\Request
  */
 private function createRequest(InternalRequestInterface $internalRequest)
 {
     return new Request($internalRequest->getMethod(), $internalRequest->getUri(), $this->prepareHeaders($internalRequest), $this->prepareBody($internalRequest), $internalRequest->getProtocolVersion());
 }
Beispiel #29
0
 /**
  * {@inheritdoc}
  */
 public function match(InternalRequestInterface $request)
 {
     $parts = parse_url((string) $request->getUrl());
     return $this->matchDomain(isset($parts['host']) ? $parts['host'] : null) && $this->matchPath(isset($parts['path']) ? $parts['path'] : null) && $this->matchScheme(isset($parts['scheme']) ? $parts['scheme'] : null);
 }