208 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * WPSEO plugin file.
 | |
|  *
 | |
|  * @package WPSEO\Inc
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Handles requests to MyYoast.
 | |
|  */
 | |
| class WPSEO_MyYoast_Api_Request {
 | |
| 
 | |
| 	/**
 | |
| 	 * The Request URL.
 | |
| 	 *
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $url;
 | |
| 
 | |
| 	/**
 | |
| 	 * The request parameters.
 | |
| 	 *
 | |
| 	 * @var array
 | |
| 	 */
 | |
| 	protected $args = [
 | |
| 		'method'    => 'GET',
 | |
| 		'timeout'   => 5,
 | |
| 		'headers'   => [
 | |
| 			'Accept-Encoding' => '*',
 | |
| 			'Expect'          => '',
 | |
| 		],
 | |
| 	];
 | |
| 
 | |
| 	/**
 | |
| 	 * Contains the fetched response.
 | |
| 	 *
 | |
| 	 * @var stdClass
 | |
| 	 */
 | |
| 	protected $response;
 | |
| 
 | |
| 	/**
 | |
| 	 * Contains the error message when request went wrong.
 | |
| 	 *
 | |
| 	 * @var string
 | |
| 	 */
 | |
| 	protected $error_message = '';
 | |
| 
 | |
| 	/**
 | |
| 	 * Constructor.
 | |
| 	 *
 | |
| 	 * @codeCoverageIgnore
 | |
| 	 *
 | |
| 	 * @param string $url  The request url.
 | |
| 	 * @param array  $args The request arguments.
 | |
| 	 */
 | |
| 	public function __construct( $url, array $args = [] ) {
 | |
| 		$this->url  = 'https://my.yoast.com/api/' . $url;
 | |
| 		$this->args = wp_parse_args( $args, $this->args );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Fires the request.
 | |
| 	 *
 | |
| 	 * @return bool True when request is successful.
 | |
| 	 */
 | |
| 	public function fire() {
 | |
| 		try {
 | |
| 			$response       = $this->do_request( $this->url, $this->args );
 | |
| 			$this->response = $this->decode_response( $response );
 | |
| 
 | |
| 			return true;
 | |
| 		}
 | |
| 		catch ( WPSEO_MyYoast_Bad_Request_Exception $bad_request_exception ) {
 | |
| 			$this->error_message = $bad_request_exception->getMessage();
 | |
| 
 | |
| 			return false;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieves the error message.
 | |
| 	 *
 | |
| 	 * @return string The set error message.
 | |
| 	 */
 | |
| 	public function get_error_message() {
 | |
| 		return $this->error_message;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieves the response.
 | |
| 	 *
 | |
| 	 * @return stdClass The response object.
 | |
| 	 */
 | |
| 	public function get_response() {
 | |
| 		return $this->response;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Performs the request using WordPress internals.
 | |
| 	 *
 | |
| 	 * @codeCoverageIgnore
 | |
| 	 *
 | |
| 	 * @param string $url               The request URL.
 | |
| 	 * @param array  $request_arguments The request arguments.
 | |
| 	 *
 | |
| 	 * @return string                                 The retrieved body.
 | |
| 	 * @throws WPSEO_MyYoast_Bad_Request_Exception    When request is invalid.
 | |
| 	 */
 | |
| 	protected function do_request( $url, $request_arguments ) {
 | |
| 		$request_arguments = $this->enrich_request_arguments( $request_arguments );
 | |
| 		$response          = wp_remote_request( $url, $request_arguments );
 | |
| 
 | |
| 		if ( is_wp_error( $response ) ) {
 | |
| 			throw new WPSEO_MyYoast_Bad_Request_Exception( $response->get_error_message() );
 | |
| 		}
 | |
| 
 | |
| 		$response_code    = wp_remote_retrieve_response_code( $response );
 | |
| 		$response_message = wp_remote_retrieve_response_message( $response );
 | |
| 
 | |
| 		// Do nothing, response code is okay.
 | |
| 		if ( $response_code === 200 || strpos( $response_code, '200' ) !== false ) {
 | |
| 			return wp_remote_retrieve_body( $response );
 | |
| 		}
 | |
| 
 | |
| 		throw new WPSEO_MyYoast_Bad_Request_Exception( esc_html( $response_message ), (int) $response_code );
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Decodes the JSON encoded response.
 | |
| 	 *
 | |
| 	 * @param string $response The response to decode.
 | |
| 	 *
 | |
| 	 * @return stdClass                             The json decoded response.
 | |
| 	 * @throws WPSEO_MyYoast_Invalid_JSON_Exception When decoded string is not a JSON object.
 | |
| 	 */
 | |
| 	protected function decode_response( $response ) {
 | |
| 		$response = json_decode( $response );
 | |
| 
 | |
| 		if ( ! is_object( $response ) ) {
 | |
| 			throw new WPSEO_MyYoast_Invalid_JSON_Exception(
 | |
| 				esc_html__( 'No JSON object was returned.', 'wordpress-seo' )
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		return $response;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Checks if MyYoast tokens are allowed and adds the token to the request body.
 | |
| 	 *
 | |
| 	 * When tokens are disallowed it will add the url to the request body.
 | |
| 	 *
 | |
| 	 * @param array $request_arguments The arguments to enrich.
 | |
| 	 *
 | |
| 	 * @return array The enriched arguments.
 | |
| 	 */
 | |
| 	protected function enrich_request_arguments( array $request_arguments ) {
 | |
| 		$request_arguments     = wp_parse_args( $request_arguments, [ 'headers' => [] ] );
 | |
| 		$addon_version_headers = $this->get_installed_addon_versions();
 | |
| 
 | |
| 		foreach ( $addon_version_headers as $addon => $version ) {
 | |
| 			$request_arguments['headers'][ $addon . '-version' ] = $version;
 | |
| 		}
 | |
| 
 | |
| 		$request_body = $this->get_request_body();
 | |
| 		if ( $request_body !== [] ) {
 | |
| 			$request_arguments['body'] = $request_body;
 | |
| 		}
 | |
| 
 | |
| 		return $request_arguments;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieves the request body based on URL or access token support.
 | |
| 	 *
 | |
| 	 * @codeCoverageIgnore
 | |
| 	 *
 | |
| 	 * @return array The request body.
 | |
| 	 */
 | |
| 	public function get_request_body() {
 | |
| 		return [ 'url' => WPSEO_Utils::get_home_url() ];
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Wraps the get current user id function.
 | |
| 	 *
 | |
| 	 * @codeCoverageIgnore
 | |
| 	 *
 | |
| 	 * @return int The user id.
 | |
| 	 */
 | |
| 	protected function get_current_user_id() {
 | |
| 		return get_current_user_id();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Retrieves the installed addons as http headers.
 | |
| 	 *
 | |
| 	 * @codeCoverageIgnore
 | |
| 	 *
 | |
| 	 * @return array The installed addon versions.
 | |
| 	 */
 | |
| 	protected function get_installed_addon_versions() {
 | |
| 		$addon_manager = new WPSEO_Addon_Manager();
 | |
| 
 | |
| 		return $addon_manager->get_installed_addons_versions();
 | |
| 	}
 | |
| }
 |