summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--http-push.c13
-rwxr-xr-xt/t5540-http-push.sh7
2 files changed, 18 insertions, 2 deletions
diff --git a/http-push.c b/http-push.c
index bb00728f14..55ad808023 100644
--- a/http-push.c
+++ b/http-push.c
@@ -152,6 +152,7 @@ struct remote_lock
char *url;
char *owner;
char *token;
+ char tmpfile_suffix[41];
time_t start_time;
long timeout;
int refreshing;
@@ -556,8 +557,7 @@ static void start_put(struct transfer_request *request)
request->dest = strbuf_detach(&buf, NULL);
append_remote_object_url(&buf, remote->url, hex, 0);
- strbuf_addstr(&buf, "_");
- strbuf_addstr(&buf, request->lock->token);
+ strbuf_add(&buf, request->lock->tmpfile_suffix, 41);
request->url = strbuf_detach(&buf, NULL);
slot = get_active_slot();
@@ -1129,6 +1129,8 @@ static void handle_lockprop_ctx(struct xml_ctx *ctx, int tag_closed)
static void handle_new_lock_ctx(struct xml_ctx *ctx, int tag_closed)
{
struct remote_lock *lock = (struct remote_lock *)ctx->userData;
+ git_SHA_CTX sha_ctx;
+ unsigned char lock_token_sha1[20];
if (tag_closed && ctx->cdata) {
if (!strcmp(ctx->name, DAV_ACTIVELOCK_OWNER)) {
@@ -1141,6 +1143,13 @@ static void handle_new_lock_ctx(struct xml_ctx *ctx, int tag_closed)
} else if (!strcmp(ctx->name, DAV_ACTIVELOCK_TOKEN)) {
lock->token = xmalloc(strlen(ctx->cdata) + 1);
strcpy(lock->token, ctx->cdata);
+
+ git_SHA1_Init(&sha_ctx);
+ git_SHA1_Update(&sha_ctx, lock->token, strlen(lock->token));
+ git_SHA1_Final(lock_token_sha1, &sha_ctx);
+
+ lock->tmpfile_suffix[0] = '_';
+ memcpy(lock->tmpfile_suffix + 1, sha1_to_hex(lock_token_sha1), 40);
}
}
}
diff --git a/t/t5540-http-push.sh b/t/t5540-http-push.sh
index c236b5e83b..11b343274f 100755
--- a/t/t5540-http-push.sh
+++ b/t/t5540-http-push.sh
@@ -94,6 +94,13 @@ test_expect_success 'MKCOL sends directory names with trailing slashes' '
'
+test_expect_success 'PUT and MOVE sends object to URLs with SHA-1 hash suffix' '
+
+ grep -P "\"(?:PUT|MOVE) .+objects/[\da-z]{2}/[\da-z]{38}_[\da-z\-]{40} HTTP/[0-9.]+\" 20\d" \
+ < "$HTTPD_ROOT_PATH"/access.log
+
+'
+
stop_httpd
test_done