53 $mparams = array_merge( [
55 'url' =>
'http://localhost:7231/',
56 'domain' =>
'localhost',
58 'forwardCookies' =>
false,
60 'parsoidCompat' =>
false,
64 if ( substr( $mparams[
'url'], -1 ) !==
'/' ) {
65 $mparams[
'url'] .=
'/';
70 $mparams[
'domain'] = preg_replace(
71 '/^(https?:\/\/)?([^\/:]+?)(:\d+)?\/?$/',
75 parent::__construct( $mparams );
78 public function onRequests( array $reqs, Closure $idGenFunc ) {
79 if ( $this->params[
'parsoidCompat'] ) {
84 foreach ( $reqs as $key =>
$req ) {
85 if ( $this->params[
'fixedUrl'] ) {
86 $version = explode(
'/',
$req[
'url'] )[1];
88 str_replace(
'#version#', $version, $this->params[
'url'] ) .
89 preg_replace(
'#^local/v./#',
'',
$req[
'url'] );
92 $req[
'url'] = preg_replace(
'#^local/#', $this->params[
'domain'] .
'/',
$req[
'url'] );
94 $req[
'url'] = $this->params[
'url'] .
$req[
'url'];
98 if ( $this->params[
'HTTPProxy'] ) {
99 $req[
'proxy'] = $this->params[
'HTTPProxy'];
101 if ( $this->params[
'timeout'] !=
null ) {
102 $req[
'reqTimeout'] = $this->params[
'timeout'];
104 if ( $this->params[
'forwardCookies'] ) {
105 $req[
'headers'][
'Cookie'] = $this->params[
'forwardCookies'];
107 $result[$key] =
$req;
122 foreach ( $reqs as $key =>
$req ) {
123 $version = explode(
'/',
$req[
'url'] )[1];
124 if ( $version ===
'v3' ) {
126 } elseif ( $version ===
'v1' ) {
129 throw new Exception(
"Only v1 and v3 are supported." );
158 $parts = explode(
'/',
$req[
'url'] );
164 if ( $targetWiki !==
'local' ) {
165 throw new Exception(
"Only 'local' target wiki is currently supported" );
166 } elseif ( $version !==
'v1' ) {
167 throw new Exception(
"Version mismatch: should not happen." );
168 } elseif ( $reqType !==
'page' && $reqType !==
'transform' ) {
169 throw new Exception(
"Request type must be either 'page' or 'transform'" );
171 $req[
'url'] = $this->params[
'url'] . $this->params[
'domain'] .
'/v1/' . $reqType .
'/';
172 if ( $reqType ===
'page' ) {
174 if ( $parts[4] !==
'html' ) {
175 throw new Exception(
"Only 'html' output format is currently supported" );
178 if ( isset( $parts[5] ) ) {
179 $req[
'url'] .=
'/' . $parts[5];
180 } elseif ( isset(
$req[
'query'][
'oldid'] ) &&
$req[
'query'][
'oldid'] ) {
181 $req[
'url'] .=
'/' .
$req[
'query'][
'oldid'];
182 unset(
$req[
'query'][
'oldid'] );
184 } elseif ( $reqType ===
'transform' ) {
186 $req[
'url'] .= $parts[3] .
'/to/' . $parts[5];
188 if ( isset( $parts[6] ) ) {
189 $req[
'url'] .=
'/' . $parts[6];
192 if ( isset( $parts[7] ) ) {
193 $req[
'url'] .=
'/' . $parts[7];
194 } elseif ( isset(
$req[
'body'][
'oldid'] ) &&
$req[
'body'][
'oldid'] ) {
195 $req[
'url'] .=
'/' .
$req[
'body'][
'oldid'];
196 unset(
$req[
'body'][
'oldid'] );
198 if ( $parts[4] !==
'to' ) {
199 throw new Exception(
"Part index 4 is not 'to'" );
201 if ( $parts[3] ===
'html' && $parts[5] ===
'wikitext' ) {
202 if ( !isset(
$req[
'body'][
'html'] ) ) {
203 throw new Exception(
"You must set an 'html' body key for this request" );
205 } elseif ( $parts[3] ==
'wikitext' && $parts[5] ==
'html' ) {
206 if ( !isset(
$req[
'body'][
'wikitext'] ) ) {
207 throw new Exception(
"You must set a 'wikitext' body key for this request" );
209 if ( isset(
$req[
'body'][
'body'] ) ) {
210 $req[
'body'][
'body_only'] =
$req[
'body'][
'body'];
211 unset(
$req[
'body'][
'body'] );
214 throw new Exception(
"Transformation unsupported" );
218 if ( $this->params[
'HTTPProxy'] ) {
219 $req[
'proxy'] = $this->params[
'HTTPProxy'];
221 if ( $this->params[
'timeout'] !=
null ) {
222 $req[
'reqTimeout'] = $this->params[
'timeout'];
224 if ( $this->params[
'forwardCookies'] ) {
225 $req[
'headers'][
'Cookie'] = $this->params[
'forwardCookies'];
250 $parts = explode(
'/',
$req[
'url'] );
259 if ( $targetWiki !==
'local' ) {
260 throw new Exception(
"Only 'local' target wiki is currently supported" );
261 } elseif ( $version !==
'v3' ) {
262 throw new Exception(
"Version mismatch: should not happen." );
265 $req[
'url'] = preg_replace(
'#^local/v3/#', $this->params[
'domain'] .
'/v1/',
$req[
'url'] );
267 $req[
'url'] = $this->params[
'url'] .
$req[
'url'];
269 if ( $this->params[
'HTTPProxy'] ) {
270 $req[
'proxy'] = $this->params[
'HTTPProxy'];
272 if ( $this->params[
'timeout'] !=
null ) {
273 $req[
'reqTimeout'] = $this->params[
'timeout'];
275 if ( $this->params[
'forwardCookies'] ) {
276 $req[
'headers'][
'Cookie'] = $this->params[
'forwardCookies'];
Virtual HTTP service client for RESTBase.
onRequests(array $reqs, Closure $idGenFunc)
Prepare virtual HTTP(S) requests (for this service) for execution.
onParsoid1Request(array $req, Closure $idGeneratorFunc)
Remap a Parsoid v1 request to a RESTBase v1 request.
onParsoidRequests(array $reqs, Closure $idGeneratorFunc)
Remaps Parsoid v1/v3 requests to RESTBase v1 requests.
onParsoid3Request(array $req, Closure $idGeneratorFunc)
Remap a Parsoid v3 request to a RESTBase v1 request.
__construct(array $params)
Example RESTBase v1 requests: GET /local/v1/page/html/{title}{/revision} POST /local/v1/transform/htm...
Virtual HTTP service instance that can be mounted on to a VirtualRESTService.
array $params
Key/value map.
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global list
this hook is for auditing only $req
namespace being checked & $result
namespace and then decline to actually register it file or subcat img or subcat $title