oont-contents/plugins/wp-rocket/inc/Engine/CDN/RocketCDN/APIClient.php
2025-02-08 15:10:23 +01:00

286 lines
6.4 KiB
PHP

<?php
namespace WP_Rocket\Engine\CDN\RocketCDN;
use WP_Error;
/**
* Class to Interact with the RocketCDN API
*/
class APIClient {
const ROCKETCDN_API = 'https://rocketcdn.me/api/';
/**
* Gets current RocketCDN subscription data from cache if it exists
*
* Else do a request to the API to get fresh data
*
* @since 3.5
*
* @return array
*/
public function get_subscription_data() {
$status = get_transient( 'rocketcdn_status' );
if ( false !== $status ) {
return $status;
}
return $this->get_remote_subscription_data();
}
/**
* Gets fresh RocketCDN subscription data from the API
*
* @since 3.5
*
* @return array
*/
private function get_remote_subscription_data() {
$default = [
'id' => 0,
'is_active' => false,
'cdn_url' => '',
'subscription_next_date_update' => 0,
'subscription_status' => 'cancelled',
];
$token = get_option( 'rocketcdn_user_token' );
if ( empty( $token ) ) {
return $default;
}
$args = [
'headers' => [
'Authorization' => 'Token ' . $token,
],
];
$response = wp_remote_get(
self::ROCKETCDN_API . 'website/search/?url=' . home_url(),
$args
);
if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
$this->set_status_transient( $default, 3 * MINUTE_IN_SECONDS );
return $default;
}
$data = wp_remote_retrieve_body( $response );
if ( empty( $data ) ) {
$this->set_status_transient( $default, 3 * MINUTE_IN_SECONDS );
return $default;
}
$data = json_decode( $data, true );
$data = array_intersect_key( (array) $data, $default );
$data = array_merge( $default, $data );
$this->set_status_transient( $data, WEEK_IN_SECONDS );
return $data;
}
/**
* Sets the RocketCDN status transient with the provided value
*
* @since 3.5
*
* @param array $value Transient value.
* @param int $duration Transient duration.
* @return void
*/
private function set_status_transient( $value, $duration ) {
set_transient( 'rocketcdn_status', $value, $duration );
}
/**
* Gets pricing & promotion data for RocketCDN from cache if it exists
*
* Else do a request to the API to get fresh data
*
* @since 3.5
*
* @return array|WP_Error
*/
public function get_pricing_data() {
$pricing = get_transient( 'rocketcdn_pricing' );
if ( false !== $pricing ) {
return $pricing;
}
return $this->get_remote_pricing_data();
}
/**
* Gets fresh pricing & promotion data for RocketCDN
*
* @since 3.5
*
* @return array|WP_Error
*/
private function get_remote_pricing_data() {
$response = wp_remote_get( self::ROCKETCDN_API . 'pricing' );
if ( is_wp_error( $response ) ) {
return $response;
}
if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
return $this->get_wp_error( __( 'We could not fetch the current price because RocketCDN API returned an unexpected error code.', 'rocket' ) );
}
$data = wp_remote_retrieve_body( $response );
if ( empty( $data ) ) {
return $this->get_wp_error( __( 'RocketCDN is not available at the moment. Please retry later.', 'rocket' ) );
}
$data = json_decode( $data, true );
set_transient( 'rocketcdn_pricing', $data, 6 * HOUR_IN_SECONDS );
return $data;
}
/**
* Gets a new WP_Error instance
*
* @since 3.5
*
* @param string $message Error message.
*
* @return WP_Error
*/
private function get_wp_error( string $message ) {
return new WP_Error( 'rocketcdn_error', $message );
}
/**
* Sends a request to the API to purge the CDN cache
*
* @since 3.5
*
* @return array
*/
public function purge_cache_request() {
$subscription = $this->get_subscription_data();
$status = 'error';
if ( ! isset( $subscription['id'] ) || 0 === $subscription['id'] ) {
return [
'status' => $status,
'message' => __( 'RocketCDN cache purge failed: Missing identifier parameter.', 'rocket' ),
];
}
$token = get_option( 'rocketcdn_user_token' );
if ( empty( $token ) ) {
return [
'status' => $status,
'message' => __( 'RocketCDN cache purge failed: Missing user token.', 'rocket' ),
];
}
$args = [
'method' => 'DELETE',
'headers' => [
'Authorization' => 'Token ' . $token,
],
];
$response = wp_remote_request(
self::ROCKETCDN_API . 'website/' . $subscription['id'] . '/purge/',
$args
);
if ( is_wp_error( $response ) ) {
return [
'status' => $status,
'message' => $response->get_error_message(),
];
}
if ( 200 !== wp_remote_retrieve_response_code( $response ) ) {
return [
'status' => $status,
'message' => __( 'RocketCDN cache purge failed: The API returned an unexpected response code.', 'rocket' ),
];
}
$data = wp_remote_retrieve_body( $response );
if ( empty( $data ) ) {
return [
'status' => $status,
'message' => __( 'RocketCDN cache purge failed: The API returned an empty response.', 'rocket' ),
];
}
$data = json_decode( $data );
if ( ! isset( $data->success ) ) {
return [
'status' => $status,
'message' => __( 'RocketCDN cache purge failed: The API returned an unexpected response.', 'rocket' ),
];
}
if ( ! $data->success ) {
return [
'status' => $status,
'message' => sprintf(
// translators: %s = message returned by the API.
__( 'RocketCDN cache purge failed: %s.', 'rocket' ),
isset( $data->message ) ? $data->message : ''
),
];
}
return [
'status' => 'success',
'message' => __( 'RocketCDN cache purge successful.', 'rocket' ),
];
}
/**
* Filter the arguments used in an HTTP request, to make sure our user token has not been overwritten
* by some other plugin.
*
* @since 3.5
*
* @param array $args An array of HTTP request arguments.
* @param string $url The request URL.
* @return array
*/
public function preserve_authorization_token( $args, $url ) {
if ( strpos( $url, self::ROCKETCDN_API ) === false ) {
return $args;
}
if ( empty( $args['headers']['Authorization'] ) && self::ROCKETCDN_API . 'pricing' === $url ) {
return $args;
}
$token = get_option( 'rocketcdn_user_token' );
if ( empty( $token ) ) {
return $args;
}
$value = 'token ' . $token;
if ( isset( $args['headers']['Authorization'] ) && $value === $args['headers']['Authorization'] ) {
return $args;
}
$args['headers']['Authorization'] = $value;
return $args;
}
}