Title: Http
Published: March 29, 2023
Last modified: November 8, 2023

---

# class Http {}

## In this article

 * [Description](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#description)
 * [Methods](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#methods)
 * [Source](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#source)
 * [Changelog](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#changelog)

[ Back to top](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#wp--skip-link--target)

HTTP Proxy connection interface

## 󠀁[Description](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#description)󠁿

Provides a handler for connection via an HTTP proxy

## 󠀁[Methods](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#methods)󠁿

| Name | Description | 
| [Http::__construct](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/__construct/) | Constructor | 
| [Http::curl_before_send](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/curl_before_send/) | Set cURL parameters before the data is sent | 
| [Http::fsockopen_header](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/fsockopen_header/) | Add extra headers to the request before sending | 
| [Http::fsockopen_remote_host_path](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/fsockopen_remote_host_path/) | Alter remote path before getting stream data | 
| [Http::fsockopen_remote_socket](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/fsockopen_remote_socket/) | Alter remote socket information before opening socket connection | 
| [Http::get_auth_string](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/get_auth_string/) | Get the authentication string (user:pass) | 
| [Http::register](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/register/) | Register the necessary callbacks |

## 󠀁[Source](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#source)󠁿

    ```php
    final class Http implements Proxy {
    	/**
    	 * Proxy host and port
    	 *
    	 * Notation: "host:port" (eg 127.0.0.1:8080 or someproxy.com:3128)
    	 *
    	 * @var string
    	 */
    	public $proxy;

    	/**
    	 * Username
    	 *
    	 * @var string
    	 */
    	public $user;

    	/**
    	 * Password
    	 *
    	 * @var string
    	 */
    	public $pass;

    	/**
    	 * Do we need to authenticate? (ie username & password have been provided)
    	 *
    	 * @var boolean
    	 */
    	public $use_authentication;

    	/**
    	 * Constructor
    	 *
    	 * @since 1.6
    	 *
    	 * @param array|string|null $args Proxy as a string or an array of proxy, user and password.
    	 *                                When passed as an array, must have exactly one (proxy)
    	 *                                or three elements (proxy, user, password).
    	 *
    	 * @throws \WpOrg\Requests\Exception\InvalidArgument When the passed argument is not an array, a string or null.
    	 * @throws \WpOrg\Requests\Exception\ArgumentCount On incorrect number of arguments (`proxyhttpbadargs`)
    	 */
    	public function __construct($args = null) {
    		if (is_string($args)) {
    			$this->proxy = $args;
    		} elseif (is_array($args)) {
    			if (count($args) === 1) {
    				list($this->proxy) = $args;
    			} elseif (count($args) === 3) {
    				list($this->proxy, $this->user, $this->pass) = $args;
    				$this->use_authentication                    = true;
    			} else {
    				throw ArgumentCount::create(
    					'an array with exactly one element or exactly three elements',
    					count($args),
    					'proxyhttpbadargs'
    				);
    			}
    		} elseif ($args !== null) {
    			throw InvalidArgument::create(1, '$args', 'array|string|null', gettype($args));
    		}
    	}

    	/**
    	 * Register the necessary callbacks
    	 *
    	 * @since 1.6
    	 * @see \WpOrg\Requests\Proxy\Http::curl_before_send()
    	 * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_socket()
    	 * @see \WpOrg\Requests\Proxy\Http::fsockopen_remote_host_path()
    	 * @see \WpOrg\Requests\Proxy\Http::fsockopen_header()
    	 * @param \WpOrg\Requests\Hooks $hooks Hook system
    	 */
    	public function register(Hooks $hooks) {
    		$hooks->register('curl.before_send', [$this, 'curl_before_send']);

    		$hooks->register('fsockopen.remote_socket', [$this, 'fsockopen_remote_socket']);
    		$hooks->register('fsockopen.remote_host_path', [$this, 'fsockopen_remote_host_path']);
    		if ($this->use_authentication) {
    			$hooks->register('fsockopen.after_headers', [$this, 'fsockopen_header']);
    		}
    	}

    	/**
    	 * Set cURL parameters before the data is sent
    	 *
    	 * @since 1.6
    	 * @param resource|\CurlHandle $handle cURL handle
    	 */
    	public function curl_before_send(&$handle) {
    		curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    		curl_setopt($handle, CURLOPT_PROXY, $this->proxy);

    		if ($this->use_authentication) {
    			curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
    			curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string());
    		}
    	}

    	/**
    	 * Alter remote socket information before opening socket connection
    	 *
    	 * @since 1.6
    	 * @param string $remote_socket Socket connection string
    	 */
    	public function fsockopen_remote_socket(&$remote_socket) {
    		$remote_socket = $this->proxy;
    	}

    	/**
    	 * Alter remote path before getting stream data
    	 *
    	 * @since 1.6
    	 * @param string $path Path to send in HTTP request string ("GET ...")
    	 * @param string $url Full URL we're requesting
    	 */
    	public function fsockopen_remote_host_path(&$path, $url) {
    		$path = $url;
    	}

    	/**
    	 * Add extra headers to the request before sending
    	 *
    	 * @since 1.6
    	 * @param string $out HTTP header string
    	 */
    	public function fsockopen_header(&$out) {
    		$out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string()));
    	}

    	/**
    	 * Get the authentication string (user:pass)
    	 *
    	 * @since 1.6
    	 * @return string
    	 */
    	public function get_auth_string() {
    		return $this->user . ':' . $this->pass;
    	}
    }
    ```

[View all references](https://developer.wordpress.org/reference/files/wp-includes/requests/src/proxy/http.php/)
[View on Trac](https://core.trac.wordpress.org/browser/tags/7.1/src/wp-includes/Requests/src/Proxy/Http.php#L24)
[View on GitHub](https://github.com/WordPress/wordpress-develop/blob/7.1/src/wp-includes/Requests/src/Proxy/Http.php#L24-L164)

## 󠀁[Changelog](https://developer.wordpress.org/reference/classes/wporg-requests-proxy-http/?output_format=md#changelog)󠁿

| Version | Description | 
| [1.6](https://developer.wordpress.org/reference/since/1.6/) | Introduced. |

## User Contributed Notes

You must [log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fdeveloper.wordpress.org%2Freference%2Fclasses%2Fwporg-requests-proxy-http%2F)
before being able to contribute a note or feedback.