FauxRequest: Remove influence from $wgRequest on getFullRequestURL()

It inherited the method from WebRequest, which in turn uses
PROTO_CURRENT, which indirectly makes it then look up $wgRequest->protocol
to decide how to expand the url.

This global state isn't expected from FauxRequest and makes its
result less than predictable.

Change-Id: Ia616e0bfa00c35f78d27db55f26b336a7d0c7606
This commit is contained in:
Timo Tijhof 2019-04-20 00:35:15 +01:00
parent 86c13ba3ad
commit 9d225ee603
2 changed files with 61 additions and 1 deletions

View file

@ -170,6 +170,17 @@ class FauxRequest extends WebRequest {
return $this->requestUrl;
}
public function getFullRequestURL() {
// Pass an explicit PROTO constant instead of PROTO_CURRENT so that we
// do not rely on state from the global $wgRequest object (which it would,
// via wfGetServerUrl/wfExpandUrl/$wgRequest->protocol).
if ( $this->protocol === 'http' ) {
return wfGetServerUrl( PROTO_HTTP ) . $this->getRequestURL();
} else {
return wfGetServerUrl( PROTO_HTTPS ) . $this->getRequestURL();
}
}
public function getProtocol() {
return $this->protocol;
}

View file

@ -7,6 +7,16 @@ class FauxRequestTest extends PHPUnit\Framework\TestCase {
use MediaWikiCoversValidator;
use PHPUnit4And6Compat;
public function setUp() {
parent::setUp();
$this->orgWgServer = $GLOBALS['wgServer'];
}
public function tearDown() {
$GLOBALS['wgServer'] = $this->orgWgServer;
parent::tearDown();
}
/**
* @covers FauxRequest::__construct
*/
@ -148,7 +158,7 @@ class FauxRequestTest extends PHPUnit\Framework\TestCase {
/**
* @covers FauxRequest::getRequestURL
*/
public function testGetRequestURL() {
public function testGetRequestURL_disallowed() {
$req = new FauxRequest();
$this->setExpectedException( MWException::class );
$req->getRequestURL();
@ -164,6 +174,45 @@ class FauxRequestTest extends PHPUnit\Framework\TestCase {
$this->assertEquals( 'https://example.org', $req->getRequestURL() );
}
/**
* @covers FauxRequest::getFullRequestURL
*/
public function testGetFullRequestURL_disallowed() {
$GLOBALS['wgServer'] = '//wiki.test';
$req = new FauxRequest();
$this->setExpectedException( MWException::class );
$req->getFullRequestURL();
}
/**
* @covers FauxRequest::getFullRequestURL
*/
public function testGetFullRequestURL_http() {
$GLOBALS['wgServer'] = '//wiki.test';
$req = new FauxRequest();
$req->setRequestURL( '/path' );
$this->assertSame(
'http://wiki.test/path',
$req->getFullRequestURL()
);
}
/**
* @covers FauxRequest::getFullRequestURL
*/
public function testGetFullRequestURL_https() {
$GLOBALS['wgServer'] = '//wiki.test';
$req = new FauxRequest( [], false, null, 'https' );
$req->setRequestURL( '/path' );
$this->assertSame(
'https://wiki.test/path',
$req->getFullRequestURL()
);
}
/**
* @covers FauxRequest::__construct
* @covers FauxRequest::getProtocol