diff --git includes/common.inc includes/common.inc index 9fc82bb..8544e02 100644 --- includes/common.inc +++ includes/common.inc @@ -784,6 +784,19 @@ function drupal_http_request($url, array $options = array()) { $result->code = -1002; return $result; } + // Proxy setup - normal sites don't need a proxy. + $proxy_server = variable_get('proxy_server', ''); + if ($proxy_server && _drupal_http_use_proxy($uri['host'])) { + // Since the url is passed as the path, we won't use the parsed query. + unset($uri['query']); + $uri['path'] = $url; + // Set the scheme so we open a socket to the proxy server. + $uri['scheme'] = 'proxy'; + if ($proxy_username = variable_get('proxy_username', '')) { + $proxy_password = variable_get('proxy_password', ''); + $options['headers']['Proxy-Authorization'] = 'Basic ' . base64_encode($proxy_username . (!empty($proxy_password) ? ":" . $proxy_password : '')); + } + } timer_start(__FUNCTION__); @@ -800,6 +813,16 @@ function drupal_http_request($url, array $options = array()) { $options['timeout'] = (float) $options['timeout']; switch ($uri['scheme']) { + case 'proxy': + // Make the socket connection to a proxy server. + $socket = 'tcp://' . $proxy_server . ':' . variable_get('proxy_port', 8080); + $port = ''; + if (isset($uri['port']) && $uri['port'] != 80) { + $port = ':' . $uri['port']; + } + // The Host header still needs to match the real request. + $options['headers']['Host'] = $uri['host'] . $port; + break; case 'http': case 'feed': $port = isset($uri['port']) ? $uri['port'] : 80; @@ -1022,6 +1045,18 @@ function drupal_http_request($url, array $options = array()) { return $result; } + +/** + * Helper function for determining hosts excluded from needing a proxy. + * + * @return + * TRUE if a proxy should be used for this host. + */ +function _drupal_http_use_proxy($host) { + $proxy_exceptions = variable_get('proxy_exceptions', array('localhost', '127.0.0.1')); + return !in_array(strtolower($host), $proxy_exceptions, TRUE); +} + /** * @} End of "HTTP handling". */ diff --git sites/default/default.settings.php sites/default/default.settings.php index d1bb23a..ff08992 100644 --- sites/default/default.settings.php +++ sites/default/default.settings.php @@ -429,3 +429,18 @@ ini_set('session.cookie_lifetime', 2000000); * Remove the leading hash signs to disable. */ # $conf['allow_authorize_operations'] = FALSE; + +/** + * External access proxy settings: + * + * If your site must access the internet via a web proxy then you can enter + * the proxy settings here. Currently only basic authentication is supported + * by using the username and password variables. The proxy_exceptions variable + * is an array of host names to be accessed directly, not via proxy. + */ +# $conf['proxy_server'] = ''; +# $conf['proxy_port'] = 8080; +# $conf['proxy_username'] = ''; +# $conf['proxy_password'] = ''; +# $conf['proxy_exceptions'] = array('127.0.0.1', 'localhost'); +