Adding Proxy Path Support 43/42443/1
authormbeierl <mark.beierl@dell.com>
Tue, 19 Sep 2017 17:30:03 +0000 (13:30 -0400)
committermbeierl <mark.beierl@dell.com>
Tue, 19 Sep 2017 17:30:03 +0000 (13:30 -0400)
Adds WSGI wrapper to allow the path to be arbitrary as
long as it is passed in the reverse proxy

Change-Id: I6feca119093a3b3c60ad615f4e4b59bb2c212800
Signed-off-by: mbeierl <mark.beierl@dell.com>
docker/storperf-master/rest_server.py
docker/storperf-reporting/src/app.py

index 0634b8f..5be3fb4 100644 (file)
@@ -20,9 +20,44 @@ from flask_restful_swagger import swagger
 from storperf.storperf_master import StorPerfMaster
 
 
+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 /storperf/ {
+        proxy_pass http://localhost:8085/;
+        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 /storperf;
+    }
+
+    :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)
+
+
 app = Flask(__name__, static_url_path="")
 CORS(app)
 api = swagger.docs(Api(app), apiVersion='1.0')
+app.wsgi_app = ReverseProxied(app.wsgi_app)
 
 storperf = StorPerfMaster()
 
index 38f1198..79baa33 100644 (file)
@@ -16,7 +16,44 @@ from flask import send_from_directory, flash
 import validators
 
 
+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 /storperf/ {
+        proxy_pass http://localhost:8085/;
+        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 /storperf;
+    }
+
+    :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)
+
+
 app = Flask(__name__)
+app.wsgi_app = ReverseProxied(app.wsgi_app)
 app.secret_key = 'storperf_graphing_module'
 
 
@@ -47,7 +84,6 @@ def success():
             data = urllib.urlopen(URL).read()
             data = json.loads(data)
             temp = data["job_ids"]
-            print temp
             if temp:
                 info = {}
                 for ID in temp: