| Viewing file:  RemoteContentRequest.php (9.98 KB)      -rwxr-xr-x Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?php/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
 
 class RemoteContentRequest {
 // these are used for making the request
 private $uri = '';
 // to get real url after signed requests
 private $notSignedUri = '';
 private $method = '';
 private $headers = array();
 private $postBody = false;
 // these fields are filled in once the request has completed
 private $responseContent = false;
 private $responseSize = false;
 private $responseHeaders = array();
 private $metadata = array();
 private $httpCode = false;
 private $httpCodeMsg = '';
 private $contentType = null;
 private $created;
 private $refreshInterval;
 private static $SC_OK = 200; //Please, use only for testing!
 public $handle = false;
 public static $DEFAULT_CONTENT_TYPE = "application/x-www-form-urlencoded; charset=utf-8";
 
 /**
 * @var Options
 */
 private $options;
 
 /**
 * @var SecurityToken
 */
 private $token;
 
 /**
 * @var string
 */
 private $invalidation;
 
 public static $AUTH_NONE = 'none';
 public static $AUTH_SIGNED = 'signed';
 public static $AUTH_OAUTH = 'oauth';
 
 /**
 * @var string
 */
 private $authType;
 
 /**
 * @var OAuthRequestParams
 */
 private $oauthParams = null;
 
 public function __construct($uri, $headers = false, $postBody = false) {
 $this->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;
 }
 }
 
 |