11d6ccbb67
There is a bug in request-id middleware that a subsequent API request will overwrite a request-id of a previous request when multiple API calls are processed in parallel in request_id middleware. This commit imports the fix in oslo. cherry-picked from oslo-incubator d7bd9dc37ac3d6bc171cd2e290c772633ad20a32 Closes-Bug: #1289696 ---- 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: Ic20047f604394f1ce4900c3b6a00595223804cba
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
# Copyright (c) 2013 NEC Corporation
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
"""Middleware that ensures request ID.
|
|
|
|
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 neutron.openstack.common import context
|
|
from neutron.openstack.common.middleware import base
|
|
|
|
|
|
ENV_REQUEST_ID = 'openstack.request_id'
|
|
HTTP_RESP_HEADER_REQUEST_ID = 'x-openstack-request-id'
|
|
|
|
|
|
class RequestIdMiddleware(base.Middleware):
|
|
|
|
@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
|