Using an HTTP / HTTPS proxy

    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 libcloud.common.base.LibcloudConnection class constructor (this setting is local to the connection instance)
    • By calling libcloud.common.base.LibcloudConnection.set_http_proxy() method aka driver.connection.connection.set_http_proxy (this setting is local to the connection instance)
    • 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.

    Without authentication (http proxy):

    Without authentication (https proxy):

    1. http_proxy=https://<proxy hostname>:<proxy port> python my_script.py
    2. # or

    With basic auth authentication (http proxy):

    . note:

    1. Some drivers don't correctly pass ``proxy_url`` argument to the connection
    2. class and don't support ``proxy_url`` constructor argument.
    3. If you pass this argument to the driver constructor, but it doesn't appear
    4. to be working, it's likely the driver doesn't support this method.
    5. In such scenarios, you are advised to use some other method of setting a
    6. proxy (e.g. by setting an environment variable or by using
    7. :meth:`libcloud.common.base.LibcloudConnection.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.

    1. from pprint import pprint
    2. HTTP_PROXY_URL_NO_AUTH_1 = 'http://<proxy hostname 1>:<proxy port 2>'
    3. HTTP_PROXY_URL_NO_AUTH_2 = 'http://<proxy hostname 1>:<proxy port 2>'
    4. HTTP_PROXY_URL_BASIC_AUTH = 'http://<user>:<pass>@<proxy hostname>:<port>'
    5. cls = get_driver(Provider.RACKSPACE)
    6. driver = cls('username', 'api key', region='ord')
    7. # Use proxy 1 for this request
    8. driver.connection.connection.set_http_proxy(proxy_url=HTTP_PROXY_URL_NO_AUTH_1)
    9. pprint(driver.list_nodes())
    10. # Use proxy 2 for this request
    11. driver.connection.connection.set_http_proxy(proxy_url=HTTP_PROXY_URL_NO_AUTH_2)
    12. pprint(driver.list_nodes())

    This example shows how to use an HTTPS proxy.

    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:

    1. SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed