API: Allow to pass whitespaces in MultiValue
authorFomafix <fomafix@googlemail.com>
Sun, 21 Jan 2018 20:58:59 +0000 (21:58 +0100)
committerFomafix <fomafix@googlemail.com>
Sun, 28 Jan 2018 18:05:07 +0000 (19:05 +0100)
This allows to response with an invalidreason instead silently ignore
the parameter.

Example request: api.php?format=json&action=query&titles=%20

Response before this change:
{
  "batchcomplete": ""
}

Response with this change:
{
  "batchcomplete": "",
  "query": {
    "pages": {
      "-1": {
        "title": " ",
        "invalidreason": "The requested page title is empty or contains only the name of a namespace.",
        "invalid": ""
      }
    }
  }
}

Bug: T185846
Change-Id: I6fdaf32792a0e6e37b08176f975c10607093351b

includes/api/ApiBase.php
tests/phpunit/includes/api/query/ApiQueryTest.php

index 1a126db..2d2f48d 100644 (file)
@@ -1408,7 +1408,7 @@ abstract class ApiBase extends ContextSource {
        protected function parseMultiValue( $valueName, $value, $allowMultiple, $allowedValues,
                $allSpecifier = null, $limit1 = null, $limit2 = null
        ) {
-               if ( ( trim( $value ) === '' || trim( $value ) === "\x1f" ) && $allowMultiple ) {
+               if ( ( $value === '' || $value === "\x1f" ) && $allowMultiple ) {
                        return [];
                }
                $limit1 = $limit1 ?: self::LIMIT_SML1;
index 8026e54..88a2e62 100644 (file)
@@ -81,6 +81,19 @@ class ApiQueryTest extends ApiTestCase {
                $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
        }
 
+       public function testTitlesWithWhitespaces() {
+               $data = $this->doApiRequest( [
+                       'action' => 'query',
+                       'titles' => ' '
+               ] );
+
+               $this->assertArrayHasKey( 'query', $data[0] );
+               $this->assertArrayHasKey( 'pages', $data[0]['query'] );
+               $this->assertEquals( 1, count( $data[0]['query']['pages'] ) );
+               $this->assertArrayHasKey( -1, $data[0]['query']['pages'] );
+               $this->assertArrayHasKey( 'invalid', $data[0]['query']['pages'][-1] );
+       }
+
        /**
         * Test the ApiBase::titlePartToKey function
         *