summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Buccella <buccella@linux.vnet.ibm.com>2014-03-10 14:54:33 +0000
committerChris Buccella <buccella@linux.vnet.ibm.com>2014-03-10 14:54:33 +0000
commit3a67978cf41aecc752b7c11e2955d234a1add7bf (patch)
treeca808caf1f43a84389455a01f2af475bd1d18e28
parent91102e233d3bd13e08015e5172ea0e638d3e8574 (diff)
downloadoslo-middleware-3a67978cf41aecc752b7c11e2955d234a1add7bf.tar.gz
Don't store the request ID value in middleware as class variable
The original version of the request_id middleware generates a request ID during process_request() and stores the value in a variable, so it can be attached as header in process_request(). This is pretty dangerous, since subsequent requests will overwrite this value, and the wrong request ID may be attached to some responses. This is particularly apparent when requests arrive in parallel. This change replaces process_request() and process_response() with an override of __call__(). This allows the generated req_id to be used in the response header without needing to save it as a class-level variable. Change-Id: I498859140ba113412c9d95d09f0c4c6b8650749c Closes-bug: #1289696
-rw-r--r--openstack/common/middleware/request_id.py15
1 files changed, 9 insertions, 6 deletions
diff --git a/openstack/common/middleware/request_id.py b/openstack/common/middleware/request_id.py
index d71eb6e..38da56f 100644
--- a/openstack/common/middleware/request_id.py
+++ b/openstack/common/middleware/request_id.py
@@ -19,6 +19,8 @@ It ensures to assign request ID for each API request and set it to
request environment. The request ID is also added to API response.
"""
+import webob.dec
+
from openstack.common import context
from openstack.common.middleware import base
@@ -29,10 +31,11 @@ HTTP_RESP_HEADER_REQUEST_ID = 'x-openstack-request-id'
class RequestIdMiddleware(base.Middleware):
- def process_request(self, req):
- self.req_id = context.generate_request_id()
- req.environ[ENV_REQUEST_ID] = self.req_id
-
- def process_response(self, response):
- response.headers.add(HTTP_RESP_HEADER_REQUEST_ID, self.req_id)
+ @webob.dec.wsgify
+ def __call__(self, req):
+ req_id = context.generate_request_id()
+ req.environ[ENV_REQUEST_ID] = req_id
+ response = req.get_response(self.application)
+ if HTTP_RESP_HEADER_REQUEST_ID not in response.headers:
+ response.headers.add(HTTP_RESP_HEADER_REQUEST_ID, req_id)
return response