Transport ========= Class ``openstack.transport.Transport`` is a subclass of ``requests.Session`` that adds some features that are common in OpenStack APIs or can be globally controlled by an application. Its use is incredibly similar to ``requests.Session`` such that we only will cover the differences in detail here. Transport object ---------------- Class ``openstack.transport.Transport(user_agent=None, verify=True, redirect=DEFAULT_REDIRECT_LIMIT, ...)`` Create a new ``Transport`` object. In addition to those listed below, all arguments available to ``requests.Session`` are available here: * user_agent - Set the default ``User-Agent`` header (default: ``None``) * verify - If ``True``, the SSL cert will be verified. It can also be set to a CA_BUNDLE path. (default: ``True``) * redirect - Disallow redirects if ``False``, or allow ``requests.Session`` to handle redirects if ``True``. An integer can instead be passed to specify the maximum number of redirections followed. Method ``Transport.request(method, url, redirect=None, **kwargs)`` Perform an HTTP request. The following arguments differ from ``requests.Session``: * redirect - (integer) The maximum number of redirections followed in a request. (boolean) No redirections if False, ``requests.Session`` handles redirection if True. (default: ``openstack.transport.DEFAULT_REDIRECT_LIMIT``) * json - Request body to be encoded as JSON. Overwrites ``data`` argument if present. (default: ``None``) * user_agent - Set the default ``User-Agent`` header (default: ``None``) Examples -------- Basic HTTP GET ~~~~~~~~~~~~~~ Making a basic HTTP GET call is very simple:: from openstack import transport trans = transport.Transport() versions = trans.get('cloud.example.com:5000').json will retrieve the version data served by the Identity API into a Python dict. HTTP POST ~~~~~~~~~ Creating a new object in an OpenStack service is similarly simple:: from openstack import transport trans = transport.Transport() new_record = {'name': 'The White Albumn', 'artist': 'The Beatles'} resp = trans.post('cloud.example.com:4999/record', json=new_record) Passing in the new_record dict with the ``json`` keyword argument performs the ``json.dumps()`` prior to the request being sent. This is an addition to the capabilities of ``requests.Session``. Additional HTTP Methods ~~~~~~~~~~~~~~~~~~~~~~~ Just as in ``requests.Session``, all of the HTTP verbs have corresponding methods in the ``Transport`` object. SSL/TLS and Certificates ~~~~~~~~~~~~~~~~~~~~~~~~ The ``verify`` argument to ``Transport.request()`` can now be set when the Transport object is created. It can still be overwritten during any individual call to ``request()`` or the HTTP verb methods. To set the default hostname verification for the Transport to use a custom CA certificate file:: from openstack import transport trans = transport.Transport(verify='/etc/tls/local-ca-certs.crt') The same usage from ``requests`` is still available. To use the default CA certificate file for a single request:: versions = trans.get('cloud.example.com:5000', verify=True) Or hit on a host with a self-signed certificate:: versions = trans.get('cloud.example.com:5000', verify=None) Redirection ~~~~~~~~~~~ Redirection handling differs from ``requests`` by default as this module is expected to be primarily used for querying REST API servers. The redirection model differs in that ``requests`` follows some browser patterns where it will redirect POSTs as GETs for certain statuses which is not want we want for an API. See: https://en.wikipedia.org/wiki/Post/Redirect/Get User Agent ~~~~~~~~~~ The ``User-Agent`` header may be set when the Transport object is created in addition to the existing per-request mode. The determination of how to set the ``User-Agent`` header is as follows: * If the ``user_agent`` argument is included in the ``request()`` call use it * Else if ``User-Agent`` is set in the headers dict use it * Else if ``user_agent`` argument is included in the ``Transport`` construction use it * Else use ``transport.DEFAULT_USER_AGENT``