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

Augie Fackler raf at durin42.com
Mon Jul 18 07:58:09 EDT 2016


On Thu, Jul 14, 2016 at 07:18:25PM -0700, Gregory Szorc wrote:
> # HG changeset patch
> # User Gregory Szorc <gregory.szorc at gmail.com>
> # Date 1468549006 25200
> #      Thu Jul 14 19:16:46 2016 -0700
> # Node ID bd76ffdbb2701c2debb6d2cc1e07a518c6269cc3
> # Parent  52433f89f816e21ca992ac8c4a41cba0345f1b73
> url: add distribution and version to user-agent request header (BC)

queued this, thanks

>
> As a server operator, I've always wanted to know what Mercurial
> version clients are running so I can track version adoption and
> make informed decisions about which versions of Mercurial to
> support in extensions. Unfortunately, there is no easy way to discern
> this today: the best you can do is look for high-level feature usage
> (e.g. bundle2) or sniff capabilities from bundle2 commands. And these
> things aren't changed frequently enough to tell you anything that
> interesting.
>
> Nearly every piece of software talking HTTP sends its version in
> the user agent. This includes web browsers, curl, and even Git.
>
> 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__.
>
> The value is inside parenthesis for a few reasons:
>
> * The version *may* contain spaces
> * Alternate forms like "Mercurial/<version>" imply structure and
>   since the user agent should not be used by servers for protocol
>   or feature negotiation/detection, we don't want to even give the
>   illusion that the value should be parsed. A free form field is
>   the most hostile to parsing.
>
> Flagging the patch as BC so it shows up in release notes. This
> change should be backwards compatible. But I wouldn't be surprised if
> a server somewhere is filtering on the exact old user agent string. 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,30 @@ def opener(ui, authinfo=None):
>          ui.debug('http auth: user %s, password %s\n' %
>                   (user, passwd and '*' * len(passwd) or 'not set'))
>
>      handlers.extend((httpbasicauthhandler(passmgr),
>                       httpdigestauthhandler(passmgr)))
>      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')]
> +    # The user agent should should *NOT* be used by servers for e.g.
> +    # protocol detection or feature negotiation: there are other
> +    # facilities for that.
> +    #
> +    # "mercurial/proto-1.0" was the original user agent string and
> +    # exists for backwards compatibility reasons.
> +    #
> +    # The "(Mercurial %s)" string contains the distribution
> +    # name and version. Other client implementations should choose their
> +    # own distribution name. Since servers should not be using the user
> +    # agent string for anything, clients should be able to define whatever
> +    # user agent they deem appropriate.
> +    agent = 'mercurial/proto-1.0 (Mercurial %s)' % util.version()
> +    opener.addheaders = [('User-agent', agent)]
>      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()
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list