
.. _`Proxy support`:

Proxy support
-------------

Starting with version 1.0, pywbem supports HTTP and SOCKS 5 proxies for
connecting to the WBEM server. This is done by utilizing the proxy support in
the underlying `requests` Python package.

The proxies to be used can be specified using the ``proxies`` init argument
of :class:`~pywbem.WBEMConnection`, or via the environment variables HTTP_PROXY
and HTTPS_PROXY.

If the ``proxies`` init argument is not `None`, it takes precedence over the
environment variables and must be a dictionary with item keys 'http' and
'https'. Each item value specifies the URL of the proxy that is to be used for
the WBEM server protocol specified by the key.

In case of the environment variables, the value of HTTP_PROXY and HTTPS_PROXY
specify the URL of the proxy that is to be used for the http and https
WBEM server protocol, respectively.

If the proxy support is used, the ``url`` init argument of
:class:`~pywbem.WBEMConnection` specifies the connection properties the proxy
uses for connecting to the WBEM server. The ``no_verification``, ``ca_certs``,
and ``x509`` init arguments are also applied to the connection between the proxy
and the WBEM server. The URL of the proxy specified via the ``proxies`` init
argument or via the HTTP_PROXY and HTTPS_PROXY environment variables is what the
pywbem client uses to connect to the proxy.

The following examples show some typical cases and are not exhaustive. For the
full description of what is possible, refer to the `Proxies section`_  in the
documentation of the requests package. In these examples, the proxy URLs are
specified using the ``proxies`` init argument, but they can also be specified
using the HTTP_PROXY and HTTPS_PROXY environment variables.

Use of an HTTP proxy requiring authentication:

.. code-block:: python

    proxies = {
      'http': 'http://user:pass@10.10.1.10:3128',
      'https': 'http://user:pass@10.10.1.10:1080',
    }

    conn = pywbem.WBEMConnection(..., proxies=proxies)

Use of SOCKS proxies requires installing the socks option of the `requests`
Python package:

.. code-block:: bash

    $ pip install requests[socks]

Use of a SOCKS 5 proxy requiring authentication where the DNS resolution for the
WBEM server hostname is done on the client (where pywbem runs):

.. code-block:: python

    proxies = {
      'http': 'socks5://user:pass@10.10.1.10:3128',
      'https': 'socks5://user:pass@10.10.1.10:1080',
    }

    conn = pywbem.WBEMConnection(..., proxies=proxies)

Use of a SOCKS 5 proxy requiring authentication where the DNS resolution for the
WBEM server hostname is done on the proxy:

.. code-block:: python

    proxies = {
      'http': 'socks5h://user:pass@10.10.1.10:3128',
      'https': 'socks5h://user:pass@10.10.1.10:1080',
    }

    conn = pywbem.WBEMConnection(..., proxies=proxies)

.. _Proxies section: https://2.python-requests.org/en/master/user/advanced/#proxies
