3 namespace MediaWiki\Rest
;
7 use MediaWiki\MediaWikiServices
;
8 use MediaWiki\Rest\BasicAccess\MWBasicAuthorizer
;
9 use MediaWiki\Rest\Validator\Validator
;
13 use Wikimedia\Message\ITextFormatter
;
16 /** @var RequestInterface */
18 /** @var WebResponse */
22 /** @var RequestContext */
25 public static function main() {
28 if ( !$wgRequest->checkUrlExtension() ) {
32 $context = RequestContext
::getMain();
34 // Set $wgTitle and the title in RequestContext, as in api.php
36 $wgTitle = Title
::makeTitle( NS_SPECIAL
, 'Badtitle/rest.php' );
37 $context->setTitle( $wgTitle );
39 $services = MediaWikiServices
::getInstance();
40 $conf = $services->getMainConfig();
41 $objectFactory = $services->getObjectFactory();
43 if ( !$conf->get( 'EnableRestAPI' ) ) {
44 wfHttpError( 403, 'Access Denied',
45 'Set $wgEnableRestAPI to true to enable the experimental REST API' );
49 $request = new RequestFromGlobals( [
50 'cookiePrefix' => $conf->get( 'CookiePrefix' )
53 $responseFactory = new ResponseFactory( self
::getTextFormatters( $services ) );
55 // @phan-suppress-next-line PhanAccessMethodInternal
56 $authorizer = new MWBasicAuthorizer( $context->getUser(),
57 $services->getPermissionManager() );
59 // @phan-suppress-next-line PhanAccessMethodInternal
60 $restValidator = new Validator( $objectFactory,
61 $services->getPermissionManager(),
63 RequestContext
::getMain()->getUser()
68 [ "$IP/includes/Rest/coreRoutes.json" ],
69 ExtensionRegistry
::getInstance()->getAttribute( 'RestRoutes' ),
70 $conf->get( 'RestPath' ),
71 $services->getLocalServerObjectCache(),
78 $entryPoint = new self(
81 $wgRequest->response(),
83 $entryPoint->execute();
87 * Get a TextFormatter array from MediaWikiServices
89 * @param MediaWikiServices $services
90 * @return ITextFormatter[]
92 public static function getTextFormatters( MediaWikiServices
$services ) {
93 $langs = array_unique( [
94 $services->getMainConfig()->get( 'ContLang' )->getCode(),
98 $factory = $services->getMessageFormatterFactory();
99 foreach ( $langs as $lang ) {
100 $textFormatters[] = $factory->getTextFormatter( $lang );
102 return $textFormatters;
105 public function __construct( RequestContext
$context, RequestInterface
$request,
106 WebResponse
$webResponse, Router
$router
108 $this->context
= $context;
109 $this->request
= $request;
110 $this->webResponse
= $webResponse;
111 $this->router
= $router;
114 public function execute() {
116 $response = $this->router
->execute( $this->request
);
118 $this->webResponse
->header(
119 'HTTP/' . $response->getProtocolVersion() . ' ' .
120 $response->getStatusCode() . ' ' .
121 $response->getReasonPhrase() );
123 foreach ( $response->getRawHeaderLines() as $line ) {
124 $this->webResponse
->header( $line );
127 foreach ( $response->getCookies() as $cookie ) {
128 $this->webResponse
->setCookie(
132 $cookie['options'] );
135 // Clear all errors that might have been displayed if display_errors=On
138 $stream = $response->getBody();
141 MediaWiki
::preOutputCommit( $this->context
);
143 if ( $stream instanceof CopyableStreamInterface
) {
144 $stream->copyToStream( fopen( 'php://output', 'w' ) );
147 $buffer = $stream->read( 65536 );
148 if ( $buffer === '' ) {
156 $mw->doPostOutputShutdown( 'fast' );