/** * {@inheritDoc} */ public function buildSignature(Request $request, Consumer $consumer, Token $token = null) { $signatureBase = $request->getSignatureBaseString(); $parts = [$consumer->secret, null !== $token ? $token->secret : ""]; $parts = Util::urlencodeRfc3986($parts); $key = implode('&', $parts); return base64_encode(hash_hmac('sha1', $signatureBase, $key, true)); }
/** * Builds the Authorization: header * * @return string * @throws TwitterOAuthException */ public function toHeader() { $first = true; $out = 'Authorization: OAuth'; foreach ($this->parameters as $k => $v) { if (substr($k, 0, 5) != "oauth") { continue; } if (is_array($v)) { throw new TwitterOAuthException('Arrays not supported in headers'); } $out .= $first ? ' ' : ', '; $out .= Util::urlencodeRfc3986($k) . '="' . Util::urlencodeRfc3986($v) . '"'; $first = false; } return $out; }
/** * Generates the basic string serialization of a token that a server * would respond to request_token and access_token calls with * * @return string */ public function __toString() { return sprintf("oauth_token=%s&oauth_token_secret=%s", Util::urlencodeRfc3986($this->key), Util::urlencodeRfc3986($this->secret)); }
/** * Make an HTTP request * * @param string $url * @param string $method * @param string $authorization * @param array $postfields * * @return string * @throws TwitterOAuthException */ private function request($url, $method, $authorization, $postfields) { /* Curl settings */ $options = [CURLOPT_CAINFO => __DIR__ . DIRECTORY_SEPARATOR . 'cacert.pem', CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout, CURLOPT_HEADER => true, CURLOPT_HTTPHEADER => ['Accept: application/json', $authorization, 'Expect:'], CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->timeout, CURLOPT_URL => $url, CURLOPT_USERAGENT => $this->userAgent, CURLOPT_ENCODING => 'gzip']; if (!empty($this->proxy)) { $options[CURLOPT_PROXY] = $this->proxy['CURLOPT_PROXY']; $options[CURLOPT_PROXYUSERPWD] = $this->proxy['CURLOPT_PROXYUSERPWD']; $options[CURLOPT_PROXYPORT] = $this->proxy['CURLOPT_PROXYPORT']; $options[CURLOPT_PROXYAUTH] = CURLAUTH_BASIC; $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP; } switch ($method) { case 'GET': break; case 'POST': $options[CURLOPT_POST] = true; $options[CURLOPT_POSTFIELDS] = Util::buildHttpQuery($postfields); break; case 'DELETE': $options[CURLOPT_CUSTOMREQUEST] = 'DELETE'; break; case 'PUT': $options[CURLOPT_CUSTOMREQUEST] = 'PUT'; break; } if (in_array($method, ['GET', 'PUT', 'DELETE']) && !empty($postfields)) { $options[CURLOPT_URL] .= '?' . Util::buildHttpQuery($postfields); } $curlHandle = curl_init(); curl_setopt_array($curlHandle, $options); $response = curl_exec($curlHandle); // Throw exceptions on cURL errors. if (curl_errno($curlHandle) > 0) { throw new TwitterOAuthException(curl_error($curlHandle), curl_errno($curlHandle)); } $this->response->setHttpCode(curl_getinfo($curlHandle, CURLINFO_HTTP_CODE)); $parts = explode("\r\n\r\n", $response); $responseBody = array_pop($parts); $responseHeader = array_pop($parts); $this->response->setHeaders($this->parseHeaders($responseHeader)); curl_close($curlHandle); return $responseBody; }