MediaWiki  master
PageDataRequestHandler.php
Go to the documentation of this file.
1 <?php
23 
31 
44  public function canHandleRequest( $subPage, WebRequest $request ) {
45  if ( $subPage === '' || $subPage === null ) {
46  return $request->getText( 'target' ) !== '';
47  }
48 
49  $parts = explode( '/', $subPage, 2 );
50  $slot = $parts[0];
51  $title = $parts[1] ?? '';
52  return ( $slot === 'main' || $slot === '' ) && $title !== '';
53  }
54 
70  public function handleRequest( $subPage, WebRequest $request, OutputPage $output ) {
71  // No matter what: The response is always public
72  $output->getRequest()->response()->header( 'Access-Control-Allow-Origin: *' );
73 
74  if ( !$this->canHandleRequest( $subPage, $request ) ) {
75  throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $subPage ) );
76  }
77 
78  $revision = 0;
79 
80  if ( $subPage !== '' ) {
81  $parts = explode( '/', $subPage, 2 );
82  $title = $parts[1] ?? '';
83  } else {
84  $title = $request->getText( 'target' );
85  }
86 
87  $revision = $request->getInt( 'oldid', $revision );
88  $revision = $request->getInt( 'revision', $revision );
89 
90  if ( $title === null || $title === '' ) {
91  //TODO: different error message?
92  throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $title ) );
93  }
94 
95  try {
97  } catch ( MalformedTitleException $ex ) {
98  throw new HttpError( 400, wfMessage( 'pagedata-bad-title', $title ) );
99  }
100 
101  $this->httpContentNegotiation( $request, $output, $title, $revision );
102  }
103 
116  public function httpContentNegotiation(
117  WebRequest $request,
118  OutputPage $output,
119  Title $title,
120  $revision = 0
121  ) {
122  $contentHandler = ContentHandler::getForTitle( $title );
123  $mimeTypes = $contentHandler->getSupportedFormats();
124 
125  $acceptHeader = $request->getHeader( 'Accept' );
126  if ( $acceptHeader !== false ) {
127  $parser = new HttpAcceptParser();
128  $accept = $parser->parseWeights( $acceptHeader );
129  } else {
130  // anything goes
131  $accept = [
132  '*' => 0.1 // just to make extra sure
133  ];
134  // prefer the default
135  $accept[$mimeTypes[0]] = 1;
136  }
137 
138  $negotiator = new HttpAcceptNegotiator( $mimeTypes );
139  $format = $negotiator->getBestSupportedKey( $accept );
140 
141  if ( $format === null ) {
142  $format = isset( $accept['text/html'] ) ? 'text/html' : null;
143  }
144 
145  if ( $format === null ) {
146  $msg = wfMessage( 'pagedata-not-acceptable', implode( ', ', $mimeTypes ) );
147  throw new HttpError( 406, $msg );
148  }
149 
150  $url = $this->getDocUrl( $title, $format, $revision );
151  $output->redirect( $url, 303 );
152  }
153 
162  private function getDocUrl( Title $title, $format = '', $revision = 0 ) {
163  $params = [];
164 
165  if ( $revision > 0 ) {
166  $params['oldid'] = $revision;
167  }
168 
169  if ( $format === 'text/html' ) {
170  return $title->getFullURL( $params );
171  }
172 
173  $params[ 'action' ] = 'raw';
174 
175  return $title->getFullURL( $params );
176  }
177 
178 }
Utility for negotiating a value from a set of supported values using a preference list...
handleRequest( $subPage, WebRequest $request, OutputPage $output)
Main method for handling requests.
getInt( $name, $default=0)
Fetch an integer value from the input or return $default if not set.
Definition: WebRequest.php:575
getHeader( $name, $flags=0)
Get a request header, or false if it isn&#39;t set.
redirect( $url, $responsecode='302')
Redirect to $url rather than displaying the normal page.
Definition: OutputPage.php:352
Show an error that looks like an HTTP server error.
Definition: HttpError.php:30
httpContentNegotiation(WebRequest $request, OutputPage $output, Title $title, $revision=0)
Applies HTTP content negotiation.
getFullURL( $query='', $query2=false, $proto=PROTO_RELATIVE)
Get a real URL referring to this title, with interwiki link and fragment.
Definition: Title.php:2103
static getForTitle(Title $title)
Returns the appropriate ContentHandler singleton for the given title.
static newFromTextThrow( $text, $defaultNamespace=NS_MAIN)
Like Title::newFromText(), but throws MalformedTitleException when the title is invalid, rather than returning null.
Definition: Title.php:352
getText( $name, $default='')
Fetch a text string from the given array or return $default if it&#39;s not set.
Definition: WebRequest.php:659
getDocUrl(Title $title, $format='', $revision=0)
Returns a url representing the given title.
Request handler implementing a data interface for mediawiki pages.
canHandleRequest( $subPage, WebRequest $request)
Checks whether the request is complete, i.e.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.