PageRenderTime 17ms CodeModel.GetById 8ms app.highlight 6ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-includes/Requests/Proxy/HTTP.php

https://bitbucket.org/skyarch-iijima/wordpress
PHP | 151 lines | 52 code | 13 blank | 86 comment | 7 complexity | ffd0e62f32db05bdbda6bca407d7f029 MD5 | raw file
  1<?php
  2/**
  3 * HTTP Proxy connection interface
  4 *
  5 * @package Requests
  6 * @subpackage Proxy
  7 * @since 1.6
  8 */
  9
 10/**
 11 * HTTP Proxy connection interface
 12 *
 13 * Provides a handler for connection via an HTTP proxy
 14 *
 15 * @package Requests
 16 * @subpackage Proxy
 17 * @since 1.6
 18 */
 19class Requests_Proxy_HTTP implements Requests_Proxy {
 20	/**
 21	 * Proxy host and port
 22	 *
 23	 * Notation: "host:port" (eg 127.0.0.1:8080 or someproxy.com:3128)
 24	 *
 25	 * @var string
 26	 */
 27	public $proxy;
 28
 29	/**
 30	 * Username
 31	 *
 32	 * @var string
 33	 */
 34	public $user;
 35
 36	/**
 37	 * Password
 38	 *
 39	 * @var string
 40	 */
 41	public $pass;
 42
 43	/**
 44	 * Do we need to authenticate? (ie username & password have been provided)
 45	 *
 46	 * @var boolean
 47	 */
 48	public $use_authentication;
 49
 50	/**
 51	 * Constructor
 52	 *
 53	 * @since 1.6
 54	 * @throws Requests_Exception On incorrect number of arguments (`authbasicbadargs`)
 55	 * @param array|null $args Array of user and password. Must have exactly two elements
 56	 */
 57	public function __construct($args = null) {
 58		if (is_string($args)) {
 59			$this->proxy = $args;
 60		}
 61		elseif (is_array($args)) {
 62			if (count($args) == 1) {
 63				list($this->proxy) = $args;
 64			}
 65			elseif (count($args) == 3) {
 66				list($this->proxy, $this->user, $this->pass) = $args;
 67				$this->use_authentication = true;
 68			}
 69			else {
 70				throw new Requests_Exception('Invalid number of arguments', 'proxyhttpbadargs');
 71			}
 72		}
 73	}
 74
 75	/**
 76	 * Register the necessary callbacks
 77	 *
 78	 * @since 1.6
 79	 * @see curl_before_send
 80	 * @see fsockopen_remote_socket
 81	 * @see fsockopen_remote_host_path
 82	 * @see fsockopen_header
 83	 * @param Requests_Hooks $hooks Hook system
 84	 */
 85	public function register(Requests_Hooks &$hooks) {
 86		$hooks->register('curl.before_send', array(&$this, 'curl_before_send'));
 87
 88		$hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket'));
 89		$hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path'));
 90		if ($this->use_authentication) {
 91			$hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header'));
 92		}
 93	}
 94
 95	/**
 96	 * Set cURL parameters before the data is sent
 97	 *
 98	 * @since 1.6
 99	 * @param resource $handle cURL resource
100	 */
101	public function curl_before_send(&$handle) {
102		curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
103		curl_setopt($handle, CURLOPT_PROXY, $this->proxy);
104
105		if ($this->use_authentication) {
106			curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
107			curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string());
108		}
109	}
110
111	/**
112	 * Alter remote socket information before opening socket connection
113	 *
114	 * @since 1.6
115	 * @param string $remote_socket Socket connection string
116	 */
117	public function fsockopen_remote_socket(&$remote_socket) {
118		$remote_socket = $this->proxy;
119	}
120
121	/**
122	 * Alter remote path before getting stream data
123	 *
124	 * @since 1.6
125	 * @param string $path Path to send in HTTP request string ("GET ...")
126	 * @param string $url Full URL we're requesting
127	 */
128	public function fsockopen_remote_host_path(&$path, $url) {
129		$path = $url;
130	}
131
132	/**
133	 * Add extra headers to the request before sending
134	 *
135	 * @since 1.6
136	 * @param string $out HTTP header string
137	 */
138	public function fsockopen_header(&$out) {
139		$out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string()));
140	}
141
142	/**
143	 * Get the authentication string (user:pass)
144	 *
145	 * @since 1.6
146	 * @return string
147	 */
148	public function get_auth_string() {
149		return $this->user . ':' . $this->pass;
150	}
151}