)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"04d627af34431a9665bf1b89b48a9da2af45c466","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"60aad1f5_96059b12","updated":"2023-07-06 21:11:06.000000000","message":"i think i see some issues on py2; which might not matter too much\n\ncalling generate txn id during the module import is wrong tho\n\neach time you repeat your request with curl you should get a different txn-id","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9829957b_c1abf97d","updated":"2023-07-10 18:17:59.000000000","message":"yup, this probably works\n\nI think the implementation might be more obvious if we only set txn-id on the logger on the way out\n\nI think the functest could be better if we moved it somewhere else\nI think the unittest could be better if we had some stronger asserts on the desirable behavior \"txn_id is in log line\" vs \"the magic attribute is not None\"","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"1ea68cdb_6b31c161","updated":"2023-07-24 18:43:35.000000000","message":"This got updated while I was reviewing but I think there is still a gap in the test coverage for the common case (i.e. the server.app.logger handles the log_message call)","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88ba67599e470b63c0ba33b383d5c58675e51d11","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"fb93b252_2e830240","updated":"2023-07-25 09:38:40.000000000","message":"I *think* the problem is that html is not a thing under py2 but is made available by the futures module. swift does not install futures, but the test requirements do (AFAICT stestr requires futures)...so the unit test virtualenvs will have stestr and therefore futures, so \u0027import html\u0027 works.\n\nI\u0027m still not sure why the probe test env doesn\u0027t have futures installed, BUT a production swift installation won\u0027t have futures so \u0027import html\u0027 will fail.\n\n```\n(junk-2.7) (acoles) ~/0dev/openstack/swift{review/ashwin_a_nair/bad-req-txn,-,+} % pyenv activate swift-2.7\npyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT\u003d1\u0027 to simulate the behavior.\n(swift-2.7) (acoles) ~/0dev/openstack/swift{review/ashwin_a_nair/bad-req-txn,-,+} % pipdeptree -r -p future\nWarning!!! Possibly conflicting dependencies found:\n* keystonemiddleware\u003d\u003d9.5.0\n - keystoneauth1 [required: \u003e\u003d3.12.0, installed: 3.4.0]\n* oslo.cache\u003d\u003d1.38.1\n - six [required: \u003e\u003d1.11.0, installed: 1.10.0]\n* oslo.config\u003d\u003d7.0.0\n - requests [required: \u003e\u003d2.18.0, installed: 2.14.2]\n* oslo.log\u003d\u003d3.45.2\n - six [required: \u003e\u003d1.11.0, installed: 1.10.0]\n* pytest-cov\u003d\u003d2.12.1\n - coverage [required: \u003e\u003d5.2.1, installed: 5.0.4]\n* python-barbicanclient\u003d\u003d5.5.0\n - keystoneauth1 [required: \u003e\u003d5.1.1, installed: 3.4.0]\n------------------------------------------------------------------------\nWarning!! Cyclic dependencies found:\n* testtools \u003d\u003e fixtures \u003d\u003e testtools\n* fixtures \u003d\u003e testtools \u003d\u003e fixtures\n------------------------------------------------------------------------\nfuture\u003d\u003d0.18.3\n  - stestr\u003d\u003d2.6.0 [requires: future]\n  ```\n  \n Workarounds? https://python-future.org/compatible_idioms.html?highlight\u003dfile#html-escaping-and-entities\n \n or, given we already have a `if six.PY2/else\u0027 clause:\n \n ```\n diff --git a/swift/common/http_protocol.py b/swift/common/http_protocol.py\nindex fd03974b2..28e281ae9 100644\n--- a/swift/common/http_protocol.py\n+++ b/swift/common/http_protocol.py\n@@ -12,7 +12,6 @@\n # implied.\n # See the License for the specific language governing permissions and\n # limitations under the License.\n-import html\n\n from eventlet import wsgi, websocket\n import six\n@@ -23,8 +22,10 @@ from swift.common.http import HTTP_NO_CONTENT, HTTP_RESET_CONTENT, \\\n\n if six.PY2:\n     from eventlet.green import httplib as http_client\n+    from cgi import escape\n else:\n     from eventlet.green.http import client as http_client\n+    from html import escape\n\n\n class SwiftHttpProtocol(wsgi.HttpProtocol):\n@@ -300,8 +301,8 @@ class SwiftHttpProtocol(wsgi.HttpProtocol):\n             # (see bug #1100201)\n             content \u003d (self.error_message_format % {\n                 \u0027code\u0027: code,\n-                \u0027message\u0027: html.escape(message, quote\u003dFalse),\n-                \u0027explain\u0027: html.escape(explain, quote\u003dFalse)\n+                \u0027message\u0027: escape(message, quote\u003dFalse),\n+                \u0027explain\u0027: escape(explain, quote\u003dFalse)\n             })\n             body \u003d content.encode(\u0027UTF-8\u0027, \u0027replace\u0027)\n             self.send_header(\"Content-Type\", self.error_content_type)\n             ```\n             \nAFAICT py2 cgi.parse is identical to py3 html.parse","commit_id":"6736e94f9c2830cd2db0547905faec896ff91f06"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"532eb4e7fd31b4d4def24c65db6f685cbc680ae2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"80200f09_5da52fe4","updated":"2023-07-25 08:37:51.000000000","message":"The probe test is failing with \n```\n_____________ ERROR collecting test/probe/test_account_failures.py _____________\nImportError while importing test module \u0027/home/zuul/src/opendev.org/openstack/swift/test/probe/test_account_failures.py\u0027.\nHint: make sure your test modules/packages have valid Python names.\nTraceback:\ntest/probe/test_account_failures.py:21: in \u003cmodule\u003e\n    from swift.common import direct_client\nswift/common/direct_client.py:32: in \u003cmodule\u003e\n    from swift.common.request_helpers import USE_REPLICATION_NETWORK_HEADER, \\\nswift/common/request_helpers.py:43: in \u003cmodule\u003e\n    from swift.common.wsgi import make_subrequest\nswift/common/wsgi.py:40: in \u003cmodule\u003e\n    from swift.common.http_protocol import SwiftHttpProtocol, \\\nswift/common/http_protocol.py:15: in \u003cmodule\u003e\n    import html\nE   ImportError: No module named html\n```\n\nwhich is weird because the py2.7 unit tests pass, so it seems the html package is not installed in the probe test env","commit_id":"6736e94f9c2830cd2db0547905faec896ff91f06"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ce3252d0c982e9f0ec05d22877c0f7bc379997b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"385ab73a_a4c90f9b","updated":"2023-07-28 16:13:21.000000000","message":"I don\u0027t think I understand all the missing attribute handling; what do you think about doing the logging in one place and always including the txn-id?\n\n\t(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one/swift$ git diff\n\tdiff --git a/swift/common/http_protocol.py b/swift/common/http_protocol.py\n\tindex 28e281ae9..917be4f23 100644\n\t--- a/swift/common/http_protocol.py\n\t+++ b/swift/common/http_protocol.py\n\t@@ -278,13 +278,12 @@ class SwiftHttpProtocol(wsgi.HttpProtocol):\n\t\t except AttributeError:\n\t\t     # turns out we don\u0027t have a LogAdapter, so go direct\n\t\t     txn_id \u003d generate_trans_id(\u0027\u0027)\n\t-            self.log_error(\"code %d, message %s, transaction_id %s\", code,\n\t-                           message, txn_id)\n\t\t else:\n\t\t     # we do have a LogAdapter, but likely not yet a txn_id\n\t\t     txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)\n\t\t     self.server.app.logger.txn_id \u003d txn_id\n\t-            self.log_error(\"code %d, message %s\", code, message)\n\t+        self.log_error(\"code %d, message %s, transaction_id %s\", code,\n\t+                        message, txn_id)\n\t\t self.send_response(code, message)\n\t\t self.send_header(\u0027Connection\u0027, \u0027close\u0027)\n\t \n\tdiff --git a/test/unit/common/test_http_protocol.py b/test/unit/common/test_http_protocol.py\n\tindex 637e8b830..d770531b3 100644\n\t--- a/test/unit/common/test_http_protocol.py\n\t+++ b/test/unit/common/test_http_protocol.py\n\t@@ -279,17 +279,10 @@ class TestSwiftHttpProtocolSomeMore(ProtocolTest):\n\t\t self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])\n\t\t self.assertIn(b\"X-Trans-Id: test-trans-id\", lines[6])\n\t\t self.assertIn(b\"X-Openstack-Request-Id: test-trans-id\", lines[7])\n\t-        # debug_logger doesn\u0027t add txn_id to the log message :\u0027(\n\t\t self.assertIn(\n\t-            \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027)\",\n\t-            app_logger.get_lines_for_level(\u0027error\u0027))\n\t-        # but we can at least assert that the logger txn_id was set\n\t-        self.assertEqual(\u0027test-trans-id\u0027, app_logger.txn_id)\n\t-        # the app logged this, server logger not used...\n\t-        self.assertNotIn(\n\t\t     \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027),\"\n\t\t     \" transaction_id test-trans-id\",\n\t-            self.logger.get_lines_for_level(\u0027info\u0027))\n\t+            app_logger.get_lines_for_level(\u0027error\u0027))\n\t \n\t     def test_leading_slashes(self):\n\t\t bytes_out \u003d self._run_bytes_through_protocol((","commit_id":"2e6039ecaf41671d769b766d29f5361dc980c9b6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"6c0958c9_e21f8dfb","updated":"2023-08-07 20:58:48.000000000","message":"I think I get it, and I\u0027m on board with the idea. I don\u0027t love inlining even more of the base HTTP handling, but it seems inevitable that we\u0027re going to need to own more of that stack. Aside from the txn id stuff, the inlining looks pretty spot-on from https://github.com/python/cpython/blob/main/Lib/http/server.py / https://github.com/python/cpython/blob/2.7/Lib/BaseHTTPServer.py","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd5e1fb54c4266538bd4ab639bcc7f1fc636e517","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"d45c2fb0_285d77c8","updated":"2023-08-09 21:37:15.000000000","message":"test failures look legit\n\nE       AssertionError: \"ERROR WSGI: code 400, message Invalid PROXY line \u0027GET /someurl HTTP/1.0\\\\r\\\\n\u0027, transaction_id test-bad-req-trans-id\" !\u003d \"ERROR WSGI: code 400, message Invalid PROXY line \u0027GET /someurl HTTP/1.0\\\\r\\\\n\u0027, (txn_id: test-bad-req-trans-id)\"\n\nAnd the pep8 errors too","commit_id":"cf90dbcdfd9e584d076f64d80b98e9e0546d7ce4"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"f14145da_5684fabf","in_reply_to":"d45c2fb0_285d77c8","updated":"2023-08-17 15:43:03.000000000","message":"Ahh my mistake, when I changed the inline-error statement from transaction_id -\u003e (txn_id: \u003cvalue\u003e), i forgot to refactor the asserts i had in test_http_protocol.py","commit_id":"cf90dbcdfd9e584d076f64d80b98e9e0546d7ce4"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"981c8bd2f10f404fdaeb94f2d99b69dc89ba0f6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"d331ba29_2674809b","updated":"2023-08-11 08:03:58.000000000","message":"@Ashwin could you resolve all the comments that have been addressed so we can see what\u0027s left? I think there\u0027s a few from Tim that may still need addressing.","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"784d5a98b45867ee09f8edd880f005420dfcac0a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"5f589bb9_c8699686","updated":"2023-08-10 20:09:28.000000000","message":"grenade failed trying to create a computer security group:","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":39,"id":"74be3ba0_0da32621","updated":"2023-08-21 15:27:14.000000000","message":"there\u0027s an extra assert in one of the tests that\u0027s annoying me, and some extra code and test cruft that\u0027s not helpful as best I can tell.\n\n... but I think this change is otherwise correct and complete:\n\n\tvagrant@saio:~$ telnet saio 8080\n\tTrying 127.0.2.1...\n\tConnected to saio.\n\tEscape character is \u0027^]\u0027.\n\tGET /bad url\n\tHTTP/1.1 400 Bad request version (\u0027url\u0027)\n\tServer: BaseHTTP/0.6 Python/3.10.12\n\tDate: Mon, 21 Aug 2023 15:23:07 GMT\n\tConnection: close\n\tContent-Type: text/html;charset\u003dutf-8\n\tContent-Length: 476\n\tX-Trans-Id: txeec3c8a80b9d42a4a9c0f-0064e3815b\n\tX-Openstack-Request-Id: txeec3c8a80b9d42a4a9c0f-0064e3815b\n\n\t\u003c!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n\t\t\"http://www.w3.org/TR/html4/strict.dtd\"\u003e\n\t\u003chtml\u003e\n\t    \u003chead\u003e\n\t\t\u003cmeta http-equiv\u003d\"Content-Type\" content\u003d\"text/html;charset\u003dutf-8\"\u003e\n\t\t\u003ctitle\u003eError response\u003c/title\u003e\n\t    \u003c/head\u003e\n\t    \u003cbody\u003e\n\t\t\u003ch1\u003eError response\u003c/h1\u003e\n\t\t\u003cp\u003eError code: 400\u003c/p\u003e\n\t\t\u003cp\u003eMessage: Bad request version (\u0027url\u0027).\u003c/p\u003e\n\t\t\u003cp\u003eError code explanation: 400 - Bad request syntax or unsupported method.\u003c/p\u003e\n\t    \u003c/body\u003e\n\t\u003c/html\u003e\n\tConnection closed by foreign host.\n\tvagrant@saio:~$ grep txeec3c8a80b9d42a4a9c0f-0064e3815b /var/log/syslog\n\tAug 21 15:23:07 saio proxy-server: ERROR WSGI: code 400, message Bad request version (\u0027url\u0027) (txn: txeec3c8a80b9d42a4a9c0f-0064e3815b)\n\tvagrant@saio:~$","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52d2866ef24425eea4b0cb0b407653329548f2dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"b31a8184_8c5596d5","updated":"2023-08-30 01:04:35.000000000","message":"I think inline implementation of send_error is sufficient - does the job\nI think the unit tests are really good - very thorough\nI think the func test is a nice to have, but the current code actually passes on master already because it\u0027s testing a different code path (post http_protocol parsing) - maybe could be improved https://review.opendev.org/c/openstack/swift/+/893119\n\nI\u0027m not really personally that motivated at the moment to try and clean up the log_message/log_error and the server.app.logger mess; but after digging a bit I DO think it could be done - mostly it would just take a bunch of updates in unit tests to make test_http_protocol not cut so many corners.","commit_id":"7b39698d0dfb463c376c7e799711a66431a24641"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f23821a4c2803802aab6837b2e72b925bb309885","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"0a9e7b7d_5e79f057","updated":"2023-08-30 17:50:17.000000000","message":"OK, the logger stuff still feels like a bit of a mess, but I don\u0027t think it\u0027s really made any *worse* by this change. Any clean up in there should probably happen as a separate change. Long-term, I think `SwiftHttpProtocol` should probably be a stand-alone class. Other patches to consider when we start down that route:\n\n- https://review.opendev.org/c/openstack/swift/+/799866\n- https://review.opendev.org/c/openstack/swift/+/866934","commit_id":"7b39698d0dfb463c376c7e799711a66431a24641"}],"swift/common/http_protocol.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"04d627af34431a9665bf1b89b48a9da2af45c466","unresolved":true,"context_lines":[{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"import html"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from eventlet import wsgi, websocket"},{"line_number":18,"context_line":"import six"}],"source_content_type":"text/x-python","patch_set":1,"id":"131683f7_e53f475a","line":15,"updated":"2023-07-06 21:11:06.000000000","message":"this is used by the code we inline.  send_error makes an html body and properly escaple the text it embeds to the dom","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"# implied."},{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":"import html"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from eventlet import wsgi, websocket"},{"line_number":18,"context_line":"import six"}],"source_content_type":"text/x-python","patch_set":1,"id":"8bb4d0f9_603849da","line":15,"in_reply_to":"131683f7_e53f475a","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"04d627af34431a9665bf1b89b48a9da2af45c466","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SwiftHttpProtocol(wsgi.HttpProtocol):"},{"line_number":29,"context_line":"    default_request_version \u003d \"HTTP/1.0\""},{"line_number":30,"context_line":"    txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":33,"context_line":"        # See https://github.com/eventlet/eventlet/pull/590"}],"source_content_type":"text/x-python","patch_set":1,"id":"e8246db2_fa92ab2e","line":30,"updated":"2023-07-06 21:11:06.000000000","message":"uh, no that would be done only once - when the module is imported - we need to generate a new trans id for every request.","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class SwiftHttpProtocol(wsgi.HttpProtocol):"},{"line_number":29,"context_line":"    default_request_version \u003d \"HTTP/1.0\""},{"line_number":30,"context_line":"    txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":33,"context_line":"        # See https://github.com/eventlet/eventlet/pull/590"}],"source_content_type":"text/x-python","patch_set":1,"id":"1de476b9_67cbd9dc","line":30,"in_reply_to":"e8246db2_fa92ab2e","updated":"2023-07-24 18:13:06.000000000","message":"I only used generate_trans_id once in to assign the class variable txn_id, if you look try re-running the curl request it should generate a single transaction_id both for the response body and in the logging after i plumbed the LogAdapter.","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"04d627af34431a9665bf1b89b48a9da2af45c466","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        txn_id \u003d self.txn_id"},{"line_number":51,"context_line":"        if logger:"},{"line_number":52,"context_line":"            logger.error(\u0027ERROR WSGI: \u0027 + f, *a)"},{"line_number":53,"context_line":"            logger.error(txn_id)"},{"line_number":54,"context_line":"        else:"},{"line_number":55,"context_line":"            # eventlet\u003c\u003d0.17.4 doesn\u0027t have an error method, and in newer"},{"line_number":56,"context_line":"            # versions the output from error is same as info anyway"}],"source_content_type":"text/x-python","patch_set":1,"id":"c97460ba_147e8936","line":53,"updated":"2023-07-06 21:11:06.000000000","message":"if this is a swift adapted logger there should be a way to set the txn_id attribute such that the thread local storage will automatically annotate all log messages with the current request/greenthreads txn-id\n\nI think there\u0027s a @setattr somewhere in common.utils - maybe example usage in catch errors?","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        txn_id \u003d self.txn_id"},{"line_number":51,"context_line":"        if logger:"},{"line_number":52,"context_line":"            logger.error(\u0027ERROR WSGI: \u0027 + f, *a)"},{"line_number":53,"context_line":"            logger.error(txn_id)"},{"line_number":54,"context_line":"        else:"},{"line_number":55,"context_line":"            # eventlet\u003c\u003d0.17.4 doesn\u0027t have an error method, and in newer"},{"line_number":56,"context_line":"            # versions the output from error is same as info anyway"}],"source_content_type":"text/x-python","patch_set":1,"id":"618ab366_73e359f8","line":53,"in_reply_to":"c97460ba_147e8936","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"04d627af34431a9665bf1b89b48a9da2af45c466","unresolved":true,"context_lines":[{"line_number":55,"context_line":"            # eventlet\u003c\u003d0.17.4 doesn\u0027t have an error method, and in newer"},{"line_number":56,"context_line":"            # versions the output from error is same as info anyway"},{"line_number":57,"context_line":"            self.server.log.info(\u0027ERROR WSGI: \u0027 + f, *a)"},{"line_number":58,"context_line":"            self.server.log.info(txn_id)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    class MessageClass(wsgi.HttpProtocol.MessageClass):"},{"line_number":61,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"ca5186cd_7fe8baba","line":58,"updated":"2023-07-06 21:11:06.000000000","message":"i don\u0027t think we should log the txn_id on a line by itself.","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            # eventlet\u003c\u003d0.17.4 doesn\u0027t have an error method, and in newer"},{"line_number":56,"context_line":"            # versions the output from error is same as info anyway"},{"line_number":57,"context_line":"            self.server.log.info(\u0027ERROR WSGI: \u0027 + f, *a)"},{"line_number":58,"context_line":"            self.server.log.info(txn_id)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    class MessageClass(wsgi.HttpProtocol.MessageClass):"},{"line_number":61,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":1,"id":"e3899b7c_7659a457","line":58,"in_reply_to":"ca5186cd_7fe8baba","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"04d627af34431a9665bf1b89b48a9da2af45c466","unresolved":true,"context_lines":[{"line_number":292,"context_line":"        if (code \u003e\u003d 200 and"},{"line_number":293,"context_line":"                code not in (HTTPStatus.NO_CONTENT,"},{"line_number":294,"context_line":"                             HTTPStatus.RESET_CONTENT,"},{"line_number":295,"context_line":"                             HTTPStatus.NOT_MODIFIED)):"},{"line_number":296,"context_line":"            # HTML encode to prevent Cross Site Scripting attacks"},{"line_number":297,"context_line":"            # (see bug #1100201)"},{"line_number":298,"context_line":"            content \u003d (self.error_message_format % {"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf00fe2d_1faa1296","line":295,"updated":"2023-07-06 21:11:06.000000000","message":"so does HTTPStatus just name error on py2?","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":292,"context_line":"        if (code \u003e\u003d 200 and"},{"line_number":293,"context_line":"                code not in (HTTPStatus.NO_CONTENT,"},{"line_number":294,"context_line":"                             HTTPStatus.RESET_CONTENT,"},{"line_number":295,"context_line":"                             HTTPStatus.NOT_MODIFIED)):"},{"line_number":296,"context_line":"            # HTML encode to prevent Cross Site Scripting attacks"},{"line_number":297,"context_line":"            # (see bug #1100201)"},{"line_number":298,"context_line":"            content \u003d (self.error_message_format % {"}],"source_content_type":"text/x-python","patch_set":1,"id":"0dd943cd_8b2355d2","line":295,"in_reply_to":"0b546ba3_eb07ecab","updated":"2023-07-21 11:45:50.000000000","message":"```\n/Users/acoles/.pyenv/versions/swift-2.7/bin/python /Applications/PyCharm CE.app/Contents/plugins/python-ce/helpers/pycharm/_jb_pytest_runner.py --target test_http_protocol.py::TestSwiftHttpProtocolSomeMore.test_bad_request -- --jb-show-summary \nTesting started at 12:16 ...\nLaunching pytest with arguments test_http_protocol.py::TestSwiftHttpProtocolSomeMore::test_bad_request in /Users/acoles/0dev/openstack/swift/test/unit/common\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d test session starts \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nplatform darwin -- Python 2.7.18, pytest-4.6.11, py-1.11.0, pluggy-0.13.1 -- /Users/acoles/.pyenv/versions/swift-2.7/bin/python\ncachedir: .pytest_cache\nrootdir: /Users/acoles/0dev/openstack/swift, inifile: tox.ini\nplugins: cov-2.12.1\ncollecting ... collected 1 item\n\ntest_http_protocol.py::TestSwiftHttpProtocolSomeMore::test_bad_request FAILED [100%]\ntest/unit/common/test_http_protocol.py:232 (TestSwiftHttpProtocolSomeMore.test_bad_request)\nself \u003d \u003ctest.unit.common.test_http_protocol.TestSwiftHttpProtocolSomeMore testMethod\u003dtest_bad_request\u003e\n\n    def test_bad_request(self):\n        bytes_out \u003d self._run_bytes_through_protocol((\n\u003e           b\"ONLY-METHOD\\r\\n\"\n            b\"Server: example.com\\r\\n\"\n            b\"\\r\\n\"\n        ))\n\ntest_http_protocol.py:235: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \ntest_http_protocol.py:146: in _run_bytes_through_protocol\n    log_output\u003dFalse,  # quiet the test run\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:1006: in server\n    (pool.spawn(serv.process_request, connection)\ntest_http_protocol.py:114: in spawn\n    a_callable(*args, **kwargs)\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:837: in process_request\n    proto.__init__(conn_state, self)\n../../../swift/common/http_protocol.py:36: in __init__\n    wsgi.HttpProtocol.__init__(self, *args, **kwargs)\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:350: in __init__\n    self.handle()\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:383: in handle\n    self.handle_one_request()\n../../../swift/common/http_protocol.py:243: in handle_one_request\n    got \u003d wsgi.HttpProtocol.handle_one_request(self)\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:424: in handle_one_request\n    if not self.parse_request():\n../../../swift/common/http_protocol.py:131: in parse_request\n    \"Bad request syntax (%r)\" % requestline)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself \u003d \u003cswift.common.http_protocol.SwiftHttpProtocol instance at 0x106605c48\u003e\ncode \u003d 400, message \u003d \"Bad request syntax (\u0027ONLY-METHOD\u0027)\"\nexplain \u003d \u0027Bad request syntax or unsupported method\u0027\n\n    def send_error(self, code, message\u003dNone, explain\u003dNone):\n        \"\"\"Send and log an error reply.\n    \n        Arguments are\n        * code:    an HTTP error code\n                   3 digits\n        * message: a simple optional 1 line reason phrase.\n                   *( HTAB / SP / VCHAR / %x80-FF )\n                   defaults to short entry matching the response code\n        * explain: a detailed message defaults to the long entry\n                   matching the response code.\n    \n        This sends an error response (so it must be called before any\n        output has been generated), logs the error, and finally sends\n        a piece of HTML explaining the error to the user.\n    \n        \"\"\"\n    \n        try:\n            shortmsg, longmsg \u003d self.responses[code]\n        except KeyError:\n            shortmsg, longmsg \u003d \u0027???\u0027, \u0027???\u0027\n        if message is None:\n            message \u003d shortmsg\n        if explain is None:\n            explain \u003d longmsg\n    \n        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)\n        self.log_error(\"code %d, message %s\", code, message)\n        self.send_response(code, message)\n        self.send_header(\u0027Connection\u0027, \u0027close\u0027)\n    \n        # Message body is omitted for cases described in:\n        #  - RFC7230: 3.3. 1xx, 204(No Content), 304(Not Modified)\n        #  - RFC7231: 6.3.6. 205(Reset Content)\n        body \u003d None\n        if (code \u003e\u003d 200 and\n\u003e               code not in (HTTPStatus.NO_CONTENT,\n                             HTTPStatus.RESET_CONTENT,\n                             HTTPStatus.NOT_MODIFIED)):\nE                            NameError: global name \u0027HTTPStatus\u0027 is not defined\n\n../../../swift/common/http_protocol.py:287: NameError\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d FAILURES \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n________________ TestSwiftHttpProtocolSomeMore.test_bad_request ________________\n\nself \u003d \u003ctest.unit.common.test_http_protocol.TestSwiftHttpProtocolSomeMore testMethod\u003dtest_bad_request\u003e\n\n    def test_bad_request(self):\n        bytes_out \u003d self._run_bytes_through_protocol((\n\u003e           b\"ONLY-METHOD\\r\\n\"\n            b\"Server: example.com\\r\\n\"\n            b\"\\r\\n\"\n        ))\n\ntest_http_protocol.py:235: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \ntest_http_protocol.py:146: in _run_bytes_through_protocol\n    log_output\u003dFalse,  # quiet the test run\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:1006: in server\n    (pool.spawn(serv.process_request, connection)\ntest_http_protocol.py:114: in spawn\n    a_callable(*args, **kwargs)\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:837: in process_request\n    proto.__init__(conn_state, self)\n../../../swift/common/http_protocol.py:36: in __init__\n    wsgi.HttpProtocol.__init__(self, *args, **kwargs)\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:350: in __init__\n    self.handle()\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:383: in handle\n    self.handle_one_request()\n../../../swift/common/http_protocol.py:243: in handle_one_request\n    got \u003d wsgi.HttpProtocol.handle_one_request(self)\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/wsgi.py:424: in handle_one_request\n    if not self.parse_request():\n../../../swift/common/http_protocol.py:131: in parse_request\n    \"Bad request syntax (%r)\" % requestline)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself \u003d \u003cswift.common.http_protocol.SwiftHttpProtocol instance at 0x106605c48\u003e\ncode \u003d 400, message \u003d \"Bad request syntax (\u0027ONLY-METHOD\u0027)\"\nexplain \u003d \u0027Bad request syntax or unsupported method\u0027\n\n    def send_error(self, code, message\u003dNone, explain\u003dNone):\n        \"\"\"Send and log an error reply.\n    \n        Arguments are\n        * code:    an HTTP error code\n                   3 digits\n        * message: a simple optional 1 line reason phrase.\n                   *( HTAB / SP / VCHAR / %x80-FF )\n                   defaults to short entry matching the response code\n        * explain: a detailed message defaults to the long entry\n                   matching the response code.\n    \n        This sends an error response (so it must be called before any\n        output has been generated), logs the error, and finally sends\n        a piece of HTML explaining the error to the user.\n    \n        \"\"\"\n    \n        try:\n            shortmsg, longmsg \u003d self.responses[code]\n        except KeyError:\n            shortmsg, longmsg \u003d \u0027???\u0027, \u0027???\u0027\n        if message is None:\n            message \u003d shortmsg\n        if explain is None:\n            explain \u003d longmsg\n    \n        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)\n        self.log_error(\"code %d, message %s\", code, message)\n        self.send_response(code, message)\n        self.send_header(\u0027Connection\u0027, \u0027close\u0027)\n    \n        # Message body is omitted for cases described in:\n        #  - RFC7230: 3.3. 1xx, 204(No Content), 304(Not Modified)\n        #  - RFC7231: 6.3.6. 205(Reset Content)\n        body \u003d None\n        if (code \u003e\u003d 200 and\n\u003e               code not in (HTTPStatus.NO_CONTENT,\n                             HTTPStatus.RESET_CONTENT,\n                             HTTPStatus.NOT_MODIFIED)):\nE                            NameError: global name \u0027HTTPStatus\u0027 is not defined\n\n../../../swift/common/http_protocol.py:287: NameError\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d warnings summary \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n/Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/__init__.py:8\n  /Users/acoles/.pyenv/versions/swift-2.7/lib/python2.7/site-packages/eventlet/__init__.py:8: DeprecationWarning: Support for your Python version is deprecated and will be removed in the future\n    DeprecationWarning,\n\n-- Docs: https://docs.pytest.org/en/latest/warnings.html\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 1 failed, 1 warnings in 0.32 seconds \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nProcess finished with exit code 1\n\n\n\n\n\n\n```","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        if (code \u003e\u003d 200 and"},{"line_number":293,"context_line":"                code not in (HTTPStatus.NO_CONTENT,"},{"line_number":294,"context_line":"                             HTTPStatus.RESET_CONTENT,"},{"line_number":295,"context_line":"                             HTTPStatus.NOT_MODIFIED)):"},{"line_number":296,"context_line":"            # HTML encode to prevent Cross Site Scripting attacks"},{"line_number":297,"context_line":"            # (see bug #1100201)"},{"line_number":298,"context_line":"            content \u003d (self.error_message_format % {"}],"source_content_type":"text/x-python","patch_set":1,"id":"abc262c7_3982f5f5","line":295,"in_reply_to":"0dd943cd_8b2355d2","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        if (code \u003e\u003d 200 and"},{"line_number":293,"context_line":"                code not in (HTTPStatus.NO_CONTENT,"},{"line_number":294,"context_line":"                             HTTPStatus.RESET_CONTENT,"},{"line_number":295,"context_line":"                             HTTPStatus.NOT_MODIFIED)):"},{"line_number":296,"context_line":"            # HTML encode to prevent Cross Site Scripting attacks"},{"line_number":297,"context_line":"            # (see bug #1100201)"},{"line_number":298,"context_line":"            content \u003d (self.error_message_format % {"}],"source_content_type":"text/x-python","patch_set":1,"id":"b40af5d4_f1726386","line":295,"in_reply_to":"0dd943cd_8b2355d2","updated":"2023-07-24 18:43:35.000000000","message":"Done","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":292,"context_line":"        if (code \u003e\u003d 200 and"},{"line_number":293,"context_line":"                code not in (HTTPStatus.NO_CONTENT,"},{"line_number":294,"context_line":"                             HTTPStatus.RESET_CONTENT,"},{"line_number":295,"context_line":"                             HTTPStatus.NOT_MODIFIED)):"},{"line_number":296,"context_line":"            # HTML encode to prevent Cross Site Scripting attacks"},{"line_number":297,"context_line":"            # (see bug #1100201)"},{"line_number":298,"context_line":"            content \u003d (self.error_message_format % {"}],"source_content_type":"text/x-python","patch_set":1,"id":"0b546ba3_eb07ecab","line":295,"in_reply_to":"bf00fe2d_1faa1296","updated":"2023-07-10 18:17:59.000000000","message":"I\u0027m still confused about how this name gets defined under py2 - you only import for py3","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"04d627af34431a9665bf1b89b48a9da2af45c466","unresolved":true,"context_lines":[{"line_number":306,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":307,"context_line":"            if code \u003e\u003d 400:"},{"line_number":308,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, trans_id)"},{"line_number":309,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, trans_id)"},{"line_number":310,"context_line":"        self.end_headers()"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        if self.command !\u003d \u0027HEAD\u0027 and body:"}],"source_content_type":"text/x-python","patch_set":1,"id":"edf48558_1777dea9","line":309,"updated":"2023-07-06 21:11:06.000000000","message":"I think what i\u0027d do is three-fold\n\n1) don\u0027t plumb in trans_id as a kwarg\n2) generate the trans_id right here - when we need to send it as a header\n3) always send a trans_id on any response coming out of send_error; these http protocol failures are of the few/only places the proxy application can send a response to a client before we\u0027ve had a chance to run any middleware.","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":306,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":307,"context_line":"            if code \u003e\u003d 400:"},{"line_number":308,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, trans_id)"},{"line_number":309,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, trans_id)"},{"line_number":310,"context_line":"        self.end_headers()"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        if self.command !\u003d \u0027HEAD\u0027 and body:"}],"source_content_type":"text/x-python","patch_set":1,"id":"8f80c3a4_2fab13ac","line":309,"in_reply_to":"edf48558_1777dea9","updated":"2023-07-21 11:45:50.000000000","message":"+1","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":306,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":307,"context_line":"            if code \u003e\u003d 400:"},{"line_number":308,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, trans_id)"},{"line_number":309,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, trans_id)"},{"line_number":310,"context_line":"        self.end_headers()"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        if self.command !\u003d \u0027HEAD\u0027 and body:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c4ce0be1_9189e23a","line":309,"in_reply_to":"edf48558_1777dea9","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"a4b2a90f4fc03557749a17d3420510d3e34ecb2d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":32,"context_line":"        # See https://github.com/eventlet/eventlet/pull/590"},{"line_number":33,"context_line":"        self.trans_id_suffix \u003d \u0027\u0027"},{"line_number":34,"context_line":"        self.pre_shutdown_bugfix_eventlet \u003d not getattr("},{"line_number":35,"context_line":"            websocket.WebSocketWSGI, \u0027_WSGI_APP_ALWAYS_IDLE\u0027, None)"},{"line_number":36,"context_line":"        # Note this is not a new-style class, so super() won\u0027t work"}],"source_content_type":"text/x-python","patch_set":6,"id":"c9d68884_fb5432e1","line":33,"updated":"2023-07-10 18:17:59.000000000","message":"instance attributes are not the most obvious place for constants; afaik we don\u0027t ever change this value.\n\nFWIW the python runtime probably makes the empty string a singleton, so there may not be any actual allocation going on here.\n\n\t\u003e\u003e\u003e x \u003d \u0027\u0027\n\t\u003e\u003e\u003e y \u003d \u0027\u0027\n\t\u003e\u003e\u003e x is y\n\tTrue\n\n\t\u003e\u003e\u003e x \u003d \u0027asdf\u0027 * 2048\n\t\u003e\u003e\u003e y \u003d \u0027asdf\u0027 * 2048\n\t\u003e\u003e\u003e x is y\n\tFalse\n\t\u003e\u003e\u003e x \u003d\u003d y\n\tTrue\n\n... but creating a \"new\" string for every instance when the string is equivilent is not a good pattern (and relying some fancy implementation details to avoid needless inefficieny seems like cheating)\n\nOTOH, we probalby only ever have one HttpProtocol per worker, so ... if you have some good reason to put it here that might be fine; but, the most obvious place for a constant string (of any length) is at the module level.","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":32,"context_line":"        # See https://github.com/eventlet/eventlet/pull/590"},{"line_number":33,"context_line":"        self.trans_id_suffix \u003d \u0027\u0027"},{"line_number":34,"context_line":"        self.pre_shutdown_bugfix_eventlet \u003d not getattr("},{"line_number":35,"context_line":"            websocket.WebSocketWSGI, \u0027_WSGI_APP_ALWAYS_IDLE\u0027, None)"},{"line_number":36,"context_line":"        # Note this is not a new-style class, so super() won\u0027t work"}],"source_content_type":"text/x-python","patch_set":6,"id":"e11e0d4c_ea877b51","line":33,"in_reply_to":"c9d68884_fb5432e1","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        self.close_connection \u003d True"},{"line_number":86,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":87,"context_line":"        trans_id_suffix \u003d self.trans_id_suffix"},{"line_number":88,"context_line":"        trans_id \u003d generate_trans_id(trans_id_suffix)"},{"line_number":89,"context_line":"        logger.txn_id \u003d trans_id"},{"line_number":90,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":91,"context_line":"        if not six.PY2:"}],"source_content_type":"text/x-python","patch_set":6,"id":"67fa1818_eadbde55","line":88,"updated":"2023-07-10 18:17:59.000000000","message":"I don\u0027t think the trans_id_suffix temporary variable buys us much; you could probably just say:\n\n    trans_id \u003d logger.txn_id \u003d generate_trans_id(\u0027\u0027)\n    \nI know it may seem trivial and it probably is; but i\u0027ve been conditioned so percieve needless verbosity as a \"code smell\", and brevity without sacrificing clarity as a virtuous ideal - https://blog.codinghorror.com/the-best-code-is-no-code-at-all/","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        self.close_connection \u003d True"},{"line_number":86,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":87,"context_line":"        trans_id_suffix \u003d self.trans_id_suffix"},{"line_number":88,"context_line":"        trans_id \u003d generate_trans_id(trans_id_suffix)"},{"line_number":89,"context_line":"        logger.txn_id \u003d trans_id"},{"line_number":90,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":91,"context_line":"        if not six.PY2:"}],"source_content_type":"text/x-python","patch_set":6,"id":"181a12f5_63d9a251","line":88,"in_reply_to":"67fa1818_eadbde55","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":86,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":87,"context_line":"        trans_id_suffix \u003d self.trans_id_suffix"},{"line_number":88,"context_line":"        trans_id \u003d generate_trans_id(trans_id_suffix)"},{"line_number":89,"context_line":"        logger.txn_id \u003d trans_id"},{"line_number":90,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":91,"context_line":"        if not six.PY2:"},{"line_number":92,"context_line":"            requestline \u003d requestline.decode(\u0027iso-8859-1\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"64426bf7_28fbc6c5","line":89,"updated":"2023-07-10 18:17:59.000000000","message":"hrm... so this is always setting the txn_id on the logger - as soon as we start parsing the request\n\nis there any logging that actually happens in this method?  I\u0027m worried about the happy path downstream.  If we continue from here we could have a request who\u0027s logs have one txn_id to start, but then we get into the middleware pipeline and the same request gets assigned a NEW txn_id - is that possible?","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":87,"context_line":"        trans_id_suffix \u003d self.trans_id_suffix"},{"line_number":88,"context_line":"        trans_id \u003d generate_trans_id(trans_id_suffix)"},{"line_number":89,"context_line":"        logger.txn_id \u003d trans_id"},{"line_number":90,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":91,"context_line":"        if not six.PY2:"},{"line_number":92,"context_line":"            requestline \u003d requestline.decode(\u0027iso-8859-1\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"4a05a318_4184294f","line":89,"in_reply_to":"64426bf7_28fbc6c5","updated":"2023-07-24 18:13:06.000000000","message":"That is not possible, since the 4xx path for this request never goes through assignation for the logger\u0027s transaction id since we catch an exception in parse_request at which point after logging the error, the code exits!","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        # Split off \\x20 explicitly (see https://bugs.python.org/issue33973)"},{"line_number":96,"context_line":"        words \u003d requestline.split(\u0027 \u0027)"},{"line_number":97,"context_line":"        if len(words) \u003d\u003d 0:"},{"line_number":98,"context_line":"            return False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        if len(words) \u003e\u003d 3:  # Enough to determine protocol version"},{"line_number":101,"context_line":"            version \u003d words[-1]"}],"source_content_type":"text/x-python","patch_set":6,"id":"d3376f47_ccce1318","line":98,"updated":"2023-07-10 18:17:59.000000000","message":"there\u0027s definately some ways out of this method that don\u0027t log - but I don\u0027t see the call site in our subclass, so it\u0027s not obvious to me if they eventually run through send_error or some other teardown","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        # Split off \\x20 explicitly (see https://bugs.python.org/issue33973)"},{"line_number":96,"context_line":"        words \u003d requestline.split(\u0027 \u0027)"},{"line_number":97,"context_line":"        if len(words) \u003d\u003d 0:"},{"line_number":98,"context_line":"            return False"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        if len(words) \u003e\u003d 3:  # Enough to determine protocol version"},{"line_number":101,"context_line":"            version \u003d words[-1]"}],"source_content_type":"text/x-python","patch_set":6,"id":"0f555f93_863969a4","line":98,"in_reply_to":"d3376f47_ccce1318","updated":"2023-07-24 18:13:06.000000000","message":"When parse_request returns False in that specific condition, we have the logger waiting to append a transaction id to log the request since this happens in the beginning of of handling the request.\n\nThe only paths we hadn\u0027t have txn-id logging coverage for which we do presently are the paths where we have exceptions raised in \"parse_request\"","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":278,"context_line":"            explain \u003d longmsg"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":281,"context_line":"        self.log_error(\"code %d, message %s\", code, message)"},{"line_number":282,"context_line":"        self.send_response(code, message)"},{"line_number":283,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7b9c3cd2_5e8aa130","line":281,"updated":"2023-07-10 18:17:59.000000000","message":"it\u0027s going to be really nice to have a txn_id on this log message!\n\nI think it\u0027d be more obvious if you set the logger attribute right here.","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            explain \u003d longmsg"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":281,"context_line":"        self.log_error(\"code %d, message %s\", code, message)"},{"line_number":282,"context_line":"        self.send_response(code, message)"},{"line_number":283,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7ba89c83_d9074332","line":281,"in_reply_to":"5ff741fb_99ce5d4e","updated":"2023-07-24 18:43:35.000000000","message":"Done","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            explain \u003d longmsg"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":281,"context_line":"        self.log_error(\"code %d, message %s\", code, message)"},{"line_number":282,"context_line":"        self.send_response(code, message)"},{"line_number":283,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"b3a7c07d_b1bd5def","line":281,"in_reply_to":"7b9c3cd2_5e8aa130","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":278,"context_line":"            explain \u003d longmsg"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":281,"context_line":"        self.log_error(\"code %d, message %s\", code, message)"},{"line_number":282,"context_line":"        self.send_response(code, message)"},{"line_number":283,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5ff741fb_99ce5d4e","line":281,"in_reply_to":"7b9c3cd2_5e8aa130","updated":"2023-07-21 11:45:50.000000000","message":"I\u0027m concerned about the assumption that self.server.app will always have a logger attribute (typically it does because it will be the catch_errors middleware, but that is not mandated), and then the assumption that the logger will have txn_id property (typically it does because it\u0027s a utils.LogAdapter instance, but it may not).\n\nSo, re-using the LogAdapter txn_id thread local to take advantage of the log formatting is a nice idea, but not 100% reliable. We at least need to handle non-existence of logger and logger.txn_id with try/except - much like log_message does.\n\nBut, for this very targeted case, would it be sufficient to just explicitly add the transaction id to the log message that is passed to log_error? or at least have that as a fallback.\n\nJust an example, there\u0027s perhaps a better way to code it:\n\n```\ntry:\n    # assume we have a LogAdapter\n    txn_id \u003d self.server.app.logger.txn_id  # just in case it was set\nexcept AttributeError:\n    # turns out we don\u0027t have a LogAdapter, so go direct\n    txn_id \u003d generate_trans_id(\u0027\u0027)\n    self.log_error(\"code %d, message %s, transaction_id %s\", code, message, txn_id)\nelse:\n    # we do have a LogAdapter, but likely not yet a txn_id\n    txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)\n    self.server.app.logger.txn_id \u003d txn_id\n    self.log_error(\"code %d, message %s\", code, message)\n```","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":301,"context_line":"            self.send_header(\"Content-Type\", self.error_content_type)"},{"line_number":302,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":303,"context_line":"            if code \u003e\u003d 400:"},{"line_number":304,"context_line":"                trans_id \u003d logger.txn_id"},{"line_number":305,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, trans_id)"},{"line_number":306,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, trans_id)"},{"line_number":307,"context_line":"        self.end_headers()"}],"source_content_type":"text/x-python","patch_set":6,"id":"afc8eabf_d62764b0","line":304,"updated":"2023-07-10 18:17:59.000000000","message":"this is a pretty clever trick; pulling the txn_id off the logger\n\nif you generate the txn_id in this method you don\u0027t have use the logger\u0027s thread-local storage for message passing.","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":301,"context_line":"            self.send_header(\"Content-Type\", self.error_content_type)"},{"line_number":302,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":303,"context_line":"            if code \u003e\u003d 400:"},{"line_number":304,"context_line":"                trans_id \u003d logger.txn_id"},{"line_number":305,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, trans_id)"},{"line_number":306,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, trans_id)"},{"line_number":307,"context_line":"        self.end_headers()"}],"source_content_type":"text/x-python","patch_set":6,"id":"c027e1e2_1c16e740","line":304,"in_reply_to":"afc8eabf_d62764b0","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":56,"context_line":"    class MessageClass(wsgi.HttpProtocol.MessageClass):"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        Subclass to see when the client didn\u0027t provide a Content-Type"},{"line_number":59,"context_line":"        \"\"\""},{"line_number":60,"context_line":"        # for py2:"},{"line_number":61,"context_line":"        def parsetype(self):"},{"line_number":62,"context_line":"            if self.typeheader is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"54ae6cbb_d4ddda8d","line":59,"updated":"2023-07-21 11:45:50.000000000","message":"nit: +1 for fixing to use double-quotes, but strictly the quotes should remain on the same line for a one-liner docstring https://docs.openstack.org/swift/latest/development_guidelines.html#documentation-guidelines","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    class MessageClass(wsgi.HttpProtocol.MessageClass):"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        Subclass to see when the client didn\u0027t provide a Content-Type"},{"line_number":59,"context_line":"        \"\"\""},{"line_number":60,"context_line":"        # for py2:"},{"line_number":61,"context_line":"        def parsetype(self):"},{"line_number":62,"context_line":"            if self.typeheader is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7fbb0417_51cdc3c7","line":59,"in_reply_to":"54ae6cbb_d4ddda8d","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    class MessageClass(wsgi.HttpProtocol.MessageClass):"},{"line_number":57,"context_line":"        \"\"\""},{"line_number":58,"context_line":"        Subclass to see when the client didn\u0027t provide a Content-Type"},{"line_number":59,"context_line":"        \"\"\""},{"line_number":60,"context_line":"        # for py2:"},{"line_number":61,"context_line":"        def parsetype(self):"},{"line_number":62,"context_line":"            if self.typeheader is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"0bf42cd9_7d8247bb","line":59,"in_reply_to":"54ae6cbb_d4ddda8d","updated":"2023-07-24 18:43:35.000000000","message":"Done","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # for py3:"},{"line_number":67,"context_line":"        def get_default_type(self):"},{"line_number":68,"context_line":"            \u0027\u0027\u0027If the client didn\u0027t provide a content type, leave it blank.\u0027\u0027\u0027"},{"line_number":69,"context_line":"            return \u0027\u0027"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def parse_request(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"b5fbf32b_9044e072","line":68,"updated":"2023-07-21 11:45:50.000000000","message":"nit: this one needs fixing to use double-quotes too if you get chance","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # for py3:"},{"line_number":67,"context_line":"        def get_default_type(self):"},{"line_number":68,"context_line":"            \u0027\u0027\u0027If the client didn\u0027t provide a content type, leave it blank.\u0027\u0027\u0027"},{"line_number":69,"context_line":"            return \u0027\u0027"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def parse_request(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"e1734dac_5b5cf20c","line":68,"in_reply_to":"b5fbf32b_9044e072","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        # for py3:"},{"line_number":67,"context_line":"        def get_default_type(self):"},{"line_number":68,"context_line":"            \u0027\u0027\u0027If the client didn\u0027t provide a content type, leave it blank.\u0027\u0027\u0027"},{"line_number":69,"context_line":"            return \u0027\u0027"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def parse_request(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"077ae5a5_65e0d0c9","line":68,"in_reply_to":"b5fbf32b_9044e072","updated":"2023-07-24 18:43:35.000000000","message":"Done","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":83,"context_line":"        self.request_version \u003d version \u003d self.default_request_version"},{"line_number":84,"context_line":"        self.close_connection \u003d True"},{"line_number":85,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":86,"context_line":"        logger.txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":87,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":88,"context_line":"        if not six.PY2:"},{"line_number":89,"context_line":"            requestline \u003d requestline.decode(\u0027iso-8859-1\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"b7468c84_f80a07a1","line":86,"updated":"2023-07-21 11:45:50.000000000","message":"you\u0027ve allowed the getattr to return a default of \u0027None\u0027 for logger but then assumed it will never be None - lots of tests blow up here because logger is None\n\nBut (I think Clay is saying this later...) we don\u0027t need to generate and set txn_id here, we only need it later in send_error","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.request_version \u003d version \u003d self.default_request_version"},{"line_number":84,"context_line":"        self.close_connection \u003d True"},{"line_number":85,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":86,"context_line":"        logger.txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":87,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":88,"context_line":"        if not six.PY2:"},{"line_number":89,"context_line":"            requestline \u003d requestline.decode(\u0027iso-8859-1\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"0cc23b1b_8a4c2101","line":86,"in_reply_to":"b7468c84_f80a07a1","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.request_version \u003d version \u003d self.default_request_version"},{"line_number":84,"context_line":"        self.close_connection \u003d True"},{"line_number":85,"context_line":"        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)"},{"line_number":86,"context_line":"        logger.txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":87,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":88,"context_line":"        if not six.PY2:"},{"line_number":89,"context_line":"            requestline \u003d requestline.decode(\u0027iso-8859-1\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9c19b054_6e244ed1","line":86,"in_reply_to":"b7468c84_f80a07a1","updated":"2023-07-24 18:43:35.000000000","message":"Done","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":247,"context_line":"                self.conn_state[2] \u003d wsgi.STATE_IDLE"},{"line_number":248,"context_line":"        return got"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def send_error(self, code, message\u003dNone, explain\u003dNone):"},{"line_number":251,"context_line":"        \"\"\"Send and log an error reply."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        Arguments are"}],"source_content_type":"text/x-python","patch_set":11,"id":"13cc9480_905933b9","line":250,"updated":"2023-07-21 11:45:50.000000000","message":"It would be really helpful to have a comment (in code or docstring) that this is overriding the superclass send_error, and *why*","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                self.conn_state[2] \u003d wsgi.STATE_IDLE"},{"line_number":248,"context_line":"        return got"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def send_error(self, code, message\u003dNone, explain\u003dNone):"},{"line_number":251,"context_line":"        \"\"\"Send and log an error reply."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        Arguments are"}],"source_content_type":"text/x-python","patch_set":11,"id":"580a2889_6ce5d16e","line":250,"in_reply_to":"13cc9480_905933b9","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                self.conn_state[2] \u003d wsgi.STATE_IDLE"},{"line_number":248,"context_line":"        return got"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def send_error(self, code, message\u003dNone, explain\u003dNone):"},{"line_number":251,"context_line":"        \"\"\"Send and log an error reply."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"        Arguments are"}],"source_content_type":"text/x-python","patch_set":11,"id":"00e7fa4e_3e6257a9","line":250,"in_reply_to":"13cc9480_905933b9","updated":"2023-07-24 18:43:35.000000000","message":"Done","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":263,"context_line":"        output has been generated), logs the error, and finally sends"},{"line_number":264,"context_line":"        a piece of HTML explaining the error to the user."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        \"\"\""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        try:"},{"line_number":269,"context_line":"            shortmsg, longmsg \u003d self.responses[code]"}],"source_content_type":"text/x-python","patch_set":11,"id":"e94400eb_0faf24d8","line":266,"updated":"2023-07-21 11:45:50.000000000","message":"nit: please use the sphinx directives for docstring (yes, the code is copied in, but we own it now)\n\nsee swift/common/http.py for examples\nsee https://docs.openstack.org/swift/latest/development_guidelines.html#documentation-guidelines\n\ne.g.:\n\n```\n:param code: An HTTP error code\n:param message: etc...\n```","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        output has been generated), logs the error, and finally sends"},{"line_number":264,"context_line":"        a piece of HTML explaining the error to the user."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        \"\"\""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        try:"},{"line_number":269,"context_line":"            shortmsg, longmsg \u003d self.responses[code]"}],"source_content_type":"text/x-python","patch_set":11,"id":"485a0524_d8ade0b1","line":266,"in_reply_to":"e94400eb_0faf24d8","updated":"2023-07-24 18:43:35.000000000","message":"Done","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        output has been generated), logs the error, and finally sends"},{"line_number":264,"context_line":"        a piece of HTML explaining the error to the user."},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        \"\"\""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        try:"},{"line_number":269,"context_line":"            shortmsg, longmsg \u003d self.responses[code]"}],"source_content_type":"text/x-python","patch_set":11,"id":"4ac9d633_a49bffff","line":266,"in_reply_to":"e94400eb_0faf24d8","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"a97c6f40eacd89df1c647bb726759c72518449e7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def send_error(self, code, message\u003dNone, explain\u003dNone):"},{"line_number":249,"context_line":"        \"\"\"Send and log an error reply, we are overriding the cpython parent"},{"line_number":250,"context_line":"        class method, so we can have logger generate txn_id\u0027s for error response"},{"line_number":251,"context_line":"        from wsgi since we are at the edge of the proxy server. This sends an"},{"line_number":252,"context_line":"        error response (so it must be called before any output has been"},{"line_number":253,"context_line":"        generated), logs the error, and finally sends a piece of HTML explaining"}],"source_content_type":"text/x-python","patch_set":19,"id":"084ba37e_c47a96fe","line":250,"in_reply_to":"240bdacb_3142ac1a","updated":"2023-07-24 18:13:06.000000000","message":"\u003e pep8: E501 line too long (80 \u003e 79 characters)\n\nPlease fix.","commit_id":"93a5b55f8bd24a2b10698b31ef4956e04146a947"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        class method, so we can have logger generate txn_id\u0027s for error response"},{"line_number":251,"context_line":"        from wsgi since we are at the edge of the proxy server. This sends an"},{"line_number":252,"context_line":"        error response (so it must be called before any output has been"},{"line_number":253,"context_line":"        generated), logs the error, and finally sends a piece of HTML explaining"},{"line_number":254,"context_line":"         the error to the user."},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        :param code:    an HTTP error code"}],"source_content_type":"text/x-python","patch_set":19,"id":"91d29181_9d2f2ecd","line":253,"in_reply_to":"fcabd84d_d9836e5c","updated":"2023-07-24 18:13:06.000000000","message":"\u003e pep8: E501 line too long (80 \u003e 79 characters)\n\nPlease fix.","commit_id":"93a5b55f8bd24a2b10698b31ef4956e04146a947"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":true,"context_lines":[{"line_number":280,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":281,"context_line":"                           message, txn_id)"},{"line_number":282,"context_line":"        else:"},{"line_number":283,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":284,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":285,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":286,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":25,"id":"0a15c375_69cd927a","line":283,"updated":"2023-07-24 18:43:35.000000000","message":"test_http_protocol does not cover this case (the common case)\n\nsee my follow on patch for suggestion to add an app to the logger (both with and without txn_id attribute)","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ce3252d0c982e9f0ec05d22877c0f7bc379997b","unresolved":true,"context_lines":[{"line_number":280,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":281,"context_line":"                           message, txn_id)"},{"line_number":282,"context_line":"        else:"},{"line_number":283,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":284,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":285,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":286,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":25,"id":"cccb9443_a28c9060","line":283,"in_reply_to":"0a15c375_69cd927a","updated":"2023-07-28 16:13:21.000000000","message":"for me when I introduce an error here I get a failure in TestSwiftHttpProtocolSomeMore.test_bad_request_app_logging","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7ca9268af899ab50abf7d6cd1c87401d25a12c2c","unresolved":false,"context_lines":[{"line_number":280,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":281,"context_line":"                           message, txn_id)"},{"line_number":282,"context_line":"        else:"},{"line_number":283,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":284,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":285,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":286,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":25,"id":"0958546d_c2179d70","line":283,"in_reply_to":"cccb9443_a28c9060","updated":"2023-07-31 09:21:16.000000000","message":"that test was added after my comment (comment is on patchset 25)","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5ce3252d0c982e9f0ec05d22877c0f7bc379997b","unresolved":true,"context_lines":[{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"30ea06ea_41db9c77","line":287,"updated":"2023-07-28 16:13:21.000000000","message":"why don\u0027t we include the txn-id here?","commit_id":"2e6039ecaf41671d769b766d29f5361dc980c9b6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7ca9268af899ab50abf7d6cd1c87401d25a12c2c","unresolved":true,"context_lines":[{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"ec80cd05_e0fbc0a0","line":287,"in_reply_to":"30ea06ea_41db9c77","updated":"2023-07-31 09:21:16.000000000","message":"This case (the common case) uses the thread local to pass the txn_id to the logging.\n\nWe could not try to be smart, and just always add the txn_id directly to the log message (like the except clause), but I figured we ought to check if the thread locals already has a txn_id (unexpected but defensive), and having done that check then we know if there is a LogAdapter so may as well use it and benefit from uniform log formatting.","commit_id":"2e6039ecaf41671d769b766d29f5361dc980c9b6"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"d4fe13a1_a8bbdbd4","line":287,"in_reply_to":"ec80cd05_e0fbc0a0","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"2e6039ecaf41671d769b766d29f5361dc980c9b6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7804ff4f_b557995e","line":287,"in_reply_to":"ec80cd05_e0fbc0a0","updated":"2023-08-10 10:53:59.000000000","message":"Done","commit_id":"2e6039ecaf41671d769b766d29f5361dc980c9b6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33f2b91b79fb18cb631b1cee304f045c92b982be","unresolved":true,"context_lines":[{"line_number":345,"context_line":"        # ourselves and our gateway proxy before processing the client"},{"line_number":346,"context_line":"        # protocol request.  Hopefully the operator will know what to do!"},{"line_number":347,"context_line":"        msg \u003d \u0027Invalid PROXY line %r\u0027 % connection_line"},{"line_number":348,"context_line":"        self.log_message(msg)"},{"line_number":349,"context_line":"        # Even assuming HTTP we don\u0027t even known what version of HTTP the"},{"line_number":350,"context_line":"        # client is sending?  This entire endeavor seems questionable."},{"line_number":351,"context_line":"        self.request_version \u003d self.default_request_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"eb785d87_8b27edcd","line":348,"updated":"2023-08-03 12:48:54.000000000","message":"I didn\u0027t notice this in earlier reviews, but now that send_error() is logging the msg (with a transaction id) do we still need this log_meesage call ? Seems like some of the tests are telling us that there are now 2 log lines emitted for errors in this class?","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":345,"context_line":"        # ourselves and our gateway proxy before processing the client"},{"line_number":346,"context_line":"        # protocol request.  Hopefully the operator will know what to do!"},{"line_number":347,"context_line":"        msg \u003d \u0027Invalid PROXY line %r\u0027 % connection_line"},{"line_number":348,"context_line":"        self.log_message(msg)"},{"line_number":349,"context_line":"        # Even assuming HTTP we don\u0027t even known what version of HTTP the"},{"line_number":350,"context_line":"        # client is sending?  This entire endeavor seems questionable."},{"line_number":351,"context_line":"        self.request_version \u003d self.default_request_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"d6188393_dd10c8eb","line":348,"in_reply_to":"93b8e7be_0c9e9268","updated":"2023-08-21 15:27:14.000000000","message":"I don\u0027t want to log the same information twice if we don\u0027t have to.  \n\nBut I\u0027m not seeing any double logging (anymore?)\n\n\tAug 21 15:21:08 saio proxy-server: STDERR: (26589) wsgi starting up on http://0.0.0.0:8080\n\tAug 21 15:22:47 saio proxy-server: STDERR: (26589) accepted (\u0027127.0.0.1\u0027, 46740)\n\tAug 21 15:23:07 saio proxy-server: ERROR WSGI: code 400, message Bad request version (\u0027url\u0027) (txn: txeec3c8a80b9d42a4a9c0f-0064e3815b)","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"1476a2c0b4d0051137c1619d60a3012f4391deb2","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        # ourselves and our gateway proxy before processing the client"},{"line_number":346,"context_line":"        # protocol request.  Hopefully the operator will know what to do!"},{"line_number":347,"context_line":"        msg \u003d \u0027Invalid PROXY line %r\u0027 % connection_line"},{"line_number":348,"context_line":"        self.log_message(msg)"},{"line_number":349,"context_line":"        # Even assuming HTTP we don\u0027t even known what version of HTTP the"},{"line_number":350,"context_line":"        # client is sending?  This entire endeavor seems questionable."},{"line_number":351,"context_line":"        self.request_version \u003d self.default_request_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"e97cbdba_505b2fe7","line":348,"in_reply_to":"d6188393_dd10c8eb","updated":"2023-08-21 23:11:53.000000000","message":"Yes I was able to change that behavior and eliminate duplicate log lines with https://review.opendev.org/c/openstack/swift/+/887904/34/swift/common/http_protocol.py#b274","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        # ourselves and our gateway proxy before processing the client"},{"line_number":346,"context_line":"        # protocol request.  Hopefully the operator will know what to do!"},{"line_number":347,"context_line":"        msg \u003d \u0027Invalid PROXY line %r\u0027 % connection_line"},{"line_number":348,"context_line":"        self.log_message(msg)"},{"line_number":349,"context_line":"        # Even assuming HTTP we don\u0027t even known what version of HTTP the"},{"line_number":350,"context_line":"        # client is sending?  This entire endeavor seems questionable."},{"line_number":351,"context_line":"        self.request_version \u003d self.default_request_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"bab4b717_25cfbcb6","line":348,"in_reply_to":"eb785d87_8b27edcd","updated":"2023-08-07 20:58:48.000000000","message":"I think that was already the case, but good idea to clean it up.","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        # ourselves and our gateway proxy before processing the client"},{"line_number":346,"context_line":"        # protocol request.  Hopefully the operator will know what to do!"},{"line_number":347,"context_line":"        msg \u003d \u0027Invalid PROXY line %r\u0027 % connection_line"},{"line_number":348,"context_line":"        self.log_message(msg)"},{"line_number":349,"context_line":"        # Even assuming HTTP we don\u0027t even known what version of HTTP the"},{"line_number":350,"context_line":"        # client is sending?  This entire endeavor seems questionable."},{"line_number":351,"context_line":"        self.request_version \u003d self.default_request_version"}],"source_content_type":"text/x-python","patch_set":31,"id":"93b8e7be_0c9e9268","line":348,"in_reply_to":"eb785d87_8b27edcd","updated":"2023-08-17 15:43:03.000000000","message":"Yes that\u0027s what is happening in some of the tests, did you want me to change that behavior ?","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":277,"context_line":"            txn_id \u003d self.server.app.logger.txn_id  # just in case it was set"},{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"bb2f8f56_9f5cba68","line":280,"range":{"start_line":280,"start_character":21,"end_line":280,"end_character":38},"updated":"2023-08-07 20:58:48.000000000","message":"Our existing callers are way down in proxy/server.py and all the way out at common/middleware/catch_errors.py -- what do we think about something like assigning the transaction ID early on in the protocol, maybe as part of `get_environ`?\n\nSeparately, we\u0027re not going to respect the `X-Trans-Id-Extra` header if sent?","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":277,"context_line":"            txn_id \u003d self.server.app.logger.txn_id  # just in case it was set"},{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"37dfd2cf_f7c10580","line":280,"range":{"start_line":280,"start_character":21,"end_line":280,"end_character":38},"in_reply_to":"15eceb43_73f300bc","updated":"2023-08-21 15:27:14.000000000","message":"Tim, this sounds like an unrelated comment - both catch-errors and obvious the proxy app will be WAY after parse_request, so is get_environ\n\nBetter x-trans-id-extra handling may be reasonable if it\u0027s easy enough to do - but I think we may not have access to request headers if we failed to parse the incoming request.\n\n@iwc I don\u0027t think i track the \"add an env var\" - not an os.getenv var for sure; I don\u0027t think Tim had a concrete suggestion.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"1476a2c0b4d0051137c1619d60a3012f4391deb2","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            txn_id \u003d self.server.app.logger.txn_id  # just in case it was set"},{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"ad8aba9f_a8754554","line":280,"range":{"start_line":280,"start_character":21,"end_line":280,"end_character":38},"in_reply_to":"37dfd2cf_f7c10580","updated":"2023-08-21 23:11:53.000000000","message":"Ack","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            txn_id \u003d self.server.app.logger.txn_id  # just in case it was set"},{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":34,"id":"15eceb43_73f300bc","line":280,"range":{"start_line":280,"start_character":21,"end_line":280,"end_character":38},"in_reply_to":"bb2f8f56_9f5cba68","updated":"2023-08-17 15:43:03.000000000","message":"I found that out to be a bit tricky since cpython base http handling has been done by parse_request, should i add an env var to the newly introduced send_error(code, message\u003dNone, explain\u003dNone) from https://github.com/python/cpython/blob/main/Lib/http/server.py or do you have any suggestions on how i could ?","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"}],"source_content_type":"text/x-python","patch_set":34,"id":"ae0830a1_7b27d762","line":281,"range":{"start_line":281,"start_character":49,"end_line":281,"end_character":63},"updated":"2023-08-07 20:58:48.000000000","message":"Might want to use the `txn:` convention to help with log parsing, like `code %d, message %s (txn: %s)`","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"}],"source_content_type":"text/x-python","patch_set":34,"id":"06b228e7_f16d0d6c","line":281,"range":{"start_line":281,"start_character":49,"end_line":281,"end_character":63},"in_reply_to":"ae0830a1_7b27d762","updated":"2023-08-17 15:43:03.000000000","message":"I agree that was what i had in the iniital revisions","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":34,"id":"673d4d20_4691a733","line":284,"range":{"start_line":284,"start_character":14,"end_line":284,"end_character":37},"updated":"2023-08-07 20:58:48.000000000","message":"Which logger will it be? Which logger _should_ it be? (Suppose, for example, that each middleware had its own `log_name` defined -- which one should emit the message?)","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52d2866ef24425eea4b0cb0b407653329548f2dc","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7f609a95_978196e2","line":284,"range":{"start_line":284,"start_character":14,"end_line":284,"end_character":37},"in_reply_to":"41a64fa6_15001f12","updated":"2023-08-30 01:04:35.000000000","message":"so looking at these comments further I\u0027m realizing we have a bit of a mess; FWIW log_error just passes through to log_message:\n\n    def log_error(self, format, *args):\n        \"\"\"Log an error.\n\n        This is called when a request cannot be fulfilled.  By\n        default it passes the message on to log_message().\n\n        Arguments are the same as for log_message().\n\n        XXX This should go to the separate error log.\n\n        \"\"\"\n\n        self.log_message(format, *args)\n\nwhich currently means we do the AttributeError dance again.\n\nThe life-cycle on these objects seems to be tied to the request, but the TESTs do some weird stuff:\n\nhttps://github.com/NVIDIA/swift/blob/master/test/unit/common/test_http_protocol.py#L29-L36\n\nSo I tried just making a property:\n\n\tdiff --git a/swift/common/http_protocol.py b/swift/common/http_protocol.py\n\tindex 23716a46c..4d6d892f8 100644\n\t--- a/swift/common/http_protocol.py\n\t+++ b/swift/common/http_protocol.py\n\t@@ -38,6 +38,14 @@ class SwiftHttpProtocol(wsgi.HttpProtocol):\n\t\t # Note this is not a new-style class, so super() won\u0027t work\n\t\t wsgi.HttpProtocol.__init__(self, *args, **kwargs)\n\t \n\t+\n\t+    @property\n\t+    def logger(self):\n\t+        try:\n\t+            return self.server.app._pipeline_request_logging_app.logger\n\t+        except AttributeError:\n\t+            return self.server.log\n\t+\n\t     def log_request(self, *a):\n\t\t \"\"\"\n\t\t Turn off logging requests by the underlying WSGI software.\n\t@@ -48,13 +56,7 @@ class SwiftHttpProtocol(wsgi.HttpProtocol):\n\t\t \"\"\"\n\t\t Redirect logging other messages by the underlying WSGI software.\n\t\t \"\"\"\n\t-        logger \u003d getattr(self.server.app, \u0027logger\u0027, None)\n\t-        if logger:\n\t-            logger.error(\u0027ERROR WSGI: \u0027 + f, *a)\n\t-        else:\n\t-            # eventlet\u003c\u003d0.17.4 doesn\u0027t have an error method, and in newer\n\t-            # versions the output from error is same as info anyway\n\t-            self.server.log.info(\u0027ERROR WSGI: \u0027 + f, *a)\n\t+        self.logger.info(\u0027WSGI: \u0027 + f, *a)\n\t \n\t     class MessageClass(wsgi.HttpProtocol.MessageClass):\n\t\t \"\"\"Subclass to see when the client didn\u0027t provide a Content-Type\"\"\"\n\nbut some of the \"apps\" are just mocks (not real common.wsgi apps created w/ the _pipeline_request_logging_app or _final_app attributes) and the tests seem real particular about that \"log_message should be level info vs error\"\n\nI\u0027m not really sure WHAT we should do.  self.server.app.logger at least follows some prior art in log_message; which is a reasonable place for our abstraction to bottom out - but there\u0027s something smelly about having to do all this dynamic stuff in a class that we\u0027ve inlined so we can have more control.\n\nProbably we should implement log_message as info and log_error as error and have them both always get a self.server.app\u0027s _final_app logger and make sure tests are reasonable.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":34,"id":"77611c75_924cf977","line":284,"range":{"start_line":284,"start_character":14,"end_line":284,"end_character":37},"in_reply_to":"673d4d20_4691a733","updated":"2023-08-10 10:53:59.000000000","message":"@Tim this just mirrors the existing logger de-referencing in log_message. The dance here is necessary to figure out how the txn id will be appended to the message (explicitly or implicitly by the logger).\n\nThinking about it more, log_error passes straight through to log_message, so we could have just called log_message here (which we define in this subclass) and added a kwarg for transaction id, then do this logic in log_message. But that would be deviating more from the original send_error implementation.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":34,"id":"d662648f_2b2a032b","line":284,"range":{"start_line":284,"start_character":14,"end_line":284,"end_character":37},"in_reply_to":"673d4d20_4691a733","updated":"2023-08-17 15:43:03.000000000","message":"When i looked into the cpython code, it seems to print out a sys.stderr, so should it be a SysLogAdapter ?","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f23821a4c2803802aab6837b2e72b925bb309885","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":34,"id":"d5cd39e2_5d808b1f","line":284,"range":{"start_line":284,"start_character":14,"end_line":284,"end_character":37},"in_reply_to":"7f609a95_978196e2","updated":"2023-08-30 17:50:17.000000000","message":"\u003e this just mirrors the existing logger de-referencing in log_message.\n\nIt\u0027s similar, but definitely different -- which makes it harder to grok. Sure, after you\u0027ve stared at it a while and flipped through three different layers of the class hierarchy across three different projects, you can see how that\n```\n            self.server.app.logger.txn_id \u003d txn_id\n            self.log_error(\"code %d, message %s\", code, message)\n```\nties together, but it feels like a bit of a Rube Goldberg machine.\n\n---\n\n\u003e I think Tim is trying to point out that self.server.app is ambiguous in a pipeline\n\nYes, 100%\n\n\u003e it\u0027s probably like gate keeper or catch errors - either of which would be appropriate.\n\nI\u0027m not sold on that yet -- could get squirrelly, particularly if different middlewares have different `log_level` configs, for example. \n\n\u003e It may be worth some effort to ensure self.server has an unambiguously swift compatible logger instance\n\nI think we might already have that, if by \"swift compatible logger\" you mean \"instance of `swift.common.utils.LogAdapter`\". There are three interesting cases I can think of:\n\n- outer-most filter has no logger, or a logger not named \"logger\" -- we pop an `AttributeError` when we drill down to `.logger`\n- outer-most filter has a logger, but it\u0027s not our `LogAdapter` -- we (almost certainly) pop an `AttributeError` when we drill down to `.txn_id`\n- outer-most filter has a `LogAdapter` logger\n\n\u003e I don\u0027t really understand why/how all the middleware objects end up with their own logger.\n\nThey don\u0027t necessarily -- this all comes down to convention, similar to the \"every middleware has a `self.app`\" convention we didn\u0027t like about `pipeline_property`. At least this one only relies on adhering to convention in one place, rather than every middleware in the pipeline.\n\n---\n\n\u003e the tests seem real particular about that \"log_message should be level info vs error\"\n\nOh, ick... https://github.com/openstack/swift/commit/a1cb91993096971934755cae08aa8013c10fc8f9\n\nGiven [our current eventlet requirements](https://github.com/openstack/swift/commit/0ebfeddf65adb473fda2adfd1705534b6308cd2b), I wouldn\u0027t feel bad dropping those tests.\n\n---\n\n\u003e  self.server.app.logger at least follows some prior art in log_message\n\nYes and no. That goes back to when we [introduced PROXY protocol support](https://github.com/openstack/swift/commit/661838d968c163cec716cd5c8bcce9f5c69d18d4) in 2018, but before that we\u0027d be using the logger coming out of `_initrp`/`init_request_processor`. *That* logger would be almost ([but not quite](https://github.com/openstack/swift/blob/661838d968c163cec716cd5c8bcce9f5c69d18d4^/swift/common/wsgi.py#L1035-L1037)) the equivalent of `_pipeline_final_app.logger` today. I was going to say that switching to `self.server.app.logger` was probably an unintentional change and Darrell was just trying to get rid of the monkey-patching, but [in the review](https://review.opendev.org/c/openstack/swift/+/373563) Clay [definitely noticed](https://review.opendev.org/c/openstack/swift/+/373563/1/swift/common/wsgi.py#b411):\n\n\u003e so really, *this* logger *instance* is not the same logger instance we access from self.server.app.logger in log_message above\n\nand even [suggested a way around it](https://review.opendev.org/c/openstack/swift/+/373563/1..11/swift/common/wsgi.py#b477) that sounds pretty similar to the property diff\n\n\u003e maybe right here just go ahead and set the logger as a class attribute?\n```\nprotocol_class._swift_logger \u003d logger\n```\n\u003eThen use it in log_message?\n```\nself._swift_logger.error(\u0027WSGI ERROR ...)\n```\n\nThe `_initrp` logger was some *old* prior art, too -- we can trace it back to https://github.com/openstack/swift/commit/c5f6275c45fcbb8e508b2a48c9782e8e025d2d79 -- but since that predates [pulling proxy-logging out as middleware](https://github.com/openstack/swift/commit/7c98e7a6259a64b4971bf1035c1bb99278ee8590), I\u0027m not sure how much that should really push us towards `_pipeline_final_app.logger` vs `_pipeline_request_logging_app.logger`\n\nMaybe we *do* want to go back to the `_initrp` logger -- I kinda like the idea of using mostly the proxy-app\u0027s logging config, but with an explicit `log_route\u003d\u0027wsgi\u0027`...","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, transaction_id %s\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"}],"source_content_type":"text/x-python","patch_set":34,"id":"41a64fa6_15001f12","line":284,"range":{"start_line":284,"start_character":14,"end_line":284,"end_character":37},"in_reply_to":"d662648f_2b2a032b","updated":"2023-08-21 15:27:14.000000000","message":"I think Tim is trying to point out that self.server.app is ambiguous in a pipeline, it\u0027s probably like gate keeper or catch errors - either of which would be appropriate.\n\nIt may be worth some effort to ensure self.server has an unambiguously swift compatible logger instance; I don\u0027t really understand why/how all the middleware objects end up with their own logger.  I guess I believe in at least some cases some middleware may log with a proxy-server:cmw_log_name sort of programname prefix instead of the expected proxy-server and when logging errors parsing http reqeusts we definately shouldn\u0027t log with an arbitrary/unrelated middleware program name","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        # Message body is omitted for cases described in:"}],"source_content_type":"text/x-python","patch_set":34,"id":"cfc049ec_929849bd","line":288,"updated":"2023-08-07 20:58:48.000000000","message":"So this still goes right into cpython code, right? Which will still add `Date` and `Server` headers.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        # Message body is omitted for cases described in:"}],"source_content_type":"text/x-python","patch_set":34,"id":"a7ed68c1_07ab398b","line":288,"in_reply_to":"6c2fb19c_482a6cf8","updated":"2023-08-21 15:27:14.000000000","message":"I\u0027m not sure Tim was suggesting there\u0027s anything wrong with adding Server/Data headers - although I do note in your example it doesn\u0027t seem like it sent a transaction id header either?  Which I would expect it to given the commit message.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        # Message body is omitted for cases described in:"}],"source_content_type":"text/x-python","patch_set":34,"id":"2efbab79_d0014515","line":288,"in_reply_to":"a7ed68c1_07ab398b","updated":"2023-08-21 23:29:29.000000000","message":"I believe i used that example in my vsaio without using reinstallswift for this patch once i do a reinstallswift and run the curl request again, I get the following result:\n```\nvagrant@vagrant:~/swift$ curl --location \u0027http://saio:8080/auth/v1.0/info asdf\u0027 -v\n*   Trying 192.168.8.80:8080...\n* TCP_NODELAY set\n* Connected to saio (192.168.8.80) port 8080 (#0)\n\u003e GET /auth/v1.0/info asdf HTTP/1.1\n\u003e Host: saio:8080\n\u003e User-Agent: curl/7.68.0\n\u003e Accept: */*\n\u003e\n* Mark bundle as not supporting multiuse\n\u003c HTTP/1.1 400 Bad request syntax (\u0027GET /auth/v1.0/info asdf HTTP/1.1\u0027)\n\u003c Server: BaseHTTP/0.6 Python/3.8.10\n\u003c Date: Mon, 21 Aug 2023 23:26:59 GMT\n\u003c Connection: close\n\u003c Content-Type: text/html;charset\u003dutf-8\n\u003c Content-Length: 505\n\u003c X-Trans-Id: tx93b1ec22fd0146678877f-0064e3f2c3\n\u003c X-Openstack-Request-Id: tx93b1ec22fd0146678877f-0064e3f2c3\n\u003c\n\u003c!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n        \"http://www.w3.org/TR/html4/strict.dtd\"\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003cmeta http-equiv\u003d\"Content-Type\" content\u003d\"text/html;charset\u003dutf-8\"\u003e\n        \u003ctitle\u003eError response\u003c/title\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003ch1\u003eError response\u003c/h1\u003e\n        \u003cp\u003eError code: 400\u003c/p\u003e\n        \u003cp\u003eMessage: Bad request syntax (\u0027GET /auth/v1.0/info asdf HTTP/1.1\u0027).\u003c/p\u003e\n        \u003cp\u003eError code explanation: 400 - Bad request syntax or unsupported method.\u003c/p\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n* Closing connection 0\n```\n\nand also logging emits the following msgs for the request:\n```\nAug 21 23:26:32 vagrant proxy-server: STDERR: (1277902) wsgi starting up on http://0.0.0.0:8080\nAug 21 23:26:59 vagrant proxy-server: STDERR: (1277902) accepted (\u0027192.168.8.80\u0027, 33008)\nAug 21 23:26:59 vagrant proxy-server: ERROR WSGI: code 400, message Bad request syntax (\u0027GET /auth/v1.0/info asdf HTTP/1.1\u0027) (txn: tx93b1ec22fd0146678877f-0064e3f2c3)\n```","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        # Message body is omitted for cases described in:"}],"source_content_type":"text/x-python","patch_set":34,"id":"6c2fb19c_482a6cf8","line":288,"in_reply_to":"cfc049ec_929849bd","updated":"2023-08-17 15:43:03.000000000","message":"It does add both headers, ref: https://github.com/python/cpython/blob/main/Lib/http/server.py#L493. Also an example could be seen below:\n\n```\ncurl --location \u0027http://saio:8080/auth/v1.0/info asdf\u0027 -v\n*   Trying 192.168.8.80:8080...\n* TCP_NODELAY set\n* Connected to saio (192.168.8.80) port 8080 (#0)\n\u003e GET /auth/v1.0/info asdf HTTP/1.1\n\u003e Host: saio:8080\n\u003e User-Agent: curl/7.68.0\n\u003e Accept: */*\n\u003e\n* Mark bundle as not supporting multiuse\n\u003c HTTP/1.1 400 Bad request syntax (\u0027GET /auth/v1.0/info asdf HTTP/1.1\u0027)\n\u003c Server: BaseHTTP/0.6 Python/3.8.10\n\u003c Date: Wed, 09 Aug 2023 16:43:24 GMT\n\u003c Connection: close\n\u003c Content-Type: text/html;charset\u003dutf-8\n\u003c Content-Length: 505\n\u003c\n\u003c!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n        \"http://www.w3.org/TR/html4/strict.dtd\"\u003e\n\u003chtml\u003e\n    \u003chead\u003e\n        \u003cmeta http-equiv\u003d\"Content-Type\" content\u003d\"text/html;charset\u003dutf-8\"\u003e\n        \u003ctitle\u003eError response\u003c/title\u003e\n    \u003c/head\u003e\n    \u003cbody\u003e\n        \u003ch1\u003eError response\u003c/h1\u003e\n        \u003cp\u003eError code: 400\u003c/p\u003e\n        \u003cp\u003eMessage: Bad request syntax (\u0027GET /auth/v1.0/info asdf HTTP/1.1\u0027).\u003c/p\u003e\n        \u003cp\u003eError code explanation: 400 - Bad request syntax or unsupported method.\u003c/p\u003e\n    \u003c/body\u003e\n\u003c/html\u003e\n* Closing connection\n```","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":292,"context_line":"        #  - RFC7230: 3.3. 1xx, 204(No Content), 304(Not Modified)"},{"line_number":293,"context_line":"        #  - RFC7231: 6.3.6. 205(Reset Content)"},{"line_number":294,"context_line":"        body \u003d None"},{"line_number":295,"context_line":"        accept_status \u003d (HTTP_NO_CONTENT,"},{"line_number":296,"context_line":"                         HTTP_RESET_CONTENT,"},{"line_number":297,"context_line":"                         HTTP_NOT_MODIFIED)"},{"line_number":298,"context_line":"        if (code \u003e\u003d 200 and"}],"source_content_type":"text/x-python","patch_set":34,"id":"b57b621f_11f1ceca","line":295,"range":{"start_line":295,"start_character":8,"end_line":295,"end_character":14},"updated":"2023-08-07 20:58:48.000000000","message":"\"except\"? \"exclude\"?","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        #  - RFC7230: 3.3. 1xx, 204(No Content), 304(Not Modified)"},{"line_number":293,"context_line":"        #  - RFC7231: 6.3.6. 205(Reset Content)"},{"line_number":294,"context_line":"        body \u003d None"},{"line_number":295,"context_line":"        accept_status \u003d (HTTP_NO_CONTENT,"},{"line_number":296,"context_line":"                         HTTP_RESET_CONTENT,"},{"line_number":297,"context_line":"                         HTTP_NOT_MODIFIED)"},{"line_number":298,"context_line":"        if (code \u003e\u003d 200 and"}],"source_content_type":"text/x-python","patch_set":34,"id":"857f514e_f936b57a","line":295,"range":{"start_line":295,"start_character":8,"end_line":295,"end_character":14},"in_reply_to":"b57b621f_11f1ceca","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":298,"context_line":"        if (code \u003e\u003d 200 and"},{"line_number":299,"context_line":"                code not in accept_status):"},{"line_number":300,"context_line":"            # HTML encode to prevent Cross Site Scripting attacks"},{"line_number":301,"context_line":"            # (see bug #1100201)"},{"line_number":302,"context_line":"            content \u003d (self.error_message_format % {"},{"line_number":303,"context_line":"                \u0027code\u0027: code,"},{"line_number":304,"context_line":"                \u0027message\u0027: escape(message, quote\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":34,"id":"34056fad_0b4f7714","line":301,"range":{"start_line":301,"start_character":19,"end_line":301,"end_character":31},"updated":"2023-08-07 20:58:48.000000000","message":"Let\u0027s link to https://bugs.python.org/issue1100201 here (or drop the comment) so we don\u0027t find ourselves looking for something on launchpad that doesn\u0027t exist.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        if (code \u003e\u003d 200 and"},{"line_number":299,"context_line":"                code not in accept_status):"},{"line_number":300,"context_line":"            # HTML encode to prevent Cross Site Scripting attacks"},{"line_number":301,"context_line":"            # (see bug #1100201)"},{"line_number":302,"context_line":"            content \u003d (self.error_message_format % {"},{"line_number":303,"context_line":"                \u0027code\u0027: code,"},{"line_number":304,"context_line":"                \u0027message\u0027: escape(message, quote\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":34,"id":"7458fe57_6d383f01","line":301,"range":{"start_line":301,"start_character":19,"end_line":301,"end_character":31},"in_reply_to":"34056fad_0b4f7714","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":307,"context_line":"            body \u003d content.encode(\u0027UTF-8\u0027, \u0027replace\u0027)"},{"line_number":308,"context_line":"            self.send_header(\"Content-Type\", self.error_content_type)"},{"line_number":309,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":310,"context_line":"            if code \u003e\u003d 400:"},{"line_number":311,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, txn_id)"},{"line_number":312,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, txn_id)"},{"line_number":313,"context_line":"        self.end_headers()"}],"source_content_type":"text/x-python","patch_set":34,"id":"c21dd651_5466965b","line":310,"updated":"2023-08-07 20:58:48.000000000","message":"What non-4xx, non-5xx codes do we expect here in `send_error`? Why shouldn\u0027t they get transaction IDs?","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":307,"context_line":"            body \u003d content.encode(\u0027UTF-8\u0027, \u0027replace\u0027)"},{"line_number":308,"context_line":"            self.send_header(\"Content-Type\", self.error_content_type)"},{"line_number":309,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":310,"context_line":"            if code \u003e\u003d 400:"},{"line_number":311,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, txn_id)"},{"line_number":312,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, txn_id)"},{"line_number":313,"context_line":"        self.end_headers()"}],"source_content_type":"text/x-python","patch_set":34,"id":"d43c06fd_39499d5b","line":310,"in_reply_to":"641bebcb_f75b99ca","updated":"2023-08-21 15:27:14.000000000","message":"I understood Tim to be suggesting that we shouldn\u0027t have a conditional statement if the condition is always True or not needed.  I don\u0027t believe this condition is needed and would suggested you remove it.  With this diff:\n\n\tdiff --git a/swift/common/http_protocol.py b/swift/common/http_protocol.py\n\tindex 52cbd3373..23716a46c 100644\n\t--- a/swift/common/http_protocol.py\n\t+++ b/swift/common/http_protocol.py\n\t@@ -307,9 +307,8 @@ class SwiftHttpProtocol(wsgi.HttpProtocol):\n\t\t     body \u003d content.encode(\u0027UTF-8\u0027, \u0027replace\u0027)\n\t\t     self.send_header(\"Content-Type\", self.error_content_type)\n\t\t     self.send_header(\u0027Content-Length\u0027, str(len(body)))\n\t-            if code \u003e\u003d 400:\n\t-                self.send_header(\u0027X-Trans-Id\u0027, txn_id)\n\t-                self.send_header(\u0027X-Openstack-Request-Id\u0027, txn_id)\n\t+            self.send_header(\u0027X-Trans-Id\u0027, txn_id)\n\t+            self.send_header(\u0027X-Openstack-Request-Id\u0027, txn_id)\n\t\t self.end_headers()\n\t \n\t\t if self.command !\u003d \u0027HEAD\u0027 and body:\n\n... `pytest swift/test/unit/common/test_http_protocol.py` still passes on my machine.  Do you have some reason to think this condition is necessary?","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":307,"context_line":"            body \u003d content.encode(\u0027UTF-8\u0027, \u0027replace\u0027)"},{"line_number":308,"context_line":"            self.send_header(\"Content-Type\", self.error_content_type)"},{"line_number":309,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":310,"context_line":"            if code \u003e\u003d 400:"},{"line_number":311,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, txn_id)"},{"line_number":312,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, txn_id)"},{"line_number":313,"context_line":"        self.end_headers()"}],"source_content_type":"text/x-python","patch_set":34,"id":"641bebcb_f75b99ca","line":310,"in_reply_to":"c21dd651_5466965b","updated":"2023-08-17 15:43:03.000000000","message":"I think the problem we were facing was only the 4xx, 5xx codes didn\u0027t have transaction_ids but the other codes did.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":307,"context_line":"            body \u003d content.encode(\u0027UTF-8\u0027, \u0027replace\u0027)"},{"line_number":308,"context_line":"            self.send_header(\"Content-Type\", self.error_content_type)"},{"line_number":309,"context_line":"            self.send_header(\u0027Content-Length\u0027, str(len(body)))"},{"line_number":310,"context_line":"            if code \u003e\u003d 400:"},{"line_number":311,"context_line":"                self.send_header(\u0027X-Trans-Id\u0027, txn_id)"},{"line_number":312,"context_line":"                self.send_header(\u0027X-Openstack-Request-Id\u0027, txn_id)"},{"line_number":313,"context_line":"        self.end_headers()"}],"source_content_type":"text/x-python","patch_set":34,"id":"9cbddc14_240f7410","line":310,"in_reply_to":"d43c06fd_39499d5b","updated":"2023-08-21 23:29:29.000000000","message":"Done","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, (txn_id: %s)\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"}],"source_content_type":"text/x-python","patch_set":38,"id":"9f9cb8b4_743260de","line":281,"updated":"2023-08-10 10:53:59.000000000","message":"I think @Tim specifically proposed using \"(txn: %s)\" to be the same as the swift log format","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        except AttributeError:"},{"line_number":279,"context_line":"            # turns out we don\u0027t have a LogAdapter, so go direct"},{"line_number":280,"context_line":"            txn_id \u003d generate_trans_id(\u0027\u0027)"},{"line_number":281,"context_line":"            self.log_error(\"code %d, message %s, (txn_id: %s)\", code,"},{"line_number":282,"context_line":"                           message, txn_id)"},{"line_number":283,"context_line":"        else:"},{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"}],"source_content_type":"text/x-python","patch_set":38,"id":"c76cbe17_660ac35e","line":281,"in_reply_to":"9f9cb8b4_743260de","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"7f675464_3492c5ce","line":287,"updated":"2023-08-21 15:27:14.000000000","message":"oic, this is why having an app with logger instance doesn\u0027t get a txn-id in our logged message; we\u0027re trusting that the app.logger WILL log the txn-id when it generates the record","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"28c3a993a89ae48475551d6d5a850b179529a0f0","unresolved":false,"context_lines":[{"line_number":284,"context_line":"            # we do have a LogAdapter, but likely not yet a txn_id"},{"line_number":285,"context_line":"            txn_id \u003d txn_id or generate_trans_id(\u0027\u0027)"},{"line_number":286,"context_line":"            self.server.app.logger.txn_id \u003d txn_id"},{"line_number":287,"context_line":"            self.log_error(\"code %d, message %s\", code, message)"},{"line_number":288,"context_line":"        self.send_response(code, message)"},{"line_number":289,"context_line":"        self.send_header(\u0027Connection\u0027, \u0027close\u0027)"},{"line_number":290,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"500a9f50_0326cc7d","line":287,"in_reply_to":"7f675464_3492c5ce","updated":"2023-08-21 23:35:12.000000000","message":"Ack","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"}],"test/functional/test_account.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":150,"context_line":"            return check_response(conn)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        resp \u003d retry(get)"},{"line_number":153,"context_line":"        resp.read()"},{"line_number":154,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":155,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":156,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f43ca1c_bf9576a7","line":153,"updated":"2023-07-10 18:17:59.000000000","message":"i think an assertIn on this body would look nice","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            return check_response(conn)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        resp \u003d retry(get)"},{"line_number":153,"context_line":"        resp.read()"},{"line_number":154,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":155,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":156,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"342b9340_0ea61606","line":153,"in_reply_to":"1f43ca1c_bf9576a7","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":153,"context_line":"        resp.read()"},{"line_number":154,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":155,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":156,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def test_invalid_acls(self):"},{"line_number":159,"context_line":"        if tf.skip:"}],"source_content_type":"text/x-python","patch_set":6,"id":"a5e5d717_be67fa69","line":156,"updated":"2023-07-10 18:17:59.000000000","message":"bah, this test doesn\u0027t belong here - but I can\u0027t find a better place for it.\n\nprobably it would look nice to add a new TestCase to test.functional.test or a new test.functional.test_http.TestProtocol - you could try to hit all the various send_error blocks with badly formed request lines","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        resp.read()"},{"line_number":154,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":155,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":156,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def test_invalid_acls(self):"},{"line_number":159,"context_line":"        if tf.skip:"}],"source_content_type":"text/x-python","patch_set":6,"id":"6be12aa4_6be69737","line":156,"in_reply_to":"a5e5d717_be67fa69","updated":"2023-07-24 18:13:06.000000000","message":"Ack","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"acb89d951152aa2019639417a8a7a01276282d33","unresolved":true,"context_lines":[{"line_number":153,"context_line":"        resp.read()"},{"line_number":154,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":155,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":156,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def test_invalid_acls(self):"},{"line_number":159,"context_line":"        if tf.skip:"}],"source_content_type":"text/x-python","patch_set":6,"id":"d23be66c_aa919025","line":156,"in_reply_to":"a5e5d717_be67fa69","updated":"2023-07-21 11:45:50.000000000","message":"agree, this is not the intuitive place for this test\n\n+1 for a new TestCase in test.functional.[tests or test_http or test_protocol]","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"}],"test/functional/test_protocol.py":[{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import unittest"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"from swift.common.utils import distribute_evenly"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"0aab2b75_51085265","line":1,"in_reply_to":"db2a61f9_554ee627","updated":"2023-07-24 18:13:06.000000000","message":"\u003e pep8: H102: Apache 2.0 license header not found\n\nPlease fix.","commit_id":"93a5b55f8bd24a2b10698b31ef4956e04146a947"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":13,"context_line":"def tearDownModule():"},{"line_number":14,"context_line":"    tf.teardown_package()"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"class TestHttpProtocol(unittest.TestCase):"},{"line_number":17,"context_line":"    existing_metadata \u003d None"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":19,"id":"2c8830a5_6a8ae8c0","line":16,"in_reply_to":"5ae13c5f_98eebd3b","updated":"2023-07-24 18:13:06.000000000","message":"\u003e pep8: E302 expected 2 blank lines, found 1\n\nPlease fix.","commit_id":"93a5b55f8bd24a2b10698b31ef4956e04146a947"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":80,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Trans-Id\u0027)))"},{"line_number":81,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"63d1a3f7_08e8d931","line":82,"in_reply_to":"940af8f8_f4d20630","updated":"2023-07-24 18:13:06.000000000","message":"\u003e pep8: W391 blank line at end of file\n\nPlease fix.","commit_id":"93a5b55f8bd24a2b10698b31ef4956e04146a947"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":97,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":98,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":99,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":100,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Trans-Id\u0027)))"},{"line_number":101,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":34,"id":"95b2f0eb_58934439","line":100,"updated":"2023-08-07 20:58:48.000000000","message":"Something like `self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))` will give you better failure messages if it breaks.","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":98,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":99,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":100,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Trans-Id\u0027)))"},{"line_number":101,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":34,"id":"425c4573_c7cf1e8f","line":100,"in_reply_to":"95b2f0eb_58934439","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"efaa91719cd3bd8165be17e133d3effbecf3b7e8","unresolved":true,"context_lines":[{"line_number":98,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":99,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":100,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Trans-Id\u0027)))"},{"line_number":101,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":34,"id":"138b2b6b_c00dbfae","line":101,"updated":"2023-08-07 20:58:48.000000000","message":"Any other headers we want to make assertions on? `Server` and `Date`, say?","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":99,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":100,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Trans-Id\u0027)))"},{"line_number":101,"context_line":"        self.assertTrue(\u0027tx\u0027 in (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":34,"id":"abaa43e3_e468afac","line":101,"in_reply_to":"138b2b6b_c00dbfae","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"8e55c3b2b52864753ab245c1ac62c041c6d42194"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertTrue(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertTrue(\u0027tx\u0027, (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":38,"id":"20d6059c_c88f4a6f","line":103,"updated":"2023-08-10 10:53:59.000000000","message":"\u0027tx\u0027 is always True. Did you mean to use assertIn as @Tim suggested?","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertTrue(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertTrue(\u0027tx\u0027, (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":38,"id":"43056fed_70a024bc","line":103,"in_reply_to":"20d6059c_c88f4a6f","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertTrue(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertTrue(\u0027tx\u0027, (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":38,"id":"e2120fba_40ee95cb","line":104,"updated":"2023-08-10 10:53:59.000000000","message":"ditto","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertTrue(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertTrue(\u0027tx\u0027, (resp.getheader(\u0027X-Openstack-Request-Id\u0027)))"}],"source_content_type":"text/x-python","patch_set":38,"id":"57d9ad54_a23e55af","line":104,"in_reply_to":"e2120fba_40ee95cb","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":70,"context_line":"        if not metadata:"},{"line_number":71,"context_line":"            return"},{"line_number":72,"context_line":"        resp \u003d retry(post, metadata)"},{"line_number":73,"context_line":"        resp.read()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @classmethod"},{"line_number":76,"context_line":"    def setUpClass(cls):"}],"source_content_type":"text/x-python","patch_set":39,"id":"7761b9ce_e8ad2ff8","line":73,"updated":"2023-08-21 15:27:14.000000000","message":"I don\u0027t understand what these get/clear/set meta class methods are doing - did you copy them from somewhere else?","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"        if not metadata:"},{"line_number":71,"context_line":"            return"},{"line_number":72,"context_line":"        resp \u003d retry(post, metadata)"},{"line_number":73,"context_line":"        resp.read()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    @classmethod"},{"line_number":76,"context_line":"    def setUpClass(cls):"}],"source_content_type":"text/x-python","patch_set":39,"id":"b1b9105b_fb6ace58","line":73,"in_reply_to":"7761b9ce_e8ad2ff8","updated":"2023-08-21 23:29:29.000000000","message":"I mimicked those helper methods from some other test, I went ahead and removed them.","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":88,"context_line":"            raise SkipTest"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        def get(url, token, parsed, conn):"},{"line_number":91,"context_line":"            path \u003d \"/info asdf\""},{"line_number":92,"context_line":"            conn.request(\u0027GET\u0027, path, \u0027\u0027, {\u0027X-Auth-Token\u0027: token})"},{"line_number":93,"context_line":"            return check_response(conn)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"4f8c1ab5_59299f78","line":91,"updated":"2023-08-21 15:27:14.000000000","message":"nice unambigiously bad path - kudos","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            raise SkipTest"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        def get(url, token, parsed, conn):"},{"line_number":91,"context_line":"            path \u003d \"/info asdf\""},{"line_number":92,"context_line":"            conn.request(\u0027GET\u0027, path, \u0027\u0027, {\u0027X-Auth-Token\u0027: token})"},{"line_number":93,"context_line":"            return check_response(conn)"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"28dd6b7a_aa2aa581","line":91,"in_reply_to":"4f8c1ab5_59299f78","updated":"2023-08-21 23:29:29.000000000","message":"Done","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":100,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"fed039d7_efc03724","line":101,"updated":"2023-08-21 15:27:14.000000000","message":"this is absolutely a beahavior we want, nice!","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":100,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"141ff8de_08ae0520","line":101,"in_reply_to":"fed039d7_efc03724","updated":"2023-08-21 23:29:29.000000000","message":"Done","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":100,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"289539c3_a40030fe","line":102,"updated":"2023-08-21 15:27:14.000000000","message":"this seems brittle, if the server is slightly slow or you\u0027re right on the second boundary.  Did you lift this some prior art?","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"28c3a993a89ae48475551d6d5a850b179529a0f0","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.assertEqual(resp.status, 412)"},{"line_number":100,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"85932e69_ae3074ff","line":102,"in_reply_to":"289539c3_a40030fe","updated":"2023-08-21 23:35:12.000000000","message":"I did , I used that assery to check that we still have a Date header in the response, i went ahead and removed the assert","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"8de9e44c_0e425544","line":104,"updated":"2023-08-21 15:27:14.000000000","message":"nit: you could assert they\u0027re equal","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        self.assertIsNotNone(resp.getheader(\u0027X-Openstack-Request-Id\u0027))"},{"line_number":102,"context_line":"        self.assertEqual(dt, resp.getheader(\u0027Date\u0027))"},{"line_number":103,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Trans-Id\u0027))"},{"line_number":104,"context_line":"        self.assertIn(\u0027tx\u0027, resp.getheader(\u0027X-Openstack-Request-Id\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"1de74780_aa00799d","line":104,"in_reply_to":"8de9e44c_0e425544","updated":"2023-08-21 23:29:29.000000000","message":"Ack","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52d2866ef24425eea4b0cb0b407653329548f2dc","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        def get(url, token, parsed, conn):"},{"line_number":40,"context_line":"            path \u003d \"/info asdf\""},{"line_number":41,"context_line":"            conn.request(\u0027GET\u0027, path, \u0027\u0027, {\u0027X-Auth-Token\u0027: token})"},{"line_number":42,"context_line":"            return check_response(conn)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        resp \u003d retry(get)"}],"source_content_type":"text/x-python","patch_set":41,"id":"389eb0bf_4713598b","line":41,"updated":"2023-08-30 01:04:35.000000000","message":"so WAY down under the hood of swiftclient this path gets passed to requests and it\u0027s automatically doing the url quoting; so the request looks like:\n\n\t\u003e /home/vagrant/swift/test/functional/test_protocol.py(44)get()\n\t-\u003e return check_response(conn)\n\t(Pdb) conn.resp.url\n\t\u0027http://saio:8080/info%20asdf\u0027\n\n... so this test already passes on master\n\nnote the 412 (kind of weird?)\n\n\t(Pdb) conn.getresponse().read()\n\tb\u0027Bad URL\u0027\n\n... instead of the \"400 Bad request syntax\"\n\nI went looking and couldn\u0027t find any other prior art:\n\nhttps://review.opendev.org/c/openstack/swift/+/893119","commit_id":"7b39698d0dfb463c376c7e799711a66431a24641"}],"test/unit/common/test_http_protocol.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":52,"context_line":"        proto_obj.log_message(\u0027a%sc\u0027, \u0027b\u0027)"},{"line_number":53,"context_line":"        self.assertListEqual([mock.call.error(\u0027ERROR WSGI: a%sc\u0027, \u0027b\u0027)],"},{"line_number":54,"context_line":"                         proto_obj.server.app.logger.mock_calls)"},{"line_number":55,"context_line":"        self.assertIsNotNone(proto_obj.server.app.logger.txn_id)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_swift_http_protocol_log_message_no_logger(self):"},{"line_number":58,"context_line":"        # If the app somehow had no logger attribute or it was None, don\u0027t blow"}],"source_content_type":"text/x-python","patch_set":6,"id":"163223e7_f856cca8","line":55,"updated":"2023-07-10 18:17:59.000000000","message":"wat?  is this a realy txn_id or some funny non-none thread-local default?  I didn\u0027t see the diff setting this in log_message","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        proto_obj.log_message(\u0027a%sc\u0027, \u0027b\u0027)"},{"line_number":53,"context_line":"        self.assertListEqual([mock.call.error(\u0027ERROR WSGI: a%sc\u0027, \u0027b\u0027)],"},{"line_number":54,"context_line":"                         proto_obj.server.app.logger.mock_calls)"},{"line_number":55,"context_line":"        self.assertIsNotNone(proto_obj.server.app.logger.txn_id)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def test_swift_http_protocol_log_message_no_logger(self):"},{"line_number":58,"context_line":"        # If the app somehow had no logger attribute or it was None, don\u0027t blow"}],"source_content_type":"text/x-python","patch_set":6,"id":"d6a31a89_569b80fe","line":55,"in_reply_to":"163223e7_f856cca8","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":84,"context_line":"            mock.call(400, \"Bad HTTP/0.9 request type (\u0027jimmy\u0027)\"),"},{"line_number":85,"context_line":"        ], proto_obj.send_error.mock_calls)"},{"line_number":86,"context_line":"        self.assertEqual((\u0027a\u0027, \u0027123\u0027), proto_obj.client_address)"},{"line_number":87,"context_line":"        self.assertIsNotNone(logger.txn_id)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def test_bad_request_line(self):"},{"line_number":90,"context_line":"        proto_obj \u003d self._proto_obj()"}],"source_content_type":"text/x-python","patch_set":6,"id":"13b82731_f16d531c","line":87,"updated":"2023-07-10 18:17:59.000000000","message":"this makes more sense, we\u0027re calling parse_request","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            mock.call(400, \"Bad HTTP/0.9 request type (\u0027jimmy\u0027)\"),"},{"line_number":85,"context_line":"        ], proto_obj.send_error.mock_calls)"},{"line_number":86,"context_line":"        self.assertEqual((\u0027a\u0027, \u0027123\u0027), proto_obj.client_address)"},{"line_number":87,"context_line":"        self.assertIsNotNone(logger.txn_id)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def test_bad_request_line(self):"},{"line_number":90,"context_line":"        proto_obj \u003d self._proto_obj()"}],"source_content_type":"text/x-python","patch_set":6,"id":"50250bd2_10aab8f5","line":87,"in_reply_to":"13b82731_f16d531c","updated":"2023-07-24 18:13:06.000000000","message":"The log_error method contains log_message in its implementation, i have moved assigning the logger\u0027s txn_id value to log_message, so we ensure a transaction id is assigned every time we \"send_error\"","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52a5962b97e8853d1045de107e8814077226c294","unresolved":true,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        logger \u003d getattr(proto_obj.server.app, \u0027logger\u0027)"},{"line_number":95,"context_line":"        self.assertEqual(False, proto_obj.parse_request())"},{"line_number":96,"context_line":"        self.assertIsNotNone(logger.txn_id)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class ProtocolTest(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"27448b3e_3de30ae8","line":96,"updated":"2023-07-10 18:17:59.000000000","message":"these tests would be a lot stronger if we\n\n1) used a debug_logger and get_lines_for_level\n2) assert logger.txn_id in log_line","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        logger \u003d getattr(proto_obj.server.app, \u0027logger\u0027)"},{"line_number":95,"context_line":"        self.assertEqual(False, proto_obj.parse_request())"},{"line_number":96,"context_line":"        self.assertIsNotNone(logger.txn_id)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class ProtocolTest(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":6,"id":"c7ac88a8_65cdc26c","line":96,"in_reply_to":"27448b3e_3de30ae8","updated":"2023-08-17 15:43:03.000000000","message":"Done","commit_id":"dd4b40a7b1e6475a8e9aaa70999dc6c00675524d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":true,"context_lines":[{"line_number":22,"context_line":"import eventlet.wsgi as wsgi"},{"line_number":23,"context_line":"import six"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from debug_logger import debug_logger"},{"line_number":26,"context_line":"from swift.common import http_protocol, swob"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"d53f57fe_3454d095","line":25,"updated":"2023-07-24 18:43:35.000000000","message":"you need to give the path to debug_logger i.e. test.debug_logger","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7ca9268af899ab50abf7d6cd1c87401d25a12c2c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"import eventlet.wsgi as wsgi"},{"line_number":23,"context_line":"import six"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from debug_logger import debug_logger"},{"line_number":26,"context_line":"from swift.common import http_protocol, swob"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"a6c797ec_8b9743aa","line":25,"in_reply_to":"d53f57fe_3454d095","updated":"2023-07-31 09:21:16.000000000","message":"Done","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":139,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":140,"context_line":"                log\u003ddebug_logger(\u0027proxy\u0027),"},{"line_number":141,"context_line":"                log_output\u003dTrue,"},{"line_number":142,"context_line":"            )"},{"line_number":143,"context_line":"        return wfile.getvalue()"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"6428f7ac_039f0bcf","line":141,"range":{"start_line":141,"start_character":27,"end_line":141,"end_character":31},"updated":"2023-07-24 18:43:35.000000000","message":"this is True by default, but no harm being explicit","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":139,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":140,"context_line":"                log\u003ddebug_logger(\u0027proxy\u0027),"},{"line_number":141,"context_line":"                log_output\u003dTrue,"},{"line_number":142,"context_line":"            )"},{"line_number":143,"context_line":"        return wfile.getvalue()"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"4d50847c_d8f8d614","line":141,"range":{"start_line":141,"start_character":27,"end_line":141,"end_character":31},"in_reply_to":"6428f7ac_039f0bcf","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1f69376262ec5349e989b2d7b389d8f1d0239e7a","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":139,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":140,"context_line":"                log\u003ddebug_logger(\u0027proxy\u0027),"},{"line_number":141,"context_line":"                log_output\u003dTrue,"},{"line_number":142,"context_line":"            )"},{"line_number":143,"context_line":"        return wfile.getvalue()"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"fecb5ad3_8b6ffac2","line":141,"range":{"start_line":141,"start_character":27,"end_line":141,"end_character":31},"in_reply_to":"6428f7ac_039f0bcf","updated":"2023-08-02 18:50:29.000000000","message":"Done","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":true,"context_lines":[{"line_number":235,"context_line":"        self.assertEqual("},{"line_number":236,"context_line":"            lines[0], b\"HTTP/1.1 400 Bad request syntax (\u0027ONLY-METHOD\u0027)\")"},{"line_number":237,"context_line":"        self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])"},{"line_number":238,"context_line":"        self.assertIn(b\"X-Trans-Id\", lines[6])"},{"line_number":239,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def test_leading_slashes(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1790ae05_3797f5cb","line":238,"updated":"2023-07-24 18:43:35.000000000","message":"ok, this checks that trans-id is sent to the client, and that it is also logged, not that the logged trans-id is the same as the one the client gets\n\nwe may want to mock generate_trans_id to return a known id so that we can make assertions, AND capture the log lines (see my follow on patch)","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7ca9268af899ab50abf7d6cd1c87401d25a12c2c","unresolved":false,"context_lines":[{"line_number":235,"context_line":"        self.assertEqual("},{"line_number":236,"context_line":"            lines[0], b\"HTTP/1.1 400 Bad request syntax (\u0027ONLY-METHOD\u0027)\")"},{"line_number":237,"context_line":"        self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])"},{"line_number":238,"context_line":"        self.assertIn(b\"X-Trans-Id\", lines[6])"},{"line_number":239,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"    def test_leading_slashes(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5e86fe8f_3099a9a1","line":238,"in_reply_to":"1790ae05_3797f5cb","updated":"2023-07-31 09:21:16.000000000","message":"Done","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":true,"context_lines":[{"line_number":394,"context_line":"        lines \u003d [l for l in bytes_out.split(b\"\\r\\n\") if l]"},{"line_number":395,"context_line":"        self.assertIn(b\"400 Invalid PROXY line\", lines[0])"},{"line_number":396,"context_line":"        self.assertIn(b\"X-Trans-Id\", lines[6])"},{"line_number":397,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def test_malformed_proxy_lines(self):"},{"line_number":400,"context_line":"        for bad_line in [b\u0027PROXY jojo\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"d461acba_853cb9b5","line":397,"updated":"2023-07-24 18:43:35.000000000","message":"ok, but what was the header value? does it match a log line? we need to have a handle on the logger instance to make assertions about log lines","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1f69376262ec5349e989b2d7b389d8f1d0239e7a","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        lines \u003d [l for l in bytes_out.split(b\"\\r\\n\") if l]"},{"line_number":395,"context_line":"        self.assertIn(b\"400 Invalid PROXY line\", lines[0])"},{"line_number":396,"context_line":"        self.assertIn(b\"X-Trans-Id\", lines[6])"},{"line_number":397,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def test_malformed_proxy_lines(self):"},{"line_number":400,"context_line":"        for bad_line in [b\u0027PROXY jojo\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"a3d97267_a628bd0c","line":397,"in_reply_to":"d461acba_853cb9b5","updated":"2023-08-02 18:50:29.000000000","message":"Done","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        lines \u003d [l for l in bytes_out.split(b\"\\r\\n\") if l]"},{"line_number":395,"context_line":"        self.assertIn(b\"400 Invalid PROXY line\", lines[0])"},{"line_number":396,"context_line":"        self.assertIn(b\"X-Trans-Id\", lines[6])"},{"line_number":397,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":398,"context_line":""},{"line_number":399,"context_line":"    def test_malformed_proxy_lines(self):"},{"line_number":400,"context_line":"        for bad_line in [b\u0027PROXY jojo\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"0feace07_725e2645","line":397,"in_reply_to":"d461acba_853cb9b5","updated":"2023-08-17 15:43:03.000000000","message":"These assertions are giving us enough coverage but since TestProxyProtocol object doesn\u0027t have a logger i have added more assertions on the desired transaction id value","commit_id":"adec9a3c0f3d7fdef4861247ad9bc4fec1e4414c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                fake_listen_socket, app or self.app,"},{"line_number":139,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":140,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":141,"context_line":"                log\u003dself.logger,"},{"line_number":142,"context_line":"                log_output\u003dTrue,"},{"line_number":143,"context_line":"            )"},{"line_number":144,"context_line":"        return wfile.getvalue()"}],"source_content_type":"text/x-python","patch_set":25,"id":"afe95c7c_1ddb441b","line":141,"updated":"2023-07-24 18:43:35.000000000","message":"this gives the wsgi server a logger so we can assert the except clause when the log call goes to the server, but there\u0027s no coverage for the usual case when the app has a logger\n\nsee https://review.opendev.org/c/openstack/swift/+/889335/1 for some ideas (NOTE my patchset is based on an older version of this)","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7ca9268af899ab50abf7d6cd1c87401d25a12c2c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                fake_listen_socket, app or self.app,"},{"line_number":139,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":140,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":141,"context_line":"                log\u003dself.logger,"},{"line_number":142,"context_line":"                log_output\u003dTrue,"},{"line_number":143,"context_line":"            )"},{"line_number":144,"context_line":"        return wfile.getvalue()"}],"source_content_type":"text/x-python","patch_set":25,"id":"1a1f2d3d_b6378360","line":141,"in_reply_to":"afe95c7c_1ddb441b","updated":"2023-07-31 09:21:16.000000000","message":"Done","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3ae706ff0abce05e16d61e706f2c6d08a9058298","unresolved":true,"context_lines":[{"line_number":233,"context_line":"            b\"\\r\\n\""},{"line_number":234,"context_line":"        ))"},{"line_number":235,"context_line":"        lines \u003d [l for l in bytes_out.split(b\"\\r\\n\") if l]"},{"line_number":236,"context_line":"        info_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":237,"context_line":"        self.assertEqual("},{"line_number":238,"context_line":"            lines[0], b\"HTTP/1.1 400 Bad request syntax (\u0027ONLY-METHOD\u0027)\")"},{"line_number":239,"context_line":"        self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])"}],"source_content_type":"text/x-python","patch_set":25,"id":"1e990f31_b5affc7b","line":236,"range":{"start_line":236,"start_character":8,"end_line":236,"end_character":60},"updated":"2023-07-24 18:43:35.000000000","message":"the common path logs at error level","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7ca9268af899ab50abf7d6cd1c87401d25a12c2c","unresolved":false,"context_lines":[{"line_number":233,"context_line":"            b\"\\r\\n\""},{"line_number":234,"context_line":"        ))"},{"line_number":235,"context_line":"        lines \u003d [l for l in bytes_out.split(b\"\\r\\n\") if l]"},{"line_number":236,"context_line":"        info_lines \u003d self.logger.get_lines_for_level(\u0027info\u0027)"},{"line_number":237,"context_line":"        self.assertEqual("},{"line_number":238,"context_line":"            lines[0], b\"HTTP/1.1 400 Bad request syntax (\u0027ONLY-METHOD\u0027)\")"},{"line_number":239,"context_line":"        self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])"}],"source_content_type":"text/x-python","patch_set":25,"id":"c6b2b772_20a89bab","line":236,"range":{"start_line":236,"start_character":8,"end_line":236,"end_character":60},"in_reply_to":"1e990f31_b5affc7b","updated":"2023-07-31 09:21:16.000000000","message":"Done","commit_id":"be811d2c3dc3661b2544cdd0b4f118e4adc43b5c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1f69376262ec5349e989b2d7b389d8f1d0239e7a","unresolved":true,"context_lines":[{"line_number":279,"context_line":"        self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])"},{"line_number":280,"context_line":"        self.assertIn(b\"X-Trans-Id: test-trans-id\", lines[6])"},{"line_number":281,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id: test-trans-id\", lines[7])"},{"line_number":282,"context_line":"        # debug_logger doesn\u0027t add txn_id to the log message :\u0027("},{"line_number":283,"context_line":"        self.assertIn("},{"line_number":284,"context_line":"            \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027)\","},{"line_number":285,"context_line":"            app_logger.get_lines_for_level(\u0027error\u0027))"}],"source_content_type":"text/x-python","patch_set":31,"id":"0af95160_6db97a52","line":282,"updated":"2023-08-02 18:50:29.000000000","message":"more accurately, DebugLogger records the log message in its lines dict, and then prints the formatted message - so the printed output does have the txn id, but get_lines_for_level(\u0027error\u0027) does not.\n\nOh, but TIL that DebugLogger also has a records dict with the *formatted* log lines, so we can write:\n\n```\n        self.assertEqual(1, len(app_logger.records.get(\u0027ERROR\u0027, [])))\n        self.assertIn(\n            \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027) \"\n            \"(txn: test-trans-id)\",\n            app_logger.records.get(\u0027ERROR\u0027)[0])\n```","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])"},{"line_number":280,"context_line":"        self.assertIn(b\"X-Trans-Id: test-trans-id\", lines[6])"},{"line_number":281,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id: test-trans-id\", lines[7])"},{"line_number":282,"context_line":"        # debug_logger doesn\u0027t add txn_id to the log message :\u0027("},{"line_number":283,"context_line":"        self.assertIn("},{"line_number":284,"context_line":"            \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027)\","},{"line_number":285,"context_line":"            app_logger.get_lines_for_level(\u0027error\u0027))"}],"source_content_type":"text/x-python","patch_set":31,"id":"c1f50698_8616354d","line":282,"in_reply_to":"0af95160_6db97a52","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        self.assertIn(b\"Bad request syntax or unsupported method.\", lines[-1])"},{"line_number":280,"context_line":"        self.assertIn(b\"X-Trans-Id: test-trans-id\", lines[6])"},{"line_number":281,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id: test-trans-id\", lines[7])"},{"line_number":282,"context_line":"        # debug_logger doesn\u0027t add txn_id to the log message :\u0027("},{"line_number":283,"context_line":"        self.assertIn("},{"line_number":284,"context_line":"            \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027)\","},{"line_number":285,"context_line":"            app_logger.get_lines_for_level(\u0027error\u0027))"}],"source_content_type":"text/x-python","patch_set":31,"id":"5f26d3c4_28345264","line":282,"in_reply_to":"0af95160_6db97a52","updated":"2023-08-10 10:53:59.000000000","message":"Done","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1f69376262ec5349e989b2d7b389d8f1d0239e7a","unresolved":true,"context_lines":[{"line_number":474,"context_line":"            self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":475,"context_line":"            self.assertIn(\"wsgi starting up\", info_lines[0])"},{"line_number":476,"context_line":"            self.assertIn(\"ERROR WSGI: Invalid PROXY line\", info_lines[1])"},{"line_number":477,"context_line":"            self.assertIn(\"transaction_id\", info_lines[2])"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def test_unknown_client_addr(self):"},{"line_number":480,"context_line":"        # For \"UNKNOWN\", the rest of the line before the CRLF may be omitted by"}],"source_content_type":"text/x-python","patch_set":31,"id":"0ce3c269_e6c4ee81","line":477,"updated":"2023-08-02 18:50:29.000000000","message":"so these errors actually get logged twice. I hadn\u0027t noticed that before.","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":false,"context_lines":[{"line_number":474,"context_line":"            self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":475,"context_line":"            self.assertIn(\"wsgi starting up\", info_lines[0])"},{"line_number":476,"context_line":"            self.assertIn(\"ERROR WSGI: Invalid PROXY line\", info_lines[1])"},{"line_number":477,"context_line":"            self.assertIn(\"transaction_id\", info_lines[2])"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def test_unknown_client_addr(self):"},{"line_number":480,"context_line":"        # For \"UNKNOWN\", the rest of the line before the CRLF may be omitted by"}],"source_content_type":"text/x-python","patch_set":31,"id":"feb5e545_2939ee1a","line":477,"in_reply_to":"0ce3c269_e6c4ee81","updated":"2023-08-10 10:53:59.000000000","message":"Done","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":474,"context_line":"            self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":475,"context_line":"            self.assertIn(\"wsgi starting up\", info_lines[0])"},{"line_number":476,"context_line":"            self.assertIn(\"ERROR WSGI: Invalid PROXY line\", info_lines[1])"},{"line_number":477,"context_line":"            self.assertIn(\"transaction_id\", info_lines[2])"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def test_unknown_client_addr(self):"},{"line_number":480,"context_line":"        # For \"UNKNOWN\", the rest of the line before the CRLF may be omitted by"}],"source_content_type":"text/x-python","patch_set":31,"id":"08c122cf_19a1c346","line":477,"in_reply_to":"0ce3c269_e6c4ee81","updated":"2023-08-17 15:43:03.000000000","message":"Yes","commit_id":"7aecf06856a254dcd47a5c783d6ad304e1f486c1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0d91c1436ffe91532d5e980df2cdd31c5a515925","unresolved":true,"context_lines":[{"line_number":261,"context_line":"        self.assertEqual("},{"line_number":262,"context_line":"            \"ERROR WSGI: code 400, message \""},{"line_number":263,"context_line":"            \"Bad request syntax (\u0027ONLY-METHOD\u0027), (txn_id: test-trans-id)\","},{"line_number":264,"context_line":"            info_lines[1])"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_bad_request_app_logging(self):"},{"line_number":267,"context_line":"        app_logger \u003d debug_logger()"}],"source_content_type":"text/x-python","patch_set":38,"id":"88b5159a_00a88378","line":264,"updated":"2023-08-10 10:53:59.000000000","message":"ideally this message would have the same format as if it had been logged by the app logger i.e. line 284, so \"(txn: test-trans-id)\"","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        self.assertEqual("},{"line_number":262,"context_line":"            \"ERROR WSGI: code 400, message \""},{"line_number":263,"context_line":"            \"Bad request syntax (\u0027ONLY-METHOD\u0027), (txn_id: test-trans-id)\","},{"line_number":264,"context_line":"            info_lines[1])"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_bad_request_app_logging(self):"},{"line_number":267,"context_line":"        app_logger \u003d debug_logger()"}],"source_content_type":"text/x-python","patch_set":38,"id":"ada32ae2_31b0ea87","line":264,"in_reply_to":"88b5159a_00a88378","updated":"2023-08-17 15:43:03.000000000","message":"Understood.","commit_id":"b63f8fa76eb41b18c7e873c09cac80c6e9da7f58"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":135,"context_line":"        with mock.patch.object(wfile, \u0027close\u0027, lambda: None), \\"},{"line_number":136,"context_line":"                mock.patch.object(rfile, \u0027close\u0027, lambda: None):"},{"line_number":137,"context_line":"            wsgi.server("},{"line_number":138,"context_line":"                fake_listen_socket, app or self.app,"},{"line_number":139,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":140,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":141,"context_line":"                log\u003dself.logger,"}],"source_content_type":"text/x-python","patch_set":39,"id":"28172d51_830bfcef","line":138,"updated":"2023-08-21 15:27:14.000000000","message":"most tests do not override the app","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"28c3a993a89ae48475551d6d5a850b179529a0f0","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        with mock.patch.object(wfile, \u0027close\u0027, lambda: None), \\"},{"line_number":136,"context_line":"                mock.patch.object(rfile, \u0027close\u0027, lambda: None):"},{"line_number":137,"context_line":"            wsgi.server("},{"line_number":138,"context_line":"                fake_listen_socket, app or self.app,"},{"line_number":139,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":140,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":141,"context_line":"                log\u003dself.logger,"}],"source_content_type":"text/x-python","patch_set":39,"id":"0b23ce4f_06e51fc1","line":138,"in_reply_to":"28172d51_830bfcef","updated":"2023-08-21 23:35:12.000000000","message":"Ack","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                fake_listen_socket, app or self.app,"},{"line_number":139,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":140,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":141,"context_line":"                log\u003dself.logger,"},{"line_number":142,"context_line":"                log_output\u003dTrue,"},{"line_number":143,"context_line":"            )"},{"line_number":144,"context_line":"        return wfile.getvalue()"}],"source_content_type":"text/x-python","patch_set":39,"id":"2fd96c59_069d839e","line":141,"updated":"2023-08-21 15:27:14.000000000","message":"i think this is the logger used most in most tests","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"28c3a993a89ae48475551d6d5a850b179529a0f0","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                fake_listen_socket, app or self.app,"},{"line_number":139,"context_line":"                protocol\u003dself.protocol_class,"},{"line_number":140,"context_line":"                custom_pool\u003dFakePool(),"},{"line_number":141,"context_line":"                log\u003dself.logger,"},{"line_number":142,"context_line":"                log_output\u003dTrue,"},{"line_number":143,"context_line":"            )"},{"line_number":144,"context_line":"        return wfile.getvalue()"}],"source_content_type":"text/x-python","patch_set":39,"id":"80d78b3e_78737fb9","line":141,"in_reply_to":"2fd96c59_069d839e","updated":"2023-08-21 23:35:12.000000000","message":"Ack","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":148,"context_line":"    protocol_class \u003d http_protocol.SwiftHttpProtocol"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @staticmethod"},{"line_number":151,"context_line":"    def app(env, start_response):"},{"line_number":152,"context_line":"        start_response(\"200 OK\", [])"},{"line_number":153,"context_line":"        return [swob.wsgi_to_bytes(env[\u0027RAW_PATH_INFO\u0027])]"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"27242e57_4e469725","line":151,"updated":"2023-08-21 15:27:14.000000000","message":"in most tests self.app is just a callable - no logger attribute","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"28c3a993a89ae48475551d6d5a850b179529a0f0","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    protocol_class \u003d http_protocol.SwiftHttpProtocol"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"    @staticmethod"},{"line_number":151,"context_line":"    def app(env, start_response):"},{"line_number":152,"context_line":"        start_response(\"200 OK\", [])"},{"line_number":153,"context_line":"        return [swob.wsgi_to_bytes(env[\u0027RAW_PATH_INFO\u0027])]"},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"829b8ab9_13bbfa0e","line":151,"in_reply_to":"27242e57_4e469725","updated":"2023-08-21 23:35:12.000000000","message":"Ack","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":261,"context_line":"        self.assertEqual("},{"line_number":262,"context_line":"            \"ERROR WSGI: code 400, message \""},{"line_number":263,"context_line":"            \"Bad request syntax (\u0027ONLY-METHOD\u0027), (txn: test-trans-id)\","},{"line_number":264,"context_line":"            info_lines[1])"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_bad_request_app_logging(self):"},{"line_number":267,"context_line":"        app_logger \u003d debug_logger()"}],"source_content_type":"text/x-python","patch_set":39,"id":"e7ea921d_bea990e6","line":264,"updated":"2023-08-21 15:27:14.000000000","message":"this looks solid!  asserts on the headers and logs - all matching the mocked test-trans-id - KUDOS!","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"        self.assertEqual("},{"line_number":262,"context_line":"            \"ERROR WSGI: code 400, message \""},{"line_number":263,"context_line":"            \"Bad request syntax (\u0027ONLY-METHOD\u0027), (txn: test-trans-id)\","},{"line_number":264,"context_line":"            info_lines[1])"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_bad_request_app_logging(self):"},{"line_number":267,"context_line":"        app_logger \u003d debug_logger()"}],"source_content_type":"text/x-python","patch_set":39,"id":"70dd7468_a1aef4b7","line":264,"in_reply_to":"e7ea921d_bea990e6","updated":"2023-08-21 23:29:29.000000000","message":"Done","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":266,"context_line":"    def test_bad_request_app_logging(self):"},{"line_number":267,"context_line":"        app_logger \u003d debug_logger()"},{"line_number":268,"context_line":"        app \u003d mock.MagicMock()"},{"line_number":269,"context_line":"        app.logger \u003d app_logger"},{"line_number":270,"context_line":"        with mock.patch(\u0027swift.common.http_protocol.generate_trans_id\u0027,"},{"line_number":271,"context_line":"                        return_value\u003d\u0027test-trans-id\u0027):"},{"line_number":272,"context_line":"            bytes_out \u003d self._run_bytes_through_protocol(("}],"source_content_type":"text/x-python","patch_set":39,"id":"540137e4_e04ad51a","line":269,"updated":"2023-08-21 15:27:14.000000000","message":"so this setup is hitting the code path for when the app DOES have a logger attribute","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":266,"context_line":"    def test_bad_request_app_logging(self):"},{"line_number":267,"context_line":"        app_logger \u003d debug_logger()"},{"line_number":268,"context_line":"        app \u003d mock.MagicMock()"},{"line_number":269,"context_line":"        app.logger \u003d app_logger"},{"line_number":270,"context_line":"        with mock.patch(\u0027swift.common.http_protocol.generate_trans_id\u0027,"},{"line_number":271,"context_line":"                        return_value\u003d\u0027test-trans-id\u0027):"},{"line_number":272,"context_line":"            bytes_out \u003d self._run_bytes_through_protocol(("}],"source_content_type":"text/x-python","patch_set":39,"id":"6e97f161_dd8ed6fb","line":269,"in_reply_to":"540137e4_e04ad51a","updated":"2023-08-21 23:29:29.000000000","message":"Done","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":288,"context_line":"        # but we can at least assert that the logger txn_id was set"},{"line_number":289,"context_line":"        self.assertEqual(\u0027test-trans-id\u0027, app_logger.txn_id)"},{"line_number":290,"context_line":"        # the app logged this, server logger not used..."},{"line_number":291,"context_line":"        self.assertNotIn("},{"line_number":292,"context_line":"            \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027),\""},{"line_number":293,"context_line":"            \" (txn: test-bad-req-trans-id)\","},{"line_number":294,"context_line":"            self.logger.get_lines_for_level(\u0027info\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"e4f479d3_162d8cbd","line":291,"updated":"2023-08-21 15:27:14.000000000","message":"what is assertNotIn accomplishing here?\n\nit\u0027s annoying that the debug logger message tracking is before the adapated record adds the transaction id:\n\n\t(Pdb) app_logger.all_log_lines()\n\t{\u0027error\u0027: [\"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027)\"]}\n\n... but it\u0027s NBD because you found app_logger.records\n\nmaybe just cut out this assert?","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        # but we can at least assert that the logger txn_id was set"},{"line_number":289,"context_line":"        self.assertEqual(\u0027test-trans-id\u0027, app_logger.txn_id)"},{"line_number":290,"context_line":"        # the app logged this, server logger not used..."},{"line_number":291,"context_line":"        self.assertNotIn("},{"line_number":292,"context_line":"            \"ERROR WSGI: code 400, message Bad request syntax (\u0027ONLY-METHOD\u0027),\""},{"line_number":293,"context_line":"            \" (txn: test-bad-req-trans-id)\","},{"line_number":294,"context_line":"            self.logger.get_lines_for_level(\u0027info\u0027))"}],"source_content_type":"text/x-python","patch_set":39,"id":"5bb4907e_179b9671","line":291,"in_reply_to":"e4f479d3_162d8cbd","updated":"2023-08-21 23:29:29.000000000","message":"Done","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f07d412b68068df36a1a724bed305296a98dd538","unresolved":true,"context_lines":[{"line_number":460,"context_line":"        self.assertEqual("},{"line_number":461,"context_line":"            \"ERROR WSGI: code 400, message Invalid PROXY line \""},{"line_number":462,"context_line":"            \"\u0027GET /someurl HTTP/1.0\\\\r\\\\n\u0027, \""},{"line_number":463,"context_line":"            \"(txn: test-bad-req-trans-id)\","},{"line_number":464,"context_line":"            info_lines[1])"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def test_malformed_proxy_lines(self):"}],"source_content_type":"text/x-python","patch_set":39,"id":"5f874f46_c877fd64","line":463,"updated":"2023-08-21 15:27:14.000000000","message":"ok, so since we don\u0027t override app with a debug_logger the UUT is manually adding the txn id","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"dc009f3b794d6eda992a394b930cee1baa8d537a","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        self.assertEqual("},{"line_number":461,"context_line":"            \"ERROR WSGI: code 400, message Invalid PROXY line \""},{"line_number":462,"context_line":"            \"\u0027GET /someurl HTTP/1.0\\\\r\\\\n\u0027, \""},{"line_number":463,"context_line":"            \"(txn: test-bad-req-trans-id)\","},{"line_number":464,"context_line":"            info_lines[1])"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def test_malformed_proxy_lines(self):"}],"source_content_type":"text/x-python","patch_set":39,"id":"55a423a7_5034379b","line":463,"in_reply_to":"5f874f46_c877fd64","updated":"2023-08-21 23:29:29.000000000","message":"Ack","commit_id":"38a9650ce5ef1bc786d552f7d8687c5bcac5f7df"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52d2866ef24425eea4b0cb0b407653329548f2dc","unresolved":true,"context_lines":[{"line_number":241,"context_line":"        self.assertIn(b\"X-Openstack-Request-Id\", lines[7])"},{"line_number":242,"context_line":"        self.assertIn(\"wsgi starting up\", info_lines[0])"},{"line_number":243,"context_line":"        self.assertIn(\"ERROR WSGI: code 400\", info_lines[1])"},{"line_number":244,"context_line":"        self.assertIn(\"txn:\", info_lines[1])"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def test_bad_request_server_logging(self):"},{"line_number":247,"context_line":"        with mock.patch(\u0027swift.common.http_protocol.generate_trans_id\u0027,"}],"source_content_type":"text/x-python","patch_set":41,"id":"0a60b9e9_2ed40dad","line":244,"updated":"2023-08-30 01:04:35.000000000","message":"here we could assert the x-trans-id returned in the headers match the txn in the log lines","commit_id":"7b39698d0dfb463c376c7e799711a66431a24641"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52d2866ef24425eea4b0cb0b407653329548f2dc","unresolved":true,"context_lines":[{"line_number":261,"context_line":"        self.assertEqual("},{"line_number":262,"context_line":"            \"ERROR WSGI: code 400, message \""},{"line_number":263,"context_line":"            \"Bad request syntax (\u0027ONLY-METHOD\u0027), (txn: test-trans-id)\","},{"line_number":264,"context_line":"            info_lines[1])"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    def test_bad_request_app_logging(self):"},{"line_number":267,"context_line":"        app_logger \u003d debug_logger()"}],"source_content_type":"text/x-python","patch_set":41,"id":"e30a7787_2345d832","line":264,"updated":"2023-08-30 01:04:35.000000000","message":"this is very similar to what\u0027s going on in test_bad_request, and covers the assertion on the equality of the returned/logged x-trans-id/txn","commit_id":"7b39698d0dfb463c376c7e799711a66431a24641"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"52d2866ef24425eea4b0cb0b407653329548f2dc","unresolved":true,"context_lines":[{"line_number":286,"context_line":"            \"(txn: test-trans-id)\","},{"line_number":287,"context_line":"            app_logger.records.get(\u0027ERROR\u0027)[0])"},{"line_number":288,"context_line":"        # but we can at least assert that the logger txn_id was set"},{"line_number":289,"context_line":"        self.assertEqual(\u0027test-trans-id\u0027, app_logger.txn_id)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def test_leading_slashes(self):"},{"line_number":292,"context_line":"        bytes_out \u003d self._run_bytes_through_protocol(("}],"source_content_type":"text/x-python","patch_set":41,"id":"726d57e6_053e18e4","line":289,"updated":"2023-08-30 01:04:35.000000000","message":"all this seems fine - including the assertion on the annotated txn with the records","commit_id":"7b39698d0dfb463c376c7e799711a66431a24641"}],"test/unit/common/test_wsgi.py":[{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":1680,"context_line":"        statuses \u003d [\u0027400 Bad Request\u0027]"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"        def app(env, start_response):"},{"line_number":1683,"context_line":"            start_response(statuses.pop(0), "},{"line_number":1684,"context_line":"                           {\u0027Content-Length\u0027: \u0027casdcadsc\u0027}.items())"},{"line_number":1685,"context_line":"            yield b\u0027400 - Bad request syntax or unsupported method.\\n\u0027"},{"line_number":1686,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1000b902_395c5bc3","line":1683,"in_reply_to":"c200f278_75fe8c81","updated":"2023-07-24 18:13:06.000000000","message":"\u003e pep8: W291 trailing whitespace\n\nPlease fix.","commit_id":"93a5b55f8bd24a2b10698b31ef4956e04146a947"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"566a488065684989ff3d4dacc344df333548859e","unresolved":false,"context_lines":[{"line_number":1689,"context_line":"        it \u003d wc._app_call(r.environ)"},{"line_number":1690,"context_line":"        wc._response_headers.append((\u0027X-Trans-Id\u0027, \u0027txn\u0027))"},{"line_number":1691,"context_line":"        self.assertEqual(wc._response_status, \u0027400 Bad Request\u0027)"},{"line_number":1692,"context_line":"        self.assertEqual(b\u0027\u0027.join(it), b\u0027400 - Bad request syntax or unsupported method.\\n\u0027)"},{"line_number":1693,"context_line":"        self.assertEqual(wc._response_headers, ["},{"line_number":1694,"context_line":"            (\u0027Content-Length\u0027, \u0027casdcadsc\u0027),"},{"line_number":1695,"context_line":"            (\u0027X-Trans-Id\u0027, \u0027txn\u0027),"}],"source_content_type":"text/x-python","patch_set":19,"id":"7d5a0046_210a129c","line":1692,"in_reply_to":"6e0262b7_754af091","updated":"2023-07-24 18:13:06.000000000","message":"\u003e pep8: E501 line too long (92 \u003e 79 characters)\n\nPlease fix.","commit_id":"93a5b55f8bd24a2b10698b31ef4956e04146a947"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7ca9268af899ab50abf7d6cd1c87401d25a12c2c","unresolved":true,"context_lines":[{"line_number":1676,"context_line":"            (\u0027X-Trans-Id\u0027, \u0027txn\u0027),"},{"line_number":1677,"context_line":"        ])"},{"line_number":1678,"context_line":""},{"line_number":1679,"context_line":"    def test_app_returns_bad_req_headers_as_dict_items(self):"},{"line_number":1680,"context_line":"        statuses \u003d [\u0027400 Bad Request\u0027]"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"        def app(env, start_response):"}],"source_content_type":"text/x-python","patch_set":29,"id":"f77035a6_6d612654","line":1679,"updated":"2023-07-31 09:21:16.000000000","message":"I\u0027m not sure I understand what this test is covering in the context of the patch?\n\nAlso \u0027_as_dict_items\u0027 threw me a bit: yes, it\u0027s a list of tuples which is similar to the type of dict.items(), but there\u0027s no dict involved in storing _response_headers","commit_id":"2e6039ecaf41671d769b766d29f5361dc980c9b6"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"f6dd3df63b66b0b28e1a2fb482e961741904c92a","unresolved":false,"context_lines":[{"line_number":1676,"context_line":"            (\u0027X-Trans-Id\u0027, \u0027txn\u0027),"},{"line_number":1677,"context_line":"        ])"},{"line_number":1678,"context_line":""},{"line_number":1679,"context_line":"    def test_app_returns_bad_req_headers_as_dict_items(self):"},{"line_number":1680,"context_line":"        statuses \u003d [\u0027400 Bad Request\u0027]"},{"line_number":1681,"context_line":""},{"line_number":1682,"context_line":"        def app(env, start_response):"}],"source_content_type":"text/x-python","patch_set":29,"id":"aac56801_031ceff7","line":1679,"in_reply_to":"f77035a6_6d612654","updated":"2023-08-17 15:43:03.000000000","message":"Ack","commit_id":"2e6039ecaf41671d769b766d29f5361dc980c9b6"}]}
