diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2009-01-17 16:11:51 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-01-17 18:19:46 -0800 |
commit | 466ddf90c2f270b973d141f20e912f743743331c (patch) | |
tree | 0a238a1c9d8c2597874dd6b8ecfb243b5812f851 | |
parent | http-push: fix off-by-path_len (diff) | |
download | tgif-466ddf90c2f270b973d141f20e912f743743331c.tar.xz |
http-push: when making directories, have a trailing slash in the path name
The function lock_remote() sends MKCOL requests to make leading
directories; However, if it does not put a forward slash '/' at the end of
the path, the server sends a 301 redirect.
By leaving the '/' in place, we can avoid this additional step.
Incidentally, at least one version of Curl (7.16.3) does not resend
credentials when it follows a 301 redirect, so this commit also fixes
a bug.
Original patch by Tay Ray Chuan <rctay89@gmail.com>.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | http-push.c | 5 | ||||
-rw-r--r-- | t/lib-httpd/apache.conf | 2 | ||||
-rwxr-xr-x | t/t5540-http-push.sh | 6 |
3 files changed, 11 insertions, 2 deletions
diff --git a/http-push.c b/http-push.c index 2f20995700..6ad853e2d0 100644 --- a/http-push.c +++ b/http-push.c @@ -1201,7 +1201,8 @@ static struct remote_lock *lock_remote(const char *path, long timeout) /* Make sure leading directories exist for the remote ref */ ep = strchr(url + strlen(remote->url) + 1, '/'); while (ep) { - *ep = 0; + char saved_character = ep[1]; + ep[1] = '\0'; slot = get_active_slot(); slot->results = &results; curl_easy_setopt(slot->curl, CURLOPT_HTTPGET, 1); @@ -1223,7 +1224,7 @@ static struct remote_lock *lock_remote(const char *path, long timeout) free(url); return NULL; } - *ep = '/'; + ep[1] = saved_character; ep = strchr(ep + 1, '/'); } diff --git a/t/lib-httpd/apache.conf b/t/lib-httpd/apache.conf index 4717c2d33b..fdb19a50f1 100644 --- a/t/lib-httpd/apache.conf +++ b/t/lib-httpd/apache.conf @@ -1,6 +1,8 @@ ServerName dummy PidFile httpd.pid DocumentRoot www +LogFormat "%h %l %u %t \"%r\" %>s %b" common +CustomLog access.log common ErrorLog error.log <IfDefine SSL> diff --git a/t/t5540-http-push.sh b/t/t5540-http-push.sh index da9588645c..22cfbb6a2d 100755 --- a/t/t5540-http-push.sh +++ b/t/t5540-http-push.sh @@ -76,6 +76,12 @@ test_expect_failure 'create and delete remote branch' ' test_must_fail git show-ref --verify refs/remotes/origin/dev ' +test_expect_success 'MKCOL sends directory names with trailing slashes' ' + + ! grep "\"MKCOL.*[^/] HTTP/[^ ]*\"" < "$HTTPD_ROOT_PATH"/access.log + +' + stop_httpd test_done |