Skip to content

Commit

Permalink
stream: add support for setting a proxy
Browse files Browse the repository at this point in the history
If the stream claims to support this feature, we can let the transport
set the proxy.
  • Loading branch information
carlosmn committed Jun 7, 2015
1 parent 4634bee commit 59b6140
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 0 deletions.
2 changes: 2 additions & 0 deletions include/git2/sys/stream.h
Expand Up @@ -29,8 +29,10 @@ typedef struct git_stream {
int version;

int encrypted;
int proxy_support;
int (*connect)(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 (*write)(struct git_stream *, const char *, size_t, int);
int (*close)(struct git_stream *);
Expand Down
13 changes: 13 additions & 0 deletions src/curl_stream.c
Expand Up @@ -64,6 +64,17 @@ static int curls_certificate(git_cert **out, git_stream *stream)
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)
{
int ret;
Expand Down Expand Up @@ -189,8 +200,10 @@ int git_curl_stream_new(git_stream **out, const char *host, const char *port, in

st->parent.version = GIT_STREAM_VERSION;
st->parent.encrypted = encrypted;
st->parent.proxy_support = 1;
st->parent.connect = curls_connect;
st->parent.certificate = curls_certificate;
st->parent.set_proxy = curls_set_proxy;
st->parent.read = curls_read;
st->parent.write = curls_write;
st->parent.close = curls_close;
Expand Down
15 changes: 15 additions & 0 deletions src/stream.h
Expand Up @@ -30,6 +30,21 @@ GIT_INLINE(int) git_stream_certificate(git_cert **out, git_stream *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)
{
return st->read(st, data, len);
Expand Down

0 comments on commit 59b6140

Please sign in to comment.