summaryrefslogtreecommitdiff
path: root/src/transports
diff options
context:
space:
mode:
Diffstat (limited to 'src/transports')
-rw-r--r--src/transports/http.c28
-rw-r--r--src/transports/local.c160
-rw-r--r--src/transports/smart.c163
-rw-r--r--src/transports/smart.h20
-rw-r--r--src/transports/smart_protocol.c19
-rw-r--r--src/transports/ssh.c18
-rw-r--r--src/transports/winhttp.c32
7 files changed, 165 insertions, 275 deletions
diff --git a/src/transports/http.c b/src/transports/http.c
index adcb1ac43..fa576ff3e 100644
--- a/src/transports/http.c
+++ b/src/transports/http.c
@@ -174,6 +174,7 @@ GIT_INLINE(int) handle_remote_auth(
git_http_response *response)
{
http_subtransport *transport = OWNING_SUBTRANSPORT(stream);
+ git_remote_connect_options *connect_opts = &transport->owner->connect_opts;
if (response->server_auth_credtypes == 0) {
git_error_set(GIT_ERROR_HTTP, "server requires authentication that we do not support");
@@ -187,8 +188,8 @@ GIT_INLINE(int) handle_remote_auth(
transport->owner->url,
response->server_auth_schemetypes,
response->server_auth_credtypes,
- transport->owner->cred_acquire_cb,
- transport->owner->cred_acquire_payload);
+ connect_opts->callbacks.credentials,
+ connect_opts->callbacks.payload);
}
GIT_INLINE(int) handle_proxy_auth(
@@ -196,6 +197,7 @@ GIT_INLINE(int) handle_proxy_auth(
git_http_response *response)
{
http_subtransport *transport = OWNING_SUBTRANSPORT(stream);
+ git_remote_connect_options *connect_opts = &transport->owner->connect_opts;
if (response->proxy_auth_credtypes == 0) {
git_error_set(GIT_ERROR_HTTP, "proxy requires authentication that we do not support");
@@ -206,11 +208,11 @@ GIT_INLINE(int) handle_proxy_auth(
return handle_auth(
&transport->proxy,
SERVER_TYPE_PROXY,
- transport->owner->proxy.url,
+ connect_opts->proxy_opts.url,
response->server_auth_schemetypes,
response->proxy_auth_credtypes,
- transport->owner->proxy.credentials,
- transport->owner->proxy.payload);
+ connect_opts->proxy_opts.credentials,
+ connect_opts->proxy_opts.payload);
}
@@ -286,6 +288,7 @@ static int lookup_proxy(
bool *out_use,
http_subtransport *transport)
{
+ git_remote_connect_options *connect_opts = &transport->owner->connect_opts;
const char *proxy;
git_remote *remote;
char *config = NULL;
@@ -294,9 +297,9 @@ static int lookup_proxy(
*out_use = false;
git_net_url_dispose(&transport->proxy.url);
- switch (transport->owner->proxy.type) {
+ switch (connect_opts->proxy_opts.type) {
case GIT_PROXY_SPECIFIED:
- proxy = transport->owner->proxy.url;
+ proxy = connect_opts->proxy_opts.url;
break;
case GIT_PROXY_AUTO:
@@ -345,7 +348,7 @@ static int generate_request(
request->credentials = transport->server.cred;
request->proxy = use_proxy ? &transport->proxy.url : NULL;
request->proxy_credentials = transport->proxy.cred;
- request->custom_headers = &transport->owner->custom_headers;
+ request->custom_headers = &transport->owner->connect_opts.custom_headers;
if (stream->service->method == GIT_HTTP_METHOD_POST) {
request->chunked = stream->service->chunked;
@@ -633,6 +636,7 @@ static int http_action(
git_smart_service_t action)
{
http_subtransport *transport = GIT_CONTAINER_OF(t, http_subtransport, parent);
+ git_remote_connect_options *connect_opts = &transport->owner->connect_opts;
http_stream *stream;
const http_service *service;
int error;
@@ -664,10 +668,10 @@ static int http_action(
if (!transport->http_client) {
git_http_client_options opts = {0};
- opts.server_certificate_check_cb = transport->owner->certificate_check_cb;
- opts.server_certificate_check_payload = transport->owner->message_cb_payload;
- opts.proxy_certificate_check_cb = transport->owner->proxy.certificate_check;
- opts.proxy_certificate_check_payload = transport->owner->proxy.payload;
+ opts.server_certificate_check_cb = connect_opts->callbacks.certificate_check;
+ opts.server_certificate_check_payload = connect_opts->callbacks.payload;
+ opts.proxy_certificate_check_cb = connect_opts->proxy_opts.certificate_check;
+ opts.proxy_certificate_check_payload = connect_opts->proxy_opts.payload;
if (git_http_client_new(&transport->http_client, &opts) < 0)
return -1;
diff --git a/src/transports/local.c b/src/transports/local.c
index 0983914b1..6065d4020 100644
--- a/src/transports/local.c
+++ b/src/transports/local.c
@@ -34,12 +34,9 @@ typedef struct {
git_remote *owner;
char *url;
int direction;
- int flags;
git_atomic32 cancelled;
git_repository *repo;
- git_transport_message_cb progress_cb;
- git_transport_message_cb error_cb;
- void *message_cb_payload;
+ git_remote_connect_options connect_opts;
git_vector refs;
unsigned connected : 1,
have_refs : 1;
@@ -200,30 +197,26 @@ on_error:
static int local_connect(
git_transport *transport,
const char *url,
- git_credential_acquire_cb cred_acquire_cb,
- void *cred_acquire_payload,
- const git_proxy_options *proxy,
- int direction, int flags)
+ int direction,
+ const git_remote_connect_options *connect_opts)
{
git_repository *repo;
int error;
- transport_local *t = (transport_local *) transport;
+ transport_local *t = (transport_local *)transport;
const char *path;
git_str buf = GIT_STR_INIT;
- GIT_UNUSED(cred_acquire_cb);
- GIT_UNUSED(cred_acquire_payload);
- GIT_UNUSED(proxy);
-
if (t->connected)
return 0;
+ if (git_remote_connect_options_normalize(&t->connect_opts, connect_opts) < 0)
+ return -1;
+
free_heads(&t->refs);
t->url = git__strdup(url);
GIT_ERROR_CHECK_ALLOC(t->url);
t->direction = direction;
- t->flags = flags;
/* 'url' may be a url or path; convert to a path */
if ((error = git_fs_path_from_url_or_path(&buf, url)) < 0) {
@@ -249,6 +242,20 @@ static int local_connect(
return 0;
}
+static int local_set_connect_opts(
+ git_transport *transport,
+ const git_remote_connect_options *connect_opts)
+{
+ transport_local *t = (transport_local *)transport;
+
+ if (!t->connected) {
+ git_error_set(GIT_ERROR_NET, "cannot reconfigure a transport that is not connected");
+ return -1;
+ }
+
+ return git_remote_connect_options_normalize(&t->connect_opts, connect_opts);
+}
+
static int local_ls(const git_remote_head ***out, size_t *size, git_transport *transport)
{
transport_local *t = (transport_local *)transport;
@@ -337,10 +344,10 @@ static int transfer_to_push_transfer(const git_indexer_progress *stats, void *pa
static int local_push(
git_transport *transport,
- git_push *push,
- const git_remote_callbacks *cbs)
+ git_push *push)
{
transport_local *t = (transport_local *)transport;
+ git_remote_callbacks *cbs = &t->connect_opts.callbacks;
git_repository *remote_repo = NULL;
push_spec *spec;
char *url = NULL;
@@ -349,8 +356,6 @@ static int local_push(
int error;
size_t j;
- GIT_UNUSED(cbs);
-
/* 'push->remote->url' may be a url or path; convert to a path */
if ((error = git_fs_path_from_url_or_path(&buf, push->remote->url)) < 0) {
git_str_dispose(&buf);
@@ -440,12 +445,11 @@ static int local_push(
}
if (push->specs.length) {
- int flags = t->flags;
url = git__strdup(t->url);
if (!url || t->parent.close(&t->parent) < 0 ||
t->parent.connect(&t->parent, url,
- NULL, NULL, NULL, GIT_DIRECTION_PUSH, flags))
+ GIT_DIRECTION_PUSH, NULL))
goto on_error;
}
@@ -482,7 +486,7 @@ static int local_counting(int stage, unsigned int current, unsigned int total, v
transport_local *t = payload;
int error;
- if (!t->progress_cb)
+ if (!t->connect_opts.callbacks.sideband_progress)
return 0;
if (stage == GIT_PACKBUILDER_ADDING_OBJECTS) {
@@ -500,9 +504,19 @@ static int local_counting(int stage, unsigned int current, unsigned int total, v
if (git_str_oom(&progress_info))
return -1;
- error = t->progress_cb(git_str_cstr(&progress_info), (int)git_str_len(&progress_info), t->message_cb_payload);
- git_str_dispose(&progress_info);
+ if (progress_info.size > INT_MAX) {
+ git_error_set(GIT_ERROR_NET, "remote sent overly large progress data");
+ git_str_dispose(&progress_info);
+ return -1;
+ }
+
+
+ error = t->connect_opts.callbacks.sideband_progress(
+ progress_info.ptr,
+ (int)progress_info.size,
+ t->connect_opts.callbacks.payload);
+ git_str_dispose(&progress_info);
return error;
}
@@ -532,9 +546,7 @@ static int foreach_reference_cb(git_reference *reference, void *payload)
static int local_download_pack(
git_transport *transport,
git_repository *repo,
- git_indexer_progress *stats,
- git_indexer_progress_cb progress_cb,
- void *progress_payload)
+ git_indexer_progress *stats)
{
transport_local *t = (transport_local*)transport;
git_revwalk *walk = NULL;
@@ -545,9 +557,11 @@ static int local_download_pack(
git_odb_writepack *writepack = NULL;
git_odb *odb = NULL;
git_str progress_info = GIT_STR_INIT;
+ foreach_data data = {0};
if ((error = git_revwalk_new(&walk, t->repo)) < 0)
goto cleanup;
+
git_revwalk_sorting(walk, GIT_SORT_TIME);
if ((error = git_packbuilder_new(&pack, t->repo)) < 0)
@@ -583,44 +597,56 @@ static int local_download_pack(
if ((error = git_packbuilder_insert_walk(pack, walk)))
goto cleanup;
- if ((error = git_str_printf(&progress_info, counting_objects_fmt, git_packbuilder_object_count(pack))) < 0)
- goto cleanup;
-
- if (t->progress_cb &&
- (error = t->progress_cb(git_str_cstr(&progress_info), (int)git_str_len(&progress_info), t->message_cb_payload)) < 0)
- goto cleanup;
+ if (t->connect_opts.callbacks.sideband_progress) {
+ if ((error = git_str_printf(
+ &progress_info,
+ counting_objects_fmt,
+ git_packbuilder_object_count(pack))) < 0 ||
+ (error = t->connect_opts.callbacks.sideband_progress(
+ progress_info.ptr,
+ (int)progress_info.size,
+ t->connect_opts.callbacks.payload)) < 0)
+ goto cleanup;
+ }
/* Walk the objects, building a packfile */
if ((error = git_repository_odb__weakptr(&odb, repo)) < 0)
goto cleanup;
/* One last one with the newline */
- git_str_clear(&progress_info);
- git_str_printf(&progress_info, counting_objects_fmt, git_packbuilder_object_count(pack));
- if ((error = git_str_putc(&progress_info, '\n')) < 0)
- goto cleanup;
-
- if (t->progress_cb &&
- (error = t->progress_cb(git_str_cstr(&progress_info), (int)git_str_len(&progress_info), t->message_cb_payload)) < 0)
- goto cleanup;
+ if (t->connect_opts.callbacks.sideband_progress) {
+ git_str_clear(&progress_info);
+
+ if ((error = git_str_printf(
+ &progress_info,
+ counting_objects_fmt,
+ git_packbuilder_object_count(pack))) < 0 ||
+ (error = git_str_putc(&progress_info, '\n')) < 0 ||
+ (error = t->connect_opts.callbacks.sideband_progress(
+ progress_info.ptr,
+ (int)progress_info.size,
+ t->connect_opts.callbacks.payload)) < 0)
+ goto cleanup;
+ }
- if ((error = git_odb_write_pack(&writepack, odb, progress_cb, progress_payload)) != 0)
+ if ((error = git_odb_write_pack(
+ &writepack,
+ odb,
+ t->connect_opts.callbacks.transfer_progress,
+ t->connect_opts.callbacks.payload)) < 0)
goto cleanup;
/* Write the data to the ODB */
- {
- foreach_data data = {0};
- data.stats = stats;
- data.progress_cb = progress_cb;
- data.progress_payload = progress_payload;
- data.writepack = writepack;
+ data.stats = stats;
+ data.progress_cb = t->connect_opts.callbacks.transfer_progress;
+ data.progress_payload = t->connect_opts.callbacks.payload;
+ data.writepack = writepack;
- /* autodetect */
- git_packbuilder_set_threads(pack, 0);
+ /* autodetect */
+ git_packbuilder_set_threads(pack, 0);
- if ((error = git_packbuilder_foreach(pack, foreach_cb, &data)) != 0)
- goto cleanup;
- }
+ if ((error = git_packbuilder_foreach(pack, foreach_cb, &data)) != 0)
+ goto cleanup;
error = writepack->commit(writepack, stats);
@@ -632,24 +658,6 @@ cleanup:
return error;
}
-static int local_set_callbacks(
- git_transport *transport,
- git_transport_message_cb progress_cb,
- git_transport_message_cb error_cb,
- git_transport_certificate_check_cb certificate_check_cb,
- void *message_cb_payload)
-{
- transport_local *t = (transport_local *)transport;
-
- GIT_UNUSED(certificate_check_cb);
-
- t->progress_cb = progress_cb;
- t->error_cb = error_cb;
- t->message_cb_payload = message_cb_payload;
-
- return 0;
-}
-
static int local_is_connected(git_transport *transport)
{
transport_local *t = (transport_local *)transport;
@@ -657,15 +665,6 @@ static int local_is_connected(git_transport *transport)
return t->connected;
}
-static int local_read_flags(git_transport *transport, int *flags)
-{
- transport_local *t = (transport_local *)transport;
-
- *flags = t->flags;
-
- return 0;
-}
-
static void local_cancel(git_transport *transport)
{
transport_local *t = (transport_local *)transport;
@@ -720,8 +719,8 @@ int git_transport_local(git_transport **out, git_remote *owner, void *param)
GIT_ERROR_CHECK_ALLOC(t);
t->parent.version = GIT_TRANSPORT_VERSION;
- t->parent.set_callbacks = local_set_callbacks;
t->parent.connect = local_connect;
+ t->parent.set_connect_opts = local_set_connect_opts;
t->parent.negotiate_fetch = local_negotiate_fetch;
t->parent.download_pack = local_download_pack;
t->parent.push = local_push;
@@ -729,7 +728,6 @@ int git_transport_local(git_transport **out, git_remote *owner, void *param)
t->parent.free = local_free;
t->parent.ls = local_ls;
t->parent.is_connected = local_is_connected;
- t->parent.read_flags = local_read_flags;
t->parent.cancel = local_cancel;
if ((error = git_vector_init(&t->refs, 0, NULL)) < 0) {
diff --git a/src/transports/smart.c b/src/transports/smart.c
index fe024de2f..4267e8841 100644
--- a/src/transports/smart.c
+++ b/src/transports/smart.c
@@ -56,101 +56,6 @@ GIT_INLINE(int) git_smart__reset_stream(transport_smart *t, bool close_subtransp
return 0;
}
-static int git_smart__set_callbacks(
- git_transport *transport,
- git_transport_message_cb progress_cb,
- git_transport_message_cb error_cb,
- git_transport_certificate_check_cb certificate_check_cb,
- void *message_cb_payload)
-{
- transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
-
- t->progress_cb = progress_cb;
- t->error_cb = error_cb;
- t->certificate_check_cb = certificate_check_cb;
- t->message_cb_payload = message_cb_payload;
-
- return 0;
-}
-
-static size_t http_header_name_length(const char *http_header)
-{
- const char *colon = strchr(http_header, ':');
- if (!colon)
- return 0;
- return colon - http_header;
-}
-
-static bool is_malformed_http_header(const char *http_header)
-{
- const char *c;
- size_t name_len;
-
- /* Disallow \r and \n */
- c = strchr(http_header, '\r');
- if (c)
- return true;
- c = strchr(http_header, '\n');
- if (c)
- return true;
-
- /* Require a header name followed by : */
- name_len = http_header_name_length(http_header);
- if (name_len < 1)
- return true;
-
- return false;
-}
-
-static char *forbidden_custom_headers[] = {
- "User-Agent",
- "Host",
- "Accept",
- "Content-Type",
- "Transfer-Encoding",
- "Content-Length",
-};
-
-static bool is_forbidden_custom_header(const char *custom_header)
-{
- unsigned long i;
- size_t name_len = http_header_name_length(custom_header);
-
- /* Disallow headers that we set */
- for (i = 0; i < ARRAY_SIZE(forbidden_custom_headers); i++)
- if (strncmp(forbidden_custom_headers[i], custom_header, name_len) == 0)
- return true;
-
- return false;
-}
-
-static int git_smart__set_custom_headers(
- git_transport *transport,
- const git_strarray *custom_headers)
-{
- transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
- size_t i;
-
- if (t->custom_headers.count)
- git_strarray_dispose(&t->custom_headers);
-
- if (!custom_headers)
- return 0;
-
- for (i = 0; i < custom_headers->count; i++) {
- if (is_malformed_http_header(custom_headers->strings[i])) {
- git_error_set(GIT_ERROR_INVALID, "custom HTTP header '%s' is malformed", custom_headers->strings[i]);
- return -1;
- }
- if (is_forbidden_custom_header(custom_headers->strings[i])) {
- git_error_set(GIT_ERROR_INVALID, "custom HTTP header '%s' is already set by libgit2", custom_headers->strings[i]);
- return -1;
- }
- }
-
- return git_strarray_copy(&t->custom_headers, custom_headers);
-}
-
int git_smart__update_heads(transport_smart *t, git_vector *symrefs)
{
size_t i;
@@ -206,11 +111,8 @@ static void free_symrefs(git_vector *symrefs)
static int git_smart__connect(
git_transport *transport,
const char *url,
- git_credential_acquire_cb cred_acquire_cb,
- void *cred_acquire_payload,
- const git_proxy_options *proxy,
int direction,
- int flags)
+ const git_remote_connect_options *connect_opts)
{
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
git_smart_subtransport_stream *stream;
@@ -223,24 +125,19 @@ static int git_smart__connect(
if (git_smart__reset_stream(t, true) < 0)
return -1;
+ if (git_remote_connect_options_normalize(&t->connect_opts, connect_opts) < 0)
+ return -1;
+
t->url = git__strdup(url);
GIT_ERROR_CHECK_ALLOC(t->url);
- git_proxy_options_clear(&t->proxy);
-
- if (git_proxy_options_dup(&t->proxy, proxy) < 0)
- return -1;
-
t->direction = direction;
- t->flags = flags;
- t->cred_acquire_cb = cred_acquire_cb;
- t->cred_acquire_payload = cred_acquire_payload;
- if (GIT_DIRECTION_FETCH == t->direction)
+ if (GIT_DIRECTION_FETCH == t->direction) {
service = GIT_SERVICE_UPLOADPACK_LS;
- else if (GIT_DIRECTION_PUSH == t->direction)
+ } else if (GIT_DIRECTION_PUSH == t->direction) {
service = GIT_SERVICE_RECEIVEPACK_LS;
- else {
+ } else {
git_error_set(GIT_ERROR_NET, "invalid direction");
return -1;
}
@@ -315,6 +212,20 @@ cleanup:
return error;
}
+static int git_smart__set_connect_opts(
+ git_transport *transport,
+ const git_remote_connect_options *opts)
+{
+ transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
+
+ if (!t->connected) {
+ git_error_set(GIT_ERROR_NET, "cannot reconfigure a transport that is not connected");
+ return -1;
+ }
+
+ return git_remote_connect_options_normalize(&t->connect_opts, opts);
+}
+
static int git_smart__ls(const git_remote_head ***out, size_t *size, git_transport *transport)
{
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
@@ -401,15 +312,6 @@ static int git_smart__is_connected(git_transport *transport)
return t->connected;
}
-static int git_smart__read_flags(git_transport *transport, int *flags)
-{
- transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
-
- *flags = t->flags;
-
- return 0;
-}
-
static int git_smart__close(git_transport *transport)
{
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
@@ -465,9 +367,8 @@ static void git_smart__free(git_transport *transport)
git_pkt_free(p);
git_vector_free(refs);
- git__free((char *)t->proxy.url);
- git_strarray_dispose(&t->custom_headers);
+ git_remote_connect_options_dispose(&t->connect_opts);
git__free(t);
}
@@ -482,34 +383,30 @@ static int ref_name_cmp(const void *a, const void *b)
int git_transport_smart_certificate_check(git_transport *transport, git_cert *cert, int valid, const char *hostname)
{
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
+ git_remote_connect_options *connect_opts = &t->connect_opts;
GIT_ASSERT_ARG(transport);
GIT_ASSERT_ARG(cert);
GIT_ASSERT_ARG(hostname);
- if (!t->certificate_check_cb)
+ if (!connect_opts->callbacks.certificate_check)
return GIT_PASSTHROUGH;
- return t->certificate_check_cb(cert, valid, hostname, t->message_cb_payload);
+ return connect_opts->callbacks.certificate_check(cert, valid, hostname, connect_opts->callbacks.payload);
}
int git_transport_smart_credentials(git_credential **out, git_transport *transport, const char *user, int methods)
{
transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
+ git_remote_connect_options *connect_opts = &t->connect_opts;
GIT_ASSERT_ARG(out);
GIT_ASSERT_ARG(transport);
- if (!t->cred_acquire_cb)
+ if (!connect_opts->callbacks.credentials)
return GIT_PASSTHROUGH;
- return t->cred_acquire_cb(out, t->url, user, methods, t->cred_acquire_payload);
-}
-
-int git_transport_smart_proxy_options(git_proxy_options *out, git_transport *transport)
-{
- transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
- return git_proxy_options_dup(out, &t->proxy);
+ return connect_opts->callbacks.credentials(out, t->url, user, methods, connect_opts->callbacks.payload);
}
int git_transport_smart(git_transport **out, git_remote *owner, void *param)
@@ -524,9 +421,8 @@ int git_transport_smart(git_transport **out, git_remote *owner, void *param)
GIT_ERROR_CHECK_ALLOC(t);
t->parent.version = GIT_TRANSPORT_VERSION;
- t->parent.set_callbacks = git_smart__set_callbacks;
- t->parent.set_custom_headers = git_smart__set_custom_headers;
t->parent.connect = git_smart__connect;
+ t->parent.set_connect_opts = git_smart__set_connect_opts;
t->parent.close = git_smart__close;
t->parent.free = git_smart__free;
t->parent.negotiate_fetch = git_smart__negotiate_fetch;
@@ -534,7 +430,6 @@ int git_transport_smart(git_transport **out, git_remote *owner, void *param)
t->parent.push = git_smart__push;
t->parent.ls = git_smart__ls;
t->parent.is_connected = git_smart__is_connected;
- t->parent.read_flags = git_smart__read_flags;
t->parent.cancel = git_smart__cancel;
t->owner = owner;
diff --git a/src/transports/smart.h b/src/transports/smart.h
index a9cab31ac..726bf40b4 100644
--- a/src/transports/smart.h
+++ b/src/transports/smart.h
@@ -137,16 +137,8 @@ typedef struct {
git_transport parent;
git_remote *owner;
char *url;
- git_credential_acquire_cb cred_acquire_cb;
- void *cred_acquire_payload;
- git_proxy_options proxy;
+ git_remote_connect_options connect_opts;
int direction;
- int flags;
- git_transport_message_cb progress_cb;
- git_transport_message_cb error_cb;
- git_transport_certificate_check_cb certificate_check_cb;
- void *message_cb_payload;
- git_strarray custom_headers;
git_smart_subtransport *wrapped;
git_smart_subtransport_stream *current_stream;
transport_smart_caps caps;
@@ -157,8 +149,8 @@ typedef struct {
packetsize_cb packetsize_cb;
void *packetsize_payload;
unsigned rpc : 1,
- have_refs : 1,
- connected : 1;
+ have_refs : 1,
+ connected : 1;
gitno_buffer buffer;
char buffer_data[65536];
} transport_smart;
@@ -166,7 +158,7 @@ typedef struct {
/* smart_protocol.c */
int git_smart__store_refs(transport_smart *t, int flushes);
int git_smart__detect_caps(git_pkt_ref *pkt, transport_smart_caps *caps, git_vector *symrefs);
-int git_smart__push(git_transport *transport, git_push *push, const git_remote_callbacks *cbs);
+int git_smart__push(git_transport *transport, git_push *push);
int git_smart__negotiate_fetch(
git_transport *transport,
@@ -177,9 +169,7 @@ int git_smart__negotiate_fetch(
int git_smart__download_pack(
git_transport *transport,
git_repository *repo,
- git_indexer_progress *stats,
- git_indexer_progress_cb progress_cb,
- void *progress_payload);
+ git_indexer_progress *stats);
/* smart.c */
int git_smart__negotiation_step(git_transport *transport, void *data, size_t len);
diff --git a/src/transports/smart_protocol.c b/src/transports/smart_protocol.c
index a9a623cc7..f1f111715 100644
--- a/src/transports/smart_protocol.c
+++ b/src/transports/smart_protocol.c
@@ -512,9 +512,7 @@ static int network_packetsize(size_t received, void *payload)
int git_smart__download_pack(
git_transport *transport,
git_repository *repo,
- git_indexer_progress *stats,
- git_indexer_progress_cb progress_cb,
- void *progress_payload)
+ git_indexer_progress *stats)
{
transport_smart *t = (transport_smart *)transport;
gitno_buffer *buf = &t->buffer;
@@ -523,6 +521,10 @@ int git_smart__download_pack(
int error = 0;
struct network_packetsize_payload npp = {0};
+ // TODO
+ git_indexer_progress_cb progress_cb = t->connect_opts.callbacks.transfer_progress;
+ void *progress_payload = t->connect_opts.callbacks.payload;
+
memset(stats, 0, sizeof(git_indexer_progress));
if (progress_cb) {
@@ -568,7 +570,7 @@ int git_smart__download_pack(
git_error_clear();
error = GIT_EUSER;
} else if (pkt->type == GIT_PKT_PROGRESS) {
- if (t->progress_cb) {
+ if (t->connect_opts.callbacks.sideband_progress) {
git_pkt_progress *p = (git_pkt_progress *) pkt;
if (p->len > INT_MAX) {
@@ -577,7 +579,7 @@ int git_smart__download_pack(
goto done;
}
- error = t->progress_cb(p->data, (int)p->len, t->message_cb_payload);
+ error = t->connect_opts.callbacks.sideband_progress(p->data, (int)p->len, t->connect_opts.callbacks.payload);
}
} else if (pkt->type == GIT_PKT_DATA) {
git_pkt_data *p = (git_pkt_data *) pkt;
@@ -811,7 +813,7 @@ static int parse_report(transport_smart *transport, git_push *push)
error = -1;
break;
case GIT_PKT_PROGRESS:
- if (transport->progress_cb) {
+ if (transport->connect_opts.callbacks.sideband_progress) {
git_pkt_progress *p = (git_pkt_progress *) pkt;
if (p->len > INT_MAX) {
@@ -820,7 +822,7 @@ static int parse_report(transport_smart *transport, git_push *push)
goto done;
}
- error = transport->progress_cb(p->data, (int)p->len, transport->message_cb_payload);
+ error = transport->connect_opts.callbacks.sideband_progress(p->data, (int)p->len, transport->connect_opts.callbacks.payload);
}
break;
default:
@@ -987,9 +989,10 @@ static int stream_thunk(void *buf, size_t size, void *data)
return error;
}
-int git_smart__push(git_transport *transport, git_push *push, const git_remote_callbacks *cbs)
+int git_smart__push(git_transport *transport, git_push *push)
{
transport_smart *t = (transport_smart *)transport;
+ git_remote_callbacks *cbs = &t->connect_opts.callbacks;
struct push_packbuilder_payload packbuilder_payload = {0};
git_str pktline = GIT_STR_INIT;
int error = 0, need_pack = 0;
diff --git a/src/transports/ssh.c b/src/transports/ssh.c
index e3bb5eef6..f37bf70bb 100644
--- a/src/transports/ssh.c
+++ b/src/transports/ssh.c
@@ -441,11 +441,15 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
int error, no_callback = 0;
git_credential *cred = NULL;
- if (!t->owner->cred_acquire_cb) {
+ if (!t->owner->connect_opts.callbacks.credentials) {
no_callback = 1;
} else {
- error = t->owner->cred_acquire_cb(&cred, t->owner->url, user, auth_methods,
- t->owner->cred_acquire_payload);
+ error = t->owner->connect_opts.callbacks.credentials(
+ &cred,
+ t->owner->url,
+ user,
+ auth_methods,
+ t->owner->connect_opts.callbacks.payload);
if (error == GIT_PASSTHROUGH) {
no_callback = 1;
@@ -558,7 +562,7 @@ post_extract:
if ((error = _git_ssh_session_create(&session, s->io)) < 0)
goto done;
- if (t->owner->certificate_check_cb != NULL) {
+ if (t->owner->connect_opts.callbacks.certificate_check != NULL) {
git_cert_hostkey cert = {{ 0 }}, *cert_ptr;
const char *key;
size_t cert_len;
@@ -632,7 +636,11 @@ post_extract:
cert_ptr = &cert;
- error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, urldata.host, t->owner->message_cb_payload);
+ error = t->owner->connect_opts.callbacks.certificate_check(
+ (git_cert *)cert_ptr,
+ 0,
+ urldata.host,
+ t->owner->connect_opts.callbacks.payload);
if (error < 0 && error != GIT_PASSTHROUGH) {
if (!git_error_last())
diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c
index 60f536fdb..9b5a67d3b 100644
--- a/src/transports/winhttp.c
+++ b/src/transports/winhttp.c
@@ -293,14 +293,14 @@ static int certificate_check(winhttp_stream *s, int valid)
git_cert_x509 cert;
/* If there is no override, we should fail if WinHTTP doesn't think it's fine */
- if (t->owner->certificate_check_cb == NULL && !valid) {
+ if (t->owner->connect_opts.callbacks.certificate_check == NULL && !valid) {
if (!git_error_last())
git_error_set(GIT_ERROR_HTTP, "unknown certificate check failure");
return GIT_ECERTIFICATE;
}
- if (t->owner->certificate_check_cb == NULL || git__strcmp(t->server.url.scheme, "https") != 0)
+ if (t->owner->connect_opts.callbacks.certificate_check == NULL || git__strcmp(t->server.url.scheme, "https") != 0)
return 0;
if (!WinHttpQueryOption(s->request, WINHTTP_OPTION_SERVER_CERT_CONTEXT, &cert_ctx, &cert_ctx_size)) {
@@ -312,7 +312,7 @@ static int certificate_check(winhttp_stream *s, int valid)
cert.parent.cert_type = GIT_CERT_X509;
cert.data = cert_ctx->pbCertEncoded;
cert.len = cert_ctx->cbCertEncoded;
- error = t->owner->certificate_check_cb((git_cert *) &cert, valid, t->server.url.host, t->owner->message_cb_payload);
+ error = t->owner->connect_opts.callbacks.certificate_check((git_cert *) &cert, valid, t->server.url.host, t->owner->connect_opts.callbacks.payload);
CertFreeCertificateContext(cert_ctx);
if (error == GIT_PASSTHROUGH)
@@ -426,7 +426,7 @@ static int winhttp_stream_connect(winhttp_stream *s)
goto on_error;
}
- proxy_opts = &t->owner->proxy;
+ proxy_opts = &t->owner->connect_opts.proxy_opts;
if (proxy_opts->type == GIT_PROXY_AUTO) {
/* Set proxy if necessary */
if (git_remote__http_proxy(&proxy_url, t->owner->owner, &t->server.url) < 0)
@@ -560,10 +560,10 @@ static int winhttp_stream_connect(winhttp_stream *s)
}
}
- for (i = 0; i < t->owner->custom_headers.count; i++) {
- if (t->owner->custom_headers.strings[i]) {
+ for (i = 0; i < t->owner->connect_opts.custom_headers.count; i++) {
+ if (t->owner->connect_opts.custom_headers.strings[i]) {
git_str_clear(&buf);
- git_str_puts(&buf, t->owner->custom_headers.strings[i]);
+ git_str_puts(&buf, t->owner->connect_opts.custom_headers.strings[i]);
if (git__utf8_to_16(ct, MAX_CONTENT_TYPE_LEN, git_str_cstr(&buf)) < 0) {
git_error_set(GIT_ERROR_OS, "failed to convert custom header to wide characters");
goto on_error;
@@ -577,14 +577,6 @@ static int winhttp_stream_connect(winhttp_stream *s)
}
}
- /* If requested, disable certificate validation */
- if (strcmp(t->server.url.scheme, "https") == 0) {
- int flags;
-
- if (t->owner->parent.read_flags(&t->owner->parent, &flags) < 0)
- goto on_error;
- }
-
if ((error = apply_credentials(s->request, &t->server.url, WINHTTP_AUTH_TARGET_SERVER, t->server.cred, t->server.auth_mechanisms)) < 0)
goto on_error;
@@ -1218,8 +1210,8 @@ replay:
int error = acquire_credentials(s->request,
&t->server,
t->owner->url,
- t->owner->cred_acquire_cb,
- t->owner->cred_acquire_payload);
+ t->owner->connect_opts.callbacks.credentials,
+ t->owner->connect_opts.callbacks.payload);
if (error < 0) {
return error;
@@ -1231,9 +1223,9 @@ replay:
} else if (status_code == HTTP_STATUS_PROXY_AUTH_REQ) {
int error = acquire_credentials(s->request,
&t->proxy,
- t->owner->proxy.url,
- t->owner->proxy.credentials,
- t->owner->proxy.payload);
+ t->owner->connect_opts.proxy_opts.url,
+ t->owner->connect_opts.proxy_opts.credentials,
+ t->owner->connect_opts.proxy_opts.payload);
if (error < 0) {
return error;