Ejemplo n.º 1
0
 /**
  * Sets options on a cURL resource based on a request.
  */
 private static function setOptionsFromRequest($curl, RequestInterface $request)
 {
     $options = array(CURLOPT_HTTP_VERSION => $request->getProtocolVersion() == 1.0 ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => $request->getMethod(), CURLOPT_URL => $request->getHost() . $request->getResource(), CURLOPT_HTTPHEADER => $request->getHeaders());
     switch ($request->getMethod()) {
         case RequestInterface::METHOD_HEAD:
             $options[CURLOPT_NOBODY] = true;
             break;
         case RequestInterface::METHOD_GET:
             $options[CURLOPT_HTTPGET] = true;
             break;
         case RequestInterface::METHOD_POST:
         case RequestInterface::METHOD_PUT:
         case RequestInterface::METHOD_DELETE:
         case RequestInterface::METHOD_PATCH:
         case RequestInterface::METHOD_OPTIONS:
             $options[CURLOPT_POSTFIELDS] = $fields = static::getPostFields($request);
             // remove the content-type header
             if (is_array($fields)) {
                 $options[CURLOPT_HTTPHEADER] = array_filter($options[CURLOPT_HTTPHEADER], function ($header) {
                     return 0 !== stripos($header, 'Content-Type: ');
                 });
             }
             break;
     }
     curl_setopt_array($curl, $options);
 }
Ejemplo n.º 2
0
 /**
  * Converts a request into an array for stream_context_create().
  *
  * @param RequestInterface $request A request object
  *
  * @return array An array for stream_context_create()
  */
 public function getStreamContextArray(RequestInterface $request)
 {
     $options = array('http' => array('method' => $request->getMethod(), 'header' => implode("\r\n", $request->getHeaders()), 'content' => $request->getContent(), 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => $this->getIgnoreErrors(), 'max_redirects' => $this->getMaxRedirects(), 'timeout' => $this->getTimeout()), 'ssl' => array('verify_peer' => $this->getVerifyPeer()));
     if ($this->proxy) {
         $options['http']['proxy'] = $this->proxy;
         $options['http']['request_fulluri'] = true;
     }
     return $options;
 }
Ejemplo n.º 3
0
 public function send(BuzzRequest $buzzRequest, BuzzResponse $buzzResponse)
 {
     $session = session_id();
     $request = Request::create($buzzRequest->getUrl(), $buzzRequest->getMethod());
     $response = static::$kernel->handle($request);
     $buzzResponse->setContent($response->getContent());
     // kernel handling set session_id to empty string
     session_id($session);
 }
 /**
  * @param string|null $message
  */
 public function __construct(RequestInterface $request, Response $response, $message = null)
 {
     $this->request = $request;
     $this->response = $response;
     if ($message === null) {
         $curlError = $response->getHeader('X-Curl-Error-Result');
         $message = sprintf('HTTP %s request to "%s%s" failed: %d - "%s".', $request->getMethod(), $request->getHost(), $request->getResource(), $curlError ?: $response->getStatusCode(), $curlError ? curl_strerror($curlError) : $response->getReasonPhrase());
     }
     parent::__construct($message);
 }
Ejemplo n.º 5
0
 /**
  * Populates uri, method and entityBody used to generate the Authentication header using the specified request object.
  * Appends the Authentication header if it is present and has been able to be calculated.
  *
  * @param RequestInterface $request  A request object
  */
 public function preSend(RequestInterface $request)
 {
     $this->setUri($request->getResource());
     $this->setMethod($request->getMethod());
     $this->setEntityBody($request->getContent());
     $header = $this->getHeader();
     if ($header) {
         $request->addHeader($header);
     }
 }
Ejemplo n.º 6
0
 /**
  * {@inheritDoc}
  *
  * @throws InvalidArgumentException
  */
 public function preSend(RequestInterface $request)
 {
     if (null === $this->method) {
         return;
     }
     switch ($this->method) {
         case Client::AUTH_HTTP_PASSWORD:
             if (!isset($this->options['login'], $this->options['password'])) {
                 throw new InvalidArgumentException('You need to set username with password!');
             }
             $request->addHeader('Authorization: Basic ' . base64_encode($this->options['login'] . ':' . $this->options['password']));
             break;
         case Client::AUTH_HTTP_TOKEN:
             if (!isset($this->options['token'])) {
                 throw new InvalidArgumentException('You need to set OAuth token!');
             }
             $request->addHeader('Authorization: token ' . $this->options['token']);
             break;
         case Client::AUTH_URL_CLIENT_ID:
             if (!isset($this->options['login'], $this->options['password'])) {
                 throw new InvalidArgumentException('You need to set client_id and client_secret!');
             }
             if ('GET' === $request->getMethod()) {
                 $url = $request->getUrl();
                 $parameters = array('client_id' => $this->options['login'], 'client_secret' => $this->options['password']);
                 $url .= (false === strpos($url, '?') ? '?' : '&') . utf8_encode(http_build_query($parameters, '', '&'));
                 $request->fromUrl(new Url($url));
             }
             break;
         case Client::AUTH_URL_TOKEN:
             if (!isset($this->options['token'])) {
                 throw new InvalidArgumentException('You need to set OAuth token!');
             }
             if ('GET' === $request->getMethod()) {
                 $url = $request->getUrl();
                 $parameters = array('access_token' => $this->options['token']);
                 $url .= (false === strpos($url, '?') ? '?' : '&') . utf8_encode(http_build_query($parameters, '', '&'));
                 $request->fromUrl(new Url($url));
             }
             break;
     }
 }
Ejemplo n.º 7
0
 /**
  * PreSend event
  * @param  RequestInterface $request Request object
  */
 public function preSend(RequestInterface $request)
 {
     $url = $request->getUrl();
     $pos = strpos($url, '?');
     if ('GET' === $request->getMethod()) {
         if ($pos !== false) {
             $url .= '&' . utf8_encode(http_build_query($this->params, '', '&'));
         } else {
             $url .= '?' . utf8_encode(http_build_query($this->params, '', '&'));
         }
         $request->fromUrl(new Url($url));
     }
 }
Ejemplo n.º 8
0
 public function preSend(RequestInterface $request)
 {
     if ($request::METHOD_GET !== $request->getMethod() || null === $this->page) {
         return;
     }
     $resource = $request->getResource();
     // Already configured, properly a secondary request
     if (false !== strpos($resource, 'pagelen=') xor false !== strpos($resource, 'limit=')) {
         return;
     }
     $urlComponents = parse_url($resource);
     if (!isset($urlComponents['query'])) {
         $urlComponents['query'] = [];
     } else {
         parse_str($urlComponents['query'], $query);
         $urlComponents['query'] = $query;
     }
     /*
      * Page limiting works as follow (only when perPage is higher then maximum):
      *
      * Divide perPage by two, so each page covers exactly two request.
      * We have a maximum of 100 (unless the limit is disabled) so no crazy math or truncating is required.
      */
     if ('2.0' === $this->client->getApiVersion()) {
         $urlComponents['query']['pagelen'] = null === $this->perPage ? 100 : $this->perPage;
         $urlComponents['query']['page'] = $this->page;
         // BitBucket please fix your API..
         // https://bitbucket.org/site/master/issue/9659/pagelen-sometimes-limited-to-100
         if (false !== strpos($urlComponents['path'], '/pullrequests') && $urlComponents['query']['pagelen'] > 50) {
             $urlComponents['query']['pagelen'] = $urlComponents['query']['pagelen'] / 2;
         }
     } elseif ('1.0' === $this->client->getApiVersion()) {
         if (null === $this->perPage) {
             // Use the maximum
             $limit = 50;
         } elseif ($this->perPage > 50) {
             // Divide perPage by two, so each page covers exactly two request (no crazy math or truncating).
             $limit = $this->perPage / 2;
         } else {
             $limit = $this->perPage;
         }
         $urlComponents['query']['limit'] = $limit;
         $urlComponents['query']['start'] = abs($this->page - 1) * $limit;
     }
     $request->setResource($urlComponents['path'] . '?' . http_build_query($urlComponents['query'], '', '&'));
 }
Ejemplo n.º 9
0
 /**
  * {@inheritDoc}
  */
 public function preSend(RequestInterface $request)
 {
     switch ($this->method) {
         case Client::AUTH_HTTP_PASSWORD:
             $request->addHeader('Authorization: Basic ' . base64_encode($this->options['login'] . ':' . $this->options['password']));
             break;
         case Client::AUTH_HTTP_TOKEN:
             $request->addHeader('Authorization: token ' . $this->options['token']);
             break;
         case Client::AUTH_URL_TOKEN:
         default:
             $url = $request->getUrl();
             if ('GET' === $request->getMethod()) {
                 $parameters = array('access_token' => $this->options['token']);
                 $url .= '?' . utf8_encode(http_build_query($parameters, '', '&'));
             }
             $request->fromUrl(new Url($url));
             break;
     }
 }
Ejemplo n.º 10
0
 public function postSend(RequestInterface $request, MessageInterface $response)
 {
     $seconds = microtime(true) - $this->startTime;
     call_user_func($this->logger, sprintf('%sSent "%s %s%s" in %dms', $this->prefix, $request->getMethod(), $request->getHost(), $request->getResource(), round($seconds * 1000)));
 }
Ejemplo n.º 11
0
 /**
  * @param AntiMattr\OAuth\OAuth         $oauth
  * @param Buzz\Message\RequestInterface $request
  *
  * @throws RuntimeException
  */
 protected function attachOAuthSignature(OAuth $oauth, RequestInterface $request)
 {
     $method = $request->getMethod();
     $url = new Url($request->getUrl());
     $parameters = $url->query->getData();
     if ($request instanceof FormRequestInterface) {
         $fields = $request->getFields();
         $parameters = array_merge($fields, $parameters);
     }
     // Parameters are sorted by name, using lexicographical byte value ordering.
     // Ref: Spec: 9.1.1 (1)
     uksort($parameters, 'strcmp');
     // Validate required parameters
     foreach (array('oauth_consumer_key', 'oauth_timestamp', 'oauth_nonce', 'oauth_version', 'oauth_signature_method') as $parameter) {
         if (!isset($parameters[$parameter])) {
             throw new RuntimeException(sprintf('Parameter "%s" must be set.', $parameter));
         }
     }
     // Remove oauth_signature if present
     // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.")
     if (isset($parameters['oauth_signature'])) {
         unset($parameters['oauth_signature']);
     }
     // Remove default ports
     // Ref: Spec: 9.1.2
     $explicitPort = $url->has('port') ? $url->get('port') : null;
     if ('https' === $url->get('scheme') && 443 === $explicitPort || 'http' === $url->get('scheme') && 80 === $explicitPort) {
         $explicitPort = null;
     }
     // Remove query params from URL
     // Ref: Spec: 9.1.2
     $urlString = sprintf('%s://%s%s%s', $url->get('scheme'), $url->get('host'), $explicitPort ? ':' . $explicitPort : '', $url->has('path') ? $url->get('path') : '');
     // Parameters are sorted by name, using lexicographical byte value ordering.
     // Ref: Spec: 9.1.1 (1)
     uksort($parameters, 'strcmp');
     // http_build_query should use RFC3986
     $parts = array(strtoupper($method), rawurlencode($urlString), rawurlencode(str_replace(array('%7E', '+'), array('~', '%20'), http_build_query($parameters, '', '&'))));
     $baseString = implode('&', $parts);
     $signatureMethod = $oauth->getSignatureMethod();
     $consumerSecret = $oauth->getConsumerSecret();
     $oAuthTokenSecret = $oauth->getOAuthTokenSecret();
     switch ($signatureMethod) {
         case OAuth::SIGNATURE_METHOD_HMAC:
             $keyParts = array(rawurlencode($consumerSecret), rawurlencode($oAuthTokenSecret));
             $signature = hash_hmac('sha1', $baseString, implode('&', $keyParts), true);
             break;
         case OAuth::SIGNATURE_METHOD_RSA:
             if (!function_exists('openssl_pkey_get_private')) {
                 throw new RuntimeException('RSA-SHA1 signature method requires the OpenSSL extension.');
             }
             $privateKey = openssl_pkey_get_private(file_get_contents($consumerSecret), $oAuthTokenSecret);
             $signature = false;
             openssl_sign($baseString, $signature, $privateKey);
             openssl_free_key($privateKey);
             break;
         case OAuth::SIGNATURE_METHOD_PLAINTEXT:
             $signature = $baseString;
             break;
         default:
             throw new RuntimeException(sprintf('Unknown signature method selected %s.', $signatureMethod));
     }
     $encoded = base64_encode($signature);
     if ($request instanceof FormRequestInterface) {
         $fields = $request->getFields();
         $fields['oauth_signature'] = $encoded;
         // Parameters are sorted by name, using lexicographical byte value ordering.
         // Ref: Spec: 9.1.1 (1)
         uksort($fields, 'strcmp');
         $request->setFields($fields);
     } else {
         $parameters['oauth_signature'] = $encoded;
         // Parameters are sorted by name, using lexicographical byte value ordering.
         // Ref: Spec: 9.1.1 (1)
         uksort($parameters, 'strcmp');
         $url->query->setData($parameters);
         $url = $url->getUrl();
         $request->fromUrl($url);
     }
 }
Ejemplo n.º 12
0
 /**
  * Converts a request into an array for stream_context_create().
  *
  * @param RequestInterface $request A request object
  *
  * @return array An array for stream_context_create()
  */
 public function getStreamContextArray(RequestInterface $request)
 {
     return array('http' => array('method' => $request->getMethod(), 'header' => implode("\r\n", $request->getHeaders()), 'content' => $request->getContent(), 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => $this->getIgnoreErrors(), 'max_redirects' => $this->getMaxRedirects(), 'timeout' => $this->getTimeout()), 'ssl' => array('verify_peer' => $this->getVerifyPeer()));
 }
 public function postSend(RequestInterface $request, MessageInterface $response)
 {
     $this->data[] = array('request' => array('method' => $request->getMethod(), 'url' => sprintf('%s%s', $request->getHost(), $request->getResource()), 'headers' => $request->getHeaders(), 'content' => $request->getContent()), 'response' => array('statusCode' => $response->getStatusCode(), 'reasonPhrase' => $response->getReasonPhrase(), 'headers' => $response->getHeaders(), 'content' => $response->getContent()));
 }