X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fresourceloader%2FResourceLoader.php;h=c58bb00b942ec8273cfe0ed2ca676e26dc8e508a;hb=b95ca29602793f39191c06cd6941e3f32ab1bbb8;hp=855311667d58b0fca00e6743db278485f93c152d;hpb=7ad35afab2a7d6a289097d6a23b2e00c1728c45a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 855311667d..c58bb00b94 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -79,6 +79,15 @@ class ResourceLoader implements LoggerAwareInterface { */ protected $errors = []; + /** + * List of extra HTTP response headers provided by loaded modules. + * + * Populated by makeModuleResponse(). + * + * @var array + */ + protected $extraHeaders = []; + /** * @var MessageBlobStore */ @@ -178,7 +187,7 @@ class ResourceLoader implements LoggerAwareInterface { * @return string Filtered data, or a comment containing an error message */ public static function filter( $filter, $data, array $options = [] ) { - if ( strpos( $data, ResourceLoader::FILTER_NOMIN ) !== false ) { + if ( strpos( $data, self::FILTER_NOMIN ) !== false ) { return $data; } @@ -646,7 +655,7 @@ class ResourceLoader implements LoggerAwareInterface { * * @since 1.26 * @param ResourceLoaderContext $context - * @param string[] $modules List of known module names + * @param string[] $moduleNames List of known module names * @return string Hash */ public function getCombinedVersion( ResourceLoaderContext $context, array $moduleNames ) { @@ -794,7 +803,7 @@ class ResourceLoader implements LoggerAwareInterface { } } - $this->sendResponseHeaders( $context, $etag, (bool)$this->errors ); + $this->sendResponseHeaders( $context, $etag, (bool)$this->errors, $this->extraHeaders ); // Remove the output buffer and output the response ob_end_clean(); @@ -827,9 +836,12 @@ class ResourceLoader implements LoggerAwareInterface { * @param ResourceLoaderContext $context * @param string $etag ETag header value * @param bool $errors Whether there are errors in the response + * @param string[] $extra Array of extra HTTP response headers * @return void */ - protected function sendResponseHeaders( ResourceLoaderContext $context, $etag, $errors ) { + protected function sendResponseHeaders( + ResourceLoaderContext $context, $etag, $errors, array $extra = [] + ) { \MediaWiki\HeaderCallback::warnIfHeadersSent(); $rlMaxage = $this->config->get( 'ResourceLoaderMaxage' ); // Use a short cache expiry so that updates propagate to clients quickly, if: @@ -873,6 +885,9 @@ class ResourceLoader implements LoggerAwareInterface { $exp = min( $maxage, $smaxage ); header( 'Expires: ' . wfTimestamp( TS_RFC2822, $exp + time() ) ); } + foreach ( $extra as $header ) { + header( $header ); + } } /** @@ -1008,6 +1023,9 @@ class ResourceLoader implements LoggerAwareInterface { /** * Generate code for a response. * + * Calling this method also populates the `errors` and `headers` members, + * later used by respond(). + * * @param ResourceLoaderContext $context Context in which to generate a response * @param ResourceLoaderModule[] $modules List of module objects keyed by module name * @param string[] $missing List of requested module names that are unregistered (optional) @@ -1052,6 +1070,10 @@ MESSAGE; $implementKey = $name . '@' . $module->getVersionHash( $context ); $strContent = ''; + if ( isset( $content['headers'] ) ) { + $this->extraHeaders = array_merge( $this->extraHeaders, $content['headers'] ); + } + // Append output switch ( $context->getOnly() ) { case 'scripts': @@ -1079,7 +1101,7 @@ MESSAGE; // mw.loader.implement will use globalEval if scripts is a string. // Minify manually here, because general response minification is // not effective due it being a string literal, not a function. - if ( !ResourceLoader::inDebugMode() ) { + if ( !self::inDebugMode() ) { $scripts = self::filter( 'minify-js', $scripts ); // T107377 } } else { @@ -1139,7 +1161,7 @@ MESSAGE; } else { if ( count( $states ) ) { $this->errors[] = 'Problematic modules: ' . - FormatJson::encode( $states, ResourceLoader::inDebugMode() ); + FormatJson::encode( $states, self::inDebugMode() ); } } @@ -1214,7 +1236,7 @@ MESSAGE; ]; self::trimArray( $module ); - return Xml::encodeJsCall( 'mw.loader.implement', $module, ResourceLoader::inDebugMode() ); + return Xml::encodeJsCall( 'mw.loader.implement', $module, self::inDebugMode() ); } /** @@ -1228,7 +1250,7 @@ MESSAGE; return Xml::encodeJsCall( 'mw.messages.set', [ (object)$messages ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } @@ -1285,13 +1307,13 @@ MESSAGE; return Xml::encodeJsCall( 'mw.loader.state', [ $name ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } else { return Xml::encodeJsCall( 'mw.loader.state', [ $name, $state ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } } @@ -1317,7 +1339,7 @@ MESSAGE; return Xml::encodeJsCall( "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )", [ $name, $version, $dependencies, $group, $source ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } @@ -1409,7 +1431,7 @@ MESSAGE; return Xml::encodeJsCall( 'mw.loader.register', [ $name ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } else { $registration = [ $name, $version, $dependencies, $group, $source, $skip ]; @@ -1417,7 +1439,7 @@ MESSAGE; return Xml::encodeJsCall( 'mw.loader.register', $registration, - ResourceLoader::inDebugMode() + self::inDebugMode() ); } } @@ -1441,13 +1463,13 @@ MESSAGE; return Xml::encodeJsCall( 'mw.loader.addSource', [ $id ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } else { return Xml::encodeJsCall( 'mw.loader.addSource', [ $id, $loadUrl ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); } } @@ -1494,7 +1516,7 @@ MESSAGE; return Xml::encodeJsCall( 'mw.config.set', [ $configuration ], - ResourceLoader::inDebugMode() + self::inDebugMode() ); }