From 37f6d5f7fb9b6d3cfc7b70a8c9f971e2ba45ebeb Mon Sep 17 00:00:00 2001 From: Benny Situ Date: Sat, 17 Mar 2012 02:23:06 +0000 Subject: [PATCH] fix for bug33214 - catch all exceptions in api execute and provides necessary parameters required by the custom printer --- includes/api/ApiFeedContributions.php | 112 ++++++++++++++++---------- 1 file changed, 68 insertions(+), 44 deletions(-) diff --git a/includes/api/ApiFeedContributions.php b/includes/api/ApiFeedContributions.php index 5df1ff6e19..4c12e1bce5 100644 --- a/includes/api/ApiFeedContributions.php +++ b/includes/api/ApiFeedContributions.php @@ -43,56 +43,80 @@ class ApiFeedContributions extends ApiBase { } public function execute() { - $params = $this->extractRequestParams(); global $wgFeed, $wgFeedClasses, $wgSitename, $wgLanguageCode; - if( !$wgFeed ) { - $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' ); - } - - if( !isset( $wgFeedClasses[ $params['feedformat'] ] ) ) { - $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' ); - } - - global $wgMiserMode; - if ( $params['showsizediff'] && $wgMiserMode ) { - $this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' ); - } - - $msg = wfMsgForContent( 'Contributions' ); - $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']'; - $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL(); - - $target = $params['user'] == 'newbies' - ? 'newbies' - : Title::makeTitleSafe( NS_USER, $params['user'] )->getText(); - - $feed = new $wgFeedClasses[$params['feedformat']] ( - $feedTitle, - htmlspecialchars( $msg ), - $feedUrl - ); - - $pager = new ContribsPager( $this->getContext(), array( - 'target' => $target, - 'namespace' => $params['namespace'], - 'year' => $params['year'], - 'month' => $params['month'], - 'tagFilter' => $params['tagfilter'], - 'deletedOnly' => $params['deletedonly'], - 'topOnly' => $params['toponly'], - 'showSizeDiff' => $params['showsizediff'], - ) ); + try { + $params = $this->extractRequestParams(); + + if( !$wgFeed ) { + $this->dieUsage( 'Syndication feeds are not available', 'feed-unavailable' ); + } + + if( !isset( $wgFeedClasses[ $params['feedformat'] ] ) ) { + $this->dieUsage( 'Invalid subscription feed type', 'feed-invalid' ); + } - $feedItems = array(); - if( $pager->getNumRows() > 0 ) { - foreach ( $pager->mResult as $row ) { - $feedItems[] = $this->feedItem( $row ); + global $wgMiserMode; + if ( $params['showsizediff'] && $wgMiserMode ) { + $this->dieUsage( 'Size difference is disabled in Miser Mode', 'sizediffdisabled' ); + } + + $msg = wfMsgForContent( 'Contributions' ); + $feedTitle = $wgSitename . ' - ' . $msg . ' [' . $wgLanguageCode . ']'; + $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL(); + + $target = $params['user'] == 'newbies' + ? 'newbies' + : Title::makeTitleSafe( NS_USER, $params['user'] )->getText(); + + $feed = new $wgFeedClasses[$params['feedformat']] ( + $feedTitle, + htmlspecialchars( $msg ), + $feedUrl + ); + + $pager = new ContribsPager( $this->getContext(), array( + 'target' => $target, + 'namespace' => $params['namespace'], + 'year' => $params['year'], + 'month' => $params['month'], + 'tagFilter' => $params['tagfilter'], + 'deletedOnly' => $params['deletedonly'], + 'topOnly' => $params['toponly'], + 'showSizeDiff' => $params['showsizediff'], + ) ); + + $feedItems = array(); + if( $pager->getNumRows() > 0 ) { + foreach ( $pager->mResult as $row ) { + $feedItems[] = $this->feedItem( $row ); + } + } + + ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems ); + + } catch ( Exception $e ) { + // Error results should not be cached + $this->getMain()->setCacheMaxAge( 0 ); + + $feedTitle = $wgSitename . ' - Error - ' . wfMsgForContent( 'contributions' ) . ' [' . $wgLanguageCode . ']'; + $feedUrl = SpecialPage::getTitleFor( 'Contributions', $params['user'] )->getFullURL(); + + $feedFormat = isset( $params['feedformat'] ) ? $params['feedformat'] : 'rss'; + $feed = new $wgFeedClasses[$feedFormat] ( $feedTitle, htmlspecialchars( wfMsgForContent( 'contributions' ) ), $feedUrl ); + + if ( $e instanceof UsageException ) { + $errorCode = $e->getCodeString(); + } else { + // Something is seriously wrong + $errorCode = 'internal_api_error'; } - } - ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems ); + $errorText = $e->getMessage(); + $feedItems[] = new FeedItem( "Error ($errorCode)", $errorText, '', '', '' ); + ApiFormatFeedWrapper::setResult( $this->getResult(), $feed, $feedItems ); + } } protected function feedItem( $row ) { -- 2.20.1