mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/SecureLinkFixer
synced 2024-11-11 17:01:43 +00:00
Lazy load large domains.php file only when it's really needed
I have seen this popping up once in a recent flame graph. I think most
services should be designed in a way that they can be instantiated
very quickly and only start doing expensive stuff when we are sure we
really need it. This was not the case here. The file domains.php is
about 150,000 lines long and can take several 100ms to load in the
worst case.
Bug: T200758
Change-Id: I7c0c787230e8cff40e8e73fede0ac1dce63ea1ca
(cherry picked from commit e5df1df69e
)
This commit is contained in:
parent
5f64cfeb1a
commit
01f3701c90
|
@ -20,16 +20,12 @@ namespace MediaWiki\SecureLinkFixer;
|
|||
|
||||
class HSTSPreloadLookup {
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $domains;
|
||||
private string $path;
|
||||
/** @var array<string,int> */
|
||||
private array $domains;
|
||||
|
||||
/**
|
||||
* @param array $domains
|
||||
*/
|
||||
public function __construct( array $domains ) {
|
||||
$this->domains = $domains;
|
||||
public function __construct( string $path ) {
|
||||
$this->path = $path;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -37,7 +33,10 @@ class HSTSPreloadLookup {
|
|||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isPreloaded( $host ) {
|
||||
public function isPreloaded( string $host ): bool {
|
||||
// Lazy-load the domain mapping if it's not already set
|
||||
$this->domains ??= require $this->path;
|
||||
|
||||
if ( isset( $this->domains[$host] ) ) {
|
||||
// Host is directly in the preload list
|
||||
return true;
|
||||
|
|
|
@ -22,12 +22,8 @@ use MediaWiki\Hook\LinkerMakeExternalLinkHook;
|
|||
|
||||
class Hooks implements LinkerMakeExternalLinkHook {
|
||||
|
||||
/** @var HSTSPreloadLookup */
|
||||
private $lookup;
|
||||
private HSTSPreloadLookup $lookup;
|
||||
|
||||
/**
|
||||
* @param HSTSPreloadLookup $lookup
|
||||
*/
|
||||
public function __construct( HSTSPreloadLookup $lookup ) {
|
||||
$this->lookup = $lookup;
|
||||
}
|
||||
|
|
|
@ -6,6 +6,6 @@ namespace MediaWiki\SecureLinkFixer;
|
|||
|
||||
return [
|
||||
'HSTSPreloadLookup' => static function () {
|
||||
return new HSTSPreloadLookup( require __DIR__ . '/../domains.php' );
|
||||
return new HSTSPreloadLookup( __DIR__ . '/../domains.php' );
|
||||
}
|
||||
];
|
||||
|
|
|
@ -20,6 +20,7 @@ namespace MediaWiki\SecureLinkFixer\Test;
|
|||
|
||||
use MediaWiki\SecureLinkFixer\HSTSPreloadLookup;
|
||||
use MediaWikiIntegrationTestCase;
|
||||
use Wikimedia\TestingAccessWrapper;
|
||||
|
||||
/**
|
||||
* @covers \MediaWiki\SecureLinkFixer\HSTSPreloadLookup
|
||||
|
@ -30,7 +31,8 @@ class HSTSPreloadLookupTest extends MediaWikiIntegrationTestCase {
|
|||
* @dataProvider provideIsPreloaded
|
||||
*/
|
||||
public function testIsPreloaded( $host, $expected ) {
|
||||
$lookup = new HSTSPreloadLookup( [
|
||||
$lookup = new HSTSPreloadLookup( 'dummy' );
|
||||
TestingAccessWrapper::newFromObject( $lookup )->domains = [
|
||||
// TLD
|
||||
'foobar' => 1,
|
||||
'secure-example.org' => 1,
|
||||
|
@ -38,7 +40,7 @@ class HSTSPreloadLookupTest extends MediaWikiIntegrationTestCase {
|
|||
'insecure-subdomains-example.org' => 0,
|
||||
// Subdomain is secure, root domain isn't
|
||||
'secure.insecure-example.org' => 1,
|
||||
] );
|
||||
];
|
||||
$this->assertSame( $expected, $lookup->isPreloaded( $host ) );
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue