Skip to content

Commit 9c8405f

Browse files
committed
Fix URI.merge/2 handling of base without authority
1 parent b601b1c commit 9c8405f

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

lib/elixir/lib/uri.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,15 @@ defmodule URI do
919919
%{base | query: rel.query || base.query, fragment: rel.fragment}
920920
end
921921

922+
def merge(%URI{host: nil, path: nil} = base, %URI{} = rel) do
923+
%{
924+
base
925+
| path: remove_dot_segments_from_path(rel.path),
926+
query: rel.query,
927+
fragment: rel.fragment
928+
}
929+
end
930+
922931
def merge(%URI{} = base, %URI{} = rel) do
923932
new_path = merge_paths(base.path, rel.path)
924933
%{base | path: new_path, query: rel.query, fragment: rel.fragment}

lib/elixir/test/elixir/uri_test.exs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,15 @@ defmodule URITest do
465465
assert URI.merge("tag:example", "#fragment") |> to_string == "tag:example#fragment"
466466
end
467467

468+
test "merge/2 with non-hierarchical base without host and path" do
469+
assert URI.merge("ex:", "test") |> to_string() == "ex:test"
470+
assert URI.merge("ex:", "a/b/c") |> to_string() == "ex:a/b/c"
471+
assert URI.merge("ex:", "a/b/./../c") |> to_string() == "ex:a/c"
472+
assert URI.merge("ex:", "test?query=value") |> to_string() == "ex:test?query=value"
473+
assert URI.merge("mailto:", "[email protected]") |> to_string() == "mailto:[email protected]"
474+
assert URI.merge("urn:isbn", "0451450523") |> to_string() == "urn:0451450523"
475+
end
476+
468477
test "merge/2 (with RFC examples)" do
469478
# These are examples from:
470479
#

0 commit comments

Comments
 (0)