From 725c008f7eb22b36d05e245583a121b7cf2562be Mon Sep 17 00:00:00 2001 From: Terin Stock Date: Wed, 10 Feb 2016 01:08:17 -0800 Subject: [PATCH] fix(hackney_url): pass "@" unescaped In Chromium's [kPathCharLookup][1] table, the commercial at symbol is given the flag to pass through without being escaped. This is due to some web services using this character as a delimiter without first unescaping. [1]: https://src.chromium.org/viewvc/chrome/trunk/src/url/url_canon_path.cc?pathrev=265120#l60 --- src/http/hackney_url.erl | 2 +- test/hackney_url_tests.erl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/http/hackney_url.erl b/src/http/hackney_url.erl index d29cd7a4..5fe918d0 100644 --- a/src/http/hackney_url.erl +++ b/src/http/hackney_url.erl @@ -368,7 +368,7 @@ partial_pathencode(<> = Bin, Acc) -> if C >= $0, C =< $9 -> partial_pathencode(Rest, <>); C >= $A, C =< $Z -> partial_pathencode(Rest, <>); C >= $a, C =< $z -> partial_pathencode(Rest, <>); - C =:= $;; C =:= $=; C =:= $,; C =:= $: -> + C =:= $;; C =:= $=; C =:= $,; C =:= $:; C =:= $@ -> partial_pathencode(Rest, <>); C =:= $.; C =:= $-; C =:= $+; C =:= $~; C =:= $_ -> partial_pathencode(Rest, <>); diff --git a/test/hackney_url_tests.erl b/test/hackney_url_tests.erl index 300657a5..7467d30f 100644 --- a/test/hackney_url_tests.erl +++ b/test/hackney_url_tests.erl @@ -259,7 +259,8 @@ pathencode_test_() -> {<<"/path1/path2%2fa">>, <<"/path1/path2%2fa">>}, {<<"/path1/path2%2fa%2fb">>, <<"/path1/path2%2fa%2fb">>}, {<<"/path1/path2%2test">>, <<"/path1/path2%252test">>}, - {<<"/id/name:107/name2;p=1,3">>, <<"/id/name:107/name2;p=1,3">>} + {<<"/id/name:107/name2;p=1,3">>, <<"/id/name:107/name2;p=1,3">>}, + {<<"/@foobar">>, <<"/@foobar">>} ], [{V, fun() -> R = hackney_url:pathencode(V) end} || {V, R} <- Tests].