Do not unquote + into ' ' in URLs
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>
Thomas Rast committed
Jul 24, 2010 at 16:49 UTC
730220de8be669257287e9a1f5dde349ace5426a
2 files changed
+14
-7
t/t5601-clone.sh
+8
-2
@@ -178,8 +178,14 @@ test_expect_success 'clone respects global branch.autosetuprebase' '
178
179
test_expect_success 'respect url-encoding of file://' '
180
git init x+y &&
181
- test_must_fail git clone "file://$PWD/x+y" xy-url &&
182
- git clone "file://$PWD/x%2By" xy-url
181
+ git clone "file://$PWD/x+y" xy-url-1 &&
182
+ git clone "file://$PWD/x%2By" xy-url-2
183
+'
184
+
185
+test_expect_success 'do not query-string-decode + in URLs' '
186
+ rm -rf x+y &&
187
+ git init "x y" &&
188
+ test_must_fail git clone "file://$PWD/x+y" xy-no-plus
189
'
190
191
test_expect_success 'do not respect url-encoding of non-url path' '
url.c
+6
-5
@@ -67,7 +67,8 @@ static int url_decode_char(const char *q)
67
return val;
68
}
69
70
-static char *url_decode_internal(const char **query, const char *stop_at, struct strbuf *out)
70
+static char *url_decode_internal(const char **query, const char *stop_at,
71
+ struct strbuf *out, int decode_plus)
72
{
73
const char *q = *query;
74
@@ -90,7 +91,7 @@ static char *url_decode_internal(const char **query, const char *stop_at, struct
91
}
92
}
93
93
- if (c == '+')
94
+ if (decode_plus && c == '+')
95
strbuf_addch(out, ' ');
96
else
97
strbuf_addch(out, c);
@@ -110,17 +111,17 @@ char *url_decode(const char *url)
111
strbuf_add(&out, url, colon - url);
112
url = colon;
113
}
113
- return url_decode_internal(&url, NULL, &out);
114
+ return url_decode_internal(&url, NULL, &out, 0);
115
}
116
117
char *url_decode_parameter_name(const char **query)
118
{
119
struct strbuf out = STRBUF_INIT;
119
- return url_decode_internal(query, "&=", &out);
120
+ return url_decode_internal(query, "&=", &out, 1);
121
}
122
123
char *url_decode_parameter_value(const char **query)
124
{
125
struct strbuf out = STRBUF_INIT;
125
- return url_decode_internal(query, "&", &out);
126
+ return url_decode_internal(query, "&", &out, 1);
127
}