)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cb93e4e089e0098806060bdaabefa92f21f498eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9ff6364a_d5c47fdb","updated":"2025-06-11 18:05:44.000000000","message":"The substance of this fix could probably merge straight to master but I\u0027ve yet to try the rebase - IDK how must test infrastructure is coming in the parent \"check-checksums\" patch","commit_id":"beb7a8410b233e26aa910799c5cad8e7852a8f12"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"da3c5f26ec40b344917e7d90725b5aaacefe8e5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3f0572aa_4330a3b1","updated":"2025-06-11 18:09:45.000000000","message":"this patch started out writing tests for checksum validation with mpu POST requests, but ended up stumbling across the error message discrepancy","commit_id":"beb7a8410b233e26aa910799c5cad8e7852a8f12"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"79c3fd55d8e7bb678c33f8a2ea79969524aed26f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8b21303a_90a13d62","updated":"2025-06-11 22:02:16.000000000","message":"I can squash it in (with some fixes) 👍","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1f31e7e0d04334f78d132eb6e5004e531ff8398e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1223bd3a_eec4c30d","updated":"2025-06-12 03:15:44.000000000","message":"I\u0027m probably just missing something obvious, happens a lot when it\u0027s aws :P","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b693ac5e9b895c0a79cb14ad1eb4aa75a0ecc481","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"51a287af_42803a36","updated":"2025-06-26 17:34:55.000000000","message":"Jianjian says Alistair was right to want this as a separate patch ;-)","commit_id":"24995e72aafbc552b007b137d3e3a44458d97862"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"fc8523bcbc79dec6e22e542b056e6cbc75ff53da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a1ee3ef6_1fa2a082","updated":"2025-07-01 20:42:37.000000000","message":"Both Tim and Al are happy with the last patch set, let\u0027s merge it!","commit_id":"1a27d1b83ff6567742478a0e4860cd0995938203"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45b47df34c915876b1992f9968476aba5a6ff4aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f5caeebb_81df78fd","updated":"2025-06-30 13:03:52.000000000","message":"LGTM","commit_id":"1a27d1b83ff6567742478a0e4860cd0995938203"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7003b20c544b2774074e8092858311fb5e8b218c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"b510a8bd_ddf0a80c","updated":"2025-06-30 16:23:57.000000000","message":"recheck\n\ngrenade timeout","commit_id":"1a27d1b83ff6567742478a0e4860cd0995938203"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"79c3fd55d8e7bb678c33f8a2ea79969524aed26f","unresolved":true,"context_lines":[{"line_number":705,"context_line":"                    content_md5 \u003d req.headers[\u0027content-md5\u0027]"},{"line_number":706,"context_line":"                    raise BadDigest("},{"line_number":707,"context_line":"                        content_md5\u003dcontent_md5,"},{"line_number":708,"context_line":"                        expected_digest\u003dcontent_md5"},{"line_number":709,"context_line":"                    )"},{"line_number":710,"context_line":"                # We\u0027re only interested in the body here, in the"},{"line_number":711,"context_line":"                # multipart-upload controller -- *don\u0027t* let it get"}],"source_content_type":"text/x-python","patch_set":2,"id":"b17707f7_aed9d910","line":708,"updated":"2025-06-11 22:02:16.000000000","message":"I was expecting one of these to use `exp_etag` -- but then I guess we\u0027d want `calculated_digest` so it would come out in a `\u003cCalculatedDigest\u003e` tag.\n\n(I think part of the reason I hadn\u0027t done that yet is that we won\u0027t do it for normal object uploads [since Swift\u0027s 422 won\u0027t include the received ETag] and it seemed a little weird to only include it with *some* `BadDigest` errors.)\n\nI think we can just drop the `content_md5` arg -- AWS would would never send a `\u003cContentMd5\u003e` tag, right?\n\nVery curious that AWS would send a b64 `\u003cExpectedDigest\u003e` here, but a hex one elsewhere. 😕","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"365109c008591621bd21c0c5169b66abc26b554c","unresolved":true,"context_lines":[{"line_number":705,"context_line":"                    content_md5 \u003d req.headers[\u0027content-md5\u0027]"},{"line_number":706,"context_line":"                    raise BadDigest("},{"line_number":707,"context_line":"                        content_md5\u003dcontent_md5,"},{"line_number":708,"context_line":"                        expected_digest\u003dcontent_md5"},{"line_number":709,"context_line":"                    )"},{"line_number":710,"context_line":"                # We\u0027re only interested in the body here, in the"},{"line_number":711,"context_line":"                # multipart-upload controller -- *don\u0027t* let it get"}],"source_content_type":"text/x-python","patch_set":2,"id":"74a07a5d_d78cb052","line":708,"in_reply_to":"63ebca66_4057b4c4","updated":"2025-06-24 17:35:32.000000000","message":"I guess user would just need to retry MPU post, since the MPU manifest received by proxy-server got corrupted during transmission?","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b693ac5e9b895c0a79cb14ad1eb4aa75a0ecc481","unresolved":false,"context_lines":[{"line_number":705,"context_line":"                    content_md5 \u003d req.headers[\u0027content-md5\u0027]"},{"line_number":706,"context_line":"                    raise BadDigest("},{"line_number":707,"context_line":"                        content_md5\u003dcontent_md5,"},{"line_number":708,"context_line":"                        expected_digest\u003dcontent_md5"},{"line_number":709,"context_line":"                    )"},{"line_number":710,"context_line":"                # We\u0027re only interested in the body here, in the"},{"line_number":711,"context_line":"                # multipart-upload controller -- *don\u0027t* let it get"}],"source_content_type":"text/x-python","patch_set":2,"id":"7fc22d57_8020d75a","line":708,"in_reply_to":"b17707f7_aed9d910","updated":"2025-06-26 17:34:55.000000000","message":"\u003e I think we can just drop the `content_md5` arg -- AWS would would never send a `\u003cContentMd5\u003e` tag, right?\n\nThat part\u0027s done, anyway; I think the rest was just me rambling.","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1f31e7e0d04334f78d132eb6e5004e531ff8398e","unresolved":true,"context_lines":[{"line_number":705,"context_line":"                    content_md5 \u003d req.headers[\u0027content-md5\u0027]"},{"line_number":706,"context_line":"                    raise BadDigest("},{"line_number":707,"context_line":"                        content_md5\u003dcontent_md5,"},{"line_number":708,"context_line":"                        expected_digest\u003dcontent_md5"},{"line_number":709,"context_line":"                    )"},{"line_number":710,"context_line":"                # We\u0027re only interested in the body here, in the"},{"line_number":711,"context_line":"                # multipart-upload controller -- *don\u0027t* let it get"}],"source_content_type":"text/x-python","patch_set":2,"id":"63ebca66_4057b4c4","line":708,"in_reply_to":"b17707f7_aed9d910","updated":"2025-06-12 03:15:44.000000000","message":"So we (or AWS) doesn\u0027t want to send back the calculated MD5 for the user to compare against?","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"79c3fd55d8e7bb678c33f8a2ea79969524aed26f","unresolved":true,"context_lines":[{"line_number":1069,"context_line":"                checksum_source \u003d self.headers"},{"line_number":1070,"context_line":""},{"line_number":1071,"context_line":"            # S3 doesn\u0027t check the checksum for at least some POSTs (e.g. MPU"},{"line_number":1072,"context_line":"            # complete) so restrict this to PUTs"},{"line_number":1073,"context_line":"            if checksum_header and self.method \u003d\u003d \u0027PUT\u0027:"},{"line_number":1074,"context_line":"                self._install_checksumming_input_wrapper("},{"line_number":1075,"context_line":"                    checksum_hasher, checksum_header, checksum_source)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dd1e54e8_3d75be42","line":1072,"updated":"2025-06-11 22:02:16.000000000","message":"I should really look at what happens with initiate MPU and delete multiple...","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"}],"test/s3api/test_input_errors.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cb93e4e089e0098806060bdaabefa92f21f498eb","unresolved":true,"context_lines":[{"line_number":1613,"context_line":"            }"},{"line_number":1614,"context_line":"        )"},{"line_number":1615,"context_line":"        self.assertEqual(resp.status_code, 200, resp.content)"},{"line_number":1616,"context_line":"        self.assertIn(b\u0027CompleteMultipartUploadResult\u0027, resp.content)"},{"line_number":1617,"context_line":""},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"class TestV4AuthHeaders(InputErrorsMixin, BaseS3TestCaseWithBucket):"}],"source_content_type":"text/x-python","patch_set":1,"id":"d1bb18d0_cdb927ea","line":1616,"updated":"2025-06-11 18:05:44.000000000","message":"probably worth adding a comment to highlight this result ?","commit_id":"beb7a8410b233e26aa910799c5cad8e7852a8f12"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b693ac5e9b895c0a79cb14ad1eb4aa75a0ecc481","unresolved":false,"context_lines":[{"line_number":1613,"context_line":"            }"},{"line_number":1614,"context_line":"        )"},{"line_number":1615,"context_line":"        self.assertEqual(resp.status_code, 200, resp.content)"},{"line_number":1616,"context_line":"        self.assertIn(b\u0027CompleteMultipartUploadResult\u0027, resp.content)"},{"line_number":1617,"context_line":""},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"class TestV4AuthHeaders(InputErrorsMixin, BaseS3TestCaseWithBucket):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0164021b_f8221729","line":1616,"in_reply_to":"86066e30_bdcac583","updated":"2025-06-26 17:34:55.000000000","message":"Done","commit_id":"beb7a8410b233e26aa910799c5cad8e7852a8f12"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"79c3fd55d8e7bb678c33f8a2ea79969524aed26f","unresolved":true,"context_lines":[{"line_number":1613,"context_line":"            }"},{"line_number":1614,"context_line":"        )"},{"line_number":1615,"context_line":"        self.assertEqual(resp.status_code, 200, resp.content)"},{"line_number":1616,"context_line":"        self.assertIn(b\u0027CompleteMultipartUploadResult\u0027, resp.content)"},{"line_number":1617,"context_line":""},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"class TestV4AuthHeaders(InputErrorsMixin, BaseS3TestCaseWithBucket):"}],"source_content_type":"text/x-python","patch_set":1,"id":"86066e30_bdcac583","line":1616,"in_reply_to":"d1bb18d0_cdb927ea","updated":"2025-06-11 22:02:16.000000000","message":"Yeah, probably.","commit_id":"beb7a8410b233e26aa910799c5cad8e7852a8f12"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1f31e7e0d04334f78d132eb6e5004e531ff8398e","unresolved":true,"context_lines":[{"line_number":246,"context_line":"        expires \u003d int((request[\u0027now\u0027] - EPOCH).total_seconds()) \\"},{"line_number":247,"context_line":"            + self.default_expiration"},{"line_number":248,"context_line":"        request[\u0027query\u0027].update({"},{"line_number":249,"context_line":"            \u0027Expires\u0027: str(expires),"},{"line_number":250,"context_line":"            \u0027AWSAccessKeyId\u0027: self.access_key,"},{"line_number":251,"context_line":"        })"},{"line_number":252,"context_line":"        request[\u0027query\u0027].update({"}],"source_content_type":"text/x-python","patch_set":2,"id":"b39a1e40_8f7a8e7e","line":249,"range":{"start_line":249,"start_character":23,"end_line":249,"end_character":35},"updated":"2025-06-12 03:15:44.000000000","message":"Can this just be:\n```\n\u0027Expires\u0027: date_to_sign(request),\n```\n\nAs it seems to do the same thing.","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"766231628058d6146c40e50f9954bc7cf02bbf37","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        expires \u003d int((request[\u0027now\u0027] - EPOCH).total_seconds()) \\"},{"line_number":247,"context_line":"            + self.default_expiration"},{"line_number":248,"context_line":"        request[\u0027query\u0027].update({"},{"line_number":249,"context_line":"            \u0027Expires\u0027: str(expires),"},{"line_number":250,"context_line":"            \u0027AWSAccessKeyId\u0027: self.access_key,"},{"line_number":251,"context_line":"        })"},{"line_number":252,"context_line":"        request[\u0027query\u0027].update({"}],"source_content_type":"text/x-python","patch_set":2,"id":"54089a7a_c9d2a4e0","line":249,"range":{"start_line":249,"start_character":23,"end_line":249,"end_character":35},"in_reply_to":"b39a1e40_8f7a8e7e","updated":"2025-06-26 17:38:10.000000000","message":"Oh yeah, *this part* I later realized I had opinions on: https://review.opendev.org/c/openstack/swift/+/944073/comment/9bb62c75_39e06610/\n\nI\u0027m glad of your comment, Matt -- I\u0027d glossed over this part of the change originally when I squashed in.","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"79c3fd55d8e7bb678c33f8a2ea79969524aed26f","unresolved":true,"context_lines":[{"line_number":530,"context_line":"        # self.assertIn(\u0027\u003cContent-MD5\u003e%s\u003c/Content-MD5\u003e\u0027 % md5_in_headers,"},{"line_number":531,"context_line":"        #               respbody)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def assertBadDigest(self, resp, md5_in_headers, md5_of_body, exp_hex\u003dTrue):"},{"line_number":534,"context_line":"        respbody \u003d resp.content"},{"line_number":535,"context_line":"        if not isinstance(respbody, str):"},{"line_number":536,"context_line":"            respbody \u003d respbody.decode(\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"70d92c58_1ce7fa77","line":533,"range":{"start_line":533,"start_character":65,"end_line":533,"end_character":72},"updated":"2025-06-11 22:02:16.000000000","message":"Maybe better as `expected_digest_should_be_hex`? We might also want a docstring to call out that the `md5_` args should be base64.","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b693ac5e9b895c0a79cb14ad1eb4aa75a0ecc481","unresolved":false,"context_lines":[{"line_number":530,"context_line":"        # self.assertIn(\u0027\u003cContent-MD5\u003e%s\u003c/Content-MD5\u003e\u0027 % md5_in_headers,"},{"line_number":531,"context_line":"        #               respbody)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def assertBadDigest(self, resp, md5_in_headers, md5_of_body, exp_hex\u003dTrue):"},{"line_number":534,"context_line":"        respbody \u003d resp.content"},{"line_number":535,"context_line":"        if not isinstance(respbody, str):"},{"line_number":536,"context_line":"            respbody \u003d respbody.decode(\u0027utf8\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1fbfc331_27a99dd1","line":533,"range":{"start_line":533,"start_character":65,"end_line":533,"end_character":72},"in_reply_to":"70d92c58_1ce7fa77","updated":"2025-06-26 17:34:55.000000000","message":"Done","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"79c3fd55d8e7bb678c33f8a2ea79969524aed26f","unresolved":true,"context_lines":[{"line_number":547,"context_line":"            exp_digest \u003d binascii.hexlify("},{"line_number":548,"context_line":"                base64.b64decode(exp_digest)).decode(\u0027ascii\u0027)"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"        # Yes, really -- AWS needs b64 in headers, but reflects back hex"},{"line_number":551,"context_line":"        self.assertIn(\u0027\u003cExpectedDigest\u003e%s\u003c/ExpectedDigest\u003e\u0027 % exp_digest,"},{"line_number":552,"context_line":"                      respbody)"},{"line_number":553,"context_line":"        # TODO: AWS provides this, but swift doesn\u0027t (yet)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3e5ea044_d11e941d","line":550,"updated":"2025-06-11 22:02:16.000000000","message":"This comment should move up (into the `if exp_hex:` block) and get updated:\n\n```\n# Yes, really -- AWS needs b64 in headers, then (only sometimes!) reflects\n# back hex, but only in \u003cExpectedDigest\u003e not \u003cCalculatedDigest\u003e\n```\n\n😭","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"1f31e7e0d04334f78d132eb6e5004e531ff8398e","unresolved":true,"context_lines":[{"line_number":547,"context_line":"            exp_digest \u003d binascii.hexlify("},{"line_number":548,"context_line":"                base64.b64decode(exp_digest)).decode(\u0027ascii\u0027)"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"        # Yes, really -- AWS needs b64 in headers, but reflects back hex"},{"line_number":551,"context_line":"        self.assertIn(\u0027\u003cExpectedDigest\u003e%s\u003c/ExpectedDigest\u003e\u0027 % exp_digest,"},{"line_number":552,"context_line":"                      respbody)"},{"line_number":553,"context_line":"        # TODO: AWS provides this, but swift doesn\u0027t (yet)"}],"source_content_type":"text/x-python","patch_set":2,"id":"641ada33_a10e4004","line":550,"in_reply_to":"3e5ea044_d11e941d","updated":"2025-06-12 03:15:44.000000000","message":":facepalm: At least it isn\u0027t just me getting confused/annoyed by the b64 sometimes and hex others","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b693ac5e9b895c0a79cb14ad1eb4aa75a0ecc481","unresolved":false,"context_lines":[{"line_number":547,"context_line":"            exp_digest \u003d binascii.hexlify("},{"line_number":548,"context_line":"                base64.b64decode(exp_digest)).decode(\u0027ascii\u0027)"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"        # Yes, really -- AWS needs b64 in headers, but reflects back hex"},{"line_number":551,"context_line":"        self.assertIn(\u0027\u003cExpectedDigest\u003e%s\u003c/ExpectedDigest\u003e\u0027 % exp_digest,"},{"line_number":552,"context_line":"                      respbody)"},{"line_number":553,"context_line":"        # TODO: AWS provides this, but swift doesn\u0027t (yet)"}],"source_content_type":"text/x-python","patch_set":2,"id":"25e7eee1_e6d62f45","line":550,"in_reply_to":"3e5ea044_d11e941d","updated":"2025-06-26 17:34:55.000000000","message":"Done","commit_id":"68f04ac06b553e0e6726a29b5f08778b6059dd0c"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"0d03fb276c6a6b7e5a7c2f91e273c9025be95d19","unresolved":true,"context_lines":[{"line_number":583,"context_line":"                      respbody)"},{"line_number":584,"context_line":"        exp_digest \u003d md5_in_headers"},{"line_number":585,"context_line":"        if expected_digest_should_be_hex:"},{"line_number":586,"context_line":"            # Yes, really -- AWS needs b64 in headers, then (sometimes!?)"},{"line_number":587,"context_line":"            # reflects back hex, but only in \u003cExpectedDigest\u003e not"},{"line_number":588,"context_line":"            # \u003cCalculatedDigest\u003e"},{"line_number":589,"context_line":"            exp_digest \u003d binascii.hexlify("}],"source_content_type":"text/x-python","patch_set":3,"id":"eeaf120a_3968c938","line":586,"updated":"2025-06-28 00:10:44.000000000","message":"from reading this comment, I got the impression that ``ExpectedDigest`` will be HEX. That\u0027ll be great if we can reword this sentence.","commit_id":"24995e72aafbc552b007b137d3e3a44458d97862"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"1d18020cba61078a72e9d5ca91af7ae787bfc00b","unresolved":true,"context_lines":[{"line_number":1323,"context_line":"                \u0027x-amz-checksum-crc32\u0027: _crc32(complete_mpu_body),"},{"line_number":1324,"context_line":"            }"},{"line_number":1325,"context_line":"        )"},{"line_number":1326,"context_line":"        self.assertBadDigest("},{"line_number":1327,"context_line":"            resp, _md5(b\u0027not the body\u0027), _md5(complete_mpu_body),"},{"line_number":1328,"context_line":"            expected_digest_should_be_hex\u003dFalse)"},{"line_number":1329,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"924be8fa_e474c6bb","line":1326,"updated":"2025-06-27 04:16:57.000000000","message":"this is weird, why my local vsaio returns ``AssertionError`` while Zuul pipeline is happy. so this test can\u0027t be run locally on vasio?\n\n```\nswift/test/s3api/test_input_errors.py:1326:\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\nswift/test/s3api/test_input_errors.py:591: in assertBadDigest\n    self.assertIn(\u0027\u003cExpectedDigest\u003e%s\u003c/ExpectedDigest\u003e\u0027 % exp_digest,\nE   AssertionError: \u0027\u003cExpectedDigest\u003e+a6OEsvPlkbVQxpNU1g3tw\u003d\u003d\u003c/ExpectedDigest\u003e\u0027 not found in \"\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e\\n\u003cError\u003e\u003cCode\u003eBadDigest\u003c/Code\u003e\u003cMessage\u003eThe Content-MD5 you specified did not match what we received.\u003c/Message\u003e\u003cRequestId\u003etx5bbc5741bbaa45c4bd7f1-00685e19dc\u003c/RequestId\u003e\u003cContentMd5\u003e+a6OEsvPlkbVQxpNU1g3tw\u003d\u003d\u003c/ContentMd5\u003e\u003c/Error\u003e\"\n```","commit_id":"24995e72aafbc552b007b137d3e3a44458d97862"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"0d03fb276c6a6b7e5a7c2f91e273c9025be95d19","unresolved":false,"context_lines":[{"line_number":1323,"context_line":"                \u0027x-amz-checksum-crc32\u0027: _crc32(complete_mpu_body),"},{"line_number":1324,"context_line":"            }"},{"line_number":1325,"context_line":"        )"},{"line_number":1326,"context_line":"        self.assertBadDigest("},{"line_number":1327,"context_line":"            resp, _md5(b\u0027not the body\u0027), _md5(complete_mpu_body),"},{"line_number":1328,"context_line":"            expected_digest_should_be_hex\u003dFalse)"},{"line_number":1329,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"6cafcc65_9597ebb6","line":1326,"in_reply_to":"760f945c_3c79c6eb","updated":"2025-06-28 00:10:44.000000000","message":"yes, that\u0027s the case!","commit_id":"24995e72aafbc552b007b137d3e3a44458d97862"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fb9acbbca9fe7ce1ca9133593799dd08efd7dd5c","unresolved":true,"context_lines":[{"line_number":1323,"context_line":"                \u0027x-amz-checksum-crc32\u0027: _crc32(complete_mpu_body),"},{"line_number":1324,"context_line":"            }"},{"line_number":1325,"context_line":"        )"},{"line_number":1326,"context_line":"        self.assertBadDigest("},{"line_number":1327,"context_line":"            resp, _md5(b\u0027not the body\u0027), _md5(complete_mpu_body),"},{"line_number":1328,"context_line":"            expected_digest_should_be_hex\u003dFalse)"},{"line_number":1329,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"760f945c_3c79c6eb","line":1326,"in_reply_to":"924be8fa_e474c6bb","updated":"2025-06-27 14:52:11.000000000","message":"That `\u003cExpectedDigest\u003e` vs `\u003cContentMd5\u003e` is exactly the issue this patch ought to address -- any chance you forgot to restart the proxy after downloading the patch?","commit_id":"24995e72aafbc552b007b137d3e3a44458d97862"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45b47df34c915876b1992f9968476aba5a6ff4aa","unresolved":true,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":"class S3SessionV2Query(S3SessionV2):"},{"line_number":243,"context_line":"    ignored_auth_query_params \u003d frozenset({"},{"line_number":244,"context_line":"        \u0027Expires\u0027, \u0027AWSAccessKeyId\u0027, \u0027Signature\u0027})"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def build_request("},{"line_number":247,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":4,"id":"69a281df_c6a0ef0c","line":244,"updated":"2025-06-30 13:03:52.000000000","message":"+1 OIC, this avoids breaking up the query construction quite so much","commit_id":"1a27d1b83ff6567742478a0e4860cd0995938203"}]}
