Make Special:PageData accept two-part subpage
authorAmir Sarabadani <ladsgroup@gmail.com>
Tue, 13 Jun 2017 09:30:41 +0000 (14:00 +0430)
committerAmir Sarabadani <ladsgroup@gmail.com>
Tue, 13 Jun 2017 14:22:33 +0000 (18:52 +0430)
Bug: T163923
Change-Id: I9fc55fd1eb956871fc5dd3e104c6786d380ef445

includes/linkeddata/PageDataRequestHandler.php
tests/phpunit/includes/linkeddata/PageDataRequestHandlerTest.php
tests/phpunit/includes/specials/SpecialPageDataTest.php

index 9804b2d..d26b304 100644 (file)
@@ -20,26 +20,36 @@ class PageDataRequestHandler {
         * This does not check whether the request is valid and will actually produce a successful
         * response.
         *
-        * @param string|null $title Page title
+        * @param string|null $subPage
         * @param WebRequest $request
         *
         * @return bool
         * @throws HttpError
         */
-       public function canHandleRequest( $title, WebRequest $request ) {
-               if ( $title === '' || $title === null ) {
+       public function canHandleRequest( $subPage, WebRequest $request ) {
+               if ( $subPage === '' || $subPage === null ) {
                        if ( $request->getText( 'target', '' ) === '' ) {
                                return false;
+                       } else {
+                               return true;
                        }
                }
 
-               return true;
+               $parts = explode( '/', $subPage, 2 );
+               if ( $parts !== 2 ) {
+                       $slot = $parts[0];
+                       if ( $slot === 'main' or $slot === '' ) {
+                               return true;
+                       }
+               }
+
+               return false;
        }
 
        /**
         * Main method for handling requests.
         *
-        * @param string $title Page title
+        * @param string $subPage
         * @param WebRequest $request The request parameters. Known parameters are:
         *        - title: the page title
         *        - format: the format
@@ -51,13 +61,23 @@ class PageDataRequestHandler {
         *
         * @throws HttpError
         */
-       public function handleRequest( $title, WebRequest $request, OutputPage $output ) {
+       public function handleRequest( $subPage, WebRequest $request, OutputPage $output ) {
                // No matter what: The response is always public
                $output->getRequest()->response()->header( 'Access-Control-Allow-Origin: *' );
 
+               if ( !$this->canHandleRequest( $subPage, $request ) ) {
+                       throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $subPage ) );
+               }
+
                $revision = 0;
 
-               $title = $request->getText( 'target', $title );
+               $parts = explode( '/', $subPage, 2 );
+               if ( $subPage !== '' ) {
+                       $title = $parts[1];
+               } else {
+                       $title = $request->getText( 'target', '' );
+               }
+
                $revision = $request->getInt( 'oldid', $revision );
                $revision = $request->getInt( 'revision', $revision );
 
index 56790e2..666dcf2 100644 (file)
@@ -87,7 +87,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                $subpageCases = [];
                foreach ( $cases as $c ) {
                        $case = $c;
-                       $case[0] = '';
+                       $case[0] = 'main/';
 
                        if ( isset( $case[1]['target'] ) ) {
                                $case[0] .= $case[1]['target'];
@@ -121,7 +121,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                ];
 
                $cases[] = [
-                       'Helsinki',
+                       '/Helsinki',
                        [],
                        [],
                        '!!',
@@ -131,7 +131,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
 
                // #31: /Q5 with "Accept: text/foobar" triggers a 406
                $cases[] = [
-                       'Helsinki',
+                       'main/Helsinki',
                        [],
                        [ 'Accept' => 'text/foobar' ],
                        '!!',
@@ -140,7 +140,7 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                ];
 
                $cases[] = [
-                       'Helsinki',
+                       'main/Helsinki',
                        [],
                        [ 'Accept' => 'text/HTML' ],
                        '!!',
@@ -148,6 +148,24 @@ class PageDataRequestHandlerTest extends \MediaWikiTestCase {
                        [ 'Location' => '!Helsinki$!' ]
                ];
 
+               $cases[] = [
+                       '/Helsinki',
+                       [],
+                       [ 'Accept' => 'text/HTML' ],
+                       '!!',
+                       303,
+                       [ 'Location' => '!Helsinki$!' ]
+               ];
+
+               $cases[] = [
+                       'main/AC/DC',
+                       [],
+                       [ 'Accept' => 'text/HTML' ],
+                       '!!',
+                       303,
+                       [ 'Location' => '!AC/DC$!' ]
+               ];
+
                return $cases;
        }
 
index 2566875..c93fe47 100644 (file)
@@ -37,21 +37,6 @@ class SpecialPageDataTest extends SpecialPageTestBase {
                        [ 'Location' => '!.+!' ]
                ];
 
-               $subpageCases = [];
-               foreach ( $cases as $c ) {
-                       $case = $c;
-                       $case[0] = '';
-
-                       if ( isset( $case[1]['title'] ) ) {
-                               $case[0] .= $case[1]['title'];
-                               unset( $case[1]['title'] );
-                       }
-
-                       $subpageCases[] = $case;
-               }
-
-               $cases = array_merge( $cases, $subpageCases );
-
                $cases['Accept only HTML'] = [
                        '',
                        [ 'target' => 'Helsinki' ],
@@ -74,7 +59,16 @@ class SpecialPageDataTest extends SpecialPageTestBase {
                ];
 
                $cases['Nothing specified'] = [
-                       'Helsinki',
+                       'main/Helsinki',
+                       [],
+                       [],
+                       '!!',
+                       303,
+                       [ 'Location' => '!Helsinki&action=raw!' ]
+               ];
+
+               $cases['Nothing specified'] = [
+                       '/Helsinki',
                        [],
                        [],
                        '!!',
@@ -83,7 +77,7 @@ class SpecialPageDataTest extends SpecialPageTestBase {
                ];
 
                $cases['Invalid Accept header'] = [
-                       'Helsinki',
+                       'main/Helsinki',
                        [],
                        [ 'Accept' => 'text/foobar' ],
                        '!!',