API: Allow for format modules that cannot handle errors
authorBrad Jorsch <bjorsch@wikimedia.org>
Thu, 27 Mar 2014 15:11:17 +0000 (11:11 -0400)
committerBrad Jorsch <bjorsch@wikimedia.org>
Thu, 27 Mar 2014 15:11:17 +0000 (11:11 -0400)
ApiFormatFeedWrapper, for example, has nothing particularly useful to do
when given an API error to print. So allow for punting errors to the
default formatter instead.

Bug: 63150
Change-Id: Ifc034d4c7861905e382c42dc22585f0cd2beaf3f

includes/api/ApiFormatBase.php
includes/api/ApiMain.php
includes/api/ApiResult.php

index 3c924bc..d43259d 100644 (file)
@@ -120,6 +120,16 @@ abstract class ApiFormatBase extends ApiBase {
                return $this->mDisabled;
        }
 
+       /**
+        * Whether this formatter can handle printing API errors. If this returns
+        * false, then on API errors the default printer will be instantiated.
+        * @since 1.23
+        * @return bool
+        */
+       public function canPrintErrors() {
+               return true;
+       }
+
        /**
         * Initialize the printer function and prepare the output headers, etc.
         * This method must be the first outputting method during execution.
@@ -377,6 +387,15 @@ class ApiFormatFeedWrapper extends ApiFormatBase {
                return true;
        }
 
+       /**
+        * ChannelFeed doesn't give us a method to print errors in a friendly
+        * manner, so just punt errors to the default printer.
+        * @return false
+        */
+       public function canPrintErrors() {
+               return false;
+       }
+
        /**
         * This class expects the result data to be in a custom format set by self::setResult()
         * $result['_feed'] - an instance of one of the $wgFeedClasses classes
index e1c0874..f7c776d 100644 (file)
@@ -641,6 +641,7 @@ class ApiMain extends ApiBase {
                global $wgShowHostnames;
 
                $result = $this->getResult();
+
                // Printer may not be initialized if the extractRequestParams() fails for the main module
                if ( !isset( $this->mPrinter ) ) {
                        // The printer has not been created yet. Try to manually get formatter value.
@@ -650,11 +651,18 @@ class ApiMain extends ApiBase {
                        }
 
                        $this->mPrinter = $this->createPrinterByName( $value );
-                       if ( $this->mPrinter->getNeedsRawData() ) {
-                               $result->setRawMode();
-                       }
                }
 
+               // Printer may not be able to handle errors. This is particularly
+               // likely if the module returns something for getCustomPrinter().
+               if ( !$this->mPrinter->canPrintErrors() ) {
+                       $this->mPrinter->safeProfileOut();
+                       $this->mPrinter = $this->createPrinterByName( self::API_DEFAULT_FORMAT );
+               }
+
+               // Update raw mode flag for the selected printer.
+               $result->setRawMode( $this->mPrinter->getNeedsRawData() );
+
                if ( $e instanceof UsageException ) {
                        // User entered incorrect parameters - print usage screen
                        $errMessage = $e->getMessageArray();
index e922020..0cbfcc8 100644 (file)
@@ -80,9 +80,11 @@ class ApiResult extends ApiBase {
        /**
         * Call this function when special elements such as '_element'
         * are needed by the formatter, for example in XML printing.
+        * @since 1.23 $flag parameter added
+        * @param bool $flag Set the raw mode flag to this state
         */
-       public function setRawMode() {
-               $this->mIsRawMode = true;
+       public function setRawMode( $flag = true ) {
+               $this->mIsRawMode = $flag;
        }
 
        /**