[PATCH] url: add distribution and version to user-agent request header (BC)

Gregory Szorc gregory.szorc at gmail.com
Thu Jul 14 01:18:26 EDT 2016

# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1468473406 25200
#      Wed Jul 13 22:16:46 2016 -0700
# Node ID 6ad61d5001b1fbfebf317d0557f158d4b34a0772
# Parent  52433f89f816e21ca992ac8c4a41cba0345f1b73
url: add distribution and version to user-agent request header (BC)

As a server operator, I've always wanted to know what Mercurial
version clients are running. Unfortunately, there is no easy
way to discern this today: the best you can do is sniff capabilities
from getbundle commands and those aren't updated frequently enough
to tell you anything that interesting.

This patch adds the distribution name and version to the user-agent
HTTP request header. We choose "Mercurial" for the distribution
name because that seems appropriate. The version string comes
from __version__. It should have no spaces and should therefore be
safe to include outside of quotes, parenthesis, etc.

Flagging the patch as BC so it shows up in release notes. This
change should be backwards compatible. But I'm sure there is a server
operator somewhere filtering on the existing user-agent request
header. So I want to make noise about this change.

diff --git a/mercurial/url.py b/mercurial/url.py
--- a/mercurial/url.py
+++ b/mercurial/url.py
@@ -500,18 +500,22 @@ def opener(ui, authinfo=None):
         ui.debug('http auth: user %s, password %s\n' %
                  (user, passwd and '*' * len(passwd) or 'not set'))
     handlers.extend([h(ui, passmgr) for h in handlerfuncs])
     opener = urlreq.buildopener(*handlers)
-    # 1.0 here is the _protocol_ version
-    opener.addheaders = [('User-agent', 'mercurial/proto-1.0')]
+    opener.addheaders = [('User-agent',
+                          # 1.0 here is the _protocol_ version
+                          # "Mercurial/%s" identifies the distribution name
+                          # and version. Other implementations of the client
+                          # should choose a different name.
+                          'mercurial/proto-1.0 Mercurial/%s' % util.version())]
     opener.addheaders.append(('Accept', 'application/mercurial-0.1'))
     return opener
 def open(ui, url_, data=None):
     u = util.url(url_)
     if u.scheme:
         u.scheme = u.scheme.lower()
         url_, authinfo = u.authinfo()

More information about the Mercurial-devel mailing list