uri = $uri; $this->notSignedUri = $uri; $this->headers = $headers; $this->postBody = $postBody; $this->created = time(); $this->authType = self::$AUTH_NONE; } public function createRemoteContentRequest($method, $uri, $headers, $postBody, $options) { $this->method = $method; $this->uri = $uri; $this->options = $options; // Copy the headers if (! isset($headers)) { $this->headers = ''; } else { $setPragmaHeader = false; $tmpHeaders = ''; foreach ($headers as $key => $value) { // Proxies should be bypassed with the Pragma: no-cache check. if ($key == "Pragma" && $options->ignoreCache) { $value = "no-cache"; $setPragmaHeader = true; } $tmpHeaders .= $key . ":" . $value . "\n"; } // Bypass caching in proxies as well. if (! $setPragmaHeader && $options->ignoreCache) { $tmpHeaders .= "Pragma: no-cache\n"; } $this->headers = $tmpHeaders; } if (! isset($postBody)) { $this->postBody = ''; } else { $this->postBody = array_merge($postBody, $this->postBody); } $type = $this->getHeader("Content-Type"); if (! isset($type)) { $this->contentType = RemoteContentRequest::$DEFAULT_CONTENT_TYPE; } else { $this->contentType = $type; } } /** * Basic GET request. * * @param uri */ public function createRemoteContentRequestWithUri($uri) { $this->createRemoteContentRequest("GET", $uri, null, null, RemoteContentRequest::getDefaultOptions()); } /** * Returns a hash code which identifies this request, used for caching, takes method, url, authType and headers * into account for constructing the md5 checksum * NOTE: the postBody is excluded so that the GadgetHrefRenderer can use cached requests without having to * fetch the data-pipeling social data first * @return string md5 checksum */ public function toHash() { return md5($this->method . $this->uri . $this->authType . $this->headers); } public static function getDefaultOptions() { return new Options(); } public function getContentType() { return $this->contentType; } public function getHttpCode() { return $this->httpCode; } public function getHttpCodeMsg() { return $this->httpCodeMsg; } public function getResponseContent() { return $this->responseContent; } public function getResponseHeaders() { return $this->responseHeaders; } public function getResponseSize() { return $this->responseSize; } public function getHeaders() { return $this->headers; } public function isPost() { return ($this->postBody != false); } public function hasHeaders() { return ! empty($this->headers); } public function getPostBody() { return $this->postBody; } public function getUrl() { return $this->uri; } public function getNotSignedUrl() { return $this->notSignedUri; } public function getMethod() { if ($this->method) { return $this->method; } if ($this->postBody) { return 'POST'; } else { return 'GET'; } } public function setMethod($method) { $this->method = $method; } /** * @return Options */ public function getOptions() { if (empty($this->options)) { $this->options = new Options(); } return $this->options; } public function setContentType($type) { $this->contentType = $type; } public function setHttpCode($code) { $this->httpCode = intval($code); } public function setHttpCodeMsg($msg) { $this->httpCodeMsg = $msg; } public function setResponseContent($content) { $this->responseContent = $content; } public function setResponseHeader($headerName, $headerValue) { $this->responseHeaders[$headerName] = $headerValue; } public function setResponseHeaders($headers) { $this->responseHeaders = $headers; } public function setResponseSize($size) { $this->responseSize = intval($size); } public function setHeaders($headers) { $this->headers = $headers; } //FIXME: Find a better way to do this // The headers can be an array of elements. public function getHeader($headerName) { $headers = explode("\n", $this->headers); foreach ($headers as $header) { $key = explode(":", $header, 2); if (strtolower(trim($key[0])) == strtolower($headerName)) return trim($key[1]); } return null; } public function getResponseHeader($headerName) { return isset($this->responseHeaders[$headerName]) ? $this->responseHeaders[$headerName] : null; } public function getCreated() { return $this->created; } public function setPostBody($postBody) { $this->postBody = $postBody; } public function setUri($uri) { $this->uri = $uri; } public function setNotSignedUri($uri) { $this->notSignedUri = $uri; } public function setInvalidation($invalidation) { $this->invalidation = $invalidation; } public function getInvalidation() { return $this->invalidation; } /** * Sets the security token to use (used if the request has authorization set (signed, oauth)) * @param SecurityToken $token */ public function setToken($token) { $this->token = $token; } /** * Returns the SecurityToken for this request * * @return SecurityToken */ public function getToken() { return $this->token; } public function setOAuthRequestParams(OAuthRequestParams $params) { $this->oauthParams = $params; } /** * @return OAuthRequestParams */ public function getOAuthRequestParams() { return $this->oauthParams; } /** * Sets the authorization type for this request, can be one of * - none, no signing or authorization * - signed, sign the request with an oauth_signature * - oauth, logges in to the remote oauth service and uses it as base for signing the requests * * @param string $type ('none', 'signed', 'oauth') */ public function setAuthType($type) { $this->authType = $type; } /** * Returns the auth type of the request * * @return string ('none', 'signed', 'oauth') */ public function getAuthType() { return $this->authType; } /** * Sets the cache refresh interval to use for this request * * @param int $refreshInterval (in seconds) */ public function setRefreshInterval($refreshInterval) { $this->refreshInterval = $refreshInterval; } /** * Returns the cache's refresh interval for this request * * @return int refreshInterval (in seconds) */ public function getRefreshInterval() { return $this->refreshInterval; } public function setMetadata($key, $value) { $this->metadata[$key] = $value; } public function getMetadatas() { return $this->metadata; } public function isStrictNoCache() { $cacheControl = $this->getResponseHeader('Cache-Control'); if ($cacheControl != null) { $directives = explode(',', $cacheControl); foreach ($directives as $directive) { if (strcasecmp($directive, 'no-cache') == 0 || strcasecmp($directive, 'no-store') == 0 || strcasecmp($directive, 'private') == 0) { return true; } } } $progmas = $this->getResponseHeader('Progma'); if ($progmas != null) { foreach ($progmas as $progma) { if (strcasecmp($progma, 'no-cache') == 0) { return true; } } } return false; } } /** * Bag of options for making a request. * * This object is mutable to keep us sane. Don't mess with it once you've * sent it to RemoteContentRequest or bad things might happen. */ class Options { public $ignoreCache = false; public $ownerSigned = true; public $viewerSigned = true; public function __construct() {} /** * Copy constructor */ public function copyOptions(Options $copyFrom) { $this->ignoreCache = $copyFrom->ignoreCache; $this->ownerSigned = $copyFrom->ownerSigned; $this->viewerSigned = $copyFrom->viewerSigned; } }