summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: eb9d47c)
raw | patch | inline | side by side (parent: eb9d47c)
author | Tay Ray Chuan <rctay89@gmail.com> | |
Thu, 8 Apr 2010 02:15:18 +0000 (10:15 +0800) | ||
committer | Junio C Hamano <gitster@pobox.com> | |
Sat, 10 Apr 2010 04:16:11 +0000 (21:16 -0700) |
Previously, we blindly assumed that URLs passed to the remote-curl
helper did not end with a trailing slash.
Use the convenience function end_url_with_slash() from http.[ch] to
ensure that URLs have a trailing slash on invocation of the remote-curl
helper, and use the URL as one with a trailing slash throughout.
It is possible for users to pass a URL with a trailing slash to
remote-curl, by, say, setting it in remote.<name>.url in their git
config. The resulting requests have an empty path component (//) and may
break implementations of the http git protocol.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
helper did not end with a trailing slash.
Use the convenience function end_url_with_slash() from http.[ch] to
ensure that URLs have a trailing slash on invocation of the remote-curl
helper, and use the URL as one with a trailing slash throughout.
It is possible for users to pass a URL with a trailing slash to
remote-curl, by, say, setting it in remote.<name>.url in their git
config. The resulting requests have an empty path component (//) and may
break implementations of the http git protocol.
Signed-off-by: Tay Ray Chuan <rctay89@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote-curl.c | patch | blob | history | |
t/t5541-http-push.sh | patch | blob | history |
diff --git a/remote-curl.c b/remote-curl.c
index a904164e425097380781c1ecd9bb13f4feec0de6..1fe59d6db0e85ab938959f08d3bca4a83f748ab5 100644 (file)
--- a/remote-curl.c
+++ b/remote-curl.c
#include "sideband.h"
static struct remote *remote;
-static const char *url;
+static const char *url; /* always ends with a trailing slash */
static struct walker *walker;
struct options {
return last;
free_discovery(last);
- strbuf_addf(&buffer, "%s/info/refs", url);
+ strbuf_addf(&buffer, "%sinfo/refs", url);
if (!prefixcmp(url, "http://") || !prefixcmp(url, "https://")) {
is_http = 1;
if (!strchr(url, '?'))
strbuf_reset(&buffer);
proto_git_candidate = 0;
- strbuf_addf(&buffer, "%s/info/refs", url);
+ strbuf_addf(&buffer, "%sinfo/refs", url);
refs_url = strbuf_detach(&buffer, NULL);
http_ret = http_get_strbuf(refs_url, &buffer, HTTP_NO_CACHE);
rpc->out = client.out;
strbuf_init(&rpc->result, 0);
- strbuf_addf(&buf, "%s/%s", url, svc);
+ strbuf_addf(&buf, "%s%s", url, svc);
rpc->service_url = strbuf_detach(&buf, NULL);
strbuf_addf(&buf, "Content-Type: application/x-%s-request", svc);
remote = remote_get(argv[1]);
if (argc > 2) {
- url = argv[2];
+ end_url_with_slash(&buf, argv[2]);
} else {
- url = remote->url[0];
+ end_url_with_slash(&buf, remote->url[0]);
}
+ url = strbuf_detach(&buf, NULL);
+
do {
if (strbuf_getline(&buf, stdin, '\n') == EOF)
break;
diff --git a/t/t5541-http-push.sh b/t/t5541-http-push.sh
index 7873d9429ab86292c03f7704b5b0d919e1a7f029..f0c50d3d774dcbd2449988c65e0813cf25366b89 100755 (executable)
--- a/t/t5541-http-push.sh
+++ b/t/t5541-http-push.sh
GET /smart/test_repo.git/info/refs?service=git-upload-pack HTTP/1.1 200
POST /smart/test_repo.git/git-upload-pack HTTP/1.1 200
EOF
-test_expect_failure 'no empty path components' '
+test_expect_success 'no empty path components' '
# In the URL, add a trailing slash, and see if git appends yet another
# slash.
cd "$ROOT_PATH" &&