use MediaWiki\MediaWikiServices;
use RequestContext;
use Title;
+use WebResponse;
class EntryPoint {
+ /** @var RequestInterface */
+ private $request;
+ /** @var WebResponse */
+ private $webResponse;
+ /** @var Router */
+ private $router;
+
public static function main() {
// URL safety checks
global $wgRequest;
RequestContext::getMain()->setTitle( $wgTitle );
$services = MediaWikiServices::getInstance();
-
$conf = $services->getMainConfig();
+
$request = new RequestFromGlobals( [
'cookiePrefix' => $conf->get( 'CookiePrefix' )
] );
new ResponseFactory
);
- $response = $router->execute( $request );
+ $entryPoint = new self(
+ $request,
+ $wgRequest->response(),
+ $router );
+ $entryPoint->execute();
+ }
+
+ public function __construct( RequestInterface $request, WebResponse $webResponse,
+ Router $router
+ ) {
+ $this->request = $request;
+ $this->webResponse = $webResponse;
+ $this->router = $router;
+ }
+
+ public function execute() {
+ $response = $this->router->execute( $this->request );
- $webResponse = $wgRequest->response();
- $webResponse->header(
+ $this->webResponse->header(
'HTTP/' . $response->getProtocolVersion() . ' ' .
$response->getStatusCode() . ' ' .
$response->getReasonPhrase() );
foreach ( $response->getRawHeaderLines() as $line ) {
- $webResponse->header( $line );
+ $this->webResponse->header( $line );
}
foreach ( $response->getCookies() as $cookie ) {
- $webResponse->setCookie(
+ $this->webResponse->setCookie(
$cookie['name'],
$cookie['value'],
$cookie['expiry'],
--- /dev/null
+<?php
+
+namespace MediaWiki\Tests\Rest;
+
+use EmptyBagOStuff;
+use GuzzleHttp\Psr7\Uri;
+use GuzzleHttp\Psr7\Stream;
+use MediaWiki\Rest\Handler;
+use MediaWikiTestCase;
+use MediaWiki\Rest\EntryPoint;
+use MediaWiki\Rest\RequestData;
+use MediaWiki\Rest\ResponseFactory;
+use MediaWiki\Rest\Router;
+use WebResponse;
+
+/**
+ * @covers \MediaWiki\Rest\EntryPoint
+ * @covers \MediaWiki\Rest\Router
+ */
+class EntryPointTest extends MediaWikiTestCase {
+ private static $mockHandler;
+
+ private function createRouter() {
+ return new Router(
+ [ __DIR__ . '/testRoutes.json' ],
+ [],
+ '/rest',
+ new EmptyBagOStuff(),
+ new ResponseFactory() );
+ }
+
+ private function createWebResponse() {
+ return $this->getMockBuilder( WebResponse::class )
+ ->setMethods( [ 'header' ] )
+ ->getMock();
+ }
+
+ public static function mockHandlerHeader() {
+ return new class extends Handler {
+ public function execute() {
+ $response = $this->getResponseFactory()->create();
+ $response->setHeader( 'Foo', 'Bar' );
+ return $response;
+ }
+ };
+ }
+
+ public function testHeader() {
+ $webResponse = $this->createWebResponse();
+ $webResponse->expects( $this->any() )
+ ->method( 'header' )
+ ->withConsecutive(
+ [ 'HTTP/1.1 200 OK', true, null ],
+ [ 'Foo: Bar', true, null ]
+ );
+
+ $entryPoint = new EntryPoint(
+ new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/header' ) ] ),
+ $webResponse,
+ $this->createRouter() );
+ $entryPoint->execute();
+ $this->assertTrue( true );
+ }
+
+ public static function mockHandlerBodyRewind() {
+ return new class extends Handler {
+ public function execute() {
+ $response = $this->getResponseFactory()->create();
+ $stream = new Stream( fopen( 'php://memory', 'w+' ) );
+ $stream->write( 'hello' );
+ $response->setBody( $stream );
+ return $response;
+ }
+ };
+ }
+
+ /**
+ * Make sure EntryPoint rewinds a seekable body stream before reading.
+ */
+ public function testBodyRewind() {
+ $entryPoint = new EntryPoint(
+ new RequestData( [ 'uri' => new Uri( '/rest/mock/EntryPoint/bodyRewind' ) ] ),
+ $this->createWebResponse(),
+ $this->createRouter() );
+ ob_start();
+ $entryPoint->execute();
+ $this->assertSame( 'hello', ob_get_clean() );
+ }
+
+}