[PATCH 2 of 3 STABLE] httpclient: pass serverhostname (issue5210)

Augie Fackler raf at durin42.com
Thu Apr 21 12:37:59 EDT 2016


On Thu, Apr 21, 2016 at 05:30:36AM +0000, timeless wrote:
> # HG changeset patch
> # User timeless <timeless at mozdev.org>
> # Date 1461216417 0
> #      Thu Apr 21 05:26:57 2016 +0000
> # Branch stable
> # Node ID ffc332df490b894efd359d2ea6a5e0066fc6d7ea
> # Parent  57d34adbea5be4a183a6a80a08abc45664c6d952
> # Available At bb://timeless/mercurial-crew
> #              hg pull bb://timeless/mercurial-crew -r ffc332df490b
> httpclient: pass serverhostname (issue5210)

I know you sent me some bb PRs for httpclient's upstream - how do
those relate to this patch? This is the kind of thing I'd expect to
get clobbered next time I do an import from upstream...

>
> diff -r 57d34adbea5b -r ffc332df490b mercurial/httpclient/__init__.py
> --- a/mercurial/httpclient/__init__.py	Wed Apr 20 21:33:02 2016 +0000
> +++ b/mercurial/httpclient/__init__.py	Thu Apr 21 05:26:57 2016 +0000
> @@ -346,9 +346,62 @@
>              if '[' in host:
>                  host = host[1:-1]
>          if ssl_wrap_socket is not None:
> -            self._ssl_wrap_socket = ssl_wrap_socket
> +            _wrap_socket = ssl_wrap_socket
>          else:
> -            self._ssl_wrap_socket = socketutil.wrap_socket
> +            _wrap_socket = socketutil.wrap_socket
> +        def handlesarg(func, arg):
> +            """ Try to determine if func accepts arg
> +
> +            Typically a function will raise:
> +                TypeError got an unexpected keyword argument '{arg}'
> +            ... if it doesn't
> +            If it throws this for arg, handlesarg will return False
> +            If it throws this for our dummy, handlesarg will return True
> +
> +            If it happens to take **args, then it could do anything:
> +                * It could throw a different TypeError, just for fun
> +                * It could throw an ArgumentError or anything else
> +                * It could choose not to throw an Exception at all
> +            handlesarg will return 'unknown'
> +            """
> +            args = {arg: True, 'nosuchargument': True}
> +            try:
> +                if arg == 'server_hostname':
> +                    func(server_hostname=True, nosuchargument=True)
> +                else:
> +                    func(serverhostname=True, nosuchargument=True)
> +            except TypeError as e:
> +                msg = str(e)
> +                if 'nosuchargument' in msg:
> +                    return True
> +                if arg in msg:
> +                    return False
> +                return 'unknown'
> +            except:
> +                return 'unknown'
> +            return 'unknown'
> +        call_wrap_socket = None
> +        handlesubar = handlesarg(_wrap_socket, 'server_hostname')
> +        if handlesubar is True:
> +            # supports server_hostname
> +            call_wrap_socket = _wrap_socket
> +        handlesnobar = handlesarg(_wrap_socket, 'serverhostname')
> +        if handlesnobar is True and handlesubar is not True:
> +            # supports serverhostname
> +            def call_wrap_socket(sock, server_hostname=None, **ssl_opts):
> +                return _wrap_socket(sock, serverhostname=server_hostname,
> +                                    **ssl_opts)
> +        if handlesubar is False and handlesnobar is False:
> +            # does not support either
> +            def call_wrap_socket(sock, server_hostname=None, **ssl_opts):
> +                return _wrap_socket(sock, **ssl_opts)
> +        if call_wrap_socket is None:
> +            # we assume it takes **args
> +            def call_wrap_socket(sock, **ssl_opts):
> +                if 'server_hostname' in ssl_opts:
> +                    ssl_opts['serverhostname'] = ssl_opts['server_hostname']
> +                return _wrap_socket(sock, **ssl_opts)
> +        self._ssl_wrap_socket = call_wrap_socket
>          if use_ssl is None and port is None:
>              use_ssl = False
>              port = 80
> @@ -429,7 +482,8 @@
>              sock.setblocking(1)
>              logger.debug('wrapping socket for ssl with options %r',
>                           self.ssl_opts)
> -            sock = self._ssl_wrap_socket(sock, **self.ssl_opts)
> +            sock = self._ssl_wrap_socket(sock, server_hostname=self.host,
> +                                         **self.ssl_opts)
>              if self._ssl_validator:
>                  self._ssl_validator(sock)
>          sock.setblocking(0)
> diff -r 57d34adbea5b -r ffc332df490b mercurial/httpclient/socketutil.py
> --- a/mercurial/httpclient/socketutil.py	Wed Apr 20 21:33:02 2016 +0000
> +++ b/mercurial/httpclient/socketutil.py	Thu Apr 21 05:26:57 2016 +0000
> @@ -122,7 +122,8 @@
>                  server_side=False, cert_reqs=CERT_NONE,
>                  ssl_version=_PROTOCOL_SSLv23, ca_certs=None,
>                  do_handshake_on_connect=True,
> -                suppress_ragged_eofs=True):
> +                suppress_ragged_eofs=True,
> +                server_hostname=None):
>          """Backport of ssl.wrap_socket from Python 2.6."""
>          if cert_reqs != CERT_NONE and ca_certs:
>              raise CertificateValidationUnsupported(
> _______________________________________________
> 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