blob: f22a9a006364c42a1866dc2e0904dfe63725d70c [file] [log] [blame]
Using an HTTP / HTTPS proxy
===========================
.. note::
1. Support for HTTP proxies is available in Libcloud v0.16.0 and higher.
2. Support for HTTPS proxies is available in Libcloud v2.5.1-dev and higher.
3. In versions prior to v2.5.1-dev, ``driver.connection.set_http_proxy()``
method is broken and you need to use
``driver.connection.connection.set_http_proxy()`` instead.
Libcloud supports using an HTTP / HTTPS proxy for outgoing HTTP and HTTPS
requests.
Proxy support has been tested with the following Python versions:
* Python 2.7 / PyPy
* Python 3.4
* Python 3.6
* Python 3.7
You can specify which HTTP(s) proxy to use using one of the approaches described
below:
* By setting ``http_proxy`` / ``https_proxy`` environment variable (this
setting is system / process wide)
* By passing ``http_proxy`` argument to the
:class:`libcloud.common.base.LibcloudConnection` class constructor (this
setting is local to the connection instance)
* By calling :meth:`libcloud.common.base.LibcloudConnection.set_http_proxy`
method aka ``driver.connection.connection.set_http_proxy`` (this setting
is local to the connection instance)
Known limitations
-----------------
* Only HTTP basic access authentication proxy authorization method is supported
* If you are using HTTPS proxy you need to configure Libcloud to use CA cert
bundle path which is used by the proxy server. See an example below on how to
do that.
Examples
--------
This section includes some code examples which show how to use an HTTP(s) proxy
with Libcloud.
1. Using ``http_proxy`` / ``htps_proxy`` environment variable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By setting ``http_proxy`` / ``https_proxy`` environment variable you can
specify which proxy to use for all of the outgoing requests for a duration /
life-time of the process or a script.
Without authentication (http proxy):
.. sourcecode:: bash
http_proxy=http://<proxy hostname>:<proxy port> python my_script.py
Without authentication (https proxy):
.. sourcecode:: bash
http_proxy=https://<proxy hostname>:<proxy port> python my_script.py
# or
https_proxy=https://<proxy hostname>:<proxy port> python my_script.py
With basic auth authentication (http proxy):
.. sourcecode:: bash
http_proxy=http://<username>:<password>@<proxy hostname>:<proxy port> python my_script.py
2. Passing ``proxy_url`` argument to the connection class constructor
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
. note::
Some drivers don't correctly pass ``proxy_url`` argument to the connection
class and don't support ``proxy_url`` constructor argument.
If you pass this argument to the driver constructor, but it doesn't appear
to be working, it's likely the driver doesn't support this method.
In such scenarios, you are advised to use some other method of setting a
proxy (e.g. by setting an environment variable or by using
:meth:`libcloud.common.base.LibcloudConnection.set_http_proxy` method).
By passing ``proxy_url`` argument to the
:class:`libcloud.common.base.Connection` class constructor, you can specify
which proxy to use for a particular connection.
.. literalinclude:: /examples/http_proxy/constructor_argument.py
:language: python
3. Calling ``set_http_proxy`` method
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Calling ``set_http_proxy`` method allows you to specify which proxy to use
for all the outgoing requests which follow ``set_http_proxy`` method call.
This method also allows you to use a different proxy for each request as shown
in the example below.
.. literalinclude:: /examples/http_proxy/set_http_proxy_method.py
:language: python
4. Using an HTTPS proxy
~~~~~~~~~~~~~~~~~~~~~~~
This example shows how to use an HTTPS proxy.
.. literalinclude:: /examples/http_proxy/https_proxy.py
:language: python
To use an HTTPS proxy, you also need to configure Libcloud to use CA cert bundle
which is used by the HTTPS proxy server, to verify outgoing https request. If you
don't do that, you will see errors similar to the one below:
.. sourcecode:: python
SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
Keep in mind that you will also receive a similar error message if you try to
use HTTP proxy for HTTPS requests.