-
Notifications
You must be signed in to change notification settings - Fork 502
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #70 from rmccue/proxy
Add full proxy support, major props @ozh
- Loading branch information
Showing
7 changed files
with
252 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
Proxy Support | ||
============= | ||
|
||
You can easily make requests through HTTP proxies. | ||
|
||
To make requests through an open proxy, specify the following options: | ||
|
||
```php | ||
$options = array( | ||
'proxy' => '127.0.0.1:3128' | ||
); | ||
Requests::get('http://httpbin.org/ip', array(), $options); | ||
``` | ||
|
||
If your proxy needs you to authenticate, the option will become an array like | ||
the following: | ||
|
||
```php | ||
$options = array( | ||
'proxy' => array( '127.0.0.1:3128', 'my_username', 'my_password' ) | ||
); | ||
Requests::get('http://httpbin.org/ip', array(), $options); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
<?php | ||
|
||
// First, include Requests | ||
include('../library/Requests.php'); | ||
|
||
// Next, make sure Requests can load internal classes | ||
Requests::register_autoloader(); | ||
|
||
// Now let's make a request via a proxy. | ||
$options = array( | ||
'proxy' => '127.0.0.1:8080', // syntax: host:port, eg 12.13.14.14:8080 or someproxy.com:3128 | ||
// If you need to authenticate, use the following syntax: | ||
// 'proxy' => array( '127.0.0.1:8080', 'username', 'password' ), | ||
); | ||
$request = Requests::get('http://httpbin.org/ip', array(), $options ); | ||
|
||
// See result | ||
var_dump($request->body); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<?php | ||
/** | ||
* Proxy connection interface | ||
* | ||
* @package Requests | ||
* @subpackage Proxy | ||
* @since 1.6 | ||
*/ | ||
|
||
/** | ||
* Proxy connection interface | ||
* | ||
* Implement this interface to handle proxy settings and authentication | ||
* | ||
* Parameters should be passed via the constructor where possible, as this | ||
* makes it much easier for users to use your provider. | ||
* | ||
* @see Requests_Hooks | ||
* @package Requests | ||
* @subpackage Proxy | ||
* @since 1.6 | ||
*/ | ||
interface Requests_Proxy { | ||
/** | ||
* Register hooks as needed | ||
* | ||
* This method is called in {@see Requests::request} when the user has set | ||
* an instance as the 'auth' option. Use this callback to register all the | ||
* hooks you'll need. | ||
* | ||
* @see Requests_Hooks::register | ||
* @param Requests_Hooks $hooks Hook system | ||
*/ | ||
public function register(Requests_Hooks &$hooks); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
<?php | ||
/** | ||
* HTTP Proxy connection interface | ||
* | ||
* @package Requests | ||
* @subpackage Proxy | ||
* @since 1.6 | ||
*/ | ||
|
||
/** | ||
* HTTP Proxy connection interface | ||
* | ||
* Provides a handler for connection via an HTTP proxy | ||
* | ||
* @package Requests | ||
* @subpackage Proxy | ||
* @since 1.6 | ||
*/ | ||
class Requests_Proxy_HTTP implements Requests_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 | ||
* @throws Requests_Exception On incorrect number of arguments (`authbasicbadargs`) | ||
* @param array|null $args Array of user and password. Must have exactly two elements | ||
*/ | ||
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 new Requests_Exception( 'Invalid number of arguments', 'proxyhttpbadargs'); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* Register the necessary callbacks | ||
* | ||
* @since 1.6 | ||
* @see curl_before_send | ||
* @see fsockopen_remote_socket | ||
* @see fsockopen_remote_host_path | ||
* @see fsockopen_header | ||
* @param Requests_Hooks $hooks Hook system | ||
*/ | ||
public function register(Requests_Hooks &$hooks) { | ||
$hooks->register('curl.before_send', array(&$this, 'curl_before_send')); | ||
|
||
$hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket')); | ||
$hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path')); | ||
if( $this->use_authentication ) { | ||
$hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); | ||
} | ||
} | ||
|
||
/** | ||
* Set cURL parameters before the data is sent | ||
* | ||
* @since 1.6 | ||
* @param resource $handle cURL resource | ||
*/ | ||
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 $out HTTP header string | ||
*/ | ||
public function fsockopen_remote_socket( &$remote_socket ) { | ||
$remote_socket = $this->proxy; | ||
} | ||
|
||
/** | ||
* Alter remote path before getting stream data | ||
* | ||
* @since 1.6 | ||
* @param string $out HTTP header string | ||
*/ | ||
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 .= "Proxy-Authorization: Basic " . base64_encode($this->get_auth_string()) . "\r\n"; | ||
} | ||
|
||
/** | ||
* Get the authentication string (user:pass) | ||
* | ||
* @since 1.6 | ||
* @return string | ||
*/ | ||
public function get_auth_string() { | ||
return $this->user . ':' . $this->pass; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
edf5e52
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
\o/ :cake: