Skip to content

Commit

Permalink
Do not unquote + into ' ' in URLs
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Thomas Rast authored and Junio C Hamano committed Jul 26, 2010
1 parent 64fdc08 commit 730220d
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 7 deletions.
10 changes: 8 additions & 2 deletions t/t5601-clone.sh
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,14 @@ test_expect_success 'clone respects global branch.autosetuprebase' '

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' '
Expand Down
11 changes: 6 additions & 5 deletions url.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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);
Expand All @@ -110,17 +111,17 @@ char *url_decode(const char *url)
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);
}

0 comments on commit 730220d

Please sign in to comment.