)]}'
{"test/unit/common/middleware/test_except.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"c2c4b98a435d232a8dec74876a0ac6946f9877e8","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.assertEqual(self.logger.txn_id, None)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        def start_response(status, headers, exc_info\u003dNone):"},{"line_number":72,"context_line":"            self.assertTrue(\u0027X-Trans-Id\u0027 in (x[0] for x in headers))"},{"line_number":73,"context_line":"            hdict \u003d dict(headers)"},{"line_number":74,"context_line":"            self.assertEqual(hdict[\u0027X-OpenStack-Request-Id\u0027],"},{"line_number":75,"context_line":"                             hdict[\u0027X-Trans-Id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_2386bf65","line":72,"updated":"2016-10-18 03:52:41.000000000","message":"For completness sake, we are doing a header check for X-Trans-Id and  although I agree if they both match below, it must also exist in the headers, but its better to thorough:\n\n  hdict \u003d dict(headers)\n  for header in (\u0027X-Trans-Id\u0027, \u0027X-Openstack-Request-Id\u0027):\n      self.assertIn(header, hdict)\n\n  self.assertEqual(hdict[\u0027X-OpenStack-Request-Id\u0027],\n                   hdict[\u0027X-Trans-Id\u0027])\n\nThen there is also the benefit of correcting the assertTrue to be a more specific assert.\n\nThe same can be said of the others below too. Although maybe it\u0027ll be smarter to break out the start_reponse into a helper method so we don\u0027t have so much repeating going on:\n\n  def self._start_response(self, status, headers, exc_info\u003dNone:\n    ...\n\n\n  def test_trans_id_header_pass(self):\n      ...\n      app(req.environ, self._start_response)\n\nSomething like http://paste.openstack.org/show/586090/","commit_id":"c5f50a0822b3b21f9696418d8d903d471dd67e39"},{"author":{"_account_id":23861,"name":"Karen Chan","email":"karen@karen-chan.com","username":"karenc"},"change_message_id":"673a4a718b774930db00046853aca27e1646ec5b","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.assertEqual(self.logger.txn_id, None)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        def start_response(status, headers, exc_info\u003dNone):"},{"line_number":72,"context_line":"            self.assertTrue(\u0027X-Trans-Id\u0027 in (x[0] for x in headers))"},{"line_number":73,"context_line":"            hdict \u003d dict(headers)"},{"line_number":74,"context_line":"            self.assertEqual(hdict[\u0027X-OpenStack-Request-Id\u0027],"},{"line_number":75,"context_line":"                             hdict[\u0027X-Trans-Id\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa6399be_59be43d5","line":72,"in_reply_to":"fa6399be_2386bf65","updated":"2016-10-18 08:00:33.000000000","message":"I agree.  I have thought about it when I made this change.","commit_id":"c5f50a0822b3b21f9696418d8d903d471dd67e39"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"72f40a39acaafd5a1e5cfe0a7b8e218b42f2fd81","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.logger \u003d get_logger({})"},{"line_number":57,"context_line":"        self.logger.txn_id \u003d None"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def assert_request_ids("},{"line_number":60,"context_line":"            self, keys\u003d(\u0027X-Trans-Id\u0027, \u0027X-OpenStack-Request-Id\u0027)):"},{"line_number":61,"context_line":"        def inner(status, headers, *args):"},{"line_number":62,"context_line":"            hdict \u003d dict(headers)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6895a0_e7ff4eff","line":59,"updated":"2016-10-24 00:44:54.000000000","message":"Do we need this extra layer of indirection? Would it be better to have start_response() take a keys kwarg?","commit_id":"a8190374f7e281176b077a083732b0a08e2f6848"},{"author":{"_account_id":23861,"name":"Karen Chan","email":"karen@karen-chan.com","username":"karenc"},"change_message_id":"589704265310b23bcc1a76a17138abf0425b7aff","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        self.logger \u003d get_logger({})"},{"line_number":57,"context_line":"        self.logger.txn_id \u003d None"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def assert_request_ids("},{"line_number":60,"context_line":"            self, keys\u003d(\u0027X-Trans-Id\u0027, \u0027X-OpenStack-Request-Id\u0027)):"},{"line_number":61,"context_line":"        def inner(status, headers, *args):"},{"line_number":62,"context_line":"            hdict \u003d dict(headers)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_47fe2639","line":59,"in_reply_to":"da6895a0_e7ff4eff","updated":"2016-10-31 02:43:06.000000000","message":"I guess I went a bit too far, we don\u0027t really need this extra layer of indirection.  I\u0027ll update this.","commit_id":"a8190374f7e281176b077a083732b0a08e2f6848"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"72f40a39acaafd5a1e5cfe0a7b8e218b42f2fd81","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        app \u003d catch_errors.CatchErrorMiddleware(FakeApp(True), {})"},{"line_number":93,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"},{"line_number":94,"context_line":"        # Pass in the request id keys because X-OpenStack-Request-Id got"},{"line_number":95,"context_line":"        # changed to X-Openstack-Request-Id by HeaderKeyDict"},{"line_number":96,"context_line":"        assert_func \u003d self.assert_request_ids("},{"line_number":97,"context_line":"            keys\u003d(\u0027X-Trans-Id\u0027, \u0027X-Openstack-Request-Id\u0027))"},{"line_number":98,"context_line":"        app(req.environ, start_response(assert_func))"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6895a0_c402480b","line":95,"updated":"2016-10-24 00:44:54.000000000","message":"So how does it come out in practice? Can we assert the\n\n X-Openstack-Request-Id\n\ncase everywhere? Given that headers are *supposed* to be case-insensitive, should we just use X-Openstack-Request-Id everywhere, even when adding to the response headers in catch_errors.py?","commit_id":"a8190374f7e281176b077a083732b0a08e2f6848"},{"author":{"_account_id":23861,"name":"Karen Chan","email":"karen@karen-chan.com","username":"karenc"},"change_message_id":"589704265310b23bcc1a76a17138abf0425b7aff","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        app \u003d catch_errors.CatchErrorMiddleware(FakeApp(True), {})"},{"line_number":93,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"},{"line_number":94,"context_line":"        # Pass in the request id keys because X-OpenStack-Request-Id got"},{"line_number":95,"context_line":"        # changed to X-Openstack-Request-Id by HeaderKeyDict"},{"line_number":96,"context_line":"        assert_func \u003d self.assert_request_ids("},{"line_number":97,"context_line":"            keys\u003d(\u0027X-Trans-Id\u0027, \u0027X-Openstack-Request-Id\u0027))"},{"line_number":98,"context_line":"        app(req.environ, start_response(assert_func))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba5da102_a7ee2289","line":95,"in_reply_to":"da6895a0_c402480b","updated":"2016-10-31 02:43:06.000000000","message":"It\u0027s probably better to use \"X-Openstack-Request-Id\" if headers are supposed to be case-insensitive.  Makes everything simpler :D","commit_id":"a8190374f7e281176b077a083732b0a08e2f6848"}]}
