From 8f416baead93a48e5799e44b8bd2e2c4859f4e04 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Fri, 14 Sep 2007 13:18:58 +0200 Subject: auf Version 1.11 aktualisiert; Login-Bug behoben --- includes/OutputHandler.php | 75 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 19 deletions(-) (limited to 'includes/OutputHandler.php') diff --git a/includes/OutputHandler.php b/includes/OutputHandler.php index d7e7c90f..d8ac12b5 100644 --- a/includes/OutputHandler.php +++ b/includes/OutputHandler.php @@ -17,31 +17,68 @@ function wfOutputHandler( $s ) { return $s; } +/** + * Get the "file extension" that some client apps will estimate from + * the currently-requested URL. + * This isn't on WebRequest because we need it when things aren't initialized + * @private + */ +function wfRequestExtension() { + /// @fixme -- this sort of dupes some code in WebRequest::getRequestUrl() + if( isset( $_SERVER['REQUEST_URI'] ) ) { + // Strip the query string... + list( $path ) = explode( '?', $_SERVER['REQUEST_URI'], 2 ); + } elseif( isset( $_SERVER['SCRIPT_NAME'] ) ) { + // Probably IIS. QUERY_STRING appears separately. + $path = $_SERVER['SCRIPT_NAME']; + } else { + // Can't get the path from the server? :( + return ''; + } + + $period = strrpos( $path, '.' ); + if( $period !== false ) { + return strtolower( substr( $path, $period ) ); + } + return ''; +} + /** * Handler that compresses data with gzip if allowed by the Accept header. * Unlike ob_gzhandler, it works for HEAD requests too. */ function wfGzipHandler( $s ) { - if ( function_exists( 'gzencode' ) && !headers_sent() ) { - $tokens = preg_split( '/[,; ]/', $_SERVER['HTTP_ACCEPT_ENCODING'] ); - if ( in_array( 'gzip', $tokens ) ) { - header( 'Content-Encoding: gzip' ); - $s = gzencode( $s, 3 ); - - # Set vary header if it hasn't been set already - $headers = headers_list(); - $foundVary = false; - foreach ( $headers as $header ) { - if ( substr( $header, 0, 5 ) == 'Vary:' ) { - $foundVary = true; - break; - } - } - if ( !$foundVary ) { - header( 'Vary: Accept-Encoding' ); - } + if( !function_exists( 'gzencode' ) || headers_sent() ) { + return $s; + } + + $ext = wfRequestExtension(); + if( $ext == '.gz' || $ext == '.tgz' ) { + // Don't do gzip compression if the URL path ends in .gz or .tgz + // This confuses Safari and triggers a download of the page, + // even though it's pretty clearly labeled as viewable HTML. + // Bad Safari! Bad! + return $s; + } + + $tokens = preg_split( '/[,; ]/', $_SERVER['HTTP_ACCEPT_ENCODING'] ); + if ( in_array( 'gzip', $tokens ) ) { + header( 'Content-Encoding: gzip' ); + $s = gzencode( $s, 3 ); + } + + // Set vary header if it hasn't been set already + $headers = headers_list(); + $foundVary = false; + foreach ( $headers as $header ) { + if ( substr( $header, 0, 5 ) == 'Vary:' ) { + $foundVary = true; + break; } } + if ( !$foundVary ) { + header( 'Vary: Accept-Encoding' ); + } return $s; } @@ -61,4 +98,4 @@ function wfDoContentLength( $length ) { } } -?> + -- cgit v1.2.2