diff --git a/src/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php b/src/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php index b44d217ea3214..c497212289b03 100644 --- a/src/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php +++ b/src/Symfony/Component/Form/Extension/Core/EventListener/FixUrlProtocolListener.php @@ -36,7 +36,7 @@ public function onSubmit(FormEvent $event) { $data = $event->getData(); - if ($this->defaultProtocol && $data && \is_string($data) && !preg_match('~^([\w+.-]+://|[^:/?@#]++@)~', $data)) { + if ($this->defaultProtocol && $data && \is_string($data) && !preg_match('~^(?:[/.]|[\w+.-]+://|[^:/?@#]++@)~', $data)) { $event->setData($this->defaultProtocol.'://'.$data); } } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php index 55fee6e2243ee..87f79439f94c7 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/EventListener/FixUrlProtocolListenerTest.php @@ -20,10 +20,25 @@ class FixUrlProtocolListenerTest extends TestCase { + /** + * @dataProvider provideUrlToFix + */ + public function testFixUrl($data) + { + $form = new Form(new FormConfigBuilder('name', null, new EventDispatcher())); + $event = new FormEvent($form, $data); + + $filter = new FixUrlProtocolListener('http'); + $filter->onSubmit($event); + + $this->assertSame('http://'.$data, $event->getData()); + } + public function provideUrlToFix() { return [ ['www.symfony.com'], + ['symfony.com/doc'], ['twitter.com/@symfony'], ['symfony.com?foo@bar'], ['symfony.com#foo@bar'], @@ -32,17 +47,17 @@ public function provideUrlToFix() } /** - * @dataProvider provideUrlToFix + * @dataProvider provideUrlToSkip */ - public function testFixUrl($data) + public function testSkipUrl($url) { $form = new Form(new FormConfigBuilder('name', null, new EventDispatcher())); - $event = new FormEvent($form, $data); + $event = new FormEvent($form, $url); $filter = new FixUrlProtocolListener('http'); $filter->onSubmit($event); - $this->assertEquals('http://'.$data, $event->getData()); + $this->assertSame($url, $event->getData()); } public function provideUrlToSkip() @@ -56,20 +71,9 @@ public function provideUrlToSkip() ['iris.beep://foo'], ['foo+bar://foo'], ['fabien@symfony.com'], + ['//relative/url'], + ['/relative/url'], + ['./relative/url'], ]; } - - /** - * @dataProvider provideUrlToSkip - */ - public function testSkipUrl($url) - { - $form = new Form(new FormConfigBuilder('name', null, new EventDispatcher())); - $event = new FormEvent($form, $url); - - $filter = new FixUrlProtocolListener('http'); - $filter->onSubmit($event); - - $this->assertEquals($url, $event->getData()); - } }