250 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			250 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace W3TC;
 | |
| 
 | |
| require_once(W3TC_LIB_DIR . '/OAuth/W3tcOAuth.php');
 | |
| require_once(W3TC_LIB_NETDNA_DIR . '/W3tcWpHttpException.php');
 | |
| 
 | |
| /**
 | |
|  * StackPath REST Client Library
 | |
|  */
 | |
| class Cdn_StackPath_Api {
 | |
| 	private $alias;
 | |
| 	private $key;
 | |
| 	private $secret;
 | |
| 	private $stackpath_api_url = 'https://api.stackpath.com/v1';
 | |
| 
 | |
| 
 | |
| 
 | |
| 	static public function create( $authorization_key ) {
 | |
| 		$keys = explode( '+', $authorization_key );
 | |
| 		$alias = '';
 | |
| 		$consumerkey = '';
 | |
| 		$consumersecret = '';
 | |
| 
 | |
| 		if ( sizeof( $keys ) == 3 ) {
 | |
| 			list( $alias, $consumerkey, $consumersecret ) = $keys;
 | |
| 		}
 | |
| 
 | |
| 		$api = new Cdn_StackPath_Api( $alias, $consumerkey, $consumersecret,
 | |
| 			$endpoint );
 | |
| 		return $api;
 | |
| 	}
 | |
| 
 | |
| 	public function __construct( $alias, $key, $secret ) {
 | |
| 		$this->alias  = $alias;
 | |
| 		$this->key    = $key;
 | |
| 		$this->secret = $secret;
 | |
| 	}
 | |
| 
 | |
| 	public function is_valid() {
 | |
| 		return !empty( $this->alias ) && !empty( $this->key ) &&
 | |
| 			!empty( $this->secret );
 | |
| 	}
 | |
| 
 | |
| 	private function execute( $selected_call, $method_type, $params ) {
 | |
| 		//increase the http request timeout
 | |
| 		add_filter( 'http_request_timeout', array( $this, 'filter_timeout_time' ) );
 | |
| 		add_filter( 'https_ssl_verify', array( $this, 'https_ssl_verify' ) );
 | |
| 
 | |
| 		$consumer = new \W3tcOAuthConsumer( $this->key, $this->secret, NULL );
 | |
| 
 | |
| 		// the endpoint for your request
 | |
| 		$endpoint = "$this->stackpath_api_url/$this->alias$selected_call";
 | |
| 
 | |
| 		//parse endpoint before creating OAuth request
 | |
| 		$parsed = parse_url( $endpoint );
 | |
| 		if ( array_key_exists( "parsed", $parsed ) ) {
 | |
| 			parse_str( $parsed['query'], $params );
 | |
| 		}
 | |
| 
 | |
| 		//generate a request from your consumer
 | |
| 		$req_req = \W3tcOAuthRequest::from_consumer_and_token(
 | |
| 			$consumer, NULL, $method_type, $endpoint, $params );
 | |
| 
 | |
| 		//sign your OAuth request using hmac_sha1
 | |
| 		$sig_method = new \W3tcOAuthSignatureMethod_HMAC_SHA1();
 | |
| 		$req_req->sign_request( $sig_method, $consumer, NULL );
 | |
| 
 | |
| 		$request = array();
 | |
| 		$request['sslverify'] = false;
 | |
| 		$request['method'] = $method_type;
 | |
| 
 | |
| 		if ( $method_type == "POST" || $method_type == "PUT" ) {
 | |
| 			$request['body'] = $req_req->to_postdata();
 | |
| 			$request['headers']['Content-Type'] =
 | |
| 				'application/x-www-form-urlencoded; charset=' .
 | |
| 				get_option('blog_charset');
 | |
| 
 | |
| 			$url = $req_req->get_normalized_http_url();
 | |
| 		} else {
 | |
| 			// notice GET, PUT and DELETE both needs to be passed in URL
 | |
| 			$url = $req_req->to_url();
 | |
| 		}
 | |
| 
 | |
| 		$response = wp_remote_request( $url, $request );
 | |
| 
 | |
| 		$json_output = '';
 | |
| 		if ( !is_wp_error( $response ) ) {
 | |
| 		// make call
 | |
| 			$result =  wp_remote_retrieve_body( $response );
 | |
| 			$headers =  wp_remote_retrieve_headers( $response );
 | |
| 			$response_code = wp_remote_retrieve_response_code( $response );
 | |
| 			// $json_output contains the output string
 | |
| 			$json_output = $result;
 | |
| 		} else {
 | |
| 			$response_code = $response->get_error_code();
 | |
| 		}
 | |
| 
 | |
| 		remove_filter( 'https_ssl_verify', array( $this, 'https_ssl_verify' ) );
 | |
| 		remove_filter( 'http_request_timeout', array( $this, 'filter_timeout_time' ) );
 | |
| 
 | |
| 		// catch errors
 | |
| 		if ( is_wp_error( $response ) ) {
 | |
| 			throw new \W3tcWpHttpException(
 | |
| 				"ERROR: {$response->get_error_message()}, Output: $json_output",
 | |
| 				$response_code, null, $headers );
 | |
| 		}
 | |
| 
 | |
| 		return $json_output;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Increase http request timeout to 60 seconds
 | |
| 	 */
 | |
| 	public function filter_timeout_time($time) {
 | |
| 		return 600;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Don't check certificate, some users have limited CA list
 | |
| 	 */
 | |
| 	public function https_ssl_verify($v) {
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	private function execute_await_200( $selected_call, $method_type, $params ) {
 | |
| 		$r = json_decode( $this->execute( $selected_call, $method_type, $params ),
 | |
| 			true );
 | |
| 		if ( !preg_match( '(200|201)', $r['code'] ) ) {
 | |
| 			throw $this->to_exception( $r );
 | |
| 		}
 | |
| 		return $r;
 | |
| 	}
 | |
| 
 | |
| 	private function get( $selected_call, $params = array() ) {
 | |
| 		return $this->execute_await_200( $selected_call, 'GET', $params );
 | |
| 	}
 | |
| 
 | |
| 	private function post( $selected_call, $params = array() ) {
 | |
| 		return $this->execute_await_200( $selected_call, 'POST', $params );
 | |
| 	}
 | |
| 
 | |
| 	private function put( $selected_call, $params = array() ) {
 | |
| 		return $this->execute_await_200( $selected_call, 'PUT', $params );
 | |
| 	}
 | |
| 
 | |
| 	private function delete( $selected_call, $params = array() ) {
 | |
| 		return $this->execute_await_200( $selected_call, 'DELETE', $params );
 | |
| 	}
 | |
| 
 | |
| 	private function to_exception($response) {
 | |
| 		if ( isset( $response['error']['message'] ) ) {
 | |
| 			$message = $response['error']['message'];
 | |
| 		} else {
 | |
| 			$message = 'Failed to communicate with StackPath';
 | |
| 		}
 | |
| 
 | |
| 		if ( isset( $response['data'] ) && isset( $response['data']['errors'] ) ) {
 | |
| 			foreach ( $response['data']['errors'] as $field => $error ) {
 | |
| 				if ( isset( $error['error'] ) ) {
 | |
| 					$message .= '. ' . $field . ': ' . $error['error'];
 | |
| 				} else {
 | |
| 					$message .= '. ' . $field . ': ' . $error;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return new \W3tcWpHttpException($message);
 | |
| 	}
 | |
| 
 | |
| 	public function get_sites() {
 | |
| 		$r = $this->get( '/sites' );
 | |
| 		$zones = array();
 | |
| 		foreach ( $r ['data']['zones'] as $zone ) {
 | |
| 			$zones[] = $zone;
 | |
| 		}
 | |
| 
 | |
| 		return $zones;
 | |
| 	}
 | |
| 
 | |
| 	public function create_site($zone) {
 | |
| 		$r = $this->post( '/sites', $zone );
 | |
| 		return $r['data']['pullzone'];
 | |
| 	}
 | |
| 
 | |
| 	public function update_site( $zone_id, $zone ) {
 | |
| 		$r = $this->put( "/sites/$zone_id", $zone );
 | |
| 		return $r['data']['pullzone'];
 | |
| 	}
 | |
| 
 | |
| 	public function get_site( $zone_id ) {
 | |
| 		$r = $this->get( "/sites/$zone_id" );
 | |
| 		return $r['data']['pullzone'];
 | |
| 	}
 | |
| 
 | |
| 	public function get_custom_domains($zone_id) {
 | |
| 		$r = $this->get( "/sites/$zone_id/customdomains" );
 | |
| 		$domains = array();
 | |
| 		foreach ($r['data']['customdomains'] as $domain) {
 | |
| 			$domains[] = $domain['custom_domain'];
 | |
| 		}
 | |
| 
 | |
| 		return $domains;
 | |
| 	}
 | |
| 
 | |
| 	public function delete_site_cache( $zone_id, $files_to_pass = null ) {
 | |
| 		$params = array();
 | |
| 		if ( !empty( $files_to_pass ) ) {
 | |
| 			 $params['files'] = $files_to_pass;
 | |
| 		}
 | |
| 
 | |
| 		$r = $this->delete("/sites/$zone_id/cache", $params );
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	public function get_stats_per_zone($zone_id) {
 | |
| 		$r = $this->get( "/reports/{$zone_id}/stats");
 | |
| 		return $r['data']['summary'];
 | |
| 	}
 | |
| 
 | |
| 	public function get_list_of_file_types_per_zone( $zone_id ) {
 | |
| 		$r = $this->get( "/reports/{$zone_id}/filetypes" );
 | |
| 		$stats = array(
 | |
| 			'total' => $r['data']['total'],
 | |
| 			'filetypes' => array()
 | |
| 		);
 | |
| 
 | |
| 		foreach( $r['data']['filetypes'] as $filetyp ) {
 | |
| 			$stats['filetypes'][] = $filetyp;
 | |
| 		}
 | |
| 		$stats['summary'] = $r['data']['summary'];
 | |
| 		return $stats;
 | |
| 	}
 | |
| 
 | |
| 	public function get_list_of_popularfiles_per_zone($zone_id) {
 | |
| 		$r = $this->get( "/reports/{$zone_id}/popularfiles" );
 | |
| 		return $r['data']['popularfiles'];
 | |
| 	}
 | |
| 
 | |
| 	public function get_account() {
 | |
| 		$r = $this->get( "/account" );
 | |
| 		return $r['data']['account'];
 | |
| 	}
 | |
| 
 | |
| 	public function create_custom_domain( $zone_id, $custom_domain ) {
 | |
| 		$custom_domain = $this->post( "/sites/$zone_id/customdomains",
 | |
| 			array( 'custom_domain' => $custom_domain) );
 | |
| 		return $custom_domain;
 | |
| 	}
 | |
| }
 |