diff options
Diffstat (limited to 'includes/HttpFunctions.php')
-rw-r--r-- | includes/HttpFunctions.php | 72 |
1 files changed, 50 insertions, 22 deletions
diff --git a/includes/HttpFunctions.php b/includes/HttpFunctions.php index 147823fe..8453e62c 100644 --- a/includes/HttpFunctions.php +++ b/includes/HttpFunctions.php @@ -1,5 +1,27 @@ <?php /** + * Various HTTP related functions. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file + * @ingroup HTTP + */ + +/** * @defgroup HTTP HTTP */ @@ -20,8 +42,9 @@ class Http { * - timeout Timeout length in seconds * - postData An array of key-value pairs or a url-encoded form data * - proxy The proxy to use. - * Will use $wgHTTPProxy (if set) otherwise. - * - noProxy Override $wgHTTPProxy (if set) and don't use any proxy at all. + * Otherwise it will use $wgHTTPProxy (if set) + * Otherwise it will use the environment variable "http_proxy" (if set) + * - noProxy Don't use any proxy at all. Takes precedence over proxy value(s). * - sslVerifyHost (curl only) Verify hostname against certificate * - sslVerifyCert (curl only) Verify SSL certificate * - caInfo (curl only) Provide CA information @@ -42,9 +65,6 @@ class Http { } $req = MWHttpRequest::factory( $url, $options ); - if( isset( $options['userAgent'] ) ) { - $req->setUserAgent( $options['userAgent'] ); - } $status = $req->execute(); if ( $status->isOK() ) { @@ -136,7 +156,7 @@ class Http { * * file:// should not be allowed here for security purpose (r67684) * - * @fixme this is wildly inaccurate and fails to actually check most stuff + * @todo FIXME this is wildly inaccurate and fails to actually check most stuff * * @param $uri Mixed: URI to check for validity * @return Boolean @@ -192,7 +212,7 @@ class MWHttpRequest { * @param $url String: url to use. If protocol-relative, will be expanded to an http:// URL * @param $options Array: (optional) extra params to pass (see Http::request()) */ - function __construct( $url, $options = array() ) { + protected function __construct( $url, $options = array() ) { global $wgHTTPTimeout; $this->url = wfExpandUrl( $url, PROTO_HTTP ); @@ -209,15 +229,27 @@ class MWHttpRequest { } else { $this->timeout = $wgHTTPTimeout; } + if( isset( $options['userAgent'] ) ) { + $this->setUserAgent( $options['userAgent'] ); + } $members = array( "postData", "proxy", "noProxy", "sslVerifyHost", "caInfo", "method", "followRedirects", "maxRedirects", "sslVerifyCert", "callback" ); foreach ( $members as $o ) { if ( isset( $options[$o] ) ) { + // ensure that MWHttpRequest::method is always + // uppercased. Bug 36137 + if ( $o == 'method' ) { + $options[$o] = strtoupper( $options[$o] ); + } $this->$o = $options[$o]; } } + + if ( $this->noProxy ) { + $this->proxy = ''; // noProxy takes precedence + } } /** @@ -278,19 +310,18 @@ class MWHttpRequest { } /** - * Take care of setting up the proxy - * (override in subclass) + * Take care of setting up the proxy (do nothing if "noProxy" is set) * - * @return String + * @return void */ public function proxySetup() { global $wgHTTPProxy; - if ( $this->proxy ) { + if ( $this->proxy || !$this->noProxy ) { return; } - if ( Http::isLocalURL( $this->url ) ) { + if ( Http::isLocalURL( $this->url ) || $this->noProxy ) { $this->proxy = ''; } elseif ( $wgHTTPProxy ) { $this->proxy = $wgHTTPProxy ; @@ -376,6 +407,7 @@ class MWHttpRequest { * * @param $fh handle * @param $content String + * @return int */ public function read( $fh, $content ) { $this->content .= $content; @@ -400,9 +432,7 @@ class MWHttpRequest { $this->setReferer( wfExpandUrl( $wgTitle->getFullURL(), PROTO_CURRENT ) ); } - if ( !$this->noProxy ) { - $this->proxySetup(); - } + $this->proxySetup(); // set up any proxy as needed if ( !$this->callback ) { $this->setCallback( array( $this, 'read' ) ); @@ -417,8 +447,6 @@ class MWHttpRequest { * Parses the headers, including the HTTP status code and any * Set-Cookie headers. This function expectes the headers to be * found in an array in the member variable headerList. - * - * @return nothing */ protected function parseHeader() { $lastname = ""; @@ -446,8 +474,6 @@ class MWHttpRequest { * RFC2616, section 10, * http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html for a * list of status codes.) - * - * @return nothing */ protected function setStatus() { if ( !$this->respHeaders ) { @@ -801,11 +827,13 @@ class PhpHttpRequest extends MWHttpRequest { if ( $this->method == 'POST' ) { // Required for HTTP 1.0 POSTs $this->reqHeaders['Content-Length'] = strlen( $this->postData ); - $this->reqHeaders['Content-type'] = "application/x-www-form-urlencoded"; + if( !isset( $this->reqHeaders['Content-Type'] ) ) { + $this->reqHeaders['Content-Type'] = "application/x-www-form-urlencoded"; + } } $options = array(); - if ( $this->proxy && !$this->noProxy ) { + if ( $this->proxy ) { $options['proxy'] = $this->urlToTCP( $this->proxy ); $options['request_fulluri'] = true; } @@ -884,7 +912,7 @@ class PhpHttpRequest extends MWHttpRequest { return $this->status; } - // If everything went OK, or we recieved some error code + // If everything went OK, or we received some error code // get the response body content. if ( $this->status->isOK() || (int)$this->respStatus >= 300) { |