Skip to content

Commit 4083555

Browse files
committed
Introduce URI.encode_www_form/1 function
1 parent dc9a47d commit 4083555

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

lib/elixir/lib/uri.ex

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,8 @@ defmodule URI do
142142
end
143143

144144
defp pair({k, v}) do
145-
encode(to_string(k)) <> "=" <> encode(to_string(v))
145+
encode_www_form(to_string(k)) <>
146+
"=" <> encode_www_form(to_string(v))
146147
end
147148

148149
@doc """
@@ -154,7 +155,6 @@ defmodule URI do
154155
c in ':/?#[]@!$&\'()*+,;='
155156
end
156157

157-
#
158158
@doc """
159159
Checks if the character is a "unreserved" character in a URI.
160160
@@ -191,6 +191,24 @@ defmodule URI do
191191
for <<c <- str>>, into: "", do: percent(c, predicate)
192192
end
193193

194+
@doc """
195+
Encode a string as "x-www-urlencoded".
196+
197+
## Example
198+
199+
iex> URI.encode_www_form("put: it+й")
200+
"put%3A+it%2B%D0%B9"
201+
202+
"""
203+
def encode_www_form(str) do
204+
for <<c <- str>>, into: "" do
205+
case percent(c, &char_unreserved?/1) do
206+
"%20" -> "+"
207+
pct -> pct
208+
end
209+
end
210+
end
211+
194212
defp percent(c, predicate) do
195213
if predicate.(c) do
196214
<<c>>

lib/elixir/test/elixir/uri_test.exs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,16 @@ defmodule URITest do
99
"%0D%0A%26%3C%25%3E%22%20%E3%82%86"
1010
end
1111

12+
test :encode_www_form do
13+
assert URI.encode_www_form("4test ~1.x") == "4test+~1.x"
14+
assert URI.encode_www_form("poll:146%") == "poll%3A146%25"
15+
assert URI.encode_www_form("/\n+/ゆ") == "%2F%0A%2B%2F%E3%82%86"
16+
end
17+
1218
test :encode_query do
1319
assert URI.encode_query([{:foo, :bar}, {:baz, :quux}]) == "foo=bar&baz=quux"
1420
assert URI.encode_query([{"foo", "bar"}, {"baz", "quux"}]) == "foo=bar&baz=quux"
15-
assert URI.encode_query([{"foo", :bar}]) == "foo=bar"
21+
assert URI.encode_query([{"foo z", :bar}]) == "foo+z=bar"
1622

1723
assert_raise ArgumentError, fn ->
1824
URI.encode_query([{"foo", 'bar'}])

0 commit comments

Comments
 (0)