diff --git a/src/Symfony/Component/DomCrawler/Link.php b/src/Symfony/Component/DomCrawler/Link.php index 83cee9c8d8..3d6d4e2417 100644 --- a/src/Symfony/Component/DomCrawler/Link.php +++ b/src/Symfony/Component/DomCrawler/Link.php @@ -120,6 +120,11 @@ class Link return $baseUri.$uri; } + // absolute URL with relative schema + if (0 === strpos($uri, '//')) { + return preg_replace('#^([^/]*)//.*$#', '$1', $this->currentUri).$uri; + } + // absolute path if ('/' === $uri[0]) { return preg_replace('#^(.*?//[^/]+)(?:\/.*)?$#', '$1', $this->currentUri).$uri; diff --git a/src/Symfony/Component/DomCrawler/Tests/LinkTest.php b/src/Symfony/Component/DomCrawler/Tests/LinkTest.php index 976082d3ee..483584b1c8 100644 --- a/src/Symfony/Component/DomCrawler/Tests/LinkTest.php +++ b/src/Symfony/Component/DomCrawler/Tests/LinkTest.php @@ -96,6 +96,10 @@ class LinkTest extends \PHPUnit_Framework_TestCase array('https://login.foo.com/foo', 'https://localhost/bar/', 'https://login.foo.com/foo'), array('mailto:foo@bar.com', 'http://localhost/foo', 'mailto:foo@bar.com'), + // tests schema relative URL (issue #7169) + array('//login.foo.com/foo', 'http://localhost/bar/', 'http://login.foo.com/foo'), + array('//login.foo.com/foo', 'https://localhost/bar/', 'https://login.foo.com/foo'), + array('?foo=2', 'http://localhost?foo=1', 'http://localhost?foo=2'), array('?foo=2', 'http://localhost/?foo=1', 'http://localhost/?foo=2'), array('?foo=2', 'http://localhost/bar?foo=1', 'http://localhost/bar?foo=2'),