ApiQuery: Don't mess with PHP output buffering
authorKevin Israel <pleasestand@live.com>
Fri, 8 Jul 2016 20:22:27 +0000 (16:22 -0400)
committerKevin Israel <pleasestand@live.com>
Fri, 8 Jul 2016 22:30:55 +0000 (18:30 -0400)
Specifically, it is not necessary to use output buffering functions
to capture XML generated by the export code because it is already
possible to set the "output sink" object to be used.

* Created a DumpStringOutput class, which appends all output to a
  string property rather than printing output immediately.
* Used that class, instead of ob_start() and ob_get_clean(), in
  ApiQuery and ExportTest.

Change-Id: I238f5d5ec7fd442c845b25cb59ef81ac3285099f

autoload.php
includes/api/ApiQuery.php
includes/export/DumpStringOutput.php [new file with mode: 0644]
tests/phpunit/includes/ExportTest.php

index 8e214ce..57da6a0 100644 (file)
@@ -389,6 +389,7 @@ $wgAutoloadLocalClasses = [
        'DumpPipeOutput' => __DIR__ . '/includes/export/DumpPipeOutput.php',
        'DumpRenderer' => __DIR__ . '/maintenance/renderDump.php',
        'DumpRev' => __DIR__ . '/maintenance/storage/dumpRev.php',
+       'DumpStringOutput' => __DIR__ . '/includes/export/DumpStringOutput.php',
        'DuplicateJob' => __DIR__ . '/includes/jobqueue/jobs/DuplicateJob.php',
        'EditAction' => __DIR__ . '/includes/actions/EditAction.php',
        'EditCLI' => __DIR__ . '/maintenance/edit.php',
index ed4d373..1e91256 100644 (file)
@@ -443,16 +443,14 @@ class ApiQuery extends ApiBase {
                }
 
                $exporter = new WikiExporter( $this->getDB() );
-               // WikiExporter writes to stdout, so catch its
-               // output with an ob
-               ob_start();
+               $sink = new DumpStringOutput;
+               $exporter->setOutputSink( $sink );
                $exporter->openStream();
                foreach ( $exportTitles as $title ) {
                        $exporter->pageByTitle( $title );
                }
                $exporter->closeStream();
-               $exportxml = ob_get_contents();
-               ob_end_clean();
+               $exportxml = $sink->getOutput();
 
                // Don't check the size of exported stuff
                // It's not continuable, so it would cause more
diff --git a/includes/export/DumpStringOutput.php b/includes/export/DumpStringOutput.php
new file mode 100644 (file)
index 0000000..5168225
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Stream outputter that buffers and returns data as a string.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * @ingroup Dump
+ * @since 1.28
+ */
+class DumpStringOutput extends DumpOutput {
+       private $output = '';
+
+       /**
+        * @param string $string
+        */
+       function write( $string ) {
+               $this->output .= $string;
+       }
+
+       /**
+        * Get the string containing the output.
+        *
+        * @return string
+        */
+       public function getOutput() {
+               return $this->output;
+       }
+}
index a2bb97a..c077081 100644 (file)
@@ -30,11 +30,12 @@ class ExportTest extends MediaWikiLangTestCase {
 
                $title = Title::newFromText( $pageTitle );
 
-               ob_start();
+               $sink = new DumpStringOutput;
+               $exporter->setOutputSink( $sink );
                $exporter->openStream();
                $exporter->pageByTitle( $title );
                $exporter->closeStream();
-               $xmlString = ob_get_clean();
+               $xmlString = $sink->getOutput();
 
                // This throws error if invalid xml output
                $xmlObject = simplexml_load_string( $xmlString );