[IMP] Refactor CROS support
authorFabien Meghazi <fme@openerp.com>
Thu, 20 Feb 2014 13:37:14 +0000 (14:37 +0100)
committerFabien Meghazi <fme@openerp.com>
Thu, 20 Feb 2014 13:37:14 +0000 (14:37 +0100)
bzr revid: fme@openerp.com-20140220133714-igpobx20mhzlxi20

openerp/http.py

index 90dbb6b..2a5b89f 100644 (file)
@@ -452,19 +452,12 @@ class HttpRequest(WebRequest):
         self.params = params
 
     def dispatch(self):
-        # TODO: refactor this correctly. This is a quick fix for pos demo.
         if request.httprequest.method == 'OPTIONS' and request.endpoint and request.endpoint.routing.get('cors'):
-            response = Response(status=200)
-            response.headers.set('Access-Control-Allow-Origin', request.endpoint.routing['cors'])
-            methods = 'GET, POST'
-            if request.endpoint.routing['type'] == 'json':
-                methods = 'POST'
-            elif request.endpoint.routing.get('methods'):
-                methods = ', '.join(request.endpoint.routing['methods'])
-            response.headers.set('Access-Control-Allow-Methods', methods)
-            response.headers.set('Access-Control-Max-Age',60*60*24)
-            response.headers.set('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept')
-            return response
+            headers = {
+                'Access-Control-Max-Age': 60 * 60 * 24,
+                'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
+            }
+            return Response(status=200, headers=headers)
 
         r = self._call_function(**self.params)
         if not r:
@@ -953,13 +946,22 @@ class Response(werkzeug.wrappers.Response):
         template = kw.pop('template', None)
         qcontext = kw.pop('qcontext', None)
         uid = kw.pop('uid', None)
-        self.set_default(template, qcontext, uid)
         super(Response, self).__init__(*args, **kw)
+        self.set_default(template, qcontext, uid)
 
     def set_default(self, template=None, qcontext=None, uid=None):
         self.template = template
         self.qcontext = qcontext or dict()
         self.uid = uid
+        # Support for Cross-Origin Resource Sharing
+        if request.endpoint and 'cors' in request.endpoint.routing:
+            self.headers.set('Access-Control-Allow-Origin', request.endpoint.routing['cors'])
+            methods = 'GET, POST'
+            if request.endpoint.routing['type'] == 'json':
+                methods = 'POST'
+            elif request.endpoint.routing.get('methods'):
+                methods = ', '.join(request.endpoint.routing['methods'])
+            self.headers.set('Access-Control-Allow-Methods', methods)
 
     @property
     def is_qweb(self):
@@ -1132,16 +1134,6 @@ class Root(object):
         if not explicit_session and hasattr(response, 'set_cookie'):
             response.set_cookie('session_id', httprequest.session.sid, max_age=90 * 24 * 60 * 60)
 
-        # Support for Cross-Origin Resource Sharing
-        if request.endpoint and 'cors' in request.endpoint.routing:
-            response.headers.set('Access-Control-Allow-Origin', request.endpoint.routing['cors'])
-            methods = 'GET, POST'
-            if request.endpoint.routing['type'] == 'json':
-                methods = 'POST'
-            elif request.endpoint.routing['methods']:
-                methods = ', '.join(request.endpoint.routing['methods'])
-            response.headers.set('Access-Control-Allow-Methods', methods)
-
         return response
 
     def dispatch(self, environ, start_response):