/** * 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); }
/** * 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; }
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); }
/** * 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); } }
/** * {@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; } }
/** * 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)); } }
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'], '', '&')); }
/** * {@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; } }
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))); }
/** * @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); } }
/** * 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())); }