Files
2026-04-28 15:13:50 +02:00

258 lines
6.4 KiB
PHP

<?php
/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* 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 FacebookPixelPlugin\FacebookAds\Http\Exception;
use FacebookPixelPlugin\FacebookAds\Exception\Exception;
use FacebookPixelPlugin\FacebookAds\Http\ResponseInterface;
class RequestException extends Exception {
/**
* @var ResponseInterface|null
*/
protected $response;
/**
* @var Headers
*/
protected $headers;
/**
* @var int|null
*/
protected $errorCode;
/**
* @var int|null
*/
protected $errorSubcode;
/**
* @var string|null
*/
protected $errorMessage;
/**
* @var string|null
*/
protected $errorUserTitle;
/**
* @var string|null
*/
protected $errorUserMessage;
/**
* @var int|null
*/
protected $errorType;
/**
* @var array|null
*/
protected $errorBlameFieldSpecs;
/**
* @var string|null
*/
protected $facebookTraceId;
/**
* @param ResponseInterface $response
*/
public function __construct(ResponseInterface $response) {
$this->headers = $response->getHeaders();
$this->response = $response;
$error_data = static::getErrorData($response);
parent::__construct($error_data['message'] ?? '', $error_data['code'] ?? 0);
$this->errorSubcode = $error_data['error_subcode'];
$this->errorUserTitle = $error_data['error_user_title'];
$this->errorUserMessage = $error_data['error_user_msg'];
$this->errorBlameFieldSpecs = $error_data['error_blame_field_specs'];
$this->facebookTraceId = $error_data['fbtrace_id'];
}
/**
* @return ResponseInterface|null
*/
public function getResponse() {
return $this->response;
}
/**
* @param array|string $array
* @param string|int $key
* @param mixed $default
* @return mixed
*/
protected static function idx($array, $key, $default = null) {
if (is_string($array)) {
$array = json_decode($array, true);
}
if (is_null($array)) {
return null;
}
return array_key_exists($key, $array)
? $array[$key]
: $default;
}
/**
* @param ResponseInterface $response
* @return array
*/
protected static function getErrorData(ResponseInterface $response) {
$response_data = $response->getContent();
if (is_null($response_data)) {
$response_data = array();
}
$error_data = static::idx($response_data, 'error', array());
if (is_string(static::idx($error_data, 'error_data'))) {
$error_data["error_data"] =
json_decode(stripslashes(static::idx($error_data, 'error_data')), true);
}
if (is_null(static::idx($error_data, 'error_data'))) {
$error_data["error_data"] = array();
}
return array(
'code' =>
static::idx($error_data, 'code', static::idx($response_data, 'code')),
'error_subcode' => static::idx($error_data, 'error_subcode'),
'message' => static::idx($error_data, 'message'),
'error_user_title' => static::idx($error_data, 'error_user_title'),
'error_user_msg' => static::idx($error_data, 'error_user_msg'),
'error_blame_field_specs' =>
static::idx(static::idx($error_data, 'error_data', array()),
'blame_field_specs'),
'fbtrace_id' => static::idx($error_data, 'fbtrace_id'),
'type' => static::idx($error_data, 'type'),
);
}
/**
* Process an error payload from the Graph API and return the appropriate
* exception subclass.
* @param ResponseInterface $response
* @return RequestException
*/
public static function create(ResponseInterface $response) {
$error_data = static::getErrorData($response);
if (in_array(
$error_data['error_subcode'], array(458, 459, 460, 463, 464, 467))
|| in_array($error_data['code'], array(100, 102, 190))
|| $error_data['type'] === 'OAuthException') {
return new AuthorizationException($response);
} elseif (in_array($error_data['code'], array(1, 2))) {
return new ServerException($response);
} elseif (in_array($error_data['code'], array(4, 17, 341))) {
return new ThrottleException($response);
} elseif ($error_data['code'] == 506) {
return new ClientException($response);
} elseif ($error_data['code'] == 10
|| ($error_data['code'] >= 200 && $error_data['code'] <= 299)) {
return new PermissionException($response);
} else {
return new self($response);
}
}
/**
* @return int
*/
public function getHttpStatusCode() {
return $this->response->getStatusCode();
}
/**
* @return int|null
*/
public function getErrorSubcode() {
return $this->errorSubcode;
}
/**
* @return string|null
*/
public function getErrorUserTitle() {
return $this->errorUserTitle;
}
/**
* @return string|null
*/
public function getErrorUserMessage() {
return $this->errorUserMessage;
}
/**
* @return array|null
*/
public function getErrorBlameFieldSpecs() {
return $this->errorBlameFieldSpecs;
}
/**
* @return string|null
*/
public function getFacebookTraceId() {
return $this->facebookTraceId;
}
/**
* @return bool
*/
public function isTransient() {
if ($this->getResponse() !== null) {
return false;
}
$body = $this->getResponse()->getBody();
return array_key_exists('error', $body)
&& array_key_exists('is_transient', $body['error'])
&& $body['error']['is_transient'];
}
/**
* @return Headers
*/
public function getHeaders() {
return $this->headers;
}
}