From 8e7741c77d98dc5e02f1689ae473701c31f8891d Mon Sep 17 00:00:00 2001 From: Alexandre Emsenhuber Date: Sat, 19 Feb 2011 13:09:17 +0000 Subject: [PATCH] Merged retrieval of request URL and header from WebRequest and Setup.php to avoid duplicate code and reduced the number of wfDebug() calls in Setup.php. The only side effect is that headers name are in uppercase in the debug log. --- includes/Setup.php | 33 ++++---------------- includes/WebRequest.php | 68 ++++++++++++++++++++++++++--------------- 2 files changed, 50 insertions(+), 51 deletions(-) diff --git a/includes/Setup.php b/includes/Setup.php index f03f625c82..fac2745c55 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -308,37 +308,16 @@ global $wgCommandLineMode; if ( $wgCommandLineMode ) { wfDebug( "\n\nStart command line script $self\n" ); } else { - wfDebug( "Start request\n\n" ); - # Output the REQUEST_URI. This is not supported by IIS in rewrite mode, - # so use an alternative - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - $requestUri = $_SERVER['REQUEST_URI']; - } elseif ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) { - $requestUri = $_SERVER['HTTP_X_ORIGINAL_URL']; - } else { - $requestUri = $_SERVER['PHP_SELF']; - } - - wfDebug( "{$_SERVER['REQUEST_METHOD']} {$requestUri}\n" ); + $debug = "Start request\n\n{$_SERVER['REQUEST_METHOD']} {$wgRequest->getRequestURL()}"; if ( $wgDebugPrintHttpHeaders ) { - $headerOut = "HTTP HEADERS:\n"; - - if ( function_exists( 'getallheaders' ) ) { - $headers = getallheaders(); - foreach ( $headers as $name => $value ) { - $headerOut .= "$name: $value\n"; - } - } else { - $headers = $_SERVER; - foreach ( $headers as $name => $value ) { - if ( substr( $name, 0, 5 ) !== 'HTTP_' ) continue; - $name = substr( $name, 5 ); - $headerOut .= "$name: $value\n"; - } + $debug .= "\nHTTP HEADERS:\n"; + + foreach ( $wgRequest->getAllHeaders() as $name => $value ) { + $debug .= "$name: $value\n"; } - wfDebug( "$headerOut\n" ); } + wfDebug( "$debug\n" ); } wfProfileOut( $fname . '-misc1' ); diff --git a/includes/WebRequest.php b/includes/WebRequest.php index c91d0046ad..b3d6edc993 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -492,10 +492,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 +505,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 @@ -700,33 +702,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; } } -- 2.20.1