* added redundand join condition for index usage as per comment on CR r88008
[lhc/web/wiklou.git] / includes / HttpFunctions.php
index df6dd49..33c2916 100644 (file)
@@ -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, PROT_HTTP );
+               $url = wfExpandUrl( $url, PROTO_HTTP );
                wfDebug( "HTTP: $method: $url\n" );
                $options['method'] = strtoupper( $method );
 
@@ -381,7 +381,7 @@ class MWHttpRequest {
                }
 
                if ( is_object( $wgTitle ) && !isset( $this->reqHeaders['Referer'] ) ) {
-                       $this->setReferer( $wgTitle->getFullURL() );
+                       $this->setReferer( wfExpandUrl( $wgTitle->getFullURL(), PROTO_CURRENT ) );
                }
 
                if ( !$this->noProxy ) {
@@ -569,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;