mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-09 15:00:04 +00:00
stream: add support for setting a proxy
If the stream claims to support this feature, we can let the transport set the proxy. We also set HTTPPROXYTUNNEL option so curl can create a tunnel through the proxy which lets us create our own TLS session (if needed).
This commit is contained in:
parent
ede517bc53
commit
1376e784c6
@ -29,8 +29,10 @@ typedef struct git_stream {
|
|||||||
int version;
|
int version;
|
||||||
|
|
||||||
int encrypted;
|
int encrypted;
|
||||||
|
int proxy_support;
|
||||||
int (*connect)(struct git_stream *);
|
int (*connect)(struct git_stream *);
|
||||||
int (*certificate)(git_cert **, struct git_stream *);
|
int (*certificate)(git_cert **, struct git_stream *);
|
||||||
|
int (*set_proxy)(struct git_stream *, const char *proxy_url);
|
||||||
ssize_t (*read)(struct git_stream *, void *, size_t);
|
ssize_t (*read)(struct git_stream *, void *, size_t);
|
||||||
ssize_t (*write)(struct git_stream *, const char *, size_t, int);
|
ssize_t (*write)(struct git_stream *, const char *, size_t, int);
|
||||||
int (*close)(struct git_stream *);
|
int (*close)(struct git_stream *);
|
||||||
|
@ -64,6 +64,17 @@ static int curls_certificate(git_cert **out, git_stream *stream)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int curls_set_proxy(git_stream *stream, const char *proxy_url)
|
||||||
|
{
|
||||||
|
CURLcode res;
|
||||||
|
curl_stream *s = (curl_stream *) stream;
|
||||||
|
|
||||||
|
if ((res = curl_easy_setopt(s->handle, CURLOPT_PROXY, proxy_url)) != CURLE_OK)
|
||||||
|
return seterr_curl(s);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int wait_for(curl_socket_t fd, bool reading)
|
static int wait_for(curl_socket_t fd, bool reading)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@ -185,12 +196,16 @@ int git_curl_stream_new(git_stream **out, const char *host, const char *port, in
|
|||||||
curl_easy_setopt(handle, CURLOPT_CONNECT_ONLY, 1);
|
curl_easy_setopt(handle, CURLOPT_CONNECT_ONLY, 1);
|
||||||
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 1);
|
curl_easy_setopt(handle, CURLOPT_SSL_VERIFYPEER, 1);
|
||||||
curl_easy_setopt(handle, CURLOPT_CERTINFO, 1);
|
curl_easy_setopt(handle, CURLOPT_CERTINFO, 1);
|
||||||
|
curl_easy_setopt(handle, CURLOPT_HTTPPROXYTUNNEL, 1);
|
||||||
|
|
||||||
/* curl_easy_setopt(handle, CURLOPT_VERBOSE, 1); */
|
/* curl_easy_setopt(handle, CURLOPT_VERBOSE, 1); */
|
||||||
|
|
||||||
st->parent.version = GIT_STREAM_VERSION;
|
st->parent.version = GIT_STREAM_VERSION;
|
||||||
st->parent.encrypted = encrypted;
|
st->parent.encrypted = encrypted;
|
||||||
|
st->parent.proxy_support = 1;
|
||||||
st->parent.connect = curls_connect;
|
st->parent.connect = curls_connect;
|
||||||
st->parent.certificate = curls_certificate;
|
st->parent.certificate = curls_certificate;
|
||||||
|
st->parent.set_proxy = curls_set_proxy;
|
||||||
st->parent.read = curls_read;
|
st->parent.read = curls_read;
|
||||||
st->parent.write = curls_write;
|
st->parent.write = curls_write;
|
||||||
st->parent.close = curls_close;
|
st->parent.close = curls_close;
|
||||||
|
15
src/stream.h
15
src/stream.h
@ -30,6 +30,21 @@ GIT_INLINE(int) git_stream_certificate(git_cert **out, git_stream *st)
|
|||||||
return st->certificate(out, st);
|
return st->certificate(out, st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GIT_INLINE(int) git_stream_supports_proxy(git_stream *st)
|
||||||
|
{
|
||||||
|
return st->proxy_support;
|
||||||
|
}
|
||||||
|
|
||||||
|
GIT_INLINE(int) git_stream_set_proxy(git_stream *st, const char *proxy_url)
|
||||||
|
{
|
||||||
|
if (!st->proxy_support) {
|
||||||
|
giterr_set(GITERR_INVALID, "proxy not supported on this stream");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return st->set_proxy(st, proxy_url);
|
||||||
|
}
|
||||||
|
|
||||||
GIT_INLINE(ssize_t) git_stream_read(git_stream *st, void *data, size_t len)
|
GIT_INLINE(ssize_t) git_stream_read(git_stream *st, void *data, size_t len)
|
||||||
{
|
{
|
||||||
return st->read(st, data, len);
|
return st->read(st, data, len);
|
||||||
|
Loading…
Reference in New Issue
Block a user