+ if ( false !== strpos(WP_ACCESSIBLE_HOSTS, '*') ) {
+ $wildcard_regex = array();
+ foreach ( $accessible_hosts as $host )
+ $wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) );
+ $wildcard_regex = '/^(' . implode('|', $wildcard_regex) . ')$/i';
+ }
+ }
+
+ if ( !empty($wildcard_regex) )
+ return !preg_match($wildcard_regex, $check['host']);
+ else
+ return !in_array( $check['host'], $accessible_hosts ); //Inverse logic, If it's in the array, then we can't access it.
+
+ }
+
+ static function make_absolute_url( $maybe_relative_path, $url ) {
+ if ( empty( $url ) )
+ return $maybe_relative_path;
+
+ // Check for a scheme
+ if ( false !== strpos( $maybe_relative_path, '://' ) )
+ return $maybe_relative_path;
+
+ if ( ! $url_parts = @parse_url( $url ) )
+ return $maybe_relative_path;
+
+ if ( ! $relative_url_parts = @parse_url( $maybe_relative_path ) )
+ return $maybe_relative_path;
+
+ $absolute_path = $url_parts['scheme'] . '://' . $url_parts['host'];
+ if ( isset( $url_parts['port'] ) )
+ $absolute_path .= ':' . $url_parts['port'];
+
+ // Start off with the Absolute URL path
+ $path = ! empty( $url_parts['path'] ) ? $url_parts['path'] : '/';
+
+ // If it's a root-relative path, then great
+ if ( ! empty( $relative_url_parts['path'] ) && '/' == $relative_url_parts['path'][0] ) {
+ $path = $relative_url_parts['path'];
+
+ // Else it's a relative path
+ } elseif ( ! empty( $relative_url_parts['path'] ) ) {
+ // Strip off any file components from the absolute path
+ $path = substr( $path, 0, strrpos( $path, '/' ) + 1 );
+
+ // Build the new path
+ $path .= $relative_url_parts['path'];
+
+ // Strip all /path/../ out of the path
+ while ( strpos( $path, '../' ) > 1 ) {
+ $path = preg_replace( '![^/]+/\.\./!', '', $path );
+ }
+
+ // Strip any final leading ../ from the path
+ $path = preg_replace( '!^/(\.\./)+!', '', $path );
+ }
+
+ // Add the Query string
+ if ( ! empty( $relative_url_parts['query'] ) )
+ $path .= '?' . $relative_url_parts['query'];
+
+ return $absolute_path . '/' . ltrim( $path, '/' );
+ }
+
+ /**
+ * Handles HTTP Redirects and follows them if appropriate.
+ *
+ * @since 3.7.0
+ *
+ * @param string $url The URL which was requested.
+ * @param array $args The Arguements which were used to make the request.
+ * @param array $response The Response of the HTTP request.
+ * @return false|object False if no redirect is present, a WP_HTTP or WP_Error result otherwise.
+ */
+ 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 WP_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 = WP_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 ) ) )
+ $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 wp_remote_request( $redirect_location, $args );
+ }
+
+ /**
+ * Determines if a specified string represents an IP address or not.
+ *
+ * This function also detects the type of the IP address, returning either
+ * '4' or '6' to represent a IPv4 and IPv6 address respectively.
+ * This does not verify if the IP is a valid IP, only that it appears to be
+ * an IP address.
+ *
+ * @see http://home.deds.nl/~aeron/regex/ for IPv6 regex
+ *
+ * @since 3.7.0
+ * @static
+ *
+ * @param string $maybe_ip A suspected IP address
+ * @return integer|bool Upon success, '4' or '6' to represent a IPv4 or IPv6 address, false upon failure
+ */
+ static function is_ip_address( $maybe_ip ) {
+ if ( preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $maybe_ip ) )
+ return 4;
+
+ if ( false !== strpos( $maybe_ip, ':' ) && preg_match( '/^(((?=.*(::))(?!.*\3.+\3))\3?|([\dA-F]{1,4}(\3|:\b|$)|\2))(?4){5}((?4){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i', trim( $maybe_ip, ' []' ) ) )
+ return 6;
+
+ return false;