From f8ceb5c237aaa3b80d38199d639359fbcfe6b823 Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Fri, 2 Dec 2016 19:57:42 -0800 Subject: [PATCH] resourceloader: Include backtrace in formatted errors (if enabled) Make ResourceLoader error formatting the same as everywhere else. Which means if wgShowExceptionDetails is enabled locally, the trace will be included as well. This matches logic in MWExceptionRenderer. Also move the typical error handling used by respond() to a utility method to reduce duplication of code and avoid mistakes. Change-Id: If04ae99618e4a758ed0f9dd2b555496b76da29de --- includes/resourceloader/ResourceLoader.php | 46 ++++++++++++---------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index d338e9b423..f0b48d544f 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -605,6 +605,25 @@ class ResourceLoader implements LoggerAwareInterface { return Wikimedia\base_convert( $hash, 16, 36, 7 ); } + /** + * Add an error to the 'errors' array and log it. + * + * Should only be called from within respond(). + * + * @since 1.29 + * @param Exception $e + * @param string $msg + * @param array $context + */ + protected function outputErrorAndLog( Exception $e, $msg, array $context = [] ) { + MWExceptionHandler::logException( $e ); + $this->logger->warning( + $msg, + $context + [ 'exception' => $e ] + ); + $this->errors[] = self::formatExceptionNoComment( $e ); + } + /** * Helper method to get and combine versions of multiple modules. * @@ -624,15 +643,12 @@ class ResourceLoader implements LoggerAwareInterface { // If modules fail to compute a version, do still consider the versions // of other modules - don't set an empty string E-Tag for the whole request. // See also T152266 and StartupModule::getModuleRegistrations(). - MWExceptionHandler::logException( $e ); - $this->logger->warning( + $this->outputErrorAndLog( $e, 'Calculating version for "{module}" failed: {exception}', [ 'module' => $module, - 'exception' => $e, ] ); - $this->errors[] = self::formatExceptionNoComment( $e ); return ''; } }, $moduleNames ); @@ -709,11 +725,7 @@ class ResourceLoader implements LoggerAwareInterface { // Preload for getCombinedVersion() and for batch makeModuleResponse() $this->preloadModuleInfo( array_keys( $modules ), $context ); } catch ( Exception $e ) { - MWExceptionHandler::logException( $e ); - $this->logger->warning( 'Preloading module info failed: {exception}', [ - 'exception' => $e - ] ); - $this->errors[] = self::formatExceptionNoComment( $e ); + $this->outputErrorAndLog( $e, 'Preloading module info failed: {exception}' ); } // Combine versions to propagate cache invalidation @@ -721,11 +733,7 @@ class ResourceLoader implements LoggerAwareInterface { try { $versionHash = $this->getCombinedVersion( $context, array_keys( $modules ) ); } catch ( Exception $e ) { - MWExceptionHandler::logException( $e ); - $this->logger->warning( 'Calculating version hash failed: {exception}', [ - 'exception' => $e - ] ); - $this->errors[] = self::formatExceptionNoComment( $e ); + $this->outputErrorAndLog( $e, 'Calculating version hash failed: {exception}' ); } // See RFC 2616 § 3.11 Entity Tags @@ -974,7 +982,9 @@ class ResourceLoader implements LoggerAwareInterface { return MWExceptionHandler::getPublicLogMessage( $e ); } - return MWExceptionHandler::getLogMessage( $e ); + return MWExceptionHandler::getLogMessage( $e ) . + "\nBacktrace:\n" . + MWExceptionHandler::getRedactedTraceAsString( $e ); } /** @@ -1075,11 +1085,7 @@ MESSAGE; $out .= $strContent; } catch ( Exception $e ) { - MWExceptionHandler::logException( $e ); - $this->logger->warning( 'Generating module package failed: {exception}', [ - 'exception' => $e - ] ); - $this->errors[] = self::formatExceptionNoComment( $e ); + $this->outputErrorAndLog( $e, 'Generating module package failed: {exception}' ); // Respond to client with error-state instead of module implementation $states[$name] = 'error'; -- 2.20.1