Kaydet (Commit) e39bba2a authored tarafından Benjamin Peterson's avatar Benjamin Peterson

merge 3.4 (#22960)

...@@ -27,14 +27,14 @@ between conformable Python objects and XML on the wire. ...@@ -27,14 +27,14 @@ between conformable Python objects and XML on the wire.
constructed data. If you need to parse untrusted or unauthenticated data see constructed data. If you need to parse untrusted or unauthenticated data see
:ref:`xml-vulnerabilities`. :ref:`xml-vulnerabilities`.
.. versionchanged:: 3.4.3 .. versionchanged:: 3.5
For https URIs, :mod:`xmlrpc.client` now performs all the necessary For https URIs, :mod:`xmlrpc.client` now performs all the necessary
certificate and hostname checks by default certificate and hostname checks by default
.. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, \ .. class:: ServerProxy(uri, transport=None, encoding=None, verbose=False, \
allow_none=False, use_datetime=False, \ allow_none=False, use_datetime=False, \
use_builtin_types=False) use_builtin_types=False, context=None)
.. versionchanged:: 3.3 .. versionchanged:: 3.3
The *use_builtin_types* flag was added. The *use_builtin_types* flag was added.
...@@ -63,7 +63,9 @@ between conformable Python objects and XML on the wire. ...@@ -63,7 +63,9 @@ between conformable Python objects and XML on the wire.
portion will be base64-encoded as an HTTP 'Authorization' header, and sent to portion will be base64-encoded as an HTTP 'Authorization' header, and sent to
the remote server as part of the connection process when invoking an XML-RPC the remote server as part of the connection process when invoking an XML-RPC
method. You only need to use this if the remote server requires a Basic method. You only need to use this if the remote server requires a Basic
Authentication user and password. Authentication user and password. If an HTTPS url is provided, *context* may
be :class:`ssl.SSLContext` and configures the SSL settings of the underlying
HTTPS connection.
The returned instance is a proxy object with methods that can be used to invoke The returned instance is a proxy object with methods that can be used to invoke
corresponding RPC calls on the remote server. If the remote server supports the corresponding RPC calls on the remote server. If the remote server supports the
...@@ -127,6 +129,9 @@ between conformable Python objects and XML on the wire. ...@@ -127,6 +129,9 @@ between conformable Python objects and XML on the wire.
:class:`Server` is retained as an alias for :class:`ServerProxy` for backwards :class:`Server` is retained as an alias for :class:`ServerProxy` for backwards
compatibility. New code should use :class:`ServerProxy`. compatibility. New code should use :class:`ServerProxy`.
.. versionchanged:: 3.5
Added the *context* argument.
.. seealso:: .. seealso::
......
...@@ -1324,6 +1324,11 @@ class Transport: ...@@ -1324,6 +1324,11 @@ class Transport:
class SafeTransport(Transport): class SafeTransport(Transport):
"""Handles an HTTPS transaction to an XML-RPC server.""" """Handles an HTTPS transaction to an XML-RPC server."""
def __init__(self, use_datetime=False, use_builtin_types=False, *,
context=None):
super().__init__(use_datetime=use_datetime, use_builtin_types=use_builtin_types)
self.context = context
# FIXME: mostly untested # FIXME: mostly untested
def make_connection(self, host): def make_connection(self, host):
...@@ -1337,7 +1342,7 @@ class SafeTransport(Transport): ...@@ -1337,7 +1342,7 @@ class SafeTransport(Transport):
# host may be a string, or a (host, x509-dict) tuple # host may be a string, or a (host, x509-dict) tuple
chost, self._extra_headers, x509 = self.get_host_info(host) chost, self._extra_headers, x509 = self.get_host_info(host)
self._connection = host, http.client.HTTPSConnection(chost, self._connection = host, http.client.HTTPSConnection(chost,
None, **(x509 or {})) None, context=self.context, **(x509 or {}))
return self._connection[1] return self._connection[1]
## ##
...@@ -1380,7 +1385,8 @@ class ServerProxy: ...@@ -1380,7 +1385,8 @@ class ServerProxy:
""" """
def __init__(self, uri, transport=None, encoding=None, verbose=False, def __init__(self, uri, transport=None, encoding=None, verbose=False,
allow_none=False, use_datetime=False, use_builtin_types=False): allow_none=False, use_datetime=False, use_builtin_types=False,
*, context=None):
# establish a "logical" server connection # establish a "logical" server connection
# get the url # get the url
...@@ -1394,10 +1400,13 @@ class ServerProxy: ...@@ -1394,10 +1400,13 @@ class ServerProxy:
if transport is None: if transport is None:
if type == "https": if type == "https":
handler = SafeTransport handler = SafeTransport
extra_kwargs = {"context": context}
else: else:
handler = Transport handler = Transport
extra_kwargs = {}
transport = handler(use_datetime=use_datetime, transport = handler(use_datetime=use_datetime,
use_builtin_types=use_builtin_types) use_builtin_types=use_builtin_types,
**extra_kwargs)
self.__transport = transport self.__transport = transport
self.__encoding = encoding or 'utf-8' self.__encoding = encoding or 'utf-8'
......
...@@ -191,6 +191,8 @@ Core and Builtins ...@@ -191,6 +191,8 @@ Core and Builtins
Library Library
------- -------
- Issue #22960: Add a context argument to xmlrpclib.ServerProxy constructor.
- Issue #22389: Add contextlib.redirect_stderr(). - Issue #22389: Add contextlib.redirect_stderr().
- Issue #21356: Make ssl.RAND_egd() optional to support LibreSSL. The - Issue #21356: Make ssl.RAND_egd() optional to support LibreSSL. The
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment