I would just have a middleware look for that header and rewrite
wsgi.url_scheme appropriately in the environment.  You could use repoze.vhm
to do that, but since you only need that one tweak, a few lines of
middleware should really be all you need.


class RewriteURLSchemeMiddleware(object):
    """Not tested."""


    def __init__(self, app, global_config, **config):
        self.app = app

    def __call__(self, environ, start_response):
        if self.key in environ:
            environ = environ.copy()
            environ['wsgi.url_scheme'] = environ[key]
        return app(environ, start_response)

On Wed, Nov 10, 2010 at 11:40 AM, Hanno Schlichting <ha...@hannosch.eu>wrote:

> Hi.
> We have an application which supports both HTTP and HTTPS. If the user
> visits the site via https:// he should stay on that protocol and as
> such all links should be generated accordingly.
> We do the SSL handling in Nginx in front of the bfg application. So
> the application always gets a request.application_url with a http://
> link. We have an additional header "'HTTP_X_FORWARDED_PROTO" which
> gets sets to 'https'.
> In order to support this, we use our own route_url function that looks
> like this:
> from repoze.bfg.url import route_url as bfg_route_url
> def route_url(route_name, request, *elements, **kw):
>    https = request.environ.get('HTTP_X_FORWARDED_PROTO') == 'https'
>    value = bfg_route_url(route_name, request, *elements, **kw)
>    if https:
>        return value.replace('http://', 'https://')
>    return value
> Does this sound like a reasonable approach, or is there a better
> alternative? Having to use a different implementation of a core API
> feels wrong.
> Thanks,
> Hanno
> _______________________________________________
> Repoze-dev mailing list
> Repoze-dev@lists.repoze.org
> http://lists.repoze.org/listinfo/repoze-dev
Repoze-dev mailing list

Reply via email to