aboutsummaryrefslogtreecommitdiffstats
path: root/lib/stdlib
diff options
context:
space:
mode:
Diffstat (limited to 'lib/stdlib')
-rw-r--r--lib/stdlib/src/uri_string.erl80
-rw-r--r--lib/stdlib/test/property_test/uri_string_recompose.erl2
-rw-r--r--lib/stdlib/test/uri_string_SUITE.erl97
3 files changed, 93 insertions, 86 deletions
diff --git a/lib/stdlib/src/uri_string.erl b/lib/stdlib/src/uri_string.erl
index 439ffa80da..f9e1e273bc 100644
--- a/lib/stdlib/src/uri_string.erl
+++ b/lib/stdlib/src/uri_string.erl
@@ -466,9 +466,9 @@ parse_relative_part(?STRING_REST($/, Rest), URI) ->
URI1#{path => decode_path(?STRING_REST($/, Path))};
parse_relative_part(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % path-empty ?query
- Query = calculate_parsed_part(Rest, T),
+ Query = calculate_parsed_query(Rest, T),
URI2 = maybe_add_path(URI1),
- URI2#{query => decode_query(?STRING_REST($?, Query))};
+ URI2#{query => decode_query(Query)};
parse_relative_part(?STRING_REST($#, Rest), URI) ->
{T, URI1} = parse_fragment(Rest, URI), % path-empty
Fragment = calculate_parsed_fragment(Rest, T),
@@ -521,8 +521,8 @@ parse_segment(?STRING_REST($/, Rest), URI) ->
parse_segment(Rest, URI); % segment
parse_segment(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_segment(?STRING_REST($#, Rest), URI) ->
{T, URI1} = parse_fragment(Rest, URI),
Fragment = calculate_parsed_fragment(Rest, T),
@@ -544,8 +544,8 @@ parse_segment_nz_nc(?STRING_REST($/, Rest), URI) ->
parse_segment(Rest, URI); % segment
parse_segment_nz_nc(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_segment_nz_nc(?STRING_REST($#, Rest), URI) ->
{T, URI1} = parse_fragment(Rest, URI),
Fragment = calculate_parsed_fragment(Rest, T),
@@ -595,14 +595,6 @@ parse_scheme_start(?STRING_REST(Char, Rest), URI) ->
%% According to the URI specification there is always a
%% path component in every URI-reference and it can be
%% empty.
-
-%% maybe_add_path(Map) ->
-%% case length(maps:keys(Map)) of
-%% 0 ->
-%% Map#{path => <<>>};
-%% _Else ->
-%% Map
-%% end.
maybe_add_path(Map) ->
case maps:is_key(path, Map) of
false ->
@@ -659,8 +651,8 @@ parse_hier(?STRING_REST($/, Rest), URI) ->
{Rest, URI1#{path => decode_path(?STRING_REST($/, Path))}};
parse_hier(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % path-empty ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_hier(?STRING_REST($#, Rest), URI) ->
{T, URI1} = parse_fragment(Rest, URI), % path-empty
Fragment = calculate_parsed_fragment(Rest, T),
@@ -776,8 +768,8 @@ parse_host(?STRING_REST($/, Rest), URI) ->
{Rest, URI1#{path => decode_path(?STRING_REST($/, Path))}};
parse_host(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % path-empty ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_host(?STRING_REST($[, Rest), URI) ->
parse_ipv6_bin(Rest, [], URI);
parse_host(?STRING_REST($#, Rest), URI) ->
@@ -805,8 +797,8 @@ parse_reg_name(?STRING_REST($/, Rest), URI) ->
{Rest, URI1#{path => decode_path(?STRING_REST($/, Path))}};
parse_reg_name(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % path-empty ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_reg_name(?STRING_REST($#, Rest), URI) ->
{T, URI1} = parse_fragment(Rest, URI), % path-empty
Fragment = calculate_parsed_fragment(Rest, T),
@@ -840,8 +832,8 @@ parse_ipv4_bin(?STRING_REST($/, Rest), Acc, URI) ->
parse_ipv4_bin(?STRING_REST($?, Rest), Acc, URI) ->
_ = validate_ipv4_address(lists:reverse(Acc)),
{T, URI1} = parse_query(Rest, URI), % path-empty ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_ipv4_bin(?STRING_REST($#, Rest), Acc, URI) ->
_ = validate_ipv4_address(lists:reverse(Acc)),
{T, URI1} = parse_fragment(Rest, URI), % path-empty
@@ -901,8 +893,8 @@ parse_ipv6_bin_end(?STRING_REST($/, Rest), URI) ->
{Rest, URI1#{path => decode_path(?STRING_REST($/, Path))}};
parse_ipv6_bin_end(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % path-empty ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_ipv6_bin_end(?STRING_REST($#, Rest), URI) ->
{T, URI1} = parse_fragment(Rest, URI), % path-empty
Fragment = calculate_parsed_fragment(Rest, T),
@@ -939,8 +931,8 @@ parse_port(?STRING_REST($/, Rest), URI) ->
{Rest, URI1#{path => decode_path(?STRING_REST($/, Path))}};
parse_port(?STRING_REST($?, Rest), URI) ->
{T, URI1} = parse_query(Rest, URI), % path-empty ?query
- Query = calculate_parsed_part(Rest, T),
- {Rest, URI1#{query => decode_query(?STRING_REST($?, Query))}};
+ Query = calculate_parsed_query(Rest, T),
+ {Rest, URI1#{query => decode_query(Query)}};
parse_port(?STRING_REST($#, Rest), URI) ->
{T, URI1} = parse_fragment(Rest, URI), % path-empty
Fragment = calculate_parsed_fragment(Rest, T),
@@ -1090,7 +1082,7 @@ remove_brackets(Addr) -> Addr.
%% Returns the parsed binary based on Input and the Unparsed part.
%% Handles the following special cases:
%%
-%% #{host => [],path => "/",query => "?"} = uri_string:parse("///?")
+%% #{host => [],path => "/",query => []} = uri_string:parse("///?")
%% #{fragment => [],host => [],path => "/"} = uri_string:parse("///#")
%%
-spec calculate_parsed_part(binary(), binary()) -> binary().
@@ -1171,6 +1163,20 @@ calculate_parsed_port(Input, Unparsed) ->
First.
+calculate_parsed_query(<<$#>>, _) -> <<>>;
+calculate_parsed_query(<<>>, _) -> <<>>;
+calculate_parsed_query(Input, <<>>) ->
+ case binary:last(Input) of
+ $# ->
+ init_binary(Input);
+ _Else ->
+ Input
+ end;
+calculate_parsed_query(Input, Unparsed) ->
+ {First, _} = split_binary(Input, byte_size(Input) - byte_size_exl_head(Unparsed)),
+ First.
+
+
-spec calculate_parsed_fragment(binary(), binary()) -> binary().
calculate_parsed_fragment(<<$#>>, _) -> <<>>;
calculate_parsed_fragment(Input, Unparsed) ->
@@ -1183,10 +1189,10 @@ calculate_parsed_fragment(Input, Unparsed) ->
%%
%% Handles the following special cases:
%%
-%% #{host => "foo",query => "?"} = uri_string:parse("//foo?")
+%% #{host => "foo",query => []} = uri_string:parse("//foo?")
%% #{fragment => [],host => "foo"} = uri_string:parse("//foo#")
%% #{host => "foo",path => "/"} = uri_string:parse("//foo/")
-%% #{host => "foo",query => "?",scheme => "http"} = uri_string:parse("http://foo?")
+%% #{host => "foo",query => [],scheme => "http"} = uri_string:parse("http://foo?")
%% #{fragment => [],host => "foo",scheme => "http"} = uri_string:parse("http://foo#")
%% #{host => "foo",path => "/",scheme => "http"} = uri_string:parse("http://foo/")
%%
@@ -1329,10 +1335,7 @@ encode_path(Cs) ->
-spec encode_query(list()|binary()) -> list() | binary().
encode_query(Cs) ->
- case validate_query(Cs) of
- true -> encode(Cs, fun is_query/1);
- false -> throw(uri_parse_error)
- end.
+ encode(Cs, fun is_query/1).
-spec encode_fragment(list()|binary()) -> list() | binary().
encode_fragment(Cs) ->
@@ -1420,10 +1423,6 @@ validate_scheme(<<H, Rest/binary>>) ->
false -> false
end.
-validate_query([$?|_]) -> true;
-validate_query(<<$?/utf8, _/binary>>) -> true;
-validate_query(_) -> false.
-
%%-------------------------------------------------------------------------
%% Classifies hostname into the following categories:
@@ -1582,7 +1581,7 @@ update_path(#{}, URI) ->
update_query(#{query := Query}, empty) ->
encode_query(Query);
update_query(#{query := Query}, URI) ->
- concat(URI,encode_query(Query));
+ concat(URI,add_question_mark(encode_query(Query)));
update_query(#{}, empty) ->
empty;
update_query(#{}, URI) ->
@@ -1615,6 +1614,11 @@ add_hashmark(Comp) when is_binary(Comp) ->
add_hashmark(Comp) when is_list(Comp) ->
[$#|Comp].
+add_question_mark(Comp) when is_binary(Comp) ->
+ <<$?, Comp/binary>>;
+add_question_mark(Comp) when is_list(Comp) ->
+ [$?|Comp].
+
add_colon(Comp) when is_binary(Comp) ->
<<$:, Comp/binary>>.
diff --git a/lib/stdlib/test/property_test/uri_string_recompose.erl b/lib/stdlib/test/property_test/uri_string_recompose.erl
index dad67cd4c1..97f9d727a0 100644
--- a/lib/stdlib/test/property_test/uri_string_recompose.erl
+++ b/lib/stdlib/test/property_test/uri_string_recompose.erl
@@ -271,7 +271,7 @@ port() ->
query_map() ->
- [$?| unicode()].
+ unicode().
query_uri() ->
diff --git a/lib/stdlib/test/uri_string_SUITE.erl b/lib/stdlib/test/uri_string_SUITE.erl
index 83f702dd13..8a10948f32 100644
--- a/lib/stdlib/test/uri_string_SUITE.erl
+++ b/lib/stdlib/test/uri_string_SUITE.erl
@@ -52,7 +52,7 @@
-define(PORT_ENC, ":8042").
-define(PATH, "/där").
-define(PATH_ENC, "/d%C3%A4r").
--define(QUERY, "?name=örn").
+-define(QUERY, "name=örn").
-define(QUERY_ENC, "?name=%C3%B6rn").
-define(FRAGMENT, "näsa").
-define(FRAGMENT_ENC, "#n%C3%A4sa").
@@ -350,7 +350,7 @@ parse_binary_host_ipv4(_Config) ->
#{host := <<"127.0.0.1">>} = uri_string:parse(<<"//127.0.0.1">>),
#{host := <<"127.0.0.1">>, path := <<"/over/there">>} =
uri_string:parse(<<"//127.0.0.1/over/there">>),
- #{host := <<"127.0.0.1">>, query := <<"?name=ferret">>} =
+ #{host := <<"127.0.0.1">>, query := <<"name=ferret">>} =
uri_string:parse(<<"//127.0.0.1?name=ferret">>),
#{host := <<"127.0.0.1">>, fragment := <<"nose">>} = uri_string:parse(<<"//127.0.0.1#nose">>),
uri_parse_error = (catch uri_string:parse(<<"//127.0.0.x">>)),
@@ -362,7 +362,7 @@ parse_binary_host_ipv6(_Config) ->
uri_string:parse(<<"//[2001:0db8:0000:0000:0000:0000:1428:07ab]">>),
#{host := <<"::127.0.0.1">>, path := <<"/over/there">>} =
uri_string:parse(<<"//[::127.0.0.1]/over/there">>),
- #{host := <<"::127.0.0.1">>, query := <<"?name=ferret">>} =
+ #{host := <<"::127.0.0.1">>, query := <<"name=ferret">>} =
uri_string:parse(<<"//[::127.0.0.1]?name=ferret">>),
#{host := <<"::127.0.0.1">>, fragment := <<"nose">>} =
uri_string:parse(<<"//[::127.0.0.1]#nose">>),
@@ -397,35 +397,35 @@ parse_binary_path(_Config) ->
uri_string:parse(<<"foo://example.com:8042/over/there">>).
parse_binary_query(_Config) ->
- #{scheme := <<"foo">>, query := <<"?name=ferret">>} =
+ #{scheme := <<"foo">>, query := <<"name=ferret">>} =
uri_string:parse(<<"foo:?name=ferret">>),
- #{scheme := <<"foo">>, path:= <<"over/there">>, query := <<"?name=ferret">>} =
+ #{scheme := <<"foo">>, path:= <<"over/there">>, query := <<"name=ferret">>} =
uri_string:parse(<<"foo:over/there?name=ferret">>),
- #{scheme := <<"foo">>, path:= <<"/over/there">>, query := <<"?name=ferret">>} =
+ #{scheme := <<"foo">>, path:= <<"/over/there">>, query := <<"name=ferret">>} =
uri_string:parse(<<"foo:/over/there?name=ferret">>),
- #{scheme := <<"foo">>, host := <<"example.com">>, query := <<"?name=ferret">>} =
+ #{scheme := <<"foo">>, host := <<"example.com">>, query := <<"name=ferret">>} =
uri_string:parse(<<"foo://example.com?name=ferret">>),
- #{scheme := <<"foo">>, host := <<"example.com">>, path := <<"/">>, query := <<"?name=ferret">>} =
+ #{scheme := <<"foo">>, host := <<"example.com">>, path := <<"/">>, query := <<"name=ferret">>} =
uri_string:parse(<<"foo://example.com/?name=ferret">>),
- #{query := <<"?name=ferret">>} =
+ #{path := <<>>, query := <<"name=ferret">>} =
uri_string:parse(<<"?name=ferret">>),
- #{path := <<"over/there">>, query := <<"?name=ferret">>} =
+ #{path := <<"over/there">>, query := <<"name=ferret">>} =
uri_string:parse(<<"over/there?name=ferret">>),
- #{path := <<"/">>, query := <<"?name=ferret">>} =
+ #{path := <<"/">>, query := <<"name=ferret">>} =
uri_string:parse(<<"/?name=ferret">>),
- #{path := <<"/over/there">>, query := <<"?name=ferret">>} =
+ #{path := <<"/over/there">>, query := <<"name=ferret">>} =
uri_string:parse(<<"/over/there?name=ferret">>),
- #{host := <<"example.com">>, query := <<"?name=ferret">>} =
+ #{host := <<"example.com">>, query := <<"name=ferret">>} =
uri_string:parse(<<"//example.com?name=ferret">>),
- #{host := <<"example.com">>, path := <<"/">>, query := <<"?name=ferret">>} =
+ #{host := <<"example.com">>, path := <<"/">>, query := <<"name=ferret">>} =
uri_string:parse(<<"//example.com/?name=ferret">>).
parse_binary_pct_encoded_query(_Config) ->
#{scheme := <<"foo">>, host := <<"example.com">>, path := <<"/">>,
- query := <<"?name=合気道"/utf8>>} =
+ query := <<"name=合気道"/utf8>>} =
uri_string:parse(<<"foo://example.com/?name=%E5%90%88%E6%B0%97%E9%81%93">>),
- #{host := <<"example.com">>, path := <<"/">>, query := <<"?name=合気道"/utf8>>} =
+ #{host := <<"example.com">>, path := <<"/">>, query := <<"name=合気道"/utf8>>} =
uri_string:parse(<<"//example.com/?name=%E5%90%88%E6%B0%97%E9%81%93">>).
parse_binary_fragment(_Config) ->
@@ -520,7 +520,7 @@ parse_host_ipv4(_Config) ->
#{host := "2001:0db8:0000:0000:0000:0000:1428:07ab"} =
uri_string:parse("//[2001:0db8:0000:0000:0000:0000:1428:07ab]"),
#{host := "127.0.0.1", path := "/over/there"} = uri_string:parse("//127.0.0.1/over/there"),
- #{host := "127.0.0.1", query := "?name=ferret"} = uri_string:parse("//127.0.0.1?name=ferret"),
+ #{host := "127.0.0.1", query := "name=ferret"} = uri_string:parse("//127.0.0.1?name=ferret"),
#{host := "127.0.0.1", fragment := "nose"} = uri_string:parse("//127.0.0.1#nose"),
uri_parse_error = (catch uri_string:parse("//127.0.0.x")),
uri_parse_error = (catch uri_string:parse("//1227.0.0.1")).
@@ -528,7 +528,7 @@ parse_host_ipv4(_Config) ->
parse_host_ipv6(_Config) ->
#{host := "::127.0.0.1"} = uri_string:parse("//[::127.0.0.1]"),
#{host := "::127.0.0.1", path := "/over/there"} = uri_string:parse("//[::127.0.0.1]/over/there"),
- #{host := "::127.0.0.1", query := "?name=ferret"} =
+ #{host := "::127.0.0.1", query := "name=ferret"} =
uri_string:parse("//[::127.0.0.1]?name=ferret"),
#{host := "::127.0.0.1", fragment := "nose"} = uri_string:parse("//[::127.0.0.1]#nose"),
uri_parse_error = (catch uri_string:parse("//[::127.0.0.x]")),
@@ -560,35 +560,35 @@ parse_path(_Config) ->
uri_string:parse("foo://example.com:8042/over/there").
parse_query(_Config) ->
- #{scheme := "foo", query := "?name=ferret"} =
+ #{scheme := "foo", query := "name=ferret"} =
uri_string:parse("foo:?name=ferret"),
- #{scheme := "foo", path:= "over/there", query := "?name=ferret"} =
+ #{scheme := "foo", path:= "over/there", query := "name=ferret"} =
uri_string:parse("foo:over/there?name=ferret"),
- #{scheme := "foo", path:= "/over/there", query := "?name=ferret"} =
+ #{scheme := "foo", path:= "/over/there", query := "name=ferret"} =
uri_string:parse("foo:/over/there?name=ferret"),
- #{scheme := "foo", host := "example.com", query := "?name=ferret"} =
+ #{scheme := "foo", host := "example.com", query := "name=ferret"} =
uri_string:parse("foo://example.com?name=ferret"),
- #{scheme := "foo", host := "example.com", path := "/", query := "?name=ferret"} =
+ #{scheme := "foo", host := "example.com", path := "/", query := "name=ferret"} =
uri_string:parse("foo://example.com/?name=ferret"),
- #{query := "?name=ferret"} =
+ #{path := "", query := "name=ferret"} =
uri_string:parse("?name=ferret"),
- #{path := "over/there", query := "?name=ferret"} =
+ #{path := "over/there", query := "name=ferret"} =
uri_string:parse("over/there?name=ferret"),
- #{path := "/", query := "?name=ferret"} =
+ #{path := "/", query := "name=ferret"} =
uri_string:parse("/?name=ferret"),
- #{path := "/over/there", query := "?name=ferret"} =
+ #{path := "/over/there", query := "name=ferret"} =
uri_string:parse("/over/there?name=ferret"),
- #{host := "example.com", query := "?name=ferret"} =
+ #{host := "example.com", query := "name=ferret"} =
uri_string:parse("//example.com?name=ferret"),
- #{host := "example.com", path := "/", query := "?name=ferret"} =
+ #{host := "example.com", path := "/", query := "name=ferret"} =
uri_string:parse("//example.com/?name=ferret").
parse_pct_encoded_query(_Config) ->
#{scheme := "foo", host := "example.com", path := "/",
- query := "?name=合気道"} =
+ query := "name=合気道"} =
uri_string:parse("foo://example.com/?name=%E5%90%88%E6%B0%97%E9%81%93"),
- #{host := "example.com", path := "/", query := "?name=合気道"} =
+ #{host := "example.com", path := "/", query := "name=合気道"} =
uri_string:parse("//example.com/?name=%E5%90%88%E6%B0%97%E9%81%93").
parse_fragment(_Config) ->
@@ -627,19 +627,19 @@ parse_pct_encoded_fragment(_Config) ->
parse_list(_Config) ->
#{scheme := "foo", path := "bar:nisse"} = uri_string:parse("foo:bar:nisse"),
#{scheme := "foo", host := "example.com", port := 8042,
- path := "/over/there", query := "?name=ferret", fragment := "nose"} =
+ path := "/over/there", query := "name=ferret", fragment := "nose"} =
uri_string:parse("foo://example.com:8042/over/there?name=ferret#nose"),
#{scheme := "foo", userinfo := "admin:admin", host := "example.com", port := 8042,
- path := "/over/there", query := "?name=ferret", fragment := "nose"} =
+ path := "/over/there", query := "name=ferret", fragment := "nose"} =
uri_string:parse("foo://admin:[email protected]:8042/over/there?name=ferret#nose").
parse_binary(_Config) ->
#{scheme := <<"foo">>, path := <<"bar:nisse">>} = uri_string:parse(<<"foo:bar:nisse">>),
#{scheme := <<"foo">>, host := <<"example.com">>, port := 8042,
- path := <<"/over/there">>, query := <<"?name=ferret">>, fragment := <<"nose">>} =
+ path := <<"/over/there">>, query := <<"name=ferret">>, fragment := <<"nose">>} =
uri_string:parse(<<"foo://example.com:8042/over/there?name=ferret#nose">>),
#{scheme := <<"foo">>, userinfo := <<"admin:admin">>, host := <<"example.com">>, port := 8042,
- path := <<"/over/there">>, query := <<"?name=ferret">>, fragment := <<"nose">>} =
+ path := <<"/over/there">>, query := <<"name=ferret">>, fragment := <<"nose">>} =
uri_string:parse(<<"foo://admin:[email protected]:8042/over/there?name=ferret#nose">>).
@@ -658,23 +658,26 @@ parse_relative(_Config) ->
uri_string:parse(lists:append("fo",<<"o">>)).
parse_special(_Config) ->
- #{host := [],query := "?"} = uri_string:parse("//?"),
+ #{host := [],query := []} = uri_string:parse("//?"),
#{fragment := [],host := []} = uri_string:parse("//#"),
- #{host := [],query := "?",scheme := "foo"} = uri_string:parse("foo://?"),
+ #{host := [],query := [],scheme := "foo"} = uri_string:parse("foo://?"),
#{fragment := [],host := [],scheme := "foo"} = uri_string:parse("foo://#"),
#{host := <<>>, path := <<"/">>} = uri_string:parse(<<"///">>),
#{host := <<"hostname">>} = uri_string:parse(<<"//hostname">>),
#{host := <<>>, path := <<"/hostname">>} = uri_string:parse(<<"///hostname">>),
- #{host := [],path := "/",query := "?"} = uri_string:parse("///?"),
+ #{host := [],path := "/",query := []} = uri_string:parse("///?"),
#{fragment := [],host := [],path := "/"} = uri_string:parse("///#"),
- #{host := "foo",query := "?"} = uri_string:parse("//foo?"),
+ #{host := "foo",query := []} = uri_string:parse("//foo?"),
#{fragment := [],host := "foo"} = uri_string:parse("//foo#"),
#{host := "foo",path := "/"} = uri_string:parse("//foo/"),
- #{host := "foo",query := "?",scheme := "http"} = uri_string:parse("http://foo?"),
+ #{host := "foo",query := [],scheme := "http"} = uri_string:parse("http://foo?"),
#{fragment := [],host := "foo",scheme := "http"} = uri_string:parse("http://foo#"),
#{host := "foo",path := "/",scheme := "http"} = uri_string:parse("http://foo/"),
#{fragment := [],host := "host",port := 80,scheme := "http"} = uri_string:parse("http://host:80#"),
- #{host := "host",port := 80,query := "?",scheme := "http"} = uri_string:parse("http://host:80?").
+ #{host := "host",port := 80,query := [],scheme := "http"} = uri_string:parse("http://host:80?"),
+ #{path := [],query := []} = uri_string:parse("?"),
+ #{path := [],query := "?"} = uri_string:parse("??"),
+ #{path := [],query := "??"} = uri_string:parse("???").
parse_special2(_Config) ->
#{host := [],path := "/",port := 1,scheme := "a"} = uri_string:parse("a://:1/"),
@@ -703,9 +706,9 @@ recompose_query(_Config) ->
fragment => <<?FRAGMENT/utf8>>,
path => <<>>}),
"?name=%C3%B6rn" =
- uri_string:recompose(#{query => "?name=örn", path => ""}),
+ uri_string:recompose(#{query => "name=örn", path => ""}),
"?name=%C3%B6rn#n%C3%A4sa" =
- uri_string:recompose(#{query => "?name=örn",
+ uri_string:recompose(#{query => "name=örn",
fragment => "näsa",
path => ""}).
@@ -724,10 +727,10 @@ recompose_path(_Config) ->
fragment => <<"näsa"/utf8>>}),
<<"/d%C3%A4r?name=%C3%B6rn">> =
uri_string:recompose(#{path => <<"/där"/utf8>>,
- query => <<"?name=örn"/utf8>>}),
+ query => <<"name=örn"/utf8>>}),
<<"/d%C3%A4r?name=%C3%B6rn#n%C3%A4sa">> =
uri_string:recompose(#{path => <<"/där"/utf8>>,
- query => <<"?name=örn"/utf8>>,
+ query => <<"name=örn"/utf8>>,
fragment => <<"näsa"/utf8>>}),
@@ -738,10 +741,10 @@ recompose_path(_Config) ->
fragment => "näsa"}),
"/d%C3%A4r?name=%C3%B6rn" =
uri_string:recompose(#{path => "/där",
- query => "?name=örn"}),
+ query => "name=örn"}),
"/d%C3%A4r?name=%C3%B6rn#n%C3%A4sa" =
uri_string:recompose(#{path => "/där",
- query => "?name=örn",
+ query => "name=örn",
fragment => "näsa"}).