WordPress.org

Make WordPress Core

Ticket #20434: 20434.3.diff

File 20434.3.diff, 3.0 KB (added by dd32, 6 years ago)

WP_HTTP::make_absolute_url()

  • wp-includes/class-http.php

     
    535535                        return !in_array( $check['host'], $accessible_hosts ); //Inverse logic, If its in the array, then we can't access it.
    536536
    537537        }
     538
     539        static function make_absolute_url( $maybe_relative_path, $url ) {
     540                if ( empty( $url ) )
     541                        return $maybe_relative_path;
     542
     543                // Check for a scheme
     544                if ( false !== strpos( $maybe_relative_path, '://' ) )
     545                        return $maybe_relative_path;
     546
     547                if ( ! $url_parts = @parse_url( $url ) )
     548                        return $maybe_relative_path;
     549
     550                if ( ! $relative_url_parts = @parse_url( $maybe_relative_path ) )
     551                        return $maybe_relative_path;
     552
     553                $absolute_path = $url_parts['scheme'] . '://' . $url_parts['host'];
     554                if ( isset( $url_parts['port'] ) )
     555                        $absolute_path .= ':' . $url_parts['port'];
     556
     557                // Start off with the Absolute URL path
     558                $path = ! empty( $url_parts['path'] ) ? $url_parts['path'] : '/';
     559
     560                // If the it's a root-relative path, then great
     561                if ( ! empty( $relative_url_parts['path'] ) && '/' == $relative_url_parts['path'][0] ) {
     562                        $path = $relative_url_parts['path'];
     563
     564                // Else it's a relative path
     565                } elseif ( ! empty( $relative_url_parts['path'] ) ) {
     566                        // Strip off any file components from the absolute path
     567                        $path = substr( $path, 0, strrpos( $path, '/' ) + 1 );
     568
     569                        // Build the new path
     570                        $path .= $relative_url_parts['path'];
     571
     572                        // Strip all /path/../ out of the path
     573                        while ( strpos( $path, '../' ) > 1 ) {
     574                                $path = preg_replace( '![^/]+/\.\./!', '', $path );
     575                        }
     576
     577                        // Strip any final leading ../ from the path
     578                        $path = preg_replace( '!^/(\.\./)+!', '', $path );
     579                }
     580
     581                // Add the Query string
     582                if ( ! empty( $relative_url_parts['query'] ) )
     583                        $path .= '?' . $relative_url_parts['query'];
     584
     585                return $absolute_path . '/' . ltrim( $path, '/' );
     586        }
    538587}
    539588
    540589/**
     
    730779                // If location is found, then assume redirect and redirect to location.
    731780                if ( isset($arrHeaders['headers']['location']) && 0 !== $r['_redirection'] ) {
    732781                        if ( $r['redirection']-- > 0 ) {
    733                                 return $this->request($arrHeaders['headers']['location'], $r);
     782                                return $this->request( WP_HTTP::make_absolute_url( $arrHeaders['headers']['location'], $url ), $r);
    734783                        } else {
    735784                                return new WP_Error('http_request_failed', __('Too many redirects.'));
    736785                        }
     
    11311180                // See #11305 - When running under safe mode, redirection is disabled above. Handle it manually.
    11321181                if ( ! empty( $theHeaders['headers']['location'] ) && 0 !== $r['_redirection'] ) { // _redirection: The requested number of redirections
    11331182                        if ( $r['redirection']-- > 0 ) {
    1134                                 return $this->request( $theHeaders['headers']['location'], $r );
     1183                                return $this->request( WP_HTTP::make_absolute_url( $theHeaders['headers']['location'], $url ), $r );
    11351184                        } else {
    11361185                                return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) );
    11371186                        }