Skip to content

Commit

Permalink
Fix is_external() to work with domains only
Browse files Browse the repository at this point in the history
  • Loading branch information
gchtr committed Jul 27, 2023
1 parent 8c61e97 commit 8d06cf8
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 14 deletions.
9 changes: 7 additions & 2 deletions src/URLHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -447,9 +447,14 @@ private static function is_internal_content($url)
*/
public static function is_external($url): bool
{
$has_http = \str_starts_with($url, '//') || \wp_parse_url($url, \PHP_URL_SCHEME);
$has_scheme = \str_starts_with($url, '//') || \wp_parse_url($url, \PHP_URL_SCHEME);

return $has_http && !self::is_local($url);
if ($has_scheme) {
return !self::is_local($url);
}

// Check with added scheme.
return !self::is_local('//' . $url);
}

/**
Expand Down
50 changes: 38 additions & 12 deletions tests/test-timber-url-helper.php
Original file line number Diff line number Diff line change
Expand Up @@ -257,10 +257,24 @@ public function testPathBase()

public function testIsLocal()
{
// Local.
$this->assertTrue(Timber\URLHelper::is_local($_SERVER['HTTP_HOST']));
$this->assertTrue(Timber\URLHelper::is_local('example.org'));
$this->assertTrue(Timber\URLHelper::is_local('//example.org'));
$this->assertTrue(Timber\URLHelper::is_local('http://example.org'));
$this->assertTrue(Timber\URLHelper::is_local('https://example.org'));
$this->assertTrue(Timber\URLHelper::is_local('https://example.org/'));
$this->assertTrue(Timber\URLHelper::is_local('https://example.org/example'));

// External.
$this->assertFalse(Timber\URLHelper::is_local('wordpress.org'));
$this->assertFalse(Timber\URLHelper::is_local('//wordpress.org'));
$this->assertFalse(Timber\URLHelper::is_local('//wordpress.org/example.org'));
$this->assertFalse(Timber\URLHelper::is_local('http://wordpress.org'));
$this->assertFalse(Timber\URLHelper::is_local('https://wordpress.org'));
$this->assertFalse(Timber\URLHelper::is_local('https://example.com/example.org'));
$this->assertFalse(Timber\URLHelper::is_local('http://example.com/' . $_SERVER['HTTP_HOST']));
$this->assertFalse(Timber\URLHelper::is_local('http://foo' . $_SERVER['HTTP_HOST'] . '/' . $_SERVER['HTTP_HOST']));
$this->assertTrue(Timber\URLHelper::is_local($_SERVER['HTTP_HOST']));
}

public function testCurrentURLWithServerPort()
Expand Down Expand Up @@ -324,17 +338,29 @@ public function testIsURL()

public function testIsExternal()
{
$local = 'http://example.org';
$subdomain = 'http://cdn.example.org';
$external = 'http://upstatement.com';
$protocol_relative = '//upstatement.com';

$this->assertFalse(Timber\URLHelper::is_external($local));
$this->assertTrue(Timber\URLHelper::is_external($subdomain));
$this->assertTrue(Timber\URLHelper::is_external($external));
$this->assertTrue(Timber\URLHelper::is_external($protocol_relative));
$this->assertTrue(Timber\URLHelper::is_external('http://example.com/' . $_SERVER['HTTP_HOST']));
$this->assertTrue(Timber\URLHelper::is_external('http://foo' . $_SERVER['HTTP_HOST'] . '/' . $_SERVER['HTTP_HOST']));
// Local.
$this->assertFalse(Timber\URLHelper::is_external('example.org'));
$this->assertFalse(Timber\URLHelper::is_external('//example.org'));
$this->assertFalse(Timber\URLHelper::is_external('http://example.org'));
$this->assertFalse(Timber\URLHelper::is_external('https://example.org/'));
$this->assertFalse(Timber\URLHelper::is_external('https://example.org/example.com'));
$this->assertFalse(Timber\URLHelper::is_external('https://example.org/example'));

// Subdomain.
$this->assertTrue(Timber\URLHelper::is_external('//cdn.example.org'));
$this->assertTrue(Timber\URLHelper::is_external('http://cdn.example.org'));
$this->assertTrue(Timber\URLHelper::is_external('https://cdn.example.org'));
$this->assertTrue(Timber\URLHelper::is_external('cdn.example.org'));

// External.
$this->assertTrue(Timber\URLHelper::is_external('upstatement.com'));
$this->assertTrue(Timber\URLHelper::is_external('//upstatement.com'));
$this->assertTrue(Timber\URLHelper::is_external('http://upstatement.com'));
$this->assertTrue(Timber\URLHelper::is_external('https://upstatement.com'));

// Other.
$this->assertTrue(Timber\URLHelper::is_external('https://example.com/' . $_SERVER['HTTP_HOST']));
$this->assertTrue(Timber\URLHelper::is_external('https://foo' . $_SERVER['HTTP_HOST'] . '/' . $_SERVER['HTTP_HOST']));
}

public function testIsExternalContent()
Expand Down

0 comments on commit 8d06cf8

Please sign in to comment.