Fix a bug when pushing to WebDAV servers which do not use a trailing slash for collection names. The previous implementation fails to see that the requested resource "refs/" is the same resource as "refs" and loads every reference twice (once for refs/ and once for refs). This implementation normalises every collection name by appending a trailing slash if necessary. This can be tested with old versions of Apache (such as the WebDAV server of GMX, Apache 2.0.63). --- http-push.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) diff --git a/http-push.c b/http-push.c index c9bcd11..aeb37ab 100644 --- a/http-push.c +++ b/http-push.c @@ -1083,6 +1083,18 @@ static void process_ls_ref(struct remote_ls_ctx *ls) one_remote_ref(ls->dentry_name); } +static void normalize_dirname(char** name) { + char* res; + int len = strlen(*name); + if((*name)[len-1]=='/') return; + res = malloc(len+2); + strcpy(res, *name); + res[len]='/'; + res[len+1]='\0'; + free(*name); + *name = res; +} + static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed) { struct remote_ls_ctx *ls = (struct remote_ls_ctx *)ctx->userData; @@ -1090,6 +1102,7 @@ static void handle_remote_ls_ctx(struct xml_ctx *ctx, int tag_closed) if (tag_closed) { if (!strcmp(ctx->name, DAV_PROPFIND_RESP) && ls->dentry_name) { if (ls->dentry_flags & IS_DIR) { + normalize_dirname(&ls->dentry_name); if (ls->flags & PROCESS_DIRS) { ls->userFunc(ls); } -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html