pylorax.api.crossdomain — Lorax 28.14.42 documentation

# Source code for pylorax.api.crossdomain

    #
    # Copyright (C) 2017  Red Hat, Inc.
    #
    # This program is free software; you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation; either version 2 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    #

    # crossdomain decorator from - http://flask.pocoo.org/snippets/56/
    from datetime import timedelta
    from flask import make_response, request, current_app
    from functools import update_wrapper

    def crossdomain(origin, methods=None, headers=None,
                    max_age=21600, attach_to_all=True,
                    automatic_options=True):
        if methods is not None:
            methods = ', '.join(sorted(x.upper() for x in methods))
        if headers is not None and not isinstance(headers, str):
            headers = ', '.join(x.upper() for x in headers)
        if not isinstance(origin, list):
            origin = [origin]
        if isinstance(max_age, timedelta):
            max_age = int(max_age.total_seconds())

        def get_methods():
            if methods is not None:
                return methods

            options_resp = current_app.make_default_options_response()
            return options_resp.headers['allow']

        def decorator(f):
            def wrapped_function(*args, **kwargs):
                if automatic_options and request.method == 'OPTIONS':
                    resp = current_app.make_default_options_response()
                else:
                    resp = make_response(f(*args, **kwargs))
                if not attach_to_all and request.method != 'OPTIONS':
                    return resp

                h = resp.headers

                h.extend([("Access-Control-Allow-Origin", orig) for orig in origin])
                h['Access-Control-Allow-Methods'] = get_methods()
                h['Access-Control-Max-Age'] = str(max_age)
                if headers is not None:
                    h['Access-Control-Allow-Headers'] = headers
                return resp

            f.provide_automatic_options = False
            f.required_methods = ['OPTIONS']
            return update_wrapper(wrapped_function, f)
        return decorator