]> git.proxmox.com Git - libgit2.git/commitdiff
Tell the git_transport about the custom_headers
authorMatt Burke <spraints@gmail.com>
Tue, 8 Sep 2015 17:53:41 +0000 (13:53 -0400)
committerMatt Burke <spraints@gmail.com>
Tue, 8 Sep 2015 18:02:33 +0000 (14:02 -0400)
include/git2/remote.h
include/git2/sys/transport.h
src/push.c
src/push.h
src/remote.c
tests/network/remote/defaultbranch.c
tests/network/remote/local.c
tests/network/remote/remotes.c
tests/online/fetch.c
tests/online/push.c

index a39e5a415a42ea70569b951bf30c150f84a11876..9237ca255532a2bdea36d53c1e21fd1a0b4d94a4 100644 (file)
@@ -241,9 +241,10 @@ GIT_EXTERN(const git_refspec *)git_remote_get_refspec(const git_remote *remote,
  * @param direction GIT_DIRECTION_FETCH if you want to fetch or
  * GIT_DIRECTION_PUSH if you want to push
  * @param callbacks the callbacks to use for this connection
+ * @param custom_headers extra HTTP headers to use in this connection
  * @return 0 or an error code
  */
-GIT_EXTERN(int) git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks);
+GIT_EXTERN(int) git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_strarray *custom_headers);
 
 /**
  * Get the remote repository's reference advertisement list
index 4a75b08327ee31ae27c81cc0c5c247f676952e38..ca8617f3fe6e4f6dc0820a10db2b5ff08f6f45f1 100644 (file)
@@ -40,6 +40,11 @@ struct git_transport {
                git_transport_certificate_check_cb certificate_check_cb,
                void *payload);
 
+       /* Set custom headers for HTTP requests */
+       int (*set_custom_headers)(
+               git_transport *transport,
+               const git_strarray *custom_headers);
+
        /* Connect the transport to the remote repository, using the given
         * direction. */
        int (*connect)(
index a0d8a055062f0b394a0cfd79bc6029e17351b616..3c9fa2f1bf85f1cad4e8435967e3674512c57e01 100644 (file)
@@ -73,6 +73,7 @@ int git_push_set_options(git_push *push, const git_push_options *opts)
        GITERR_CHECK_VERSION(opts, GIT_PUSH_OPTIONS_VERSION, "git_push_options");
 
        push->pb_parallelism = opts->pb_parallelism;
+       push->custom_headers = &opts->custom_headers;
 
        return 0;
 }
@@ -638,7 +639,7 @@ int git_push_finish(git_push *push, const git_remote_callbacks *callbacks)
        int error;
 
        if (!git_remote_connected(push->remote) &&
-           (error = git_remote_connect(push->remote, GIT_DIRECTION_PUSH, callbacks)) < 0)
+           (error = git_remote_connect(push->remote, GIT_DIRECTION_PUSH, callbacks, push->custom_headers)) < 0)
                return error;
 
        if ((error = filter_refs(push->remote)) < 0 ||
index a847ee0d080e03451f087fdb3b30a192fa5a82fc..e32ad2f4dad79830c8b6add7ad1174f8d9a5ef7f 100644 (file)
@@ -38,6 +38,7 @@ struct git_push {
 
        /* options */
        unsigned pb_parallelism;
+       const git_strarray *custom_headers;
 };
 
 /**
index 7404bf49f535f4b75dcf67ff7b2e16ee9977000a..9e907d2810f71e8d80a84556c966b77226f77031 100644 (file)
@@ -687,7 +687,15 @@ int set_transport_callbacks(git_transport *t, const git_remote_callbacks *cbs)
                                cbs->certificate_check, cbs->payload);
 }
 
-int git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks)
+int set_transport_custom_headers(git_transport *t, const git_strarray *custom_headers)
+{
+       if (!t->set_custom_headers || !custom_headers)
+               return 0;
+
+       return t->set_custom_headers(t, custom_headers);
+}
+
+int git_remote_connect(git_remote *remote, git_direction direction, const git_remote_callbacks *callbacks, const git_strarray *custom_headers)
 {
        git_transport *t;
        const char *url;
@@ -726,6 +734,9 @@ int git_remote_connect(git_remote *remote, git_direction direction, const git_re
        if (!t && (error = git_transport_new(&t, remote, url)) < 0)
                return error;
 
+       if ((error = set_transport_custom_headers(t, custom_headers)) != 0)
+               goto on_error;
+
        if ((error = set_transport_callbacks(t, callbacks)) < 0 ||
            (error = t->connect(t, url, credentials, payload, direction, flags)) != 0)
                goto on_error;
@@ -893,7 +904,7 @@ int git_remote_download(git_remote *remote, const git_strarray *refspecs, const
        }
 
        if (!git_remote_connected(remote) &&
-           (error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs)) < 0)
+           (error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs, NULL)) < 0)
                goto on_error;
 
        if (ls_to_vector(&refs, remote) < 0)
@@ -966,7 +977,7 @@ int git_remote_fetch(
        }
 
        /* Connect and download everything */
-       if ((error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs)) != 0)
+       if ((error = git_remote_connect(remote, GIT_DIRECTION_FETCH, cbs, NULL)) != 0)
                return error;
 
        error = git_remote_download(remote, refspecs, opts);
@@ -2384,7 +2395,7 @@ int git_remote_upload(git_remote *remote, const git_strarray *refspecs, const gi
                cbs = &opts->callbacks;
 
        if (!git_remote_connected(remote) &&
-           (error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs)) < 0)
+           (error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs, &opts->custom_headers)) < 0)
                goto cleanup;
 
        free_refspecs(&remote->active_refspecs);
@@ -2441,7 +2452,7 @@ int git_remote_push(git_remote *remote, const git_strarray *refspecs, const git_
 
        assert(remote && refspecs);
 
-       if ((error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs)) < 0)
+       if ((error = git_remote_connect(remote, GIT_DIRECTION_PUSH, cbs, &opts->custom_headers)) < 0)
                return error;
 
        if ((error = git_remote_upload(remote, refspecs, opts)) < 0)
index e83755ef678b5dbd16901ce83953da86981164e1..5edd79fb80671b8e7f36072ba95912974392cf91 100644 (file)
@@ -26,7 +26,7 @@ static void assert_default_branch(const char *should)
 {
        git_buf name = GIT_BUF_INIT;
 
-       cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL, NULL));
        cl_git_pass(git_remote_default_branch(&name, g_remote));
        cl_assert_equal_s(should, name.ptr);
        git_buf_free(&name);
@@ -57,7 +57,7 @@ void test_network_remote_defaultbranch__no_default_branch(void)
        git_buf buf = GIT_BUF_INIT;
 
        cl_git_pass(git_remote_create(&remote_b, g_repo_b, "self", git_repository_path(g_repo_b)));
-       cl_git_pass(git_remote_connect(remote_b, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(remote_b, GIT_DIRECTION_FETCH, NULL, NULL));
        cl_git_pass(git_remote_ls(&heads, &len, remote_b));
        cl_assert_equal_i(0, len);
 
@@ -80,7 +80,7 @@ void test_network_remote_defaultbranch__detached_sharing_nonbranch_id(void)
        cl_git_pass(git_reference_create(&ref, g_repo_a, "refs/foo/bar", &id, 1, NULL));
        git_reference_free(ref);
 
-       cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(g_remote, GIT_DIRECTION_FETCH, NULL, NULL));
        cl_git_fail_with(GIT_ENOTFOUND, git_remote_default_branch(&buf, g_remote));
 
        cl_git_pass(git_clone(&cloned_repo, git_repository_path(g_repo_a), "./local-detached", NULL));
index 5d726c9587bf9e62fc93a59030bf32e5bb385ba3..4d990ab714f205b69bc195b29c67ba1841791b22 100644 (file)
@@ -40,7 +40,7 @@ static void connect_to_local_repository(const char *local_repository)
        git_buf_sets(&file_path_buf, cl_git_path_url(local_repository));
 
        cl_git_pass(git_remote_create_anonymous(&remote, repo, git_buf_cstr(&file_path_buf)));
-       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
 }
 
 void test_network_remote_local__connected(void)
@@ -214,7 +214,7 @@ void test_network_remote_local__push_to_bare_remote(void)
 
        /* Connect to the bare repo */
        cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localbare.git"));
-       cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL));
+       cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL, NULL));
 
        /* Try to push */
        cl_git_pass(git_remote_upload(localremote, &push_array, NULL));
@@ -253,7 +253,7 @@ void test_network_remote_local__push_to_bare_remote_with_file_url(void)
 
        /* Connect to the bare repo */
        cl_git_pass(git_remote_create_anonymous(&localremote, repo, url));
-       cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL));
+       cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL, NULL));
 
        /* Try to push */
        cl_git_pass(git_remote_upload(localremote, &push_array, NULL));
@@ -290,7 +290,7 @@ void test_network_remote_local__push_to_non_bare_remote(void)
 
        /* Connect to the bare repo */
        cl_git_pass(git_remote_create_anonymous(&localremote, repo, "./localnonbare"));
-       cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL));
+       cl_git_pass(git_remote_connect(localremote, GIT_DIRECTION_PUSH, NULL, NULL));
 
        /* Try to push */
        cl_git_fail_with(GIT_EBAREREPO, git_remote_upload(localremote, &push_array, NULL));
index 2fa21d460714e5b12dc72bd5a83b1fd63df7c1d7..46abc6d332ac33fe18e8372167cb40162abb38f9 100644 (file)
@@ -93,7 +93,7 @@ void test_network_remote_remotes__error_when_no_push_available(void)
        cl_git_pass(git_remote_create_anonymous(&r, _repo, cl_fixture("testrepo.git")));
 
        callbacks.transport = git_transport_local;
-       cl_git_pass(git_remote_connect(r, GIT_DIRECTION_PUSH, &callbacks));
+       cl_git_pass(git_remote_connect(r, GIT_DIRECTION_PUSH, &callbacks, NULL));
 
        /* Make sure that push is really not available */
        r->transport->push = NULL;
@@ -359,7 +359,7 @@ void test_network_remote_remotes__can_load_with_an_empty_url(void)
        cl_assert(remote->url == NULL);
        cl_assert(remote->pushurl == NULL);
 
-       cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
 
        cl_assert(giterr_last() != NULL);
        cl_assert(giterr_last()->klass == GITERR_INVALID);
@@ -376,7 +376,7 @@ void test_network_remote_remotes__can_load_with_only_an_empty_pushurl(void)
        cl_assert(remote->url == NULL);
        cl_assert(remote->pushurl == NULL);
 
-       cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_fail(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
 
        git_remote_free(remote);
 }
index 72e7c24e3c0e85cd1b87fe6a33090aab5016c413..c12df069fe39127c830548c14dfdf2f6f052631a 100644 (file)
@@ -81,11 +81,11 @@ void test_online_fetch__fetch_twice(void)
 {
        git_remote *remote;
        cl_git_pass(git_remote_create(&remote, _repo, "test", "git://github.com/libgit2/TestGitRepository.git"));
-       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
        cl_git_pass(git_remote_download(remote, NULL, NULL));
        git_remote_disconnect(remote);
        
-       git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL);
+       git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL);
        cl_git_pass(git_remote_download(remote, NULL, NULL));
        git_remote_disconnect(remote);
        
@@ -117,7 +117,7 @@ void test_online_fetch__doesnt_retrieve_a_pack_when_the_repository_is_up_to_date
        cl_git_pass(git_repository_open(&_repository, "./fetch/lg2"));
 
        cl_git_pass(git_remote_lookup(&remote, _repository, "origin"));
-       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
 
        cl_assert_equal_i(false, invoked);
 
@@ -155,7 +155,7 @@ void test_online_fetch__can_cancel(void)
        options.callbacks.transfer_progress = cancel_at_half;
        options.callbacks.payload = &bytes_received;
 
-       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
        cl_git_fail_with(git_remote_download(remote, NULL, &options), -4321);
        git_remote_disconnect(remote);
        git_remote_free(remote);
@@ -169,7 +169,7 @@ void test_online_fetch__ls_disconnected(void)
 
        cl_git_pass(git_remote_create(&remote, _repo, "test",
                                "http://github.com/libgit2/TestGitRepository.git"));
-       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
        cl_git_pass(git_remote_ls(&refs, &refs_len_before, remote));
        git_remote_disconnect(remote);
        cl_git_pass(git_remote_ls(&refs, &refs_len_after, remote));
@@ -187,7 +187,7 @@ void test_online_fetch__remote_symrefs(void)
 
        cl_git_pass(git_remote_create(&remote, _repo, "test",
                                "http://github.com/libgit2/TestGitRepository.git"));
-       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL));
+       cl_git_pass(git_remote_connect(remote, GIT_DIRECTION_FETCH, NULL, NULL));
        git_remote_disconnect(remote);
        cl_git_pass(git_remote_ls(&refs, &refs_len, remote));
 
index 0b0892c97ab5878ae6a56d497f4f96d278bbd3d2..13d364d306bde03ccad302f7ff966c5834c7b550 100644 (file)
@@ -373,7 +373,7 @@ void test_online_push__initialize(void)
 
        record_callbacks_data_clear(&_record_cbs_data);
 
-       cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_PUSH, &_record_cbs));
+       cl_git_pass(git_remote_connect(_remote, GIT_DIRECTION_PUSH, &_record_cbs, NULL));
 
        /* Clean up previously pushed branches.  Fails if receive.denyDeletes is
         * set on the remote.  Also, on Git 1.7.0 and newer, you must run