/** * Pre HTTP request * * @see https://github.com/WordPress/WordPress/blob/3.9.1/wp-includes/class-http.php#L150-L164 * @return string */ public function pre_http_request($preempt, $request, $url) { $response = file_get_contents(dirname(__FILE__) . '/Mock/GetIssuersXml200.http'); $processedResponse = WP_Http::processResponse($response); $processedHeaders = WP_Http::processHeaders($processedResponse['headers'], $url); $processedHeaders['body'] = $processedResponse['body']; return $processedHeaders; }
/** * Send an HTTP request to a URI. * * Please note: The only URI that are supported in the HTTP Transport implementation * are the HTTP and HTTPS protocols. * * @access public * @since 2.7.0 * * @param string $url The request URL. * @param string|array $args { * Optional. Array or string of HTTP request arguments. * * @type string $method Request method. Accepts 'GET', 'POST', 'HEAD', or 'PUT'. * Some transports technically allow others, but should not be * assumed. Default 'GET'. * @type int $timeout How long the connection should stay open in seconds. Default 5. * @type int $redirection Number of allowed redirects. Not supported by all transports * Default 5. * @type string $httpversion Version of the HTTP protocol to use. Accepts '1.0' and '1.1'. * Default '1.0'. * @type string $user-agent User-agent value sent. * Default WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ). * @type bool $reject_unsafe_urls Whether to pass URLs through wp_http_validate_url(). * Default false. * @type bool $blocking Whether the calling code requires the result of the request. * If set to false, the request will be sent to the remote server, * and processing returned to the calling code immediately, the caller * will know if the request succeeded or failed, but will not receive * any response from the remote server. Default true. * @type string|array $headers Array or string of headers to send with the request. * Default empty array. * @type array $cookies List of cookies to send with the request. Default empty array. * @type string|array $body Body to send with the request. Default null. * @type bool $compress Whether to compress the $body when sending the request. * Default false. * @type bool $decompress Whether to decompress a compressed response. If set to false and * compressed content is returned in the response anyway, it will * need to be separately decompressed. Default true. * @type bool $sslverify Whether to verify SSL for the request. Default true. * @type string sslcertificates Absolute path to an SSL certificate .crt file. * Default ABSPATH . WPINC . '/certificates/ca-bundle.crt'. * @type bool $stream Whether to stream to a file. If set to true and no filename was * given, it will be droped it in the WP temp dir and its name will * be set using the basename of the URL. Default false. * @type string $filename Filename of the file to write to when streaming. $stream must be * set to true. Default null. * @type int $limit_response_size Size in bytes to limit the response to. Default null. * * } * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. * A WP_Error instance upon error. */ public function request($url, $args = array()) { $defaults = array('method' => 'GET', 'timeout' => apply_filters('http_request_timeout', 5), 'redirection' => apply_filters('http_request_redirection_count', 5), 'httpversion' => apply_filters('http_request_version', '1.0'), 'user-agent' => apply_filters('http_headers_useragent', 'WordPress/' . get_bloginfo('version') . '; ' . get_bloginfo('url')), 'reject_unsafe_urls' => apply_filters('http_request_reject_unsafe_urls', false), 'blocking' => true, 'headers' => array(), 'cookies' => array(), 'body' => null, 'compress' => false, 'decompress' => true, 'sslverify' => true, 'sslcertificates' => ABSPATH . WPINC . '/certificates/ca-bundle.crt', 'stream' => false, 'filename' => null, 'limit_response_size' => null); // Pre-parse for the HEAD checks. $args = wp_parse_args($args); // By default, Head requests do not cause redirections. if (isset($args['method']) && 'HEAD' == $args['method']) { $defaults['redirection'] = 0; } $r = wp_parse_args($args, $defaults); /** * Filters the arguments used in an HTTP request. * * @since 2.7.0 * * @param array $r An array of HTTP request arguments. * @param string $url The request URL. */ $r = apply_filters('http_request_args', $r, $url); // The transports decrement this, store a copy of the original value for loop purposes. if (!isset($r['_redirection'])) { $r['_redirection'] = $r['redirection']; } /** * Filters whether to preempt an HTTP request's return value. * * Returning a non-false value from the filter will short-circuit the HTTP request and return * early with that value. A filter should return either: * * - An array containing 'headers', 'body', 'response', 'cookies', and 'filename' elements * - A WP_Error instance * - boolean false (to avoid short-circuiting the response) * * Returning any other value may result in unexpected behaviour. * * @since 2.9.0 * * @param false|array|WP_Error $preempt Whether to preempt an HTTP request's return value. Default false. * @param array $r HTTP request arguments. * @param string $url The request URL. */ $pre = apply_filters('pre_http_request', false, $r, $url); if (false !== $pre) { return $pre; } if (function_exists('wp_kses_bad_protocol')) { if ($r['reject_unsafe_urls']) { $url = wp_http_validate_url($url); } if ($url) { $url = wp_kses_bad_protocol($url, array('http', 'https', 'ssl')); } } $arrURL = @parse_url($url); if (empty($url) || empty($arrURL['scheme'])) { return new WP_Error('http_request_failed', __('A valid URL was not provided.')); } if ($this->block_request($url)) { return new WP_Error('http_request_failed', __('User has blocked requests through HTTP.')); } // If we are streaming to a file but no filename was given drop it in the WP temp dir // and pick its name using the basename of the $url if ($r['stream']) { if (empty($r['filename'])) { $r['filename'] = get_temp_dir() . basename($url); } // Force some settings if we are streaming to a file and check for existence and perms of destination directory $r['blocking'] = true; if (!wp_is_writable(dirname($r['filename']))) { return new WP_Error('http_request_failed', __('Destination directory for file streaming does not exist or is not writable.')); } } if (is_null($r['headers'])) { $r['headers'] = array(); } // WP allows passing in headers as a string, weirdly. if (!is_array($r['headers'])) { $processedHeaders = WP_Http::processHeaders($r['headers']); $r['headers'] = $processedHeaders['headers']; } // Setup arguments $headers = $r['headers']; $data = $r['body']; $type = $r['method']; $options = array('timeout' => $r['timeout'], 'useragent' => $r['user-agent'], 'blocking' => $r['blocking'], 'hooks' => new WP_HTTP_Requests_Hooks($url, $r)); // Ensure redirects follow browser behaviour. $options['hooks']->register('requests.before_redirect', array(get_class(), 'browser_redirect_compatibility')); if ($r['stream']) { $options['filename'] = $r['filename']; } if (empty($r['redirection'])) { $options['follow_redirects'] = false; } else { $options['redirects'] = $r['redirection']; } // Use byte limit, if we can if (isset($r['limit_response_size'])) { $options['max_bytes'] = $r['limit_response_size']; } // If we've got cookies, use and convert them to Requests_Cookie. if (!empty($r['cookies'])) { $options['cookies'] = WP_Http::normalize_cookies($r['cookies']); } // SSL certificate handling if (!$r['sslverify']) { $options['verify'] = false; $options['verifyname'] = false; } else { $options['verify'] = $r['sslcertificates']; } // All non-GET/HEAD requests should put the arguments in the form body. if ('HEAD' !== $type && 'GET' !== $type) { $options['data_format'] = 'body'; } /** * Filters whether SSL should be verified for non-local requests. * * @since 2.8.0 * * @param bool $ssl_verify Whether to verify the SSL connection. Default true. */ $options['verify'] = apply_filters('https_ssl_verify', $options['verify']); // Check for proxies. $proxy = new WP_HTTP_Proxy(); if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) { $options['proxy'] = new Requests_Proxy_HTTP($proxy->host() . ':' . $proxy->port()); if ($proxy->use_authentication()) { $options['proxy']->use_authentication = true; $options['proxy']->user = $proxy->username(); $options['proxy']->pass = $proxy->password(); } } // Avoid issues where mbstring.func_overload is enabled mbstring_binary_safe_encoding(); try { $requests_response = Requests::request($url, $headers, $data, $type, $options); // Convert the response into an array $http_response = new WP_HTTP_Requests_Response($requests_response, $r['filename']); $response = $http_response->to_array(); // Add the original object to the array. $response['http_response'] = $http_response; } catch (Requests_Exception $e) { $response = new WP_Error('http_request_failed', $e->getMessage()); } reset_mbstring_encoding(); /** * Fires after an HTTP API response is received and before the response is returned. * * @since 2.8.0 * * @param array|WP_Error $response HTTP response or WP_Error object. * @param string $context Context under which the hook is fired. * @param string $class HTTP transport used. * @param array $args HTTP request arguments. * @param string $url The request URL. */ do_action('http_api_debug', $response, 'response', 'Requests', $r, $url); if (is_wp_error($response)) { return $response; } if (!$r['blocking']) { return array('headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array(), 'http_response' => null); } /** * Filters the HTTP API response immediately before the response is returned. * * @since 2.9.0 * * @param array $response HTTP response. * @param array $r HTTP request arguments. * @param string $url The request URL. */ return apply_filters('http_response', $response, $r, $url); }
/** * Send a HTTP request to a URI using cURL extension. * * @access public * @since 2.7.0 * * @param string $url The request URL. * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error */ public function request($url, $args = array()) { $defaults = array('method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null, 'cookies' => array()); $r = wp_parse_args($args, $defaults); if (isset($r['headers']['User-Agent'])) { $r['user-agent'] = $r['headers']['User-Agent']; unset($r['headers']['User-Agent']); } elseif (isset($r['headers']['user-agent'])) { $r['user-agent'] = $r['headers']['user-agent']; unset($r['headers']['user-agent']); } // Construct Cookie: header if any cookies are set. WP_Http::buildCookieHeader($r); $handle = curl_init(); // cURL offers really easy proxy support. $proxy = new WP_HTTP_Proxy(); if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) { curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_setopt($handle, CURLOPT_PROXY, $proxy->host()); curl_setopt($handle, CURLOPT_PROXYPORT, $proxy->port()); if ($proxy->use_authentication()) { curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); curl_setopt($handle, CURLOPT_PROXYUSERPWD, $proxy->authentication()); } } $is_local = isset($r['local']) && $r['local']; $ssl_verify = isset($r['sslverify']) && $r['sslverify']; if ($is_local) { /** This filter is documented in wp-includes/class-http.php */ $ssl_verify = apply_filters('https_local_ssl_verify', $ssl_verify); } elseif (!$is_local) { /** This filter is documented in wp-includes/class-http.php */ $ssl_verify = apply_filters('https_ssl_verify', $ssl_verify); } /* * CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since. * a value of 0 will allow an unlimited timeout. */ $timeout = (int) ceil($r['timeout']); curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($handle, CURLOPT_TIMEOUT, $timeout); curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, $ssl_verify === true ? 2 : false); curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify); curl_setopt($handle, CURLOPT_CAINFO, $r['sslcertificates']); curl_setopt($handle, CURLOPT_USERAGENT, $r['user-agent']); /* * The option doesn't work with safe mode or when open_basedir is set, and there's * a bug #17490 with redirected POST requests, so handle redirections outside Curl. */ curl_setopt($handle, CURLOPT_FOLLOWLOCATION, false); if (defined('CURLOPT_PROTOCOLS')) { // PHP 5.2.10 / cURL 7.19.4 curl_setopt($handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); } switch ($r['method']) { case 'HEAD': curl_setopt($handle, CURLOPT_NOBODY, true); break; case 'POST': curl_setopt($handle, CURLOPT_POST, true); curl_setopt($handle, CURLOPT_POSTFIELDS, $r['body']); break; case 'PUT': curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($handle, CURLOPT_POSTFIELDS, $r['body']); break; default: curl_setopt($handle, CURLOPT_CUSTOMREQUEST, $r['method']); if (!is_null($r['body'])) { curl_setopt($handle, CURLOPT_POSTFIELDS, $r['body']); } break; } if (true === $r['blocking']) { curl_setopt($handle, CURLOPT_HEADERFUNCTION, array($this, 'stream_headers')); curl_setopt($handle, CURLOPT_WRITEFUNCTION, array($this, 'stream_body')); } curl_setopt($handle, CURLOPT_HEADER, false); if (isset($r['limit_response_size'])) { $this->max_body_length = intval($r['limit_response_size']); } else { $this->max_body_length = false; } // If streaming to a file open a file handle, and setup our curl streaming handler. if ($r['stream']) { if (!WP_DEBUG) { $this->stream_handle = @fopen($r['filename'], 'w+'); } else { $this->stream_handle = fopen($r['filename'], 'w+'); } if (!$this->stream_handle) { return new WP_Error('http_request_failed', sprintf(__('Could not open handle for fopen() to %s'), $r['filename'])); } } else { $this->stream_handle = false; } if (!empty($r['headers'])) { // cURL expects full header strings in each element. $headers = array(); foreach ($r['headers'] as $name => $value) { $headers[] = "{$name}: {$value}"; } curl_setopt($handle, CURLOPT_HTTPHEADER, $headers); } if ($r['httpversion'] == '1.0') { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); } else { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); } /** * Fires before the cURL request is executed. * * Cookies are not currently handled by the HTTP API. This action allows * plugins to handle cookies themselves. * * @since 2.8.0 * * @param resource &$handle The cURL handle returned by curl_init(). * @param array $r The HTTP request arguments. * @param string $url The request URL. */ do_action_ref_array('http_api_curl', array(&$handle, $r, $url)); // We don't need to return the body, so don't. Just execute request and return. if (!$r['blocking']) { curl_exec($handle); if ($curl_error = curl_error($handle)) { curl_close($handle); return new WP_Error('http_request_failed', $curl_error); } if (in_array(curl_getinfo($handle, CURLINFO_HTTP_CODE), array(301, 302))) { curl_close($handle); return new WP_Error('http_request_failed', __('Too many redirects.')); } curl_close($handle); return array('headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array()); } curl_exec($handle); $theHeaders = WP_Http::processHeaders($this->headers, $url); $theBody = $this->body; $bytes_written_total = $this->bytes_written_total; $this->headers = ''; $this->body = ''; $this->bytes_written_total = 0; $curl_error = curl_errno($handle); // If an error occurred, or, no response. if ($curl_error || 0 == strlen($theBody) && empty($theHeaders['headers'])) { if (CURLE_WRITE_ERROR == $curl_error) { if (!$this->max_body_length || $this->max_body_length != $bytes_written_total) { if ($r['stream']) { curl_close($handle); fclose($this->stream_handle); return new WP_Error('http_request_failed', __('Failed to write request to temporary file.')); } else { curl_close($handle); return new WP_Error('http_request_failed', curl_error($handle)); } } } else { if ($curl_error = curl_error($handle)) { curl_close($handle); return new WP_Error('http_request_failed', $curl_error); } } if (in_array(curl_getinfo($handle, CURLINFO_HTTP_CODE), array(301, 302))) { curl_close($handle); return new WP_Error('http_request_failed', __('Too many redirects.')); } } curl_close($handle); if ($r['stream']) { fclose($this->stream_handle); } $response = array('headers' => $theHeaders['headers'], 'body' => null, 'response' => $theHeaders['response'], 'cookies' => $theHeaders['cookies'], 'filename' => $r['filename']); // Handle redirects. if (false !== ($redirect_response = WP_HTTP::handle_redirects($url, $r, $response))) { return $redirect_response; } if (true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders['headers'])) { $theBody = WP_Http_Encoding::decompress($theBody); } $response['body'] = $theBody; return $response; }
/** * Make an HTTP request * * @return API results */ function http($url, $method, $postfields = null, $multi = false) { if ($method == 'POST') { $multi = WP_Http::processHeaders($multi); $header = array("Content-Type" => "application/atom+xml"); $header = array_merge($header, $multi['headers']); } $params = array("method" => $method, "body" => $postfields, "headers" => $header); return class_http($url, $params); }
/** * Send a HTTP request to a URI using PHP Streams. * * @see WP_Http::request For default options descriptions. * * @since 2.7.0 * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). * * @access public * @param string $url The request URL. * @param string|array $args Optional. Override the defaults. * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error */ public function request($url, $args = array()) { $defaults = array('method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null, 'cookies' => array()); $r = wp_parse_args($args, $defaults); if (isset($r['headers']['User-Agent'])) { $r['user-agent'] = $r['headers']['User-Agent']; unset($r['headers']['User-Agent']); } elseif (isset($r['headers']['user-agent'])) { $r['user-agent'] = $r['headers']['user-agent']; unset($r['headers']['user-agent']); } // Construct Cookie: header if any cookies are set. WP_Http::buildCookieHeader($r); $arrURL = parse_url($url); $connect_host = $arrURL['host']; $secure_transport = $arrURL['scheme'] == 'ssl' || $arrURL['scheme'] == 'https'; if (!isset($arrURL['port'])) { if ($arrURL['scheme'] == 'ssl' || $arrURL['scheme'] == 'https') { $arrURL['port'] = 443; $secure_transport = true; } else { $arrURL['port'] = 80; } } // Always pass a Path, defaulting to the root in cases such as http://example.com if (!isset($arrURL['path'])) { $arrURL['path'] = '/'; } if (isset($r['headers']['Host']) || isset($r['headers']['host'])) { if (isset($r['headers']['Host'])) { $arrURL['host'] = $r['headers']['Host']; } else { $arrURL['host'] = $r['headers']['host']; } unset($r['headers']['Host'], $r['headers']['host']); } /* * Certain versions of PHP have issues with 'localhost' and IPv6, It attempts to connect * to ::1, which fails when the server is not set up for it. For compatibility, always * connect to the IPv4 address. */ if ('localhost' == strtolower($connect_host)) { $connect_host = '127.0.0.1'; } $connect_host = $secure_transport ? 'ssl://' . $connect_host : 'tcp://' . $connect_host; $is_local = isset($r['local']) && $r['local']; $ssl_verify = isset($r['sslverify']) && $r['sslverify']; if ($is_local) { /** * Filter whether SSL should be verified for local requests. * * @since 2.8.0 * * @param bool $ssl_verify Whether to verify the SSL connection. Default true. */ $ssl_verify = apply_filters('https_local_ssl_verify', $ssl_verify); } elseif (!$is_local) { /** * Filter whether SSL should be verified for non-local requests. * * @since 2.8.0 * * @param bool $ssl_verify Whether to verify the SSL connection. Default true. */ $ssl_verify = apply_filters('https_ssl_verify', $ssl_verify); } $proxy = new WP_HTTP_Proxy(); $context = stream_context_create(array('ssl' => array('verify_peer' => $ssl_verify, 'capture_peer_cert' => $ssl_verify, 'SNI_enabled' => true, 'cafile' => $r['sslcertificates'], 'allow_self_signed' => !$ssl_verify))); $timeout = (int) floor($r['timeout']); $utimeout = $timeout == $r['timeout'] ? 0 : 1000000 * $r['timeout'] % 1000000; $connect_timeout = max($timeout, 1); // Store error number. $connection_error = null; // Store error string. $connection_error_str = null; if (!WP_DEBUG) { // In the event that the SSL connection fails, silence the many PHP Warnings. if ($secure_transport) { $error_reporting = error_reporting(0); } if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) { $handle = @stream_socket_client('tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context); } else { $handle = @stream_socket_client($connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context); } if ($secure_transport) { error_reporting($error_reporting); } } else { if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) { $handle = stream_socket_client('tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context); } else { $handle = stream_socket_client($connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context); } } if (false === $handle) { // SSL connection failed due to expired/invalid cert, or, OpenSSL configuration is broken. if ($secure_transport && 0 === $connection_error && '' === $connection_error_str) { return new WP_Error('http_request_failed', __('The SSL certificate for the host could not be verified.')); } return new WP_Error('http_request_failed', $connection_error . ': ' . $connection_error_str); } // Verify that the SSL certificate is valid for this request. if ($secure_transport && $ssl_verify && !$proxy->is_enabled()) { if (!self::verify_ssl_certificate($handle, $arrURL['host'])) { return new WP_Error('http_request_failed', __('The SSL certificate for the host could not be verified.')); } } stream_set_timeout($handle, $timeout, $utimeout); if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) { //Some proxies require full URL in this field. $requestPath = $url; } else { $requestPath = $arrURL['path'] . (isset($arrURL['query']) ? '?' . $arrURL['query'] : ''); } $strHeaders = strtoupper($r['method']) . ' ' . $requestPath . ' HTTP/' . $r['httpversion'] . "\r\n"; $include_port_in_host_header = $proxy->is_enabled() && $proxy->send_through_proxy($url) || 'http' == $arrURL['scheme'] && 80 != $arrURL['port'] || 'https' == $arrURL['scheme'] && 443 != $arrURL['port']; if ($include_port_in_host_header) { $strHeaders .= 'Host: ' . $arrURL['host'] . ':' . $arrURL['port'] . "\r\n"; } else { $strHeaders .= 'Host: ' . $arrURL['host'] . "\r\n"; } if (isset($r['user-agent'])) { $strHeaders .= 'User-agent: ' . $r['user-agent'] . "\r\n"; } if (is_array($r['headers'])) { foreach ((array) $r['headers'] as $header => $headerValue) { $strHeaders .= $header . ': ' . $headerValue . "\r\n"; } } else { $strHeaders .= $r['headers']; } if ($proxy->use_authentication()) { $strHeaders .= $proxy->authentication_header() . "\r\n"; } $strHeaders .= "\r\n"; if (!is_null($r['body'])) { $strHeaders .= $r['body']; } fwrite($handle, $strHeaders); if (!$r['blocking']) { stream_set_blocking($handle, 0); fclose($handle); return array('headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array()); } $strResponse = ''; $bodyStarted = false; $keep_reading = true; $block_size = 4096; if (isset($r['limit_response_size'])) { $block_size = min($block_size, $r['limit_response_size']); } // If streaming to a file setup the file handle. if ($r['stream']) { if (!WP_DEBUG) { $stream_handle = @fopen($r['filename'], 'w+'); } else { $stream_handle = fopen($r['filename'], 'w+'); } if (!$stream_handle) { return new WP_Error('http_request_failed', sprintf(__('Could not open handle for fopen() to %s'), $r['filename'])); } $bytes_written = 0; while (!feof($handle) && $keep_reading) { $block = fread($handle, $block_size); if (!$bodyStarted) { $strResponse .= $block; if (strpos($strResponse, "\r\n\r\n")) { $process = WP_Http::processResponse($strResponse); $bodyStarted = true; $block = $process['body']; unset($strResponse); $process['body'] = ''; } } $this_block_size = strlen($block); if (isset($r['limit_response_size']) && $bytes_written + $this_block_size > $r['limit_response_size']) { $this_block_size = $r['limit_response_size'] - $bytes_written; $block = substr($block, 0, $this_block_size); } $bytes_written_to_file = fwrite($stream_handle, $block); if ($bytes_written_to_file != $this_block_size) { fclose($handle); fclose($stream_handle); return new WP_Error('http_request_failed', __('Failed to write request to temporary file.')); } $bytes_written += $bytes_written_to_file; $keep_reading = !isset($r['limit_response_size']) || $bytes_written < $r['limit_response_size']; } fclose($stream_handle); } else { $header_length = 0; while (!feof($handle) && $keep_reading) { $block = fread($handle, $block_size); $strResponse .= $block; if (!$bodyStarted && strpos($strResponse, "\r\n\r\n")) { $header_length = strpos($strResponse, "\r\n\r\n") + 4; $bodyStarted = true; } $keep_reading = !$bodyStarted || !isset($r['limit_response_size']) || strlen($strResponse) < $header_length + $r['limit_response_size']; } $process = WP_Http::processResponse($strResponse); unset($strResponse); } fclose($handle); $arrHeaders = WP_Http::processHeaders($process['headers'], $url); $response = array('headers' => $arrHeaders['headers'], 'body' => null, 'response' => $arrHeaders['response'], 'cookies' => $arrHeaders['cookies'], 'filename' => $r['filename']); // Handle redirects. if (false !== ($redirect_response = WP_Http::handle_redirects($url, $r, $response))) { return $redirect_response; } // If the body was chunk encoded, then decode it. if (!empty($process['body']) && isset($arrHeaders['headers']['transfer-encoding']) && 'chunked' == $arrHeaders['headers']['transfer-encoding']) { $process['body'] = WP_Http::chunkTransferDecode($process['body']); } if (true === $r['decompress'] && true === WP_Http_Encoding::should_decode($arrHeaders['headers'])) { $process['body'] = WP_Http_Encoding::decompress($process['body']); } if (isset($r['limit_response_size']) && strlen($process['body']) > $r['limit_response_size']) { $process['body'] = substr($process['body'], 0, $r['limit_response_size']); } $response['body'] = $process['body']; return $response; }
/** * Send a HTTP request to a URI using cURL extension. * * @access public * @since 2.7.0 * * @param string $url * @param str|array $args Optional. Override the defaults. * @return array 'headers', 'body', 'cookies' and 'response' keys. */ function request($url, $args = array()) { $defaults = array('method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null, 'cookies' => array()); $r = wp_parse_args($args, $defaults); if (isset($r['headers']['User-Agent'])) { $r['user-agent'] = $r['headers']['User-Agent']; unset($r['headers']['User-Agent']); } else { if (isset($r['headers']['user-agent'])) { $r['user-agent'] = $r['headers']['user-agent']; unset($r['headers']['user-agent']); } } // Construct Cookie: header if any cookies are set. WP_Http::buildCookieHeader($r); // cURL extension will sometimes fail when the timeout is less than 1 as it may round down // to 0, which gives it unlimited timeout. if ($r['timeout'] > 0 && $r['timeout'] < 1) { $r['timeout'] = 1; } $handle = curl_init(); // cURL offers really easy proxy support. $proxy = new WP_HTTP_Proxy(); if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) { $isPHP5 = version_compare(PHP_VERSION, '5.0.0', '>='); if ($isPHP5) { curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_setopt($handle, CURLOPT_PROXY, $proxy->host()); curl_setopt($handle, CURLOPT_PROXYPORT, $proxy->port()); } else { curl_setopt($handle, CURLOPT_PROXY, $proxy->host() . ':' . $proxy->port()); } if ($proxy->use_authentication()) { if ($isPHP5) { curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_BASIC); } curl_setopt($handle, CURLOPT_PROXYUSERPWD, $proxy->authentication()); } } $is_local = isset($args['local']) && $args['local']; $ssl_verify = isset($args['sslverify']) && $args['sslverify']; if ($is_local) { $ssl_verify = apply_filters('https_local_ssl_verify', $ssl_verify); } elseif (!$is_local) { $ssl_verify = apply_filters('https_ssl_verify', $ssl_verify); } curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, $ssl_verify); curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify); curl_setopt($handle, CURLOPT_USERAGENT, $r['user-agent']); curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, $r['timeout']); curl_setopt($handle, CURLOPT_TIMEOUT, $r['timeout']); curl_setopt($handle, CURLOPT_MAXREDIRS, $r['redirection']); switch ($r['method']) { case 'HEAD': curl_setopt($handle, CURLOPT_NOBODY, true); break; case 'POST': curl_setopt($handle, CURLOPT_POST, true); curl_setopt($handle, CURLOPT_POSTFIELDS, $r['body']); break; case 'PUT': curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($handle, CURLOPT_POSTFIELDS, $r['body']); break; } if (true === $r['blocking']) { curl_setopt($handle, CURLOPT_HEADER, true); } else { curl_setopt($handle, CURLOPT_HEADER, false); } // The option doesn't work with safe mode or when open_basedir is set. if (!ini_get('safe_mode') && !ini_get('open_basedir')) { curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true); } if (!empty($r['headers'])) { // cURL expects full header strings in each element $headers = array(); foreach ($r['headers'] as $name => $value) { $headers[] = "{$name}: {$value}"; } curl_setopt($handle, CURLOPT_HTTPHEADER, $headers); } if ($r['httpversion'] == '1.0') { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); } else { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); } // Cookies are not handled by the HTTP API currently. Allow for plugin authors to handle it // themselves... Although, it is somewhat pointless without some reference. do_action_ref_array('http_api_curl', array(&$handle)); // We don't need to return the body, so don't. Just execute request and return. if (!$r['blocking']) { curl_exec($handle); curl_close($handle); return array('headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array()); } $theResponse = curl_exec($handle); if (!empty($theResponse)) { $headerLength = curl_getinfo($handle, CURLINFO_HEADER_SIZE); $theHeaders = trim(substr($theResponse, 0, $headerLength)); $theBody = substr($theResponse, $headerLength); if (false !== strrpos($theHeaders, "\r\n\r\n")) { $headerParts = explode("\r\n\r\n", $theHeaders); $theHeaders = $headerParts[count($headerParts) - 1]; } $theHeaders = WP_Http::processHeaders($theHeaders); } else { if ($curl_error = curl_error($handle)) { return new WP_Error('http_request_failed', $curl_error); } if (in_array(curl_getinfo($handle, CURLINFO_HTTP_CODE), array(301, 302))) { return new WP_Error('http_request_failed', __('Too many redirects.')); } $theHeaders = array('headers' => array(), 'cookies' => array()); $theBody = ''; } $response = array(); $response['code'] = curl_getinfo($handle, CURLINFO_HTTP_CODE); $response['message'] = get_status_header_desc($response['code']); curl_close($handle); if (true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders['headers'])) { $theBody = WP_Http_Encoding::decompress($theBody); } return array('headers' => $theHeaders['headers'], 'body' => $theBody, 'response' => $response, 'cookies' => $theHeaders['cookies']); }
/** * Send a HTTP request to a URI using cURL extension. * * @access public * @since 2.7.0 * * @param string $url * @param str|array $args Optional. Override the defaults. * @return array 'headers', 'body', and 'response' keys. */ function request($url, $args = array()) { $defaults = array('method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null); $r = wp_parse_args($args, $defaults); if (isset($r['headers']['User-Agent'])) { $r['user-agent'] = $r['headers']['User-Agent']; unset($r['headers']['User-Agent']); } else { if (isset($r['headers']['user-agent'])) { $r['user-agent'] = $r['headers']['user-agent']; unset($r['headers']['user-agent']); } } // cURL extension will sometimes fail when the timeout is less than 1 as // it may round down to 0, which gives it unlimited timeout. if ($r['timeout'] > 0 && $r['timeout'] < 1) { $r['timeout'] = 1; } $handle = curl_init(); curl_setopt($handle, CURLOPT_URL, $url); // The cURL extension requires that the option be set for the HEAD to // work properly. if ('HEAD' === $r['method']) { curl_setopt($handle, CURLOPT_NOBODY, true); } if (true === $r['blocking']) { curl_setopt($handle, CURLOPT_HEADER, true); curl_setopt($handle, CURLOPT_RETURNTRANSFER, 1); } else { curl_setopt($handle, CURLOPT_HEADER, false); curl_setopt($handle, CURLOPT_NOBODY, true); curl_setopt($handle, CURLOPT_RETURNTRANSFER, 0); } curl_setopt($handle, CURLOPT_USERAGENT, $r['user-agent']); curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 1); curl_setopt($handle, CURLOPT_TIMEOUT, $r['timeout']); curl_setopt($handle, CURLOPT_MAXREDIRS, $r['redirection']); // The option doesn't work with safe mode or when open_basedir is set. if (!ini_get('safe_mode') && !ini_get('open_basedir')) { curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true); } if (!is_null($r['headers'])) { curl_setopt($handle, CURLOPT_HTTPHEADER, $r['headers']); } if ($r['httpversion'] == '1.0') { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); } else { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); } // Cookies are not handled by the HTTP API currently. Allow for plugin // authors to handle it themselves... Although, it is somewhat pointless // without some reference. do_action_ref_array('http_api_curl', array(&$handle)); // We don't need to return the body, so don't. Just execution request // and return. if (!$r['blocking']) { curl_exec($handle); curl_close($handle); return array('headers' => array(), 'body' => '', 'response' => array('code', 'message')); } $theResponse = curl_exec($handle); if (!empty($theResponse)) { $headerLength = curl_getinfo($handle, CURLINFO_HEADER_SIZE); $theHeaders = trim(substr($theResponse, 0, $headerLength)); $theBody = substr($theResponse, $headerLength); if (false !== strrpos($theHeaders, "\r\n\r\n")) { $headerParts = explode("\r\n\r\n", $theHeaders); $theHeaders = $headerParts[count($headerParts) - 1]; } $theHeaders = WP_Http::processHeaders($theHeaders); } else { if ($curl_error = curl_error($handle)) { return new WP_Error('http_request_failed', $curl_error); } if (in_array(curl_getinfo($handle, CURLINFO_HTTP_CODE), array(301, 302))) { return new WP_Error('http_request_failed', __('Too many redirects.')); } $theHeaders = array('headers' => array()); $theBody = ''; } $response = array(); $response['code'] = curl_getinfo($handle, CURLINFO_HTTP_CODE); $response['message'] = get_status_header_desc($response['code']); curl_close($handle); if (true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders)) { $theBody = WP_Http_Encoding::decompress($theBody); } return array('headers' => $theHeaders['headers'], 'body' => $theBody, 'response' => $response); }
/** * Send a HTTP request to a URI using cURL extension. * * @access public * @since 2.7.0 * * @param string $url * @param str|array $args Optional. Override the defaults. * @return array 'headers', 'body', 'response', 'cookies' and 'filename' keys. */ function request($url, $args = array()) { $defaults = array('method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null, 'cookies' => array()); $r = wp_parse_args($args, $defaults); if (isset($r['headers']['User-Agent'])) { $r['user-agent'] = $r['headers']['User-Agent']; unset($r['headers']['User-Agent']); } else { if (isset($r['headers']['user-agent'])) { $r['user-agent'] = $r['headers']['user-agent']; unset($r['headers']['user-agent']); } } // Construct Cookie: header if any cookies are set. WP_Http::buildCookieHeader($r); $handle = curl_init(); // cURL offers really easy proxy support. $proxy = new WP_HTTP_Proxy(); if ($proxy->is_enabled() && $proxy->send_through_proxy($url)) { curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); curl_setopt($handle, CURLOPT_PROXY, $proxy->host()); curl_setopt($handle, CURLOPT_PROXYPORT, $proxy->port()); if ($proxy->use_authentication()) { curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); curl_setopt($handle, CURLOPT_PROXYUSERPWD, $proxy->authentication()); } } $is_local = isset($args['local']) && $args['local']; $ssl_verify = isset($args['sslverify']) && $args['sslverify']; if ($is_local) { $ssl_verify = apply_filters('https_local_ssl_verify', $ssl_verify); } elseif (!$is_local) { $ssl_verify = apply_filters('https_ssl_verify', $ssl_verify); } // CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since // a value of 0 will allow an ulimited timeout. $timeout = (int) ceil($r['timeout']); curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($handle, CURLOPT_TIMEOUT, $timeout); curl_setopt($handle, CURLOPT_URL, $url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, $ssl_verify === true ? 2 : false); curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify); curl_setopt($handle, CURLOPT_USERAGENT, $r['user-agent']); curl_setopt($handle, CURLOPT_MAXREDIRS, $r['redirection']); switch ($r['method']) { case 'HEAD': curl_setopt($handle, CURLOPT_NOBODY, true); break; case 'POST': curl_setopt($handle, CURLOPT_POST, true); curl_setopt($handle, CURLOPT_POSTFIELDS, $r['body']); break; case 'PUT': curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($handle, CURLOPT_POSTFIELDS, $r['body']); break; } if (true === $r['blocking']) { curl_setopt($handle, CURLOPT_HEADERFUNCTION, array(&$this, 'stream_headers')); } curl_setopt($handle, CURLOPT_HEADER, false); // If streaming to a file open a file handle, and setup our curl streaming handler if ($r['stream']) { if (!WP_DEBUG) { $stream_handle = @fopen($r['filename'], 'w+'); } else { $stream_handle = fopen($r['filename'], 'w+'); } if (!$stream_handle) { return new WP_Error('http_request_failed', sprintf(__('Could not open handle for fopen() to %s'), $r['filename'])); } curl_setopt($handle, CURLOPT_FILE, $stream_handle); } // The option doesn't work with safe mode or when open_basedir is set. if (!ini_get('safe_mode') && !ini_get('open_basedir') && 0 !== $r['_redirection']) { curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true); } if (!empty($r['headers'])) { // cURL expects full header strings in each element $headers = array(); foreach ($r['headers'] as $name => $value) { $headers[] = "{$name}: {$value}"; } curl_setopt($handle, CURLOPT_HTTPHEADER, $headers); } if ($r['httpversion'] == '1.0') { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); } else { curl_setopt($handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); } // Cookies are not handled by the HTTP API currently. Allow for plugin authors to handle it // themselves... Although, it is somewhat pointless without some reference. do_action_ref_array('http_api_curl', array(&$handle)); // We don't need to return the body, so don't. Just execute request and return. if (!$r['blocking']) { curl_exec($handle); curl_close($handle); return array('headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array()); } $theResponse = curl_exec($handle); $theBody = ''; $theHeaders = WP_Http::processHeaders($this->headers); if (strlen($theResponse) > 0 && !is_bool($theResponse)) { // is_bool: when using $args['stream'], curl_exec will return (bool)true $theBody = $theResponse; } // If no response, and It's not a HEAD request with valid headers returned if (0 == strlen($theResponse) && ('HEAD' != $args['method'] || empty($this->headers))) { if ($curl_error = curl_error($handle)) { return new WP_Error('http_request_failed', $curl_error); } if (in_array(curl_getinfo($handle, CURLINFO_HTTP_CODE), array(301, 302))) { return new WP_Error('http_request_failed', __('Too many redirects.')); } } unset($this->headers); $response = array(); $response['code'] = curl_getinfo($handle, CURLINFO_HTTP_CODE); $response['message'] = get_status_header_desc($response['code']); curl_close($handle); if ($r['stream']) { fclose($stream_handle); } // See #11305 - When running under safe mode, redirection is disabled above. Handle it manually. if (!empty($theHeaders['headers']['location']) && (ini_get('safe_mode') || ini_get('open_basedir')) && 0 !== $r['_redirection']) { if ($r['redirection']-- > 0) { return $this->request($theHeaders['headers']['location'], $r); } else { return new WP_Error('http_request_failed', __('Too many redirects.')); } } if (true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders['headers'])) { $theBody = WP_Http_Encoding::decompress($theBody); } return array('headers' => $theHeaders['headers'], 'body' => $theBody, 'response' => $response, 'cookies' => $theHeaders['cookies'], 'filename' => $r['filename']); }
function fv_wp_flowplayer_check_files() { if (stripos($_SERVER['HTTP_REFERER'], home_url()) === 0) { global $wpdb; define('VIDEO_DIR', '/videos/'); $bNotDone = false; $tStart = microtime(true); $tMax = @ini_get('max_execution_time') ? @ini_get('max_execution_time') - 5 : 25; $videos1 = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_type != 'revision' AND post_status != 'trash' AND post_content LIKE '%[flowplayer %'"); $videos2 = $wpdb->get_results("SELECT ID, post_content FROM {$wpdb->posts} WHERE post_type != 'revision' AND post_status != 'trash' AND post_content LIKE '%[fvplayer %'"); $videos = array_merge($videos1, $videos2); $source_servers = array(); $shortcodes_count = 0; $src_count = 0; if (count($videos)) { foreach ($videos as $post) { $shortcodes_count += preg_match_all('!\\[(?:flowplayer|fvplayer)[^\\]]+\\]!', $post->post_content, $post_videos); if (count($post_videos[0])) { foreach ($post_videos[0] as $post_video) { $post_video = preg_replace('!popup=\'.*\'!', '', $post_video); $src_count += preg_match_all('!(?:src|src1|src2|src3|mp4|webm|ogv)=[\'"](.*?(?:mp4|m4v))[\'"]!', $post_video, $sources1); $src_count += preg_match_all('!(?:src|src1|src2|src3|mp4|webm|ogv)=([^\'"].*?(?:mp4|m4v|flv))[\\s\\]]!', $post_video, $sources2); $sources = array_merge($sources1[1], $sources2[1]); if (count($sources)) { foreach ($sources as $src) { if (strpos($src, '//') === 0) { $src = 'http:' . $src; } else { if (strpos($src, '/') === 0) { $src = home_url() . $src; } else { if (!preg_match('!^\\S+://!', $src)) { $src = home_url() . VIDEO_DIR . $src; } } } $server = preg_replace('!(.*?//.*?)/.+!', '$1', $src); $source_servers[$server][] = array('src' => $src, 'post_id' => $post->ID); } } } } } } $ok = array(); $errors = array(); $count = 0; foreach ($source_servers as $server => $videos) { $tCurrent = microtime(true); if ($tCurrent - $tStart > $tMax) { $bNotDone = true; break; } if (stripos($videos[0]['src'], '.mp4') === FALSE) { continue; } global $FV_Player_Checker; if (stripos(trim($videos[0]['src']), 'rtmp://') === false) { list($header, $message_out) = $FV_Player_Checker->http_request(trim($videos[0]['src']), array('quick_check' => 10, 'size' => 65536)); if ($header) { $headers = WP_Http::processHeaders($header); list($new_errors, $mime_type, $fatal) = $FV_Player_Checker->check_headers($headers, trim($videos[0]['src']), rand(0, 999), array('talk_bad_mime' => 'Server <code>' . $server . '</code> uses incorrect mime type for MP4 ', 'wrap' => false)); if ($fatal) { continue; } if ($new_errors) { $sPostsLinks = false; foreach ($videos as $video) { $sPostsLinks .= '<a href="' . home_url() . '?p=' . $video['post_id'] . '">' . $video['post_id'] . '</a> '; } $errors[] = implode(" ", $new_errors) . '(<a href="#" onclick="jQuery(\'#fv-flowplayer-warning-' . $count . '\').toggle(); return false">click to see a list of posts</a>) <div id="fv-flowplayer-warning-' . $count . '" style="display: none; ">' . $sPostsLinks . '</div>'; $count++; continue; } else { $ok[] = 'Server <code>' . $server . '</code> appears to serve correct mime type <code>' . $mime_type . '</code> for MP4 videos.'; } } } } if ($bNotDone) { $ok[] = '<strong>Not all the servers were checked as you use a lot of them, increase your PHP execution time or check your other videos by hand.</strong>'; } $output = array('errors' => $errors, 'ok' => $ok); echo '<FVFLOWPLAYER>' . json_encode($output) . '</FVFLOWPLAYER>'; die; } die('-1'); }
public function check_mimetype($URLs = false, $meta = false) { add_action('http_api_curl', array('FV_Player_Checker', 'http_api_curl')); $tStart = microtime(true); global $fv_wp_flowplayer_ver, $fv_fp; if (!empty($meta)) { extract($meta, EXTR_SKIP); } if (defined('DOING_AJAX') && DOING_AJAX && isset($_POST['media']) && stripos($_SERVER['HTTP_REFERER'], home_url()) === 0) { $URLs = json_decode(stripslashes(trim($_POST['media']))); } if (isset($URLs)) { $all_sources = $URLs; foreach ($all_sources as $source) { if (preg_match('!^rtmp://!', $source, $match)) { $found_rtmp = true; } else { if (!isset($media) && !preg_match('!\\.(m3u8ALLOW|m3uALLOW|avi)$!', $source)) { $media = $source; } } } //$random = rand( 0, 10000 ); $random = isset($_POST['hash']) ? trim($_POST['hash']) : false; if (isset($media)) { $remotefilename = $media; $remotefilename_encoded = flowplayer::get_encoded_url($remotefilename); if ($fv_fp->is_secure_amazon_s3($remotefilename_encoded) || 1 > 0) { // skip headers check for Amazon S3, as it's slow $headers = false; } else { $headers = wp_remote_head(trim(str_replace(' ', '%20', $remotefilename_encoded)), array('method' => 'GET', 'redirection' => 3)); } $bValidFile = true; if (is_wp_error($headers)) { $video_errors[] = 'Error checking ' . $media . '!<br />' . print_r($headers, true); } else { if ($headers) { list($aVideoErrors, $sContentType, $bFatal) = $this->check_headers($headers, $remotefilename, $random); if ($bFatal) { $bValidFile = false; } if ($aVideoErrors) { $video_errors = array_merge($video_errors, $aVideoErrors); } } if (function_exists('is_utf8') && is_utf8($remotefilename)) { $video_errors[] = '<p><strong>UTF-8 error</strong>: Your file name is using non-latin characters, the file might not play in browsers using Flash for the video!</p>'; } if (@ini_get('safe_mode')) { $video_warnings[] = 'Detailed video check is not available with PHP Safe Mode On. Please contact your webhost support.'; } else { if (!class_exists('getID3')) { require ABSPATH . WPINC . '/ID3/getid3.php'; } $getID3 = new getID3(); if (!function_exists('curl_init')) { $video_errors[] = 'cURL for PHP not found, please contact your server administrator.'; } else { $message = '<p>Analysis of <a class="bluelink" target="_blank" href="' . esc_attr($remotefilename_encoded) . '">' . $remotefilename_encoded . '</a></p>'; // taken from: http://www.getid3.org/phpBB3/viewtopic.php?f=3&t=1141 $upload_dir = wp_upload_dir(); $localtempfilename = trailingslashit($upload_dir['basedir']) . 'fv_flowlayer_tmp_' . md5(rand(1, 999)) . '_' . basename(substr($remotefilename_encoded, 0, 32)); $out = fopen($localtempfilename, 'wb'); if ($out) { $aArgs = array('file' => $localtempfilename); if (!$this->is_cron) { $aArgs['quick_check'] = apply_filters('fv_flowplayer_checker_timeout_quick', 2); } list($header, $sHTTPError) = $this->http_request($remotefilename_encoded, $aArgs); $video_errors = array(); if ($sHTTPError) { $video_errors[] = $sHTTPError; $bValidFile = false; } fclose($out); if (!$headers) { $headers = WP_Http::processHeaders($header); list($aVideoErrors, $sContentType, $bFatal) = $this->check_headers($headers, $remotefilename, $random); if ($bFatal) { $bValidFile = false; } if ($aVideoErrors) { $video_errors = array_merge($video_errors, $aVideoErrors); } if (isset($hearders['headers']['server']) && $hearders['headers']['server'] == 'AmazonS3' && $headers['response']['code'] == '403') { $error = new SimpleXMLElement($body); if (stripos($error->Message, 'Request has expired') !== false) { $video_errors[] = '<p><strong>Amazon S3</strong>: Your secure link is expired, there might be problem with your Amazon S3 plugin. Please test if the above URL opens in your browser.</p>'; } else { $video_errors[] = '<p><strong>Amazon S3</strong>: ' . $error->Message . '</p>'; } } } if ($bValidFile) { $ThisFileInfo = $getID3->analyze($localtempfilename); } if (!@unlink($localtempfilename)) { $video_errors[] = 'Can\'t remove temporary file for video analysis in <tt>' . $localtempfilename . '</tt>!'; } } else { $video_errors[] = 'Can\'t create temporary file for video analysis in <tt>' . $localtempfilename . '</tt>!'; } } /* Only check file length */ if (isset($meta_action) && $meta_action == 'check_time') { $time = false; if (isset($ThisFileInfo) && isset($ThisFileInfo['playtime_seconds'])) { $time = $ThisFileInfo['playtime_seconds']; } $time = apply_filters('fv_flowplayer_checker_time', $time, $meta_original); global $post; $fv_flowplayer_meta = get_post_meta($post->ID, flowplayer::get_video_key($meta_original), true); $fv_flowplayer_meta = $fv_flowplayer_meta ? $fv_flowplayer_meta : array(); $fv_flowplayer_meta['duration'] = $time; $fv_flowplayer_meta['etag'] = isset($headers['headers']['etag']) ? $headers['headers']['etag'] : false; // todo: check! $fv_flowplayer_meta['date'] = time(); $fv_flowplayer_meta['check_time'] = microtime(true) - $tStart; if ($time > 0 || $this->is_cron) { update_post_meta($post->ID, flowplayer::get_video_key($meta_original), $fv_flowplayer_meta); return true; } //} else { //self::queue_add($post->ID); //return false; //} } } } // end is_wp_error check } // end isset($media) } }
/** * Send a HTTP request to a URI using cURL extension. * * @access public * @since 2.7 * * @param string $url * @param str|array $args Optional. Override the defaults. * @return array 'headers', 'body', and 'response' keys. */ function request($url, $args = array()) { $defaults = array( 'method' => 'GET', 'timeout' => 5, 'redirection' => 5, 'httpversion' => '1.0', 'blocking' => true, 'headers' => array(), 'body' => null ); $r = wp_parse_args( $args, $defaults ); if ( isset($r['headers']['User-Agent']) ) { $r['user-agent'] = $r['headers']['User-Agent']; unset($r['headers']['User-Agent']); } else if( isset($r['headers']['user-agent']) ) { $r['user-agent'] = $r['headers']['user-agent']; unset($r['headers']['user-agent']); } // If timeout is a float less than 1, round it up to 1. if ( $r['timeout'] > 0 && $r['timeout'] < 1 ) $r['timeout'] = 1; $handle = curl_init(); curl_setopt( $handle, CURLOPT_URL, $url); if ( 'HEAD' === $r['method'] ) { curl_setopt( $handle, CURLOPT_NOBODY, true ); } if ( true === $r['blocking'] ) { curl_setopt( $handle, CURLOPT_HEADER, true ); curl_setopt( $handle, CURLOPT_RETURNTRANSFER, 1 ); } else { curl_setopt( $handle, CURLOPT_HEADER, false ); curl_setopt( $handle, CURLOPT_NOBODY, true ); curl_setopt( $handle, CURLOPT_RETURNTRANSFER, 0 ); } curl_setopt( $handle, CURLOPT_USERAGENT, $r['user-agent'] ); curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, 1 ); curl_setopt( $handle, CURLOPT_TIMEOUT, $r['timeout'] ); curl_setopt( $handle, CURLOPT_MAXREDIRS, $r['redirection'] ); if ( !ini_get('safe_mode') && !ini_get('open_basedir') ) curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, true ); if( ! is_null($r['headers']) ) curl_setopt( $handle, CURLOPT_HTTPHEADER, $r['headers'] ); if ( $r['httpversion'] == '1.0' ) curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 ); else curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 ); if ( ! $r['blocking'] ) { curl_exec( $handle ); curl_close( $handle ); return array( 'headers' => array(), 'body' => '', 'response' => array('code', 'message') ); } $theResponse = curl_exec( $handle ); if ( !empty($theResponse) ) { $headerLength = curl_getinfo($handle, CURLINFO_HEADER_SIZE); $theHeaders = trim( substr($theResponse, 0, $headerLength) ); $theBody = substr( $theResponse, $headerLength ); if ( false !== strrpos($theHeaders, "\r\n\r\n") ) { $headerParts = explode("\r\n\r\n", $theHeaders); $theHeaders = $headerParts[ count($headerParts) -1 ]; } $theHeaders = WP_Http::processHeaders($theHeaders); } else { if ( $curl_error = curl_error($handle) ) return new WP_Error('http_request_failed', $curl_error); if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array(301, 302) ) ) return new WP_Error('http_request_failed', __('Too many redirects.')); $theHeaders = array( 'headers' => array() ); $theBody = ''; } $response = array(); $response['code'] = curl_getinfo( $handle, CURLINFO_HTTP_CODE ); $response['message'] = get_status_header_desc($response['code']); curl_close( $handle ); return array('headers' => $theHeaders['headers'], 'body' => $theBody, 'response' => $response); }