summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 64fdc08)
raw | patch | inline | side by side (parent: 64fdc08)
author | Thomas Rast <trast@student.ethz.ch> | |
Sat, 24 Jul 2010 14:49:04 +0000 (16:49 +0200) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Mon, 26 Jul 2010 04:57:23 +0000 (21:57 -0700) |
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>
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>
t/t5601-clone.sh | patch | blob | history | |
url.c | patch | blob | history |
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index 8abb71afcd4d7389260baa6f82ecb9b53bb9524c..4431dfd02b59710b8e7fc48928dd846615a8c000 100755 (executable)
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
test_expect_success 'respect url-encoding of file://' '
git init x+y &&
- test_must_fail git clone "file://$PWD/x+y" xy-url &&
- git clone "file://$PWD/x%2By" xy-url
+ git clone "file://$PWD/x+y" xy-url-1 &&
+ 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' '
index 230623657a0e06975c4721a9fddb117ba84883b1..cd8f74f00c345294f94cb25e4e00849a0618168b 100644 (file)
--- a/url.c
+++ b/url.c
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;
}
}
- if (c == '+')
+ if (decode_plus && c == '+')
strbuf_addch(out, ' ');
else
strbuf_addch(out, c);
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);
}