mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-02-24 06:47:05 +08:00
313 lines
7.6 KiB
PHP
313 lines
7.6 KiB
PHP
<?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 Facebook\HttpClients\FacebookHttpable;
|
|
use Facebook\HttpClients\FacebookCurlHttpClient;
|
|
use Facebook\HttpClients\FacebookStreamHttpClient;
|
|
|
|
/**
|
|
* 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.9';
|
|
|
|
/**
|
|
* @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 \Facebook\HttpClients\FacebookHttpable
|
|
*/
|
|
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', $token, FacebookSession::_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($params, null, '&');
|
|
}
|
|
|
|
list($path, $query_string) = explode('?', $url, 2);
|
|
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($params, null, '&');
|
|
}
|
|
|
|
}
|