@matheusbsbs / matheus-bagliano / commits / 730220de8b
Fork 0

Do not unquote + into ' ' in URLs

Since 9d2e942 (decode file:// and ssh:// URLs, 2010-05-23) the URL logic unquotes escaped URLs. For the %2B type of escape, this is conformant with RFC 2396. However, it also unquotes + into a space character, which is only appropriate for the query strings in HTTP. This notably broke fetching from the gtk+ repository. We cannot just remove the corresponding code since the same url_decode_internal() is also used by the HTTP backend to decode query parameters. Introduce a new argument that controls whether the + decoding happens, and use it only in the (client-side) url_decode(). Reported-by: Jasper St. Pierre <jstpierre@mecheye.net> Signed-off-by: Thomas Rast <trast@student.ethz.ch> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Thomas Rast committed Jul 24, 2010 at 16:49 UTC 730220de8be669257287e9a1f5dde349ace5426a
2 files changed +14 -7
t/t5601-clone.sh
+8 -2
@@ -178,8 +178,14 @@ test_expect_success 'clone respects global branch.autosetuprebase' '
178
179 test_expect_success 'respect url-encoding of file://' '
180 git init x+y &&
181 - test_must_fail git clone "file://$PWD/x+y" xy-url &&
182 - git clone "file://$PWD/x%2By" xy-url
181 + git clone "file://$PWD/x+y" xy-url-1 &&
182 + git clone "file://$PWD/x%2By" xy-url-2
183 +'
184 +
185 +test_expect_success 'do not query-string-decode + in URLs' '
186 + rm -rf x+y &&
187 + git init "x y" &&
188 + test_must_fail git clone "file://$PWD/x+y" xy-no-plus
189 '
190
191 test_expect_success 'do not respect url-encoding of non-url path' '
url.c
+6 -5
@@ -67,7 +67,8 @@ static int url_decode_char(const char *q)
67 return val;
68 }
69
70 -static char *url_decode_internal(const char **query, const char *stop_at, struct strbuf *out)
70 +static char *url_decode_internal(const char **query, const char *stop_at,
71 + struct strbuf *out, int decode_plus)
72 {
73 const char *q = *query;
74
@@ -90,7 +91,7 @@ static char *url_decode_internal(const char **query, const char *stop_at, struct
91 }
92 }
93
93 - if (c == '+')
94 + if (decode_plus && c == '+')
95 strbuf_addch(out, ' ');
96 else
97 strbuf_addch(out, c);
@@ -110,17 +111,17 @@ char *url_decode(const char *url)
111 strbuf_add(&out, url, colon - url);
112 url = colon;
113 }
113 - return url_decode_internal(&url, NULL, &out);
114 + return url_decode_internal(&url, NULL, &out, 0);
115 }
116
117 char *url_decode_parameter_name(const char **query)
118 {
119 struct strbuf out = STRBUF_INIT;
119 - return url_decode_internal(query, "&=", &out);
120 + return url_decode_internal(query, "&=", &out, 1);
121 }
122
123 char *url_decode_parameter_value(const char **query)
124 {
125 struct strbuf out = STRBUF_INIT;
125 - return url_decode_internal(query, "&", &out);
126 + return url_decode_internal(query, "&", &out, 1);
127 }