Вход Регистрация
Файл: includes/library/auth/Facebook/FacebookRequest.php
Строк: 274
<?php
/**
 * Copyright 2014 Facebook, Inc.
 *
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
 * use, copy, modify, and distribute this software in source code or binary
 * form for use in connection with the web services and APIs provided by
 * Facebook.
 *
 * As with any software that integrates with the Facebook platform, your use
 * of this software is subject to the Facebook Developer Principles and
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
 * shall be included in all copies or substantial portions of the software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 */
namespace Facebook;

use 
FacebookHttpClientsFacebookHttpable;
use 
FacebookHttpClientsFacebookCurlHttpClient;
use 
FacebookHttpClientsFacebookStreamHttpClient;

/**
 * Class FacebookRequest
 * @package Facebook
 * @author Fosco Marotto <fjm@fb.com>
 * @author David Poll <depoll@fb.com>
 */
class FacebookRequest
{

  
/**
   * @const string Version number of the Facebook PHP SDK.
   */
  
const VERSION '4.0.11';

  
/**
   * @const string Default Graph API version for requests
   */
  
const GRAPH_API_VERSION 'v2.0';

  
/**
   * @const string Graph API URL
   */
  
const BASE_GRAPH_URL 'https://graph.facebook.com';

  
/**
   * @var FacebookSession The session used for this request
   */
  
private $session;

  
/**
   * @var string The HTTP method for the request
   */
  
private $method;

  
/**
   * @var string The path for the request
   */
  
private $path;

  
/**
   * @var array The parameters for the request
   */
  
private $params;

  
/**
   * @var string The Graph API version for the request
   */
  
private $version;

  
/**
   * @var string ETag sent with the request
   */
  
private $etag;

  
/**
   * @var FacebookHttpable HTTP client handler
   */
  
private static $httpClientHandler;

  
/**
   * @var int The number of calls that have been made to Graph.
   */
  
public static $requestCount 0;

  
/**
   * getSession - Returns the associated FacebookSession.
   *
   * @return FacebookSession
   */
  
public function getSession()
  {
    return 
$this->session;
  }

  
/**
   * getPath - Returns the associated path.
   *
   * @return string
   */
  
public function getPath()
  {
    return 
$this->path;
  }

  
/**
   * getParameters - Returns the associated parameters.
   *
   * @return array
   */
  
public function getParameters()
  {
    return 
$this->params;
  }

  
/**
   * getMethod - Returns the associated method.
   *
   * @return string
   */
  
public function getMethod()
  {
    return 
$this->method;
  }

  
/**
   * getETag - Returns the ETag sent with the request.
   *
   * @return string
   */
  
public function getETag()
  {
    return 
$this->etag;
  }

  
/**
   * setHttpClientHandler - Returns an instance of the HTTP client
   * handler
   *
   * @param FacebookHttpClientsFacebookHttpable
   */
  
public static function setHttpClientHandler(FacebookHttpable $handler)
  {
    static::
$httpClientHandler $handler;
  }

  
/**
   * getHttpClientHandler - Returns an instance of the HTTP client
   * data handler
   *
   * @return FacebookHttpable
   */
  
public static function getHttpClientHandler()
  {
    if (static::
$httpClientHandler) {
      return static::
$httpClientHandler;
    }
    return 
function_exists('curl_init') ? new FacebookCurlHttpClient() : new FacebookStreamHttpClient();
  }

  
/**
   * FacebookRequest - Returns a new request using the given session.  optional
   *   parameters hash will be sent with the request.  This object is
   *   immutable.
   *
   * @param FacebookSession $session
   * @param string $method
   * @param string $path
   * @param array|null $parameters
   * @param string|null $version
   * @param string|null $etag
   */
  
public function __construct(
    
FacebookSession $session$method$path$parameters null$version null$etag null
  
)
  {
    
$this->session $session;
    
$this->method $method;
    
$this->path $path;
    if (
$version) {
      
$this->version $version;
    } else {
      
$this->version = static::GRAPH_API_VERSION;
    }
    
$this->etag $etag;

    
$params = ($parameters ?: array());
    if (
$session
      
&& !isset($params["access_token"])) {
      
$params["access_token"] = $session->getToken();
    }
    if (
FacebookSession::useAppSecretProof()
      && !isset(
$params["appsecret_proof"])) {
      
$params["appsecret_proof"] = $this->getAppSecretProof(
        
$params["access_token"]
      );
    }
    
$this->params $params;
  }

  
/**
   * Returns the base Graph URL.
   *
   * @return string
   */
  
protected function getRequestURL()
  {
    return static::
BASE_GRAPH_URL '/' $this->version $this->path;
  }

  
/**
   * execute - Makes the request to Facebook and returns the result.
   *
   * @return FacebookResponse
   *
   * @throws FacebookSDKException
   * @throws FacebookRequestException
   */
  
public function execute()
  {
    
$url $this->getRequestURL();
    
$params $this->getParameters();

    if (
$this->method === "GET") {
      
$url self::appendParamsToUrl($url$params);
      
$params = array();
    }

    
$connection self::getHttpClientHandler();
    
$connection->addRequestHeader('User-Agent''fb-php-' self::VERSION);
    
$connection->addRequestHeader('Accept-Encoding''*'); // Support all available encodings.

    // ETag
    
if (isset($this->etag)) {
      
$connection->addRequestHeader('If-None-Match'$this->etag);
    }

    
// Should throw `FacebookSDKException` exception on HTTP client error.
    // Don't catch to allow it to bubble up.
    
$result $connection->send($url$this->method$params);

    static::
$requestCount++;

    
$etagHit 304 == $connection->getResponseHttpStatusCode();

    
$headers $connection->getResponseHeaders();
    
$etagReceived = isset($headers['ETag']) ? $headers['ETag'] : null;

    
$decodedResult json_decode($result);
    if (
$decodedResult === null) {
      
$out = array();
      
parse_str($result$out);
      return new 
FacebookResponse($this$out$result$etagHit$etagReceived);
    }
    if (isset(
$decodedResult->error)) {
      throw 
FacebookRequestException::create(
        
$result,
        
$decodedResult->error,
        
$connection->getResponseHttpStatusCode()
      );
    }

    return new 
FacebookResponse($this$decodedResult$result$etagHit$etagReceived);
  }

  
/**
   * Generate and return the appsecret_proof value for an access_token
   *
   * @param string $token
   *
   * @return string
   */
  
public function getAppSecretProof($token)
  {
    return 
hash_hmac('sha256'$tokenFacebookSession::_getTargetAppSecret());
  }

  
/**
   * appendParamsToUrl - Gracefully appends params to the URL.
   *
   * @param string $url
   * @param array $params
   *
   * @return string
   */
  
public static function appendParamsToUrl($url$params = array())
  {
    if (!
$params) {
      return 
$url;
    }

    if (
strpos($url'?') === false) {
      return 
$url '?' http_build_query($paramsnull'&');
    }

    list(
$path$query_string) = explode('?'$url2);
    
parse_str($query_string$query_array);

    
// Favor params from the original URL over $params
    
$params array_merge($params$query_array);

    return 
$path '?' http_build_query($paramsnull'&');
  }

}
Онлайн: 0
Реклама