diff --git a/lib/elixir/lib/uri.ex b/lib/elixir/lib/uri.ex index 0a1858cf964..b6eeef526ad 100644 --- a/lib/elixir/lib/uri.ex +++ b/lib/elixir/lib/uri.ex @@ -656,16 +656,16 @@ defmodule URI do scheme = String.downcase(scheme, :ascii) case map do - %{port: port} when port != :undefined -> + %{port: port} when is_integer(port) -> %{uri | scheme: scheme} %{} -> - case default_port(scheme) do - nil -> %{uri | scheme: scheme} - port -> %{uri | scheme: scheme, port: port} - end + %{uri | scheme: scheme, port: default_port(scheme)} end + %{port: :undefined} -> + %{uri | port: nil} + %{} -> uri end diff --git a/lib/elixir/test/elixir/uri_test.exs b/lib/elixir/test/elixir/uri_test.exs index e465cb323e3..8772ec97d3c 100644 --- a/lib/elixir/test/elixir/uri_test.exs +++ b/lib/elixir/test/elixir/uri_test.exs @@ -277,6 +277,32 @@ defmodule URITest do test "preserves an empty query" do assert URI.new!("http://foo.com/?").query == "" end + + test "without scheme, undefined port after host translates to nil" do + assert URI.new!("//https://www.example.com") == + %URI{ + scheme: nil, + userinfo: nil, + host: "https", + port: nil, + path: "//www.example.com", + query: nil, + fragment: nil + } + end + + test "with scheme, undefined port after host translates to nil" do + assert URI.new!("myscheme://myhost:/path/info") == + %URI{ + scheme: "myscheme", + userinfo: nil, + host: "myhost", + port: nil, + path: "/path/info", + query: nil, + fragment: nil + } + end end test "http://http://http://@http://http://?http://#http://" do