X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=url.c;h=230623657a0e06975c4721a9fddb117ba84883b1;hb=ea56a7ed971f3bd547abb16a3cb9a41c00133c85;hp=cd32b927a4caaa141a56e415ac42c7a52d40e8ee;hpb=632d3f4b5b80700c6c7c3637d6a4d1d9a457f7e1;p=git.git diff --git a/url.c b/url.c index cd32b927a..230623657 100644 --- a/url.c +++ b/url.c @@ -67,12 +67,10 @@ 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) { const char *q = *query; - struct strbuf out; - strbuf_init(&out, 16); do { unsigned char c = *q; @@ -86,33 +84,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, ' '); + 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); } char *url_decode_parameter_name(const char **query) { - return url_decode_internal(query, "&="); + struct strbuf out = STRBUF_INIT; + return url_decode_internal(query, "&=", &out); } char *url_decode_parameter_value(const char **query) { - return url_decode_internal(query, "&"); + struct strbuf out = STRBUF_INIT; + return url_decode_internal(query, "&", &out); }