X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=url.c;h=cd8f74f00c345294f94cb25e4e00849a0618168b;hb=edc54fb5d4ce6774fc2ac76779bd57dc2d6ab189;hp=cd32b927a4caaa141a56e415ac42c7a52d40e8ee;hpb=9cb16a92d7c069b36f7b7b08557f779de499d3f7;p=git.git diff --git a/url.c b/url.c index cd32b927a..cd8f74f00 100644 --- a/url.c +++ b/url.c @@ -67,12 +67,11 @@ static int url_decode_char(const char *q) return val; } -static char *url_decode_internal(const char **query, const char *stop_at) +static char *url_decode_internal(const char **query, const char *stop_at, + struct strbuf *out, int decode_plus) { const char *q = *query; - struct strbuf out; - strbuf_init(&out, 16); do { unsigned char c = *q; @@ -86,33 +85,43 @@ static char *url_decode_internal(const char **query, const char *stop_at) if (c == '%') { int val = url_decode_char(q + 1); if (0 <= val) { - strbuf_addch(&out, val); + strbuf_addch(out, val); q += 3; continue; } } - if (c == '+') - strbuf_addch(&out, ' '); + if (decode_plus && c == '+') + strbuf_addch(out, ' '); else - strbuf_addch(&out, c); + strbuf_addch(out, c); q++; } while (1); *query = q; - return strbuf_detach(&out, NULL); + return strbuf_detach(out, NULL); } char *url_decode(const char *url) { - return url_decode_internal(&url, NULL); + struct strbuf out = STRBUF_INIT; + const char *colon = strchr(url, ':'); + + /* Skip protocol part if present */ + if (colon && url < colon) { + strbuf_add(&out, url, colon - url); + url = colon; + } + return url_decode_internal(&url, NULL, &out, 0); } char *url_decode_parameter_name(const char **query) { - return url_decode_internal(query, "&="); + struct strbuf out = STRBUF_INIT; + return url_decode_internal(query, "&=", &out, 1); } char *url_decode_parameter_value(const char **query) { - return url_decode_internal(query, "&"); + struct strbuf out = STRBUF_INIT; + return url_decode_internal(query, "&", &out, 1); }