# HG changeset patch # User BenoƮt Allard # Date 1411573604 -7200 # Node ID 3478e20885fdcda72195495f0ad9c14af9dea092 # Parent fe1918b6e3e065ff3483dc711079df2b00cdabef Add a ReverseProxy and fix the cache path everywhere diff -r fe1918b6e3e0 -r 3478e20885fd farol/main.py --- a/farol/main.py Wed Sep 24 16:16:42 2014 +0200 +++ b/farol/main.py Wed Sep 24 17:46:44 2014 +0200 @@ -38,6 +38,7 @@ from .session import get_current, set_current, has_current, del_current, document_required from .vulnerability import vulnerability from .producttree import producttree +from .proxy import ReverseProxied app = Flask(__name__, instance_relative_config=True) app.config.from_object('farol.config.Config') @@ -46,6 +47,8 @@ app.register_blueprint(vulnerability, url_prefix='/vulnerability') app.register_blueprint(producttree, url_prefix='/producttree') +app.wsgi_app = ReverseProxied(app.wsgi_app) + @app.context_processor def cache_content(): """ List the documents in cache """ @@ -354,7 +357,9 @@ # Get some kind of filename, and save the cvrf on cache (disk) path = secure_filename(request.form['fname']) path, _ = os.path.splitext(path) - with open(os.path.join(app.config['CACHE_DIRECTORY'], path + '.xml'), 'wt') as f: + dirname = app.config.get('CACHE_DIRECTORY', + os.path.join(app.instance_path, '_cache')) + with open(os.path.join(dirname, path + '.xml'), 'wt') as f: f.write(render_cvrf(get_current(), 'cvrf.j2').encode('utf-8')) flash('File saved as %s' % path) del_current() @@ -367,7 +372,9 @@ # Suggest to save first return render_template('load.j2', element=element) - fpath = os.path.join(app.config['CACHE_DIRECTORY'], element+'.xml') + dirname = app.config.get('CACHE_DIRECTORY', + os.path.join(app.instance_path, '_cache')) + fpath = os.path.join(dirname, element+'.xml') with open(fpath, 'rt') as f: set_current(parse(f)) os.remove(fpath) diff -r fe1918b6e3e0 -r 3478e20885fd farol/proxy.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/farol/proxy.py Wed Sep 24 17:46:44 2014 +0200 @@ -0,0 +1,38 @@ +# Code from http://flask.pocoo.org/snippets/35/ +# +# This snippet by Peter Hansen can be used freely for anything you like. +# Consider it public domain. + + +class ReverseProxied(object): + '''Wrap the application in this middleware and configure the + front-end server to add these headers, to let you quietly bind + this to a URL other than / and to an HTTP scheme that is + different than what is used locally. + + In nginx: + location /myprefix { + proxy_pass http://192.168.0.1:5001; + proxy_set_header Host $host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Scheme $scheme; + proxy_set_header X-Script-Name /myprefix; + } + + :param app: the WSGI application + ''' + def __init__(self, app): + self.app = app + + def __call__(self, environ, start_response): + script_name = environ.get('HTTP_X_SCRIPT_NAME', '') + if script_name: + environ['SCRIPT_NAME'] = script_name + path_info = environ['PATH_INFO'] + if path_info.startswith(script_name): + environ['PATH_INFO'] = path_info[len(script_name):] + + scheme = environ.get('HTTP_X_SCHEME', '') + if scheme: + environ['wsgi.url_scheme'] = scheme + return self.app(environ, start_response)