Skip to content

Commit

Permalink
Allow underscore character in Uri host
Browse files Browse the repository at this point in the history
I don't understand why this validity check has be added.
Has per rfc 2181
(https://datatracker.ietf.org/doc/html/rfc2181#section-11), underscore
are valid character to use in an uri host.

For my specific usage, it broke for requests using docker internal
hostnames.

added test to prevent regression on URI containing underscore in host
  • Loading branch information
lulhum authored and clue committed Nov 19, 2024
1 parent 8111281 commit 75065ef
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/Message/Uri.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function __construct($uri)
}
// @codeCoverageIgnoreEnd

if ($parts === false || (isset($parts['scheme']) && !\preg_match('#^[a-z]+$#i', $parts['scheme'])) || (isset($parts['host']) && \preg_match('#[\s_%+]#', $parts['host']))) {
if ($parts === false || (isset($parts['scheme']) && !\preg_match('#^[a-z]+$#i', $parts['scheme'])) || (isset($parts['host']) && \preg_match('#[\s%+]#', $parts['host']))) {
throw new \InvalidArgumentException('Invalid URI given');
}

Expand Down Expand Up @@ -173,7 +173,7 @@ public function withHost($host)
return $this;
}

if (\preg_match('#[\s_%+]#', $host) || ($host !== '' && \parse_url('http://' . $host, \PHP_URL_HOST) !== $host)) {
if (\preg_match('#[\s%+]#', $host) || ($host !== '' && \parse_url('http://' . $host, \PHP_URL_HOST) !== $host)) {
throw new \InvalidArgumentException('Invalid URI host given');
}

Expand Down
13 changes: 13 additions & 0 deletions tests/Message/UriTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,9 @@ public static function provideValidUris()
),
array(
'http://user%20name:pass%20word@localhost/path%20name?query%20name#frag%20ment'
),
array(
'http://docker_container/'
)
);
}
Expand Down Expand Up @@ -338,6 +341,16 @@ public function testWithHostReturnsNewInstanceWhenHostIsChanged()
$this->assertEquals('localhost', $uri->getHost());
}

public function testWithHostReturnsNewInstanceWhenHostIsChangedWithUnderscore()
{
$uri = new Uri('http://localhost');

$new = $uri->withHost('docker_container');
$this->assertNotSame($uri, $new);
$this->assertEquals('docker_container', $new->getHost());
$this->assertEquals('localhost', $uri->getHost());
}

public function testWithHostReturnsNewInstanceWithHostToLowerCaseWhenHostIsChangedWithUpperCase()
{
$uri = new Uri('http://localhost');
Expand Down

0 comments on commit 75065ef

Please sign in to comment.