diff options
author | Thomas Rast <trast@student.ethz.ch> | 2010-07-24 16:49:04 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-07-25 21:57:23 -0700 |
commit | 730220de8be669257287e9a1f5dde349ace5426a (patch) | |
tree | 397acf0fb781bb98853ea4a5af3d50235ff876fe /url.c | |
parent | 64fdc08dac6694d1e754580e7acb82dfa4988bb9 (diff) | |
download | git-730220de8be669257287e9a1f5dde349ace5426a.tar.gz |
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>
Diffstat (limited to 'url.c')
-rw-r--r-- | url.c | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -67,7 +67,8 @@ static int url_decode_char(const char *q) return val; } -static char *url_decode_internal(const char **query, const char *stop_at, struct strbuf *out) +static char *url_decode_internal(const char **query, const char *stop_at, + struct strbuf *out, int decode_plus) { const char *q = *query; @@ -90,7 +91,7 @@ static char *url_decode_internal(const char **query, const char *stop_at, struct } } - if (c == '+') + if (decode_plus && c == '+') strbuf_addch(out, ' '); else strbuf_addch(out, c); @@ -110,17 +111,17 @@ char *url_decode(const char *url) strbuf_add(&out, url, colon - url); url = colon; } - return url_decode_internal(&url, NULL, &out); + return url_decode_internal(&url, NULL, &out, 0); } char *url_decode_parameter_name(const char **query) { struct strbuf out = STRBUF_INIT; - return url_decode_internal(query, "&=", &out); + return url_decode_internal(query, "&=", &out, 1); } char *url_decode_parameter_value(const char **query) { struct strbuf out = STRBUF_INIT; - return url_decode_internal(query, "&", &out); + return url_decode_internal(query, "&", &out, 1); } |