File 0340-support-key-without-value-in-query-string.patch of Package erlang

From 552659087cfe98d0937ce0f120ea18c515bcafaa Mon Sep 17 00:00:00 2001
From: Tristan Sloughter <t@crashfast.com>
Date: Thu, 14 Jun 2018 10:45:18 -0600
Subject: [PATCH] support key without value in query string

---
 lib/stdlib/src/uri_string.erl        | 23 ++++++++++++++---------
 lib/stdlib/test/uri_string_SUITE.erl | 10 +++++++---
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/lib/stdlib/src/uri_string.erl b/lib/stdlib/src/uri_string.erl
index 48cce90d68..f90f8f916a 100644
--- a/lib/stdlib/src/uri_string.erl
+++ b/lib/stdlib/src/uri_string.erl
@@ -415,7 +415,7 @@ transcode(URIString, Options) when is_list(URIString) ->
 %% (application/x-www-form-urlencoded encoding algorithm)
 %%-------------------------------------------------------------------------
 -spec compose_query(QueryList) -> QueryString when
-      QueryList :: [{unicode:chardata(), unicode:chardata()}],
+      QueryList :: [{unicode:chardata(), unicode:chardata() | true}],
       QueryString :: uri_string()
                    | error().
 compose_query(List) ->
@@ -423,7 +423,7 @@ compose_query(List) ->
 
 
 -spec compose_query(QueryList, Options) -> QueryString when
-      QueryList :: [{unicode:chardata(), unicode:chardata()}],
+      QueryList :: [{unicode:chardata(), unicode:chardata() | true}],
       Options :: [{encoding, atom()}],
       QueryString :: uri_string()
                    | error().
@@ -435,6 +435,11 @@ compose_query(List, Options) ->
       throw:{error, Atom, RestData} -> {error, Atom, RestData}
     end.
 %%
+compose_query([{Key,true}|Rest], Options, IsList, Acc) ->
+    Separator = get_separator(Rest),
+    K = form_urlencode(Key, Options),
+    IsListNew = IsList orelse is_list(Key),
+    compose_query(Rest, Options, IsListNew, <<Acc/binary,K/binary,Separator/binary>>);
 compose_query([{Key,Value}|Rest], Options, IsList, Acc) ->
     Separator = get_separator(Rest),
     K = form_urlencode(Key, Options),
@@ -454,7 +459,7 @@ compose_query([], _Options, IsList, Acc) ->
 %%-------------------------------------------------------------------------
 -spec dissect_query(QueryString) -> QueryList when
       QueryString :: uri_string(),
-      QueryList :: [{unicode:chardata(), unicode:chardata()}]
+      QueryList :: [{unicode:chardata(), unicode:chardata() | true}]
                  | error().
 dissect_query(<<>>) ->
     [];
@@ -1889,13 +1894,12 @@ dissect_query_key(<<$=,T/binary>>, IsList, Acc, Key, Value) ->
     dissect_query_value(T, IsList, Acc, Key, Value);
 dissect_query_key(<<"&#",T/binary>>, IsList, Acc, Key, Value) ->
     dissect_query_key(T, IsList, Acc, <<Key/binary,"&#">>, Value);
-dissect_query_key(<<$&,_T/binary>>, _IsList, _Acc, _Key, _Value) ->
-    throw({error, missing_value, "&"});
+dissect_query_key(T = <<$&,_/binary>>, IsList, Acc, Key, <<>>) ->
+    dissect_query_value(T, IsList, Acc, Key, true);
 dissect_query_key(<<H,T/binary>>, IsList, Acc, Key, Value) ->
     dissect_query_key(T, IsList, Acc, <<Key/binary,H>>, Value);
-dissect_query_key(B, _, _, _, _) ->
-    throw({error, missing_value, B}).
-
+dissect_query_key(T = <<>>, IsList, Acc, Key, <<>>) ->
+    dissect_query_value(T, IsList, Acc, Key, true).
 
 dissect_query_value(<<$&,T/binary>>, IsList, Acc, Key, Value) ->
     K = form_urldecode(IsList, Key),
@@ -1908,9 +1912,10 @@ dissect_query_value(<<>>, IsList, Acc, Key, Value) ->
     V = form_urldecode(IsList, Value),
     lists:reverse([{K,V}|Acc]).
 
-
 %% HTML 5.2 - 4.10.21.6 URL-encoded form data - WHATWG URL (10 Jan 2018) - UTF-8
 %% HTML 5.0 - 4.10.22.6 URL-encoded form data - decoding (non UTF-8)
+form_urldecode(_, true) ->
+    true;
 form_urldecode(true, B) ->
     Result = base10_decode(form_urldecode(B, <<>>)),
     convert_to_list(Result, utf8);
diff --git a/lib/stdlib/test/uri_string_SUITE.erl b/lib/stdlib/test/uri_string_SUITE.erl
index 2aa399525d..86d993dc91 100644
--- a/lib/stdlib/test/uri_string_SUITE.erl
+++ b/lib/stdlib/test/uri_string_SUITE.erl
@@ -862,9 +862,11 @@ transcode_negative(_Config) ->
 compose_query(_Config) ->
     [] = uri_string:compose_query([]),
     "foo=1&bar=2" = uri_string:compose_query([{<<"foo">>,"1"}, {"bar", "2"}]),
+    "foo=1&bar" = uri_string:compose_query([{<<"foo">>,"1"}, {"bar", true}]),
     "foo=1&b%C3%A4r=2" = uri_string:compose_query([{"foo","1"}, {"bär", "2"}],[{encoding,utf8}]),
     "foo=1&b%C3%A4r=2" = uri_string:compose_query([{"foo","1"}, {"bär", "2"}],[{encoding,unicode}]),
     "foo=1&b%E4r=2" = uri_string:compose_query([{"foo","1"}, {"bär", "2"}],[{encoding,latin1}]),
+    "foo&b%E4r=2" = uri_string:compose_query([{"foo",true}, {"bär", "2"}],[{encoding,latin1}]),
     "foo+bar=1&%E5%90%88=2" = uri_string:compose_query([{"foo bar","1"}, {"合", "2"}]),
     "foo+bar=1&%26%2321512%3B=2" =
         uri_string:compose_query([{"foo bar","1"}, {"合", "2"}],[{encoding,latin1}]),
@@ -906,11 +908,13 @@ dissect_query(_Config) ->
     [{"föo bar","1"},{"ö","2"}] =
         uri_string:dissect_query("föo+bar=1&%C3%B6=2"),
     [{<<"föo bar"/utf8>>,<<"1">>},{<<"ö"/utf8>>,<<"2">>}] =
-        uri_string:dissect_query(<<"föo+bar=1&%C3%B6=2"/utf8>>).
+        uri_string:dissect_query(<<"föo+bar=1&%C3%B6=2"/utf8>>),
+    [{"foo1",true},{"bar","2"}] =
+        uri_string:dissect_query("foo1&bar=2"),
+    [{<<"foo1">>,<<"1">>},{<<"bar">>,true}] =
+        uri_string:dissect_query(<<"foo1=1&bar">>).
 
 dissect_query_negative(_Config) ->
-    {error,missing_value,"&"} =
-        uri_string:dissect_query("foo1&bar=2"),
     {error,invalid_percent_encoding,"%XX%B6"} = uri_string:dissect_query("foo=%XX%B6&amp;bar=2"),
     {error,invalid_input,[153]} =
         uri_string:dissect_query("foo=%99%B6&amp;bar=2"),
-- 
2.16.4

openSUSE Build Service is sponsored by