From 3c5ccee75cf3b6b428c3420eab5c50654ae65b7b Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 26 Oct 2011 04:13:05 +0000 Subject: [PATCH] FU r100535: * Added thumb-handler.php5 file * Moved 404.php to thumb-handler.php as wfDisplay404Error() * Removed excess short-circuiting error cases in thumb-handler.php * Moved cURL extension check to the top of the file * Improved sample $thgThumbHashFragment regex value * Cleaned up wfStreamThumbViaCurl() error handling code a bit --- 404.php | 29 ------------ thumb-handler.php | 112 ++++++++++++++++++++++---------------------- thumb-handler.php5 | 1 + thumb.config.sample | 4 +- 4 files changed, 59 insertions(+), 87 deletions(-) delete mode 100644 404.php create mode 100644 thumb-handler.php5 diff --git a/404.php b/404.php deleted file mode 100644 index c115c62b08..0000000000 --- a/404.php +++ /dev/null @@ -1,29 +0,0 @@ - - -404 Not Found - -

Not Found

-

The requested URL $encUrl was not found on this server.

- -ENDTEXT; - -echo $standard_404; diff --git a/thumb-handler.php b/thumb-handler.php index 8f3864d1ff..6d18bab3e0 100644 --- a/thumb-handler.php +++ b/thumb-handler.php @@ -8,10 +8,14 @@ define( 'THUMB_HANDLER', true ); $configPath = dirname( __FILE__ ) . "/thumb.config.php"; if ( !file_exists( $configPath ) ) { die( "Thumb-handler.php is not enabled for this wiki.\n" ); +} elseif ( !extension_loaded( 'curl' ) ) { + die( "cURL is not enabled for PHP on this wiki.\n" ); // sanity } require( $configPath ); -function wfHandleThumb404() { +wfHandleThumb404Main(); + +function wfHandleThumb404Main() { global $thgThumbCallbacks, $thgThumb404File; # lighttpd puts the original request in REQUEST_URI, while @@ -26,34 +30,21 @@ function wfHandleThumb404() { # Extract thumb.php params from the URI... if ( isset( $thgThumbCallbacks['extractParams'] ) - && is_callable( $thgThumbCallbacks['extractParams'] ) ) + && is_callable( $thgThumbCallbacks['extractParams'] ) ) // overridden by configuration? { - # Overridden by configuration $params = call_user_func_array( $thgThumbCallbacks['extractParams'], array( $uri ) ); } else { $params = wfExtractThumbParams( $uri ); // basic wiki URL param extracting } - if ( $params === null ) { // not a valid thumb request - header( 'X-Debug: no regex match' ); // useful for debugging - require_once( $thgThumb404File ); // standard 404 message - return; - } - # Do some basic checks on the filename... - if ( preg_match( '/[\x80-\xff]/', $uri ) ) { - header( 'HTTP/1.0 400 Bad request' ); - header( 'Content-Type: text/html' ); - print "Bad request" . - "The URI contained bytes with the high bit set, this is not allowed." . - ""; - return; - } elseif ( strpos( $params['f'], '%20' ) !== false ) { - header( 'HTTP/1.0 404 Not found' ); - header( 'Content-Type: text/html' ); - header( 'X-Debug: filename contains a space' ); // useful for debugging - print "Not found" . - "The URL contained spaces, we don't have any thumbnail files with spaces." . - ""; + # Show 404 error if this is not a valid thumb request... + if ( !is_array( $params ) ) { + header( 'X-Debug: no regex match' ); // useful for debugging + if ( $thgThumb404File ) { // overridden by configuration? + require( $thgThumb404File ); + } else { + wfDisplay404Error(); // standard 404 message + } return; } @@ -83,7 +74,6 @@ function wfExtractThumbParams( $uri ) { preg_quote( $thgThumbFragment ) . '(/archive|/temp|)/' . $thgThumbHashFragment . '([^/]*)/(page(\d*)-)*(\d*)px-[^/]*$!'; - # Is this a thumbnail? if ( preg_match( $thumbRegex, $uri, $matches ) ) { list( $all, $archOrTemp, $filename, $pagefull, $pagenum, $size ) = $matches; $params = array( 'f' => $filename, 'width' => $size ); @@ -96,7 +86,7 @@ function wfExtractThumbParams( $uri ) { $params['temp'] = 1; } } else { - $params = null; + $params = null; // not a valid thumbnail URL } return $params; @@ -112,16 +102,6 @@ function wfExtractThumbParams( $uri ) { function wfStreamThumbViaCurl( array $params, $uri ) { global $thgThumbCallbacks, $thgThumbScriptPath, $thgThumbCurlProxy, $thgThumbCurlTimeout; - if ( !function_exists( 'curl_init' ) ) { - header( 'HTTP/1.0 404 Not found' ); - header( 'Content-Type: text/html' ); - header( 'X-Debug: cURL is not enabled' ); // useful for debugging - print "Not found" . - "cURL is not enabled for PHP on this wiki. Unable to send request thumb.php." . - ""; - return; - } - # Build up the request URL to use with CURL... $reqURL = "{$thgThumbScriptPath}?"; $first = true; @@ -166,29 +146,28 @@ function wfStreamThumbViaCurl( array $params, $uri ) { # Actually make the request $text = curl_exec( $ch ); - # Send it on to the client + # Send it on to the client... $errno = curl_errno( $ch ); $contentType = curl_getinfo( $ch, CURLINFO_CONTENT_TYPE ); $httpCode = curl_getinfo( $ch, CURLINFO_HTTP_CODE ); if ( $errno ) { header( 'HTTP/1.1 500 Internal server error' ); header( 'Cache-Control: no-cache' ); - list( $text, $contentType ) = wfCurlErrorText( $ch ); - } elseif ( $httpCode == 304 ) { + $contentType = 'text/html'; + $text = wfCurlErrorText( $ch ); + } elseif ( $httpCode == 304 ) { // OK header( 'HTTP/1.1 304 Not modified' ); $contentType = ''; $text = ''; } elseif ( strval( $text ) == '' ) { header( 'HTTP/1.1 500 Internal server error' ); header( 'Cache-Control: no-cache' ); - list( $text, $contentType ) = wfCurlEmptyText( $ch ); + $contentType = 'text/html'; + $text = wfCurlEmptyText( $ch ); } elseif ( $httpCode == 404 ) { header( 'HTTP/1.1 404 Not found' ); header( 'Cache-Control: s-maxage=300, must-revalidate, max-age=0' ); - } elseif ( $httpCode != 200 - || substr( $contentType, 0, 9 ) == 'text/html' - || substr( $text, 0, 5 ) == ' Thumbnail error Error retrieving thumbnail from scaling server: $error EOT; - return array( $text, $contentType ); } /** - * Get error message and content type for when the cURL response is an error. + * Get error message HTML for when the cURL response is empty. * * @param $ch cURL handle - * @return Array (error html, content type) + * @return string */ function wfCurlEmptyText( $ch ) { - $contentType = 'text/html'; - $error = htmlspecialchars( curl_error( $ch ) ); - $text = << Thumbnail error Error retrieving thumbnail from scaling server: empty response EOT; - return array( $text, $contentType ); } -# Entry point -wfHandleThumb404(); +/** + * Print out a generic 404 error message. + * + * @return void + */ +function wfDisplay404Error() { + header( 'HTTP/1.1 404 Not Found' ); + header( 'Content-Type: text/html;charset=utf-8' ); + + $prot = isset( $_SERVER['HTTPS'] ) ? "https://" : "http://"; + $serv = strlen( $_SERVER['HTTP_HOST'] ) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; + $loc = $_SERVER["REQUEST_URI"]; + + $encUrl = htmlspecialchars( $prot . $serv . $loc ); + + // Looks like a typical apache2 error + $standard_404 = << + +404 Not Found + +

Not Found

+

The requested URL $encUrl was not found on this server.

+ +ENDTEXT; + + print $standard_404; +} diff --git a/thumb-handler.php5 b/thumb-handler.php5 new file mode 100644 index 0000000000..cb8eb611ea --- /dev/null +++ b/thumb-handler.php5 @@ -0,0 +1 @@ +