X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=url.c;h=6a5495960f03ded65f0f5f8b8bd5c7cd98c0b05e;hb=0fdadc501ee42c530946731718dfdd710f4005d3;hp=bf5bb9c88f751be2dd22bc49bcd9d53812cc5b94;hpb=6296062285e07051a5a46cbbd74c67a10bf2ac16;p=git.git diff --git a/url.c b/url.c index bf5bb9c88..6a5495960 100644 --- a/url.c +++ b/url.c @@ -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); @@ -103,24 +104,38 @@ static char *url_decode_internal(const char **query, const char *stop_at, struct char *url_decode(const char *url) { struct strbuf out = STRBUF_INIT; - const char *slash = strchr(url, '/'); + const char *colon = strchr(url, ':'); /* Skip protocol part if present */ - if (slash && url < slash) { - strbuf_add(&out, url, slash - url); - url = slash; + if (colon && url < colon) { + 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); +} + +void end_url_with_slash(struct strbuf *buf, const char *url) +{ + strbuf_addstr(buf, url); + if (buf->len && buf->buf[buf->len - 1] != '/') + strbuf_addstr(buf, "/"); +} + +void str_end_url_with_slash(const char *url, char **dest) { + struct strbuf buf = STRBUF_INIT; + end_url_with_slash(&buf, url); + free(*dest); + *dest = strbuf_detach(&buf, NULL); }