Instead of creating an OutputPage and then setting a context start initializing Outpu...
[lhc/web/wiklou.git] / includes / WebRequest.php
index c91d004..a48cd79 100644 (file)
@@ -442,6 +442,16 @@ class WebRequest {
                return $retVal;
        }
 
+       /**
+        * Get the values passed in the query string.
+        * No transformation is performed on the values.
+        *
+        * @return Array
+        */
+        public function getQueryValues() {
+               return $_GET;
+        }
+
        /**
         * Returns true if the present request was reached by a POST operation,
         * false otherwise (GET, HEAD, or command-line).
@@ -492,10 +502,12 @@ class WebRequest {
         * @return String
         */
        public function getRequestURL() {
-               if( isset( $_SERVER['REQUEST_URI']) && strlen($_SERVER['REQUEST_URI']) ) {
+               if( isset( $_SERVER['REQUEST_URI'] ) && strlen( $_SERVER['REQUEST_URI'] ) ) {
                        $base = $_SERVER['REQUEST_URI'];
-               } elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
+               } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) && strlen( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
                        // Probably IIS; doesn't set REQUEST_URI
+                       $base = $_SERVER['HTTP_X_ORIGINAL_URL'];
+               } elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) {
                        $base = $_SERVER['SCRIPT_NAME'];
                        if( isset( $_SERVER['QUERY_STRING'] ) && $_SERVER['QUERY_STRING'] != '' ) {
                                $base .= '?' . $_SERVER['QUERY_STRING'];
@@ -503,8 +515,8 @@ class WebRequest {
                } else {
                        // This shouldn't happen!
                        throw new MWException( "Web server doesn't provide either " .
-                               "REQUEST_URI or SCRIPT_NAME. Report details of your " .
-                               "web server configuration to http://bugzilla.wikimedia.org/" );
+                               "REQUEST_URI, HTTP_X_ORIGINAL_URL or SCRIPT_NAME. Report details " .
+                               "of your web server configuration to http://bugzilla.wikimedia.org/" );
                }
                // User-agents should not send a fragment with the URI, but
                // if they do, and the web server passes it on to us, we
@@ -539,25 +551,7 @@ class WebRequest {
         * @return String
         */
        public function appendQuery( $query ) {
-               global $wgTitle;
-               $basequery = '';
-               foreach( $_GET as $var => $val ) {
-                       if ( $var == 'title' ) {
-                               continue;
-                       }
-                       if ( is_array( $val ) ) {
-                               /* This will happen given a request like
-                                * http://en.wikipedia.org/w/index.php?title[]=Special:Userlogin&returnto[]=Main_Page
-                                */
-                               continue;
-                       }
-                       $basequery .= '&' . urlencode( $var ) . '=' . urlencode( $val );
-               }
-               $basequery .= '&' . $query;
-
-               # Trim the extra &
-               $basequery = substr( $basequery, 1 );
-               return $wgTitle->getLocalURL( $basequery );
+               return $this->appendQueryArray( wfCgiToArray( $query ) );
        }
 
        /**
@@ -584,7 +578,7 @@ class WebRequest {
         */
        public function appendQueryArray( $array, $onlyquery = false ) {
                global $wgTitle;
-               $newquery = $_GET;
+               $newquery = $this->getQueryValues();
                unset( $newquery['title'] );
                $newquery = array_merge( $newquery, $array );
                $query = wfArrayToCGI( $newquery );
@@ -700,33 +694,51 @@ class WebRequest {
                return $this->response;
        }
 
+       /**
+        * Initialise the header list
+        */
+       private function initHeaders() {
+               if ( count( $this->headers ) ) {
+                       return;
+               }
+
+               if ( function_exists( 'apache_request_headers' ) ) {
+                       foreach ( apache_request_headers() as $tempName => $tempValue ) {
+                               $this->headers[ strtoupper( $tempName ) ] = $tempValue;
+                       }
+               } else {
+                       $headers = $_SERVER;
+                       foreach ( $_SERVER as $name => $value ) {
+                               if ( substr( $name, 0, 5 ) === 'HTTP_' ) {
+                                       $name = str_replace( '_', '-',  substr( $name, 5 ) );
+                                       $this->headers[$name] = $value;
+                               } elseif ( $name === 'CONTENT_LENGTH' ) {
+                                       $this->headers['CONTENT-LENGTH'] = $value;
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Get an array containing all request headers
+        *
+        * @return Array mapping header name to its value
+        */
+       public function getAllHeaders() {
+               $this->initHeaders();
+               return $this->headers;
+       }
+
        /**
         * Get a request header, or false if it isn't set
         * @param $name String: case-insensitive header name
         */
        public function getHeader( $name ) {
                $name = strtoupper( $name );
-               if ( function_exists( 'apache_request_headers' ) ) {
-                       if ( !$this->headers ) {
-                               foreach ( apache_request_headers() as $tempName => $tempValue ) {
-                                       $this->headers[ strtoupper( $tempName ) ] = $tempValue;
-                               }
-                       }
-                       if ( isset( $this->headers[$name] ) ) {
-                               return $this->headers[$name];
-                       } else {
-                               return false;
-                       }
+               if ( isset( $this->headers[$name] ) ) {
+                       return $this->headers[$name];
                } else {
-                       $name = 'HTTP_' . str_replace( '-', '_', $name );
-                       if ( $name === 'HTTP_CONTENT_LENGTH' && !isset( $_SERVER[$name] ) ) {
-                               $name = 'CONTENT_LENGTH';
-                       }
-                       if ( isset( $_SERVER[$name] ) ) {
-                               return $_SERVER[$name];
-                       } else {
-                               return false;
-                       }
+                       return false;
                }
        }
 
@@ -975,6 +987,14 @@ class FauxRequest extends WebRequest {
                return $this->data;
        }
 
+       public function getQueryValues() {
+               if ( $this->wasPosted ) {
+                       return array();
+               } else {
+                       return $this->data;
+               }
+       }
+
        public function wasPosted() {
                return $this->wasPosted;
        }
@@ -987,28 +1007,6 @@ class FauxRequest extends WebRequest {
                $this->notImplemented( __METHOD__ );
        }
 
-       public function appendQuery( $query ) {
-               global $wgTitle;
-               $basequery = '';
-               foreach( $this->data as $var => $val ) {
-                       if ( $var == 'title' ) {
-                               continue;
-                       }
-                       if ( is_array( $val ) ) {
-                               /* This will happen given a request like
-                                * http://en.wikipedia.org/w/index.php?title[]=Special:Userlogin&returnto[]=Main_Page
-                                */
-                               continue;
-                       }
-                       $basequery .= '&' . urlencode( $var ) . '=' . urlencode( $val );
-               }
-               $basequery .= '&' . $query;
-
-               # Trim the extra &
-               $basequery = substr( $basequery, 1 );
-               return $wgTitle->getLocalURL( $basequery );
-       }
-
        public function getHeader( $name ) {
                return isset( $this->headers[$name] ) ? $this->headers[$name] : false;
        }
@@ -1026,6 +1024,10 @@ class FauxRequest extends WebRequest {
                $this->session[$key] = $data;
        }
 
+       public function getSessionArray() {
+               return $this->session;
+       }
+
        public function isPathInfoBad() {
                return false;
        }