Merge "Make thumb.php respond with HTTP 400 (not 500) on invalid parameters"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 10 Feb 2015 08:29:47 +0000 (08:29 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 10 Feb 2015 08:29:47 +0000 (08:29 +0000)
1  2 
thumb.php

diff --combined thumb.php
+++ b/thumb.php
@@@ -321,6 -321,7 +321,7 @@@ function wfStreamThumb( array $params 
  
        // Check for thumbnail generation errors...
        $msg = wfMessage( 'thumbnail_error' );
+       $errorCode = 500;
        if ( !$thumb ) {
                $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
        } elseif ( $thumb->isError() ) {
        } elseif ( $thumb->fileIsSource() ) {
                $errorMsg = $msg->
                        rawParams( 'Image was not scaled, is the requested width bigger than the source?' )->escaped();
+               $errorCode = 400;
        }
  
        if ( $errorMsg !== false ) {
-               wfThumbError( 500, $errorMsg );
+               wfThumbError( $errorCode, $errorMsg );
        } else {
                // Stream the file if there were no errors
                $thumb->streamFile( $headers );
@@@ -424,6 -426,66 +426,6 @@@ function wfGenerateThumbnail( File $fil
        return array( $thumb, $errorHtml );
  }
  
 -/**
 - * Returns true if this thumbnail is one that MediaWiki generates
 - * links to on file description pages and possibly parser output.
 - *
 - * $params is considered non-standard if they involve a non-standard
 - * width or any non-default parameters aside from width and page number.
 - * The number of possible files with standard parameters is far less than
 - * that of all combinations; rate-limiting for them can thus be more generious.
 - *
 - * @param File $file
 - * @param array $params
 - * @return bool
 - */
 -function wfThumbIsStandard( File $file, array $params ) {
 -      global $wgThumbLimits, $wgImageLimits;
 -
 -      $handler = $file->getHandler();
 -      if ( !$handler || !isset( $params['width'] ) ) {
 -              return false;
 -      }
 -
 -      $basicParams = array();
 -      if ( isset( $params['page'] ) ) {
 -              $basicParams['page'] = $params['page'];
 -      }
 -
 -      // Check if the width matches one of $wgThumbLimits
 -      if ( in_array( $params['width'], $wgThumbLimits ) ) {
 -              $normalParams = $basicParams + array( 'width' => $params['width'] );
 -              // Append any default values to the map (e.g. "lossy", "lossless", ...)
 -              $handler->normaliseParams( $file, $normalParams );
 -      } else {
 -              // If not, then check if the width matchs one of $wgImageLimits
 -              $match = false;
 -              foreach ( $wgImageLimits as $pair ) {
 -                      $normalParams = $basicParams + array( 'width' => $pair[0], 'height' => $pair[1] );
 -                      // Decide whether the thumbnail should be scaled on width or height.
 -                      // Also append any default values to the map (e.g. "lossy", "lossless", ...)
 -                      $handler->normaliseParams( $file, $normalParams );
 -                      // Check if this standard thumbnail size maps to the given width
 -                      if ( $normalParams['width'] == $params['width'] ) {
 -                              $match = true;
 -                              break;
 -                      }
 -              }
 -              if ( !$match ) {
 -                      return false; // not standard for description pages
 -              }
 -      }
 -
 -      // Check that the given values for non-page, non-width, params are just defaults
 -      foreach ( $params as $key => $value ) {
 -              if ( !isset( $normalParams[$key] ) || $normalParams[$key] != $value ) {
 -                      return false;
 -              }
 -      }
 -
 -      return true;
 -}
 -
  /**
   * Convert pathinfo type parameter, into normal request parameters
   *
@@@ -545,7 -607,9 +547,9 @@@ function wfThumbError( $status, $msg ) 
  
        header( 'Cache-Control: no-cache' );
        header( 'Content-Type: text/html; charset=utf-8' );
-       if ( $status == 404 ) {
+       if ( $status == 400 ) {
+               header( 'HTTP/1.1 400 Bad request' );
+       } elseif ( $status == 404 ) {
                header( 'HTTP/1.1 404 Not found' );
        } elseif ( $status == 403 ) {
                header( 'HTTP/1.1 403 Forbidden' );
                $debug = '';
        }
        echo <<<EOT
 -<html><head><title>Error generating thumbnail</title></head>
 +<!DOCTYPE html>
 +<html><head>
 +<meta charset="UTF-8" />
 +<title>Error generating thumbnail</title>
 +</head>
  <body>
  <h1>Error generating thumbnail</h1>
  <p>