function __construct()
 {
     $this->processdone = FALSE;
     $this->genesis = FALSE;
     //$this->reorder      = FALSE;
     $this->is_new = FALSE;
     $this->encoding = WP_Http_Encoding::is_available();
     $this->menuName = CHLD_THM_CFG_MENU;
     // backward compatability for plugins extension
     $this->is_post = 'POST' == $_SERVER['REQUEST_METHOD'];
     $this->is_get = 'GET' == $_SERVER['REQUEST_METHOD'];
     $this->is_debug = get_option(CHLD_THM_CFG_OPTIONS . '_debug');
     $this->debug = '';
     $this->errors = array();
 }
 /**
  * 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
  *
  * @global string $wp_version
  *
  * @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/' . $wp_version . '; ' . get_bloginfo( 'url' ).
  *     @type bool         $reject_unsafe_urls  Whether to pass URLs through {@see 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())
 {
     global $wp_version;
     $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/' . $wp_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);
     /**
      * Filter 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'];
     }
     /**
      * Filter 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.'));
     }
     /*
      * Determine if this is a https call and pass that on to the transport functions
      * so that we can blacklist the transports that do not support ssl verification
      */
     $r['ssl'] = $arrURL['scheme'] == 'https' || $arrURL['scheme'] == 'ssl';
     // Determine if this request is to OUR install of WordPress.
     $homeURL = parse_url(get_bloginfo('url'));
     $r['local'] = 'localhost' == $arrURL['host'] || isset($homeURL['host']) && $homeURL['host'] == $arrURL['host'];
     unset($homeURL);
     /*
      * 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'] && empty($r['filename'])) {
         $r['filename'] = get_temp_dir() . wp_unique_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.
      */
     if ($r['stream']) {
         $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();
     }
     if (!is_array($r['headers'])) {
         $processedHeaders = self::processHeaders($r['headers'], $url);
         $r['headers'] = $processedHeaders['headers'];
     }
     if (isset($r['headers']['User-Agent'])) {
         $r['user-agent'] = $r['headers']['User-Agent'];
         unset($r['headers']['User-Agent']);
     }
     if (isset($r['headers']['user-agent'])) {
         $r['user-agent'] = $r['headers']['user-agent'];
         unset($r['headers']['user-agent']);
     }
     if ('1.1' == $r['httpversion'] && !isset($r['headers']['connection'])) {
         $r['headers']['connection'] = 'close';
     }
     // Construct Cookie: header if any cookies are set.
     self::buildCookieHeader($r);
     // Avoid issues where mbstring.func_overload is enabled.
     mbstring_binary_safe_encoding();
     if (!isset($r['headers']['Accept-Encoding'])) {
         if ($encoding = WP_Http_Encoding::accept_encoding($url, $r)) {
             $r['headers']['Accept-Encoding'] = $encoding;
         }
     }
     if (!is_null($r['body']) && '' != $r['body'] || 'POST' == $r['method'] || 'PUT' == $r['method']) {
         if (is_array($r['body']) || is_object($r['body'])) {
             $r['body'] = http_build_query($r['body'], null, '&');
             if (!isset($r['headers']['Content-Type'])) {
                 $r['headers']['Content-Type'] = 'application/x-www-form-urlencoded; charset=' . get_option('blog_charset');
             }
         }
         if ('' === $r['body']) {
             $r['body'] = null;
         }
         if (!isset($r['headers']['Content-Length']) && !isset($r['headers']['content-length'])) {
             $r['headers']['Content-Length'] = strlen($r['body']);
         }
     }
     $response = $this->_dispatch_request($url, $r);
     reset_mbstring_encoding();
     if (is_wp_error($response)) {
         return $response;
     }
     // Append cookies that were used in this request to the response
     if (!empty($r['cookies'])) {
         $cookies_set = wp_list_pluck($response['cookies'], 'name');
         foreach ($r['cookies'] as $cookie) {
             if (!in_array($cookie->name, $cookies_set) && $cookie->test($url)) {
                 $response['cookies'][] = $cookie;
             }
         }
     }
     return $response;
 }
Example #3
0
 /**
  * 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;
 }
 /**
  * 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;
 }
Example #5
0
 /**
  * Decompression of deflated string.
  *
  * Will attempt to decompress using the RFC 1950 standard, and if that fails
  * then the RFC 1951 standard deflate will be attempted. Finally, the RFC
  * 1952 standard gzip decode will be attempted. If all fail, then the
  * original compressed string will be returned.
  *
  * @since 2.8
  *
  * @param string $compressed String to decompress.
  * @param int $length The optional length of the compressed data.
  * @return string|bool False on failure.
  */
 function decompress($compressed, $length = null)
 {
     $decompressed = WP_Http_Encoding::compatible_gzinflate($compressed);
     if (false !== $decompressed) {
         return $decompressed;
     }
     $decompressed = gzuncompress($compressed);
     if (false !== $decompressed) {
         return $decompressed;
     }
     if (function_exists('gzdecode')) {
         $decompressed = gzdecode($compressed);
         if (false !== $decompressed) {
             return $decompressed;
         }
     }
     return $compressed;
 }
Example #6
0
 /**
  * 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);
 }
Example #7
0
 /**
  * What encoding types to accept and their priority values.
  *
  * @since 2.8.0
  *
  * @return string Types of encoding to accept.
  */
 public static function accept_encoding($url, $args)
 {
     $type = array();
     $compression_enabled = WP_Http_Encoding::is_available();
     if (!$args['decompress']) {
         // Decompression specifically disabled.
         $compression_enabled = false;
     } elseif ($args['stream']) {
         // Disable when streaming to file.
         $compression_enabled = false;
     } elseif (isset($args['limit_response_size'])) {
         // If only partial content is being requested, we won't be able to decompress it.
         $compression_enabled = false;
     }
     if ($compression_enabled) {
         if (function_exists('gzinflate')) {
             $type[] = 'deflate;q=1.0';
         }
         if (function_exists('gzuncompress')) {
             $type[] = 'compress;q=0.5';
         }
         if (function_exists('gzdecode')) {
             $type[] = 'gzip;q=0.5';
         }
     }
     /**
      * Filter the allowed encoding types.
      *
      * @since 3.6.0
      *
      * @param array  $type Encoding types allowed. Accepts 'gzinflate',
      *                     'gzuncompress', 'gzdecode'.
      * @param string $url  URL of the HTTP request.
      * @param array  $args HTTP request arguments.
      */
     $type = apply_filters('wp_http_accept_encoding', $type, $url, $args);
     return implode(', ', $type);
 }
	/**
	 * 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;
		}

		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) ) {
			$parts = explode("\r\n\r\n", $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']);
	}
Example #9
0
 /**
  * What encoding types to accept and their priority values.
  *
  * @since 2.8
  *
  * @return string Types of encoding to accept.
  */
 public static function accept_encoding($url, $args)
 {
     $type = array();
     $compression_enabled = WP_Http_Encoding::is_available();
     if (!$args['decompress']) {
         // decompression specifically disabled
         $compression_enabled = false;
     } elseif ($args['stream']) {
         // disable when streaming to file
         $compression_enabled = false;
     } elseif (isset($args['limit-response-size'])) {
         // If only partial content is being requested, we won't be able to decompress it
         $compression_enabled = false;
     }
     if ($compression_enabled) {
         if (function_exists('gzinflate')) {
             $type[] = 'deflate;q=1.0';
         }
         if (function_exists('gzuncompress')) {
             $type[] = 'compress;q=0.5';
         }
         if (function_exists('gzdecode')) {
             $type[] = 'gzip;q=0.5';
         }
     }
     $type = apply_filters('wp_http_accept_encoding', $type, $url, $args);
     return implode(', ', $type);
 }
function fb_linkedin_resume_decompress($compressed)
{
    if (false !== ($decompressed = @gzinflate($compressed))) {
        return $decompressed;
    }
    if (false !== ($decompressed = WP_Http_Encoding::compatible_gzinflate($compressed))) {
        return $decompressed;
    }
    if (false !== ($decompressed = @gzuncompress($compressed))) {
        return $decompressed;
    }
    if (function_exists('gzdecode')) {
        $decompressed = @gzdecode($compressed);
        if (false !== $decompressed) {
            return $decompressed;
        }
    }
    return $compressed;
}
 /**
  * Make a HTTP request to a supplied URL.
  *
  * Much of the logic here is plagiarized from the WP_Http_Curl as to avoid
  * trying to re-invent the wheel.
  *
  * @param $url
  * @param $args
  * @return bool
  */
 public function request($url, $args)
 {
     $r = wp_parse_args($args, self::$request_defaults);
     // Construct Cookie: header if any cookies are set.
     WP_Http::buildCookieHeader($r);
     $is_local = isset($r['local']) && $r['local'];
     $ssl_verify = isset($r['sslverify']) && $r['sslverify'];
     if ($is_local) {
         $ssl_verify = apply_filters('https_local_ssl_verify', $ssl_verify);
     } else {
         $ssl_verify = apply_filters('https_ssl_verify', $ssl_verify);
     }
     // For now, lets not support streaming into a file and see what breaks
     if (isset($r['filename'])) {
         return new WP_Error('http_request_failed', __('Saving to a file is not currently supported.'));
     }
     $req = new \google\appengine\URLFetchRequest();
     $req->setUrl($url);
     $req->setMethod(self::$request_map[$r['method']]);
     $req->setMustValidateServerCertificate($ssl_verify);
     if (isset($r['body'])) {
         $req->setPayload($r['body']);
     }
     if (isset($r['timeout'])) {
         $req->setDeadline($r['timeout']);
     }
     // App Engine does not allow setting the number of redirects, only if we
     // follow redirects or not.
     $req->setFollowRedirects(isset($r['redirection']) && $r['redirection'] != 0);
     foreach ($r['headers'] as $key => $value) {
         $header = $req->addHeader();
         $header->setKey($key);
         $header->setValue($value);
     }
     $resp = new \google\appengine\URLFetchResponse();
     try {
         ApiProxy::makeSyncCall('urlfetch', 'Fetch', $req, $resp);
     } catch (ApplicationError $e) {
         syslog(LOG_ERR, sprintf("Call to URLFetch failed with application error %d for url %s.", $e->getApplicationError(), $url));
         return new \WP_Error('http_request_failed', $e->getMessage());
     }
     $response = [];
     $response['code'] = $resp->getStatusCode();
     $response['message'] = \get_status_header_desc($resp->getStatusCode());
     $headers = [];
     $cookies = [];
     foreach ($resp->getHeaderList() as $header) {
         $key = strtolower($header->getKey());
         $value = trim($header->getValue());
         // If a header has multiple values then it is stored in an array
         if (isset($headers[$key])) {
             if (!is_array($headers[$key])) {
                 $headers[$key] = [$headers[$key]];
             }
             $headers[$key][] = $value;
         } else {
             $headers[$key] = $value;
         }
         if ('set-cookie' == $key) {
             $cookies[] = new \WP_Http_Cookie($value, $url);
         }
     }
     $theBody = $resp->getContent();
     if (true === $r['decompress'] && true === WP_Http_Encoding::should_decode($headers)) {
         $theBody = WP_Http_Encoding::decompress($theBody);
     }
     if (isset($r['limit_response_size']) && strlen($theBody) > $r['limit_response_size']) {
         $theBody = substr($theBody, 0, $r['limit_response_size']);
     }
     $response = ['response' => $response, 'body' => $theBody, 'cookies' => $cookies, 'headers' => $headers];
     return $response;
 }
Example #12
0
	/**
	 * Decompression of deflated string.
	 *
	 * Will attempt to decompress using the RFC 1950 standard, and if that fails
	 * then the RFC 1951 standard deflate will be attempted. Finally, the RFC
	 * 1952 standard gzip decode will be attempted. If all fail, then the
	 * original compressed string will be returned.
	 *
	 * @since 2.8
	 *
	 * @param string $compressed String to decompress.
	 * @param int $length The optional length of the compressed data.
	 * @return string|bool False on failure.
	 */
	function decompress( $compressed, $length = null ) {

		if ( empty($compressed) )
			return $compressed;

		if ( false !== ( $decompressed = @gzinflate( $compressed ) ) )
			return $decompressed;

		if ( false !== ( $decompressed = WP_Http_Encoding::compatible_gzinflate( $compressed ) ) )
			return $decompressed;

		if ( false !== ( $decompressed = @gzuncompress( $compressed ) ) )
			return $decompressed;

		if ( function_exists('gzdecode') ) {
			$decompressed = @gzdecode( $compressed );

			if ( false !== $decompressed )
				return $decompressed;
		}

		return $compressed;
	}