From e250f70742f082bc294e39329a773bcf5ec99dea Mon Sep 17 00:00:00 2001 From: Amir Sarabadani Date: Tue, 13 Jun 2017 14:00:41 +0430 Subject: [PATCH] Make Special:PageData accept two-part subpage Bug: T163923 Change-Id: I9fc55fd1eb956871fc5dd3e104c6786d380ef445 --- .../linkeddata/PageDataRequestHandler.php | 34 +++++++++++++++---- .../linkeddata/PageDataRequestHandlerTest.php | 26 +++++++++++--- .../includes/specials/SpecialPageDataTest.php | 28 ++++++--------- 3 files changed, 60 insertions(+), 28 deletions(-) diff --git a/includes/linkeddata/PageDataRequestHandler.php b/includes/linkeddata/PageDataRequestHandler.php index 9804b2d651..d26b304d4d 100644 --- a/includes/linkeddata/PageDataRequestHandler.php +++ b/includes/linkeddata/PageDataRequestHandler.php @@ -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 ); diff --git a/tests/phpunit/includes/linkeddata/PageDataRequestHandlerTest.php b/tests/phpunit/includes/linkeddata/PageDataRequestHandlerTest.php index 56790e2081..666dcf2a10 100644 --- a/tests/phpunit/includes/linkeddata/PageDataRequestHandlerTest.php +++ b/tests/phpunit/includes/linkeddata/PageDataRequestHandlerTest.php @@ -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; } diff --git a/tests/phpunit/includes/specials/SpecialPageDataTest.php b/tests/phpunit/includes/specials/SpecialPageDataTest.php index 25668757f1..c93fe479c9 100644 --- a/tests/phpunit/includes/specials/SpecialPageDataTest.php +++ b/tests/phpunit/includes/specials/SpecialPageDataTest.php @@ -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' ], '!!', -- 2.20.1