)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ea0bfd292b1f886458cc1c0edeaf7883d2815c71","unresolved":true,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2025-05-19 16:15:12 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"s3api: more test cases for conditional writes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Id5583e3a1e4515ec3c8a972f647aaaabfba673bc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"50c4e998_fc03d979","line":8,"updated":"2025-05-20 11:05:21.000000000","message":"please add\n\n```\nRelated-Change: I2e57dacb342b5758f16b502bb91372a2443d0182\n```","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bf7aa49f7a262ec8941cd757d3e8651b444397fd","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2025-05-19 16:15:12 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"s3api: more test cases for conditional writes."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Id5583e3a1e4515ec3c8a972f647aaaabfba673bc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"2487c384_a5b8316c","line":8,"in_reply_to":"50c4e998_fc03d979","updated":"2025-05-21 01:07:51.000000000","message":"Done","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ea0bfd292b1f886458cc1c0edeaf7883d2815c71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"63618fbc_3f0bcd3d","updated":"2025-05-20 11:05:21.000000000","message":"This is great, just some cleanup related comments caused my -1. Thanks","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a5a2382b9c309e6321926634867272c8d2437cb4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c89e52da_c8d3f151","updated":"2025-05-21 09:28:30.000000000","message":"sorry, I missed the ``extra_headers\u003d{}`` anti-pattern on first review","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bf7aa49f7a262ec8941cd757d3e8651b444397fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"912d82bd_e29bd52c","updated":"2025-05-21 01:07:51.000000000","message":"thanks for the reviews!","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c658024b4f5f4cbb5feb113e16659f2615c78a89","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fbf1c6ee_65ba726e","updated":"2025-05-21 09:31:20.000000000","message":"@Jianjian - I pushed a fix for the default extra_headers. Let\u0027s get this merged!","commit_id":"33b17742a727e3bd15072b61a0f119191423f6b7"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6ab7560c632a8cf248ec252cc51528479de79ad6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"677f356c_32d3c1a3","updated":"2025-05-21 18:32:39.000000000","message":"thanks for the help!","commit_id":"33b17742a727e3bd15072b61a0f119191423f6b7"}],"test/unit/common/middleware/s3api/test_multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ea0bfd292b1f886458cc1c0edeaf7883d2815c71","unresolved":true,"context_lines":[{"line_number":1456,"context_line":"    def test_object_multipart_upload_complete_with_if_none_match_star(self):"},{"line_number":1457,"context_line":"        self._do_test_object_multipart_upload_complete("},{"line_number":1458,"context_line":"            extra_headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027}"},{"line_number":1459,"context_line":"        )"},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"    def test_object_multipart_upload_complete_mixed_policy(self):"},{"line_number":1462,"context_line":"        self._do_test_object_multipart_upload_complete("}],"source_content_type":"text/x-python","patch_set":1,"id":"e301b49e_7ae1322d","line":1459,"updated":"2025-05-20 11:05:21.000000000","message":"nice","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bf7aa49f7a262ec8941cd757d3e8651b444397fd","unresolved":false,"context_lines":[{"line_number":1456,"context_line":"    def test_object_multipart_upload_complete_with_if_none_match_star(self):"},{"line_number":1457,"context_line":"        self._do_test_object_multipart_upload_complete("},{"line_number":1458,"context_line":"            extra_headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027}"},{"line_number":1459,"context_line":"        )"},{"line_number":1460,"context_line":""},{"line_number":1461,"context_line":"    def test_object_multipart_upload_complete_mixed_policy(self):"},{"line_number":1462,"context_line":"        self._do_test_object_multipart_upload_complete("}],"source_content_type":"text/x-python","patch_set":1,"id":"95530017_d79f3a24","line":1459,"in_reply_to":"e301b49e_7ae1322d","updated":"2025-05-21 01:07:51.000000000","message":"Acknowledged","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ea0bfd292b1f886458cc1c0edeaf7883d2815c71","unresolved":true,"context_lines":[{"line_number":1470,"context_line":"        )"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def _do_test_object_multipart_upload_complete_501("},{"line_number":1473,"context_line":"            self, bucket_policy_index\u003dint(POLICIES.default),"},{"line_number":1474,"context_line":"            segment_bucket_policy_index\u003dNone, extra_headers\u003d{}):"},{"line_number":1475,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1476,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1477,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?uploadId\u003dX\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"cb174b49_737c3e1d","line":1474,"range":{"start_line":1473,"start_character":18,"end_line":1474,"end_character":44},"updated":"2025-05-20 11:05:21.000000000","message":"these args aren\u0027t ever set by a caller","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bf7aa49f7a262ec8941cd757d3e8651b444397fd","unresolved":false,"context_lines":[{"line_number":1470,"context_line":"        )"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def _do_test_object_multipart_upload_complete_501("},{"line_number":1473,"context_line":"            self, bucket_policy_index\u003dint(POLICIES.default),"},{"line_number":1474,"context_line":"            segment_bucket_policy_index\u003dNone, extra_headers\u003d{}):"},{"line_number":1475,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1476,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1477,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?uploadId\u003dX\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"6d12cea0_4eee818e","line":1474,"range":{"start_line":1473,"start_character":18,"end_line":1474,"end_character":44},"in_reply_to":"cb174b49_737c3e1d","updated":"2025-05-21 01:07:51.000000000","message":"Done","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ea0bfd292b1f886458cc1c0edeaf7883d2815c71","unresolved":true,"context_lines":[{"line_number":1746,"context_line":"    def test_object_multipart_upload_retry_complete_with_if_unmodified_since("},{"line_number":1747,"context_line":"            self):"},{"line_number":1748,"context_line":"        self._do_object_multipart_upload_retry_complete_etag_mismatch_501("},{"line_number":1749,"context_line":"            {\u0027If-Unmodified-Since\u0027: \u0027not-the-etag\u0027})"},{"line_number":1750,"context_line":""},{"line_number":1751,"context_line":"    def test_object_multipart_upload_retry_complete_upload_id_mismatch(self):"},{"line_number":1752,"context_line":"        content_md5 \u003d base64.b64encode(md5("}],"source_content_type":"text/x-python","patch_set":1,"id":"77a0ab6c_5fdcfc7a","line":1749,"updated":"2025-05-20 11:05:21.000000000","message":"pretty comprehensive coverage, thanks!","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bf7aa49f7a262ec8941cd757d3e8651b444397fd","unresolved":false,"context_lines":[{"line_number":1746,"context_line":"    def test_object_multipart_upload_retry_complete_with_if_unmodified_since("},{"line_number":1747,"context_line":"            self):"},{"line_number":1748,"context_line":"        self._do_object_multipart_upload_retry_complete_etag_mismatch_501("},{"line_number":1749,"context_line":"            {\u0027If-Unmodified-Since\u0027: \u0027not-the-etag\u0027})"},{"line_number":1750,"context_line":""},{"line_number":1751,"context_line":"    def test_object_multipart_upload_retry_complete_upload_id_mismatch(self):"},{"line_number":1752,"context_line":"        content_md5 \u003d base64.b64encode(md5("}],"source_content_type":"text/x-python","patch_set":1,"id":"51edee75_67c43cfb","line":1749,"in_reply_to":"77a0ab6c_5fdcfc7a","updated":"2025-05-21 01:07:51.000000000","message":"Acknowledged","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a5a2382b9c309e6321926634867272c8d2437cb4","unresolved":true,"context_lines":[{"line_number":1398,"context_line":""},{"line_number":1399,"context_line":"    def _do_test_object_multipart_upload_complete("},{"line_number":1400,"context_line":"            self, bucket_policy_index\u003dint(POLICIES.default),"},{"line_number":1401,"context_line":"            segment_bucket_policy_index\u003dNone, extra_headers\u003d{}):"},{"line_number":1402,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1403,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1404,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?uploadId\u003dX\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ebfdb171_dfad2740","line":1401,"range":{"start_line":1401,"start_character":46,"end_line":1401,"end_character":62},"updated":"2025-05-21 09:28:30.000000000","message":"see comment line 1472","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6ab7560c632a8cf248ec252cc51528479de79ad6","unresolved":false,"context_lines":[{"line_number":1398,"context_line":""},{"line_number":1399,"context_line":"    def _do_test_object_multipart_upload_complete("},{"line_number":1400,"context_line":"            self, bucket_policy_index\u003dint(POLICIES.default),"},{"line_number":1401,"context_line":"            segment_bucket_policy_index\u003dNone, extra_headers\u003d{}):"},{"line_number":1402,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1403,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1404,"context_line":"        req \u003d Request.blank(\u0027/bucket/object?uploadId\u003dX\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"039652df_22bf2c7b","line":1401,"range":{"start_line":1401,"start_character":46,"end_line":1401,"end_character":62},"in_reply_to":"ebfdb171_dfad2740","updated":"2025-05-21 18:32:39.000000000","message":"Acknowledged","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a5a2382b9c309e6321926634867272c8d2437cb4","unresolved":true,"context_lines":[{"line_number":1469,"context_line":"            extra_headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027}"},{"line_number":1470,"context_line":"        )"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def _do_test_object_multipart_upload_complete_501(self, extra_headers\u003d{}):"},{"line_number":1473,"context_line":"        bucket_policy_index \u003d int(POLICIES.default)"},{"line_number":1474,"context_line":"        segment_bucket_policy_index \u003d bucket_policy_index"},{"line_number":1475,"context_line":"        content_md5 \u003d base64.b64encode(md5("}],"source_content_type":"text/x-python","patch_set":2,"id":"ca0b6b20_6ceb2702","line":1472,"range":{"start_line":1472,"start_character":74,"end_line":1472,"end_character":76},"updated":"2025-05-21 09:28:30.000000000","message":"I didn\u0027t spot this before - best practice is to not default an arg to a mutable because there is only ever ONE instance of that default arg shared by all calls to the function\n\nhttps://docs.python-guide.org/writing/gotchas/#mutable-default-arguments\n\nso instead write\n\n```\n        extra_headers \u003d extra_headers or {}\n```\n\nor, in this case, you don\u0027t need a default anyway, extra_headers is always passed in","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6ab7560c632a8cf248ec252cc51528479de79ad6","unresolved":false,"context_lines":[{"line_number":1469,"context_line":"            extra_headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027}"},{"line_number":1470,"context_line":"        )"},{"line_number":1471,"context_line":""},{"line_number":1472,"context_line":"    def _do_test_object_multipart_upload_complete_501(self, extra_headers\u003d{}):"},{"line_number":1473,"context_line":"        bucket_policy_index \u003d int(POLICIES.default)"},{"line_number":1474,"context_line":"        segment_bucket_policy_index \u003d bucket_policy_index"},{"line_number":1475,"context_line":"        content_md5 \u003d base64.b64encode(md5("}],"source_content_type":"text/x-python","patch_set":2,"id":"c5d5ab2f_b279d1f7","line":1472,"range":{"start_line":1472,"start_character":74,"end_line":1472,"end_character":76},"in_reply_to":"ca0b6b20_6ceb2702","updated":"2025-05-21 18:32:39.000000000","message":"I learned this when I started learning python, but apparently I forgot it already and it\u0027s good to remind me again on this, thanks Al!","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a5a2382b9c309e6321926634867272c8d2437cb4","unresolved":true,"context_lines":[{"line_number":1586,"context_line":""},{"line_number":1587,"context_line":"    def _do_test_object_multipart_upload_retry_complete("},{"line_number":1588,"context_line":"            self, bucket_policy_index\u003dint(POLICIES.default),"},{"line_number":1589,"context_line":"            segment_bucket_policy_index\u003dNone, extra_headers\u003d{}):"},{"line_number":1590,"context_line":"        if segment_bucket_policy_index is None:"},{"line_number":1591,"context_line":"            segment_bucket_policy_index \u003d bucket_policy_index"},{"line_number":1592,"context_line":"        self._register_bucket_policy_index_head(\u0027bucket\u0027, bucket_policy_index)"}],"source_content_type":"text/x-python","patch_set":2,"id":"60b36013_6c21eb7a","line":1589,"range":{"start_line":1589,"start_character":46,"end_line":1589,"end_character":62},"updated":"2025-05-21 09:28:30.000000000","message":"see comment line 1472","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a5a2382b9c309e6321926634867272c8d2437cb4","unresolved":true,"context_lines":[{"line_number":1649,"context_line":"            extra_headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027})"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"    def _do_object_multipart_upload_retry_complete_etag_mismatch("},{"line_number":1652,"context_line":"            self, extra_headers\u003d{}):"},{"line_number":1653,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1654,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1655,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a100b19_78e762b4","line":1652,"range":{"start_line":1652,"start_character":18,"end_line":1652,"end_character":34},"updated":"2025-05-21 09:28:30.000000000","message":"see comment line 1472","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6ab7560c632a8cf248ec252cc51528479de79ad6","unresolved":false,"context_lines":[{"line_number":1649,"context_line":"            extra_headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027})"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"    def _do_object_multipart_upload_retry_complete_etag_mismatch("},{"line_number":1652,"context_line":"            self, extra_headers\u003d{}):"},{"line_number":1653,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1654,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1655,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"399bddbf_a8e8c445","line":1652,"range":{"start_line":1652,"start_character":18,"end_line":1652,"end_character":34},"in_reply_to":"5a100b19_78e762b4","updated":"2025-05-21 18:32:39.000000000","message":"Acknowledged","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a5a2382b9c309e6321926634867272c8d2437cb4","unresolved":true,"context_lines":[{"line_number":1696,"context_line":"            {\u0027If-None-Match\u0027: \u0027*\u0027})"},{"line_number":1697,"context_line":""},{"line_number":1698,"context_line":"    def _do_object_multipart_upload_retry_complete_etag_mismatch_501("},{"line_number":1699,"context_line":"            self, extra_headers\u003d{}):"},{"line_number":1700,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1701,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1702,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"20ffb288_3c8c3a21","line":1699,"range":{"start_line":1699,"start_character":18,"end_line":1699,"end_character":34},"updated":"2025-05-21 09:28:30.000000000","message":"see comment line 1472, but in this case you don\u0027t need a default - extra_headers is always passed in","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"6ab7560c632a8cf248ec252cc51528479de79ad6","unresolved":false,"context_lines":[{"line_number":1696,"context_line":"            {\u0027If-None-Match\u0027: \u0027*\u0027})"},{"line_number":1697,"context_line":""},{"line_number":1698,"context_line":"    def _do_object_multipart_upload_retry_complete_etag_mismatch_501("},{"line_number":1699,"context_line":"            self, extra_headers\u003d{}):"},{"line_number":1700,"context_line":"        content_md5 \u003d base64.b64encode(md5("},{"line_number":1701,"context_line":"            XML.encode(\u0027ascii\u0027), usedforsecurity\u003dFalse).digest())"},{"line_number":1702,"context_line":"        self.swift.register(\u0027HEAD\u0027, \u0027/v1/AUTH_test/bucket+segments/object/X\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"296c8e83_a0b9e19e","line":1699,"range":{"start_line":1699,"start_character":18,"end_line":1699,"end_character":34},"in_reply_to":"20ffb288_3c8c3a21","updated":"2025-05-21 18:32:39.000000000","message":"Acknowledged","commit_id":"0ea0bb18f5068d116a16f7406b2777b41f4f89b9"}],"test/unit/common/middleware/s3api/test_s3request.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ea0bfd292b1f886458cc1c0edeaf7883d2815c71","unresolved":true,"context_lines":[{"line_number":429,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":430,"context_line":"        with self.assertRaises(s3response.S3NotImplemented) as cm:"},{"line_number":431,"context_line":"            S3Request(req.environ, self.s3api.conf)._validate_headers()"},{"line_number":432,"context_line":"        self.assertIn(\u0027501 Not Implemented\u0027, str(cm.exception))"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def test_put_object_if_none_match_star(self):"},{"line_number":435,"context_line":"        # This is the only allowed case, should NOT raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ec2f73b_e788bdfe","line":432,"updated":"2025-05-20 11:05:21.000000000","message":"great! these all fail as expected if I introduce a regression","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bf7aa49f7a262ec8941cd757d3e8651b444397fd","unresolved":false,"context_lines":[{"line_number":429,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":430,"context_line":"        with self.assertRaises(s3response.S3NotImplemented) as cm:"},{"line_number":431,"context_line":"            S3Request(req.environ, self.s3api.conf)._validate_headers()"},{"line_number":432,"context_line":"        self.assertIn(\u0027501 Not Implemented\u0027, str(cm.exception))"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def test_put_object_if_none_match_star(self):"},{"line_number":435,"context_line":"        # This is the only allowed case, should NOT raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"47872146_26ca4327","line":432,"in_reply_to":"3ec2f73b_e788bdfe","updated":"2025-05-21 01:07:51.000000000","message":"Acknowledged","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ea0bfd292b1f886458cc1c0edeaf7883d2815c71","unresolved":true,"context_lines":[{"line_number":437,"context_line":"                            headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027,"},{"line_number":438,"context_line":"                                     \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":439,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":440,"context_line":"        S3Request(req.environ, self.s3api.conf)._validate_headers()"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def _test_request_timestamp_sigv4(self, date_header):"},{"line_number":443,"context_line":"        # signature v4 here"}],"source_content_type":"text/x-python","patch_set":1,"id":"60fd4f3a_a2929f5b","line":440,"updated":"2025-05-20 11:05:21.000000000","message":"if there is a regression this test will fail with\n\n```\nFAILED\ntest/unit/common/middleware/s3api/test_s3request.py:433 (TestRequest.test_put_object_if_none_match_star)\ntest_s3request.py:440: in test_put_object_if_none_match_star\n    S3Request(req.environ, self.s3api.conf)._validate_headers()\n../../../../../swift/common/middleware/s3api/s3request.py:978: in __init__\n    self._validate_headers()\n../../../../../swift/common/middleware/s3api/s3request.py:1363: in _validate_headers\n    \u0027Conditional object PUTs are not supported.\u0027)\nE   swift.common.middleware.s3api.s3response.S3NotImplemented: 501 Not Implemented\n```\n\ni.e. not an AssertionError\n\ncould be better to wrap in a try/except:\n```\ndiff --git a/test/unit/common/middleware/s3api/test_s3request.py b/test/unit/common/middleware/s3api/test_s3request.py\nindex e94acf159..53cd5f981 100644\n--- a/test/unit/common/middleware/s3api/test_s3request.py\n+++ b/test/unit/common/middleware/s3api/test_s3request.py\n@@ -37,7 +37,7 @@ from swift.common.middleware.s3api.s3response import InvalidArgument, \\\n     NoSuchBucket, InternalError, ServiceUnavailable, \\\n     AccessDenied, SignatureDoesNotMatch, RequestTimeTooSkewed, \\\n     InvalidPartArgument, InvalidPartNumber, InvalidRequest, \\\n-    XAmzContentSHA256Mismatch\n+    XAmzContentSHA256Mismatch, ErrorResponse\n \n from test.debug_logger import debug_logger\n \n@@ -437,7 +437,10 @@ class TestRequest(S3ApiTestCase):\n                             headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027,\n                                      \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,\n                                      \u0027Date\u0027: self.get_date_header()})\n-        S3Request(req.environ, self.s3api.conf)._validate_headers()\n+        try:\n+            S3Request(req.environ, self.s3api.conf)._validate_headers()\n+        except ErrorResponse as err:\n+            self.fail(\u0027Unexpected exception raised: %s\u0027 % err)\n \n     def _test_request_timestamp_sigv4(self, date_header):\n         # signature v4 here\n\n```\nwhich would then fail with:\n```\nE   AssertionError: Unexpected exception raised: 501 Not Implemented\n```","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"bf7aa49f7a262ec8941cd757d3e8651b444397fd","unresolved":false,"context_lines":[{"line_number":437,"context_line":"                            headers\u003d{\u0027If-None-Match\u0027: \u0027*\u0027,"},{"line_number":438,"context_line":"                                     \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":439,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":440,"context_line":"        S3Request(req.environ, self.s3api.conf)._validate_headers()"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    def _test_request_timestamp_sigv4(self, date_header):"},{"line_number":443,"context_line":"        # signature v4 here"}],"source_content_type":"text/x-python","patch_set":1,"id":"978be5ff_2833e427","line":440,"in_reply_to":"60fd4f3a_a2929f5b","updated":"2025-05-21 01:07:51.000000000","message":"Done","commit_id":"1ce8d152d2af8531ce3437ffb6975154643db6cd"}]}
