X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/wordpress.git/blobdiff_plain/b22765f41bf0b2021b9beb9120ee0ac91fa89292..refs/tags/wordpress-4.7-scripts:/wp-includes/http.php diff --git a/wp-includes/http.php b/wp-includes/http.php index 130eae3c..862e456a 100644 --- a/wp-includes/http.php +++ b/wp-includes/http.php @@ -208,9 +208,12 @@ function wp_remote_head($url, $args = array()) { * Retrieve only the headers from the raw response. * * @since 2.7.0 + * @since 4.6.0 Return value changed from an array to an Requests_Utility_CaseInsensitiveDictionary instance. + * + * @see \Requests_Utility_CaseInsensitiveDictionary * * @param array $response HTTP response. - * @return array The headers of the response. Empty array if incorrect parameter given. + * @return array|\Requests_Utility_CaseInsensitiveDictionary The headers of the response. Empty array if incorrect parameter given. */ function wp_remote_retrieve_headers( $response ) { if ( is_wp_error( $response ) || ! isset( $response['headers'] ) ) { @@ -614,7 +617,7 @@ function ms_allowed_http_request_hosts( $is_external, $host ) { static $queried = array(); if ( $is_external ) return $is_external; - if ( $host === get_current_site()->domain ) + if ( $host === get_network()->domain ) return true; if ( isset( $queried[ $host ] ) ) return $queried[ $host ]; @@ -623,47 +626,118 @@ function ms_allowed_http_request_hosts( $is_external, $host ) { } /** - * A wrapper for PHP's parse_url() function that handles edgecases in < PHP 5.4.7 + * A wrapper for PHP's parse_url() function that handles consistency in the return + * values across PHP versions. * * PHP 5.4.7 expanded parse_url()'s ability to handle non-absolute url's, including - * schemeless and relative url's with :// in the path, this works around those - * limitations providing a standard output on PHP 5.2~5.4+. + * schemeless and relative url's with :// in the path. This function works around + * those limitations providing a standard output on PHP 5.2~5.4+. + * + * Secondly, across various PHP versions, schemeless URLs starting containing a ":" + * in the query are being handled inconsistently. This function works around those + * differences as well. * * Error suppression is used as prior to PHP 5.3.3, an E_WARNING would be generated * when URL parsing failed. * * @since 4.4.0 - * - * @param string $url The URL to parse. - * @return bool|array False on failure; Array of URL components on success; - * See parse_url()'s return values. + * @since 4.7.0 The $component parameter was added for parity with PHP's parse_url(). + * + * @param string $url The URL to parse. + * @param int $component The specific component to retrieve. Use one of the PHP + * predefined constants to specify which one. + * Defaults to -1 (= return all parts as an array). + * @see http://php.net/manual/en/function.parse-url.php + * @return mixed False on parse failure; Array of URL components on success; + * When a specific component has been requested: null if the component + * doesn't exist in the given URL; a sting or - in the case of + * PHP_URL_PORT - integer when it does. See parse_url()'s return values. */ -function wp_parse_url( $url ) { +function wp_parse_url( $url, $component = -1 ) { + $to_unset = array(); + $url = strval( $url ); + + if ( '//' === substr( $url, 0, 2 ) ) { + $to_unset[] = 'scheme'; + $url = 'placeholder:' . $url; + } elseif ( '/' === substr( $url, 0, 1 ) ) { + $to_unset[] = 'scheme'; + $to_unset[] = 'host'; + $url = 'placeholder://placeholder' . $url; + } + $parts = @parse_url( $url ); - if ( ! $parts ) { - // < PHP 5.4.7 compat, trouble with relative paths including a scheme break in the path - if ( '/' == $url[0] && false !== strpos( $url, '://' ) ) { - // Since we know it's a relative path, prefix with a scheme/host placeholder and try again - if ( ! $parts = @parse_url( 'placeholder://placeholder' . $url ) ) { - return $parts; - } - // Remove the placeholder values - unset( $parts['scheme'], $parts['host'] ); - } else { - return $parts; - } + + if ( false === $parts ) { + // Parsing failure. + return $parts; } - // < PHP 5.4.7 compat, doesn't detect schemeless URL's host field - if ( '//' == substr( $url, 0, 2 ) && ! isset( $parts['host'] ) ) { - $path_parts = explode( '/', substr( $parts['path'], 2 ), 2 ); - $parts['host'] = $path_parts[0]; - if ( isset( $path_parts[1] ) ) { - $parts['path'] = '/' . $path_parts[1]; - } else { - unset( $parts['path'] ); - } + // Remove the placeholder values. + foreach ( $to_unset as $key ) { + unset( $parts[ $key ] ); } - return $parts; + return _get_component_from_parsed_url_array( $parts, $component ); +} + +/** + * Retrieve a specific component from a parsed URL array. + * + * @internal + * + * @since 4.7.0 + * + * @param array|false $url_parts The parsed URL. Can be false if the URL failed to parse. + * @param int $component The specific component to retrieve. Use one of the PHP + * predefined constants to specify which one. + * Defaults to -1 (= return all parts as an array). + * @see http://php.net/manual/en/function.parse-url.php + * @return mixed False on parse failure; Array of URL components on success; + * When a specific component has been requested: null if the component + * doesn't exist in the given URL; a sting or - in the case of + * PHP_URL_PORT - integer when it does. See parse_url()'s return values. + */ +function _get_component_from_parsed_url_array( $url_parts, $component = -1 ) { + if ( -1 === $component ) { + return $url_parts; + } + + $key = _wp_translate_php_url_constant_to_key( $component ); + if ( false !== $key && is_array( $url_parts ) && isset( $url_parts[ $key ] ) ) { + return $url_parts[ $key ]; + } else { + return null; + } +} + +/** + * Translate a PHP_URL_* constant to the named array keys PHP uses. + * + * @internal + * + * @since 4.7.0 + * + * @see http://php.net/manual/en/url.constants.php + * + * @param int $constant PHP_URL_* constant. + * @return string|bool The named key or false. + */ +function _wp_translate_php_url_constant_to_key( $constant ) { + $translation = array( + PHP_URL_SCHEME => 'scheme', + PHP_URL_HOST => 'host', + PHP_URL_PORT => 'port', + PHP_URL_USER => 'user', + PHP_URL_PASS => 'pass', + PHP_URL_PATH => 'path', + PHP_URL_QUERY => 'query', + PHP_URL_FRAGMENT => 'fragment', + ); + + if ( isset( $translation[ $constant ] ) ) { + return $translation[ $constant ]; + } else { + return false; + } }