parameters = $parameters; $this->httpMethod = $httpMethod; $this->httpUrl = $httpUrl; } /** * pretty much a helper function to set up the request * * @param Consumer $consumer * @param Token $token * @param string $httpMethod * @param string $httpUrl * @param array $parameters * * @return Request */ public static function fromConsumerAndToken( Consumer $consumer, Token $token = null, $httpMethod, $httpUrl, array $parameters = [] ) { $defaults = [ "oauth_version" => Request::$version, "oauth_nonce" => Request::generateNonce(), "oauth_timestamp" => time(), "oauth_consumer_key" => $consumer->key ]; if (null !== $token) { $defaults['oauth_token'] = $token->key; } $parameters = array_merge($defaults, $parameters); return new Request($httpMethod, $httpUrl, $parameters); } /** * @param string $name * @param string $value */ public function setParameter($name, $value) { $this->parameters[$name] = $value; } /** * @param $name * * @return string|null */ public function getParameter($name) { return isset($this->parameters[$name]) ? $this->parameters[$name] : null; } /** * @return array */ public function getParameters() { return $this->parameters; } /** * @param $name */ public function removeParameter($name) { unset($this->parameters[$name]); } /** * The request parameters, sorted and concatenated into a normalized string. * * @return string */ public function getSignableParameters() { // Grab all parameters $params = $this->parameters; // Remove oauth_signature if present // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") if (isset($params['oauth_signature'])) { unset($params['oauth_signature']); } return Util::buildHttpQuery($params); } /** * Returns the base string of this request * * The base string defined as the method, the url * and the parameters (normalized), each urlencoded * and the concated with &. * * @return string */ public function getSignatureBaseString() { $parts = [ $this->getNormalizedHttpMethod(), $this->getNormalizedHttpUrl(), $this->getSignableParameters() ]; $parts = Util::urlencodeRfc3986($parts); return implode('&', $parts); } /** * Returns the HTTP Method in uppercase * * @return string */ public function getNormalizedHttpMethod() { return strtoupper($this->httpMethod); } /** * parses the url and rebuilds it to be * scheme://host/path * * @return string */ public function getNormalizedHttpUrl() { $parts = parse_url($this->httpUrl); $scheme = $parts['scheme']; $host = strtolower($parts['host']); $path = $parts['path']; return "$scheme://$host$path"; } /** * Builds a url usable for a GET request * * @return string */ public function toUrl() { $postData = $this->toPostdata(); $out = $this->getNormalizedHttpUrl(); if ($postData) { $out .= '?' . $postData; } return $out; } /** * Builds the data one would send in a POST request * * @return string */ public function toPostdata() { return Util::buildHttpQuery($this->parameters); } /** * 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; } /** * @return string */ public function __toString() { return $this->toUrl(); } /** * @param SignatureMethod $signatureMethod * @param Consumer $consumer * @param Token $token */ public function signRequest(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null) { $this->setParameter("oauth_signature_method", $signatureMethod->getName()); $signature = $this->buildSignature($signatureMethod, $consumer, $token); $this->setParameter("oauth_signature", $signature); } /** * @param SignatureMethod $signatureMethod * @param Consumer $consumer * @param Token $token * * @return string */ public function buildSignature(SignatureMethod $signatureMethod, Consumer $consumer, Token $token = null) { return $signatureMethod->buildSignature($this, $consumer, $token); } /** * @return string */ public static function generateNonce() { return md5(microtime() . mt_rand()); } }