Followup r94995: add hooks.txt entries for the new hooks
[lhc/web/wiklou.git] / includes / HttpFunctions.php
index b36011e..638788b 100644 (file)
@@ -14,7 +14,7 @@ class Http {
         * Perform an HTTP request
         *
         * @param $method String: HTTP method. Usually GET/POST
-        * @param $url String: full URL to act on
+        * @param $url String: full URL to act on. If protocol-relative, will be expanded to an http:// URL
         * @param $options Array: options to pass to MWHttpRequest object.
         *      Possible keys for the array:
         *    - timeout             Timeout length in seconds
@@ -32,7 +32,7 @@ class Http {
         * @return Mixed: (bool)false on failure or a string on success
         */
        public static function request( $method, $url, $options = array() ) {
-               $url = wfExpandUrl( $url );
+               $url = wfExpandUrl( $url, PROTO_HTTP );
                wfDebug( "HTTP: $method: $url\n" );
                $options['method'] = strtoupper( $method );
 
@@ -125,12 +125,14 @@ class Http {
         * protocols, because we only want protocols that both cURL
         * and php support.
         *
+        * @fixme this is wildly inaccurate and fails to actually check most stuff
+        *
         * @param $uri Mixed: URI to check for validity
         * @returns Boolean
         */
        public static function isValidURI( $uri ) {
                return preg_match(
-                       '/^(f|ht)tps?:\/\/[^\/\s]\S*$/D',
+                       '/^https?:\/\/[^\/\s]\S*$/D',
                        $uri
                );
        }
@@ -207,6 +209,15 @@ class MWHttpRequest {
                }
        }
 
+       /**
+        * Simple function to test if we can make any sort of requests at all, using
+        * cURL or fopen()
+        * @return bool
+        */
+       public static function canMakeRequests() {
+               return function_exists( 'curl_init' ) || wfIniGetBool( 'allow_url_fopen' );
+       }
+
        /**
         * Generate a new request object
         * @param $url String: url to use
@@ -558,13 +569,44 @@ class MWHttpRequest {
        /**
         * Returns the final URL after all redirections.
         *
-        * @return String
+        * Relative values of the "Location" header are incorrect as stated in RFC, however they do happen and modern browsers support them.
+        * This function loops backwards through all locations in order to build the proper absolute URI - Marooned at wikia-inc.com
+        *
+        * @returns string
         */
        public function getFinalUrl() {
-               $location = $this->getResponseHeader( "Location" );
+               $headers = $this->getResponseHeaders();
+
+               //return full url (fix for incorrect but handled relative location)
+               if ( isset( $headers[ 'location' ] ) ) {
+                       $locations = $headers[ 'location' ];
+                       $domain = '';
+                       $foundRelativeURI = false;
+                       $countLocations = count($locations);
 
-               if ( $location ) {
-                       return $location;
+                       for ( $i = $countLocations - 1; $i >= 0; $i-- ) {
+                               $url = parse_url( $locations[ $i ] );
+
+                               if ( isset($url[ 'host' ]) ) {
+                                       $domain = $url[ 'scheme' ] . '://' . $url[ 'host' ];
+                                       break;  //found correct URI (with host)
+                               } else {
+                                       $foundRelativeURI = true;
+                               }
+                       }
+
+                       if ( $foundRelativeURI ) {
+                               if ( $domain ) {
+                                       return $domain . $locations[ $countLocations - 1 ];
+                               } else {
+                                       $url = parse_url( $this->url );
+                                       if ( isset($url[ 'host' ]) ) {
+                                               return $url[ 'scheme' ] . '://' . $url[ 'host' ] . $locations[ $countLocations - 1 ];
+                                       }
+                               }
+                       } else {
+                               return $locations[ $countLocations - 1 ];
+                       }
                }
 
                return $this->url;
@@ -714,7 +756,6 @@ class PhpHttpRequest extends MWHttpRequest {
                }
 
                if ( $this->parsedUrl['scheme'] != 'http' &&
-                        $this->parsedUrl['scheme'] != 'ftp' &&
                         $this->parsedUrl['scheme'] != 'https' ) {
                        $this->status->fatal( 'http-invalid-scheme', $this->parsedUrl['scheme'] );
                }