Merge branch 'tr/maint-no-unquote-plus'

* tr/maint-no-unquote-plus:
  Do not unquote + into ' ' in URLs
maint
Junio C Hamano 2010-08-31 16:23:35 -07:00
commit d7cc7c971f
2 changed files with 14 additions and 7 deletions

View File

@ -178,8 +178,14 @@ test_expect_success 'clone respects global branch.autosetuprebase' '


test_expect_success 'respect url-encoding of file://' ' test_expect_success 'respect url-encoding of file://' '
git init x+y && git init x+y &&
test_must_fail git clone "file://$PWD/x+y" xy-url && git clone "file://$PWD/x+y" xy-url-1 &&
git clone "file://$PWD/x%2By" xy-url git clone "file://$PWD/x%2By" xy-url-2
'

test_expect_success 'do not query-string-decode + in URLs' '
rm -rf x+y &&
git init "x y" &&
test_must_fail git clone "file://$PWD/x+y" xy-no-plus
' '


test_expect_success 'do not respect url-encoding of non-url path' ' test_expect_success 'do not respect url-encoding of non-url path' '

11
url.c
View File

@ -67,7 +67,8 @@ static int url_decode_char(const char *q)
return val; 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; 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, ' '); strbuf_addch(out, ' ');
else else
strbuf_addch(out, c); strbuf_addch(out, c);
@ -110,17 +111,17 @@ char *url_decode(const char *url)
strbuf_add(&out, url, colon - url); strbuf_add(&out, url, colon - url);
url = colon; 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) char *url_decode_parameter_name(const char **query)
{ {
struct strbuf out = STRBUF_INIT; 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) char *url_decode_parameter_value(const char **query)
{ {
struct strbuf out = STRBUF_INIT; struct strbuf out = STRBUF_INIT;
return url_decode_internal(query, "&", &out); return url_decode_internal(query, "&", &out, 1);
} }