GC_Http::handle_redirects()
最后更新于:2021-12-01 11:14:02
GC_( string$url, array$args, array$response)Handles an HTTP redirect and follows it if appropriate.
参数
- $url
-
(string) (Required) The URL which was requested.
- $args
-
(array) (Required) The arguments which were used to make the request.
- $response
-
(array) (Required) The response of the HTTP request.
响应
(array|false|GC_Error) An HTTP API response array if the redirect is successfully followed, false if no redirect is present, or a GC_Error object if there’s an error.
源文件
文件: gc-includes/class-http.php
public static function handle_redirects( $url, $args, $response ) {
// If no redirects are present, or, redirects were not requested, perform no action.
if ( ! isset( $response['headers']['location'] ) || 0 === $args['_redirection'] ) {
return false;
}
// Only perform redirections on redirection http codes.
if ( $response['response']['code'] > 399 || $response['response']['code'] < 300 ) {
return false;
}
// Don't redirect if we've run out of redirects.
if ( $args['redirection']-- <= 0 ) {
return new GC_Error( 'http_request_failed', __( 'Too many redirects.' ) );
}
$redirect_location = $response['headers']['location'];
// If there were multiple Location headers, use the last header specified.
if ( is_array( $redirect_location ) ) {
$redirect_location = array_pop( $redirect_location );
}
$redirect_location = GC_Http::make_absolute_url( $redirect_location, $url );
// POST requests should not POST to a redirected location.
if ( 'POST' === $args['method'] ) {
if ( in_array( $response['response']['code'], array( 302, 303 ), true ) ) {
$args['method'] = 'GET';
}
}
// Include valid cookies in the redirect process.
if ( ! empty( $response['cookies'] ) ) {
foreach ( $response['cookies'] as $cookie ) {
if ( $cookie->test( $redirect_location ) ) {
$args['cookies'][] = $cookie;
}
}
}
return gc_remote_request( $redirect_location, $args );
}