Make Special:PageData accept two-part subpage
Bug: T163923 Change-Id: I9fc55fd1eb956871fc5dd3e104c6786d380ef445
This commit is contained in:
parent
a3f66f4966
commit
e250f70742
3 changed files with 60 additions and 28 deletions
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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' ],
|
||||
'!!',
|
||||
|
|
|
|||
Loading…
Reference in a new issue