diff options
Diffstat (limited to 'plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-resolve-redirect.php')
-rw-r--r-- | plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-resolve-redirect.php | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-resolve-redirect.php b/plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-resolve-redirect.php new file mode 100644 index 00000000..442a2efa --- /dev/null +++ b/plugins/jetpack/_inc/lib/core-api/wpcom-endpoints/class-wpcom-rest-api-v2-endpoint-resolve-redirect.php @@ -0,0 +1,94 @@ +<?php +/** + * REST API endpoint for resolving URL redirects. + * + * @package Jetpack + * @since 8.0.0 + */ + +/** + * Resolve URL redirects. + * + * @since 8.0.0 + */ +class WPCOM_REST_API_V2_Endpoint_Resolve_Redirect extends WP_REST_Controller { + /** + * Constructor. + */ + public function __construct() { + $this->namespace = 'wpcom/v2'; + $this->rest_base = 'resolve-redirect'; + // This endpoint *does not* need to connect directly to Jetpack sites. + add_action( 'rest_api_init', array( $this, 'register_routes' ) ); + } + + /** + * Register the route. + */ + public function register_routes() { + // GET /sites/<blog_id>/resolve-redirect/<url> - Follow 301/302 redirects on a URL, and return the final destination. + register_rest_route( + $this->namespace, + '/' . $this->rest_base . '/(?P<url>.+)', + array( + 'args' => array( + 'url' => array( + 'description' => __( 'The URL to check for redirects.', 'jetpack' ), + 'type' => 'string', + 'required' => 'true', + 'validate_callback' => 'wp_http_validate_url', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'follow_redirect' ), + 'permission_callback' => 'is_user_logged_in', + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Follows 301/302 redirect for the passed URL, and returns the final destination. + * + * @param WP_REST_Request $request The REST API request data. + * @return WP_REST_Response The REST API response. + */ + public function follow_redirect( $request ) { + $response = wp_safe_remote_get( $request['url'] ); + if ( is_wp_error( $response ) ) { + return rest_ensure_response( '' ); + } + + $history = $response['http_response']->get_response_object()->history; + if ( ! $history ) { + return response_ensure_response( $request['url'] ); + } + + $location = $history[0]->headers->getValues( 'location' ); + if ( ! $location ) { + return response_ensure_response( $request['url'] ); + } + + return rest_ensure_response( $location[0] ); + } + + /** + * Retrieves the comment's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'resolve-redirect', + 'type' => 'string', + 'description' => __( 'The final destination of the URL being checked for redirects.', 'jetpack' ), + ); + + return $schema; + } +} + +wpcom_rest_api_v2_load_plugin( 'WPCOM_REST_API_V2_Endpoint_Resolve_Redirect' ); |