summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2015-10-02 03:57:14 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2015-11-09 10:20:48 +0100
commit014964369cf3d446486f371d19708eaf2a1879a6 (patch)
treeed978a6e17c017493de3bbdb1aede6c9645ac2b0
parente48aa0fc66fc157d58f96a36ce77b3703510135f (diff)
downloadlibgit2-cmn/custom-agent.tar.gz
winhttp: use a custom user-agent if the user has set itcmn/custom-agent
We also keep the "git/1.0" prefix in order to maintain compatibility with hosters.
-rw-r--r--src/transports/winhttp.c36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/transports/winhttp.c b/src/transports/winhttp.c
index b364e906e..77d939bd3 100644
--- a/src/transports/winhttp.c
+++ b/src/transports/winhttp.c
@@ -15,6 +15,7 @@
#include "smart.h"
#include "remote.h"
#include "repository.h"
+#include "global.h"
#include <wincrypt.h>
#include <winhttp.h>
@@ -567,12 +568,28 @@ static int winhttp_close_connection(winhttp_subtransport *t)
return ret;
}
+static int user_agent(git_buf *ua)
+{
+ const char *custom = git_libgit2__user_agent();
+
+ git_buf_clear(ua);
+ git_buf_PUTS(ua, "git/1.0 (");
+
+ if (custom)
+ git_buf_puts(ua, custom);
+ else
+ git_buf_PUTS(ua, "libgit2 " LIBGIT2_VERSION);
+
+ return git_buf_putc(ua, ')');
+}
+
static int winhttp_connect(
winhttp_subtransport *t)
{
- wchar_t *ua = L"git/1.0 (libgit2 " WIDEN(LIBGIT2_VERSION) L")";
wchar_t *wide_host;
int32_t port;
+ wchar_t *wide_ua;
+ git_buf ua = GIT_BUF_INIT;
int error = -1;
int default_timeout = TIMEOUT_INFINITE;
int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT;
@@ -590,9 +607,23 @@ static int winhttp_connect(
return -1;
}
+ if ((error = user_agent(&ua)) < 0) {
+ git__free(wide_host);
+ return error;
+ }
+
+ if (git__utf8_to_16_alloc(&wide_ua, git_buf_cstr(&ua)) < 0) {
+ giterr_set(GITERR_OS, "Unable to convert host to wide characters");
+ git__free(wide_host);
+ git_buf_free(&ua);
+ return -1;
+ }
+
+ git_buf_free(&ua);
+
/* Establish session */
t->session = WinHttpOpen(
- ua,
+ wide_ua,
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
@@ -628,6 +659,7 @@ on_error:
winhttp_close_connection(t);
git__free(wide_host);
+ git__free(wide_ua);
return error;
}