)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":10,"context_line":"  not BadDigest. This should include ClientComputedContentSHA256 and"},{"line_number":11,"context_line":"  S3ComputedContentSHA256 elements."},{"line_number":12,"context_line":"- Requests with a v4 authorization header perform a"},{"line_number":13,"context_line":"  looks-like-a-valid-sha256 check, rejecting with InvalidArgument"},{"line_number":14,"context_line":"  on failure."},{"line_number":15,"context_line":"- v2-signed requests can still raise XAmzContentSHA256Mismatch errors"},{"line_number":16,"context_line":"  (though they *don\u0027t* do the looks-like-a-valid-sha256 check)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"84232f1f_11b2c42a","line":13,"range":{"start_line":13,"start_character":50,"end_line":13,"end_character":65},"updated":"2024-08-23 17:28:30.000000000","message":"or InvalidRequest?\n\nhttps://review.opendev.org/c/openstack/swift/+/920206/7/swift/common/middleware/s3api/s3request.py line 876","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  not BadDigest. This should include ClientComputedContentSHA256 and"},{"line_number":11,"context_line":"  S3ComputedContentSHA256 elements."},{"line_number":12,"context_line":"- Requests with a v4 authorization header perform a"},{"line_number":13,"context_line":"  looks-like-a-valid-sha256 check, rejecting with InvalidArgument"},{"line_number":14,"context_line":"  on failure."},{"line_number":15,"context_line":"- v2-signed requests can still raise XAmzContentSHA256Mismatch errors"},{"line_number":16,"context_line":"  (though they *don\u0027t* do the looks-like-a-valid-sha256 check)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"b26f659b_bd1e156c","line":13,"range":{"start_line":13,"start_character":50,"end_line":13,"end_character":65},"in_reply_to":"5c86b4b3_6082a9ee","updated":"2024-09-03 13:48:42.000000000","message":"Done","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a1148723fde88d21632348bb9c347eaa50b1c02c","unresolved":true,"context_lines":[{"line_number":10,"context_line":"  not BadDigest. This should include ClientComputedContentSHA256 and"},{"line_number":11,"context_line":"  S3ComputedContentSHA256 elements."},{"line_number":12,"context_line":"- Requests with a v4 authorization header perform a"},{"line_number":13,"context_line":"  looks-like-a-valid-sha256 check, rejecting with InvalidArgument"},{"line_number":14,"context_line":"  on failure."},{"line_number":15,"context_line":"- v2-signed requests can still raise XAmzContentSHA256Mismatch errors"},{"line_number":16,"context_line":"  (though they *don\u0027t* do the looks-like-a-valid-sha256 check)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"5c86b4b3_6082a9ee","line":13,"range":{"start_line":13,"start_character":50,"end_line":13,"end_character":65},"in_reply_to":"84232f1f_11b2c42a","updated":"2024-08-23 19:51:15.000000000","message":"I\u0027d view that one as an existence check, worthy of its own bullet point.\n\n#willfix","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-08-23 16:41:18 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"s3api: Clean up some a bunch of errors"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- SHA256 mismatches should trip XAmzContentSHA256Mismatch errors,"},{"line_number":10,"context_line":"  not BadDigest. This should include ClientComputedContentSHA256 and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"a0a4382b_45d2fe47","line":7,"range":{"start_line":7,"start_character":7,"end_line":7,"end_character":38},"updated":"2024-09-03 13:48:42.000000000","message":"maybe worth mentioning SHA256 in the subject","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-08-23 16:41:18 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"s3api: Clean up some a bunch of errors"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- SHA256 mismatches should trip XAmzContentSHA256Mismatch errors,"},{"line_number":10,"context_line":"  not BadDigest. This should include ClientComputedContentSHA256 and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"f795e81d_ef777e53","line":7,"range":{"start_line":7,"start_character":7,"end_line":7,"end_character":38},"in_reply_to":"67a20f5d_07060b1c","updated":"2024-09-03 22:55:11.000000000","message":"Done","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"35c86e5538340edcc00a03fdb6194ba82df5afe2","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-08-23 16:41:18 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"s3api: Clean up some a bunch of errors"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- SHA256 mismatches should trip XAmzContentSHA256Mismatch errors,"},{"line_number":10,"context_line":"  not BadDigest. This should include ClientComputedContentSHA256 and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"67a20f5d_07060b1c","line":7,"range":{"start_line":7,"start_character":7,"end_line":7,"end_character":38},"in_reply_to":"a0a4382b_45d2fe47","updated":"2024-09-03 16:00:47.000000000","message":"There *is* more to it than just SHA256 changes -- I should make sure those are called out, too.","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"da55c4909517902d58977a726e4692e4174d4f93","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5e3208fc_b0e45b9e","updated":"2024-06-03 05:50:14.000000000","message":"Had a play in my VSAIO. And seems to do what we expect on the tin. And nicer to be more inline with AWS in our s3api middleware in regards to errors raised.","commit_id":"fa8eab42ce7b87f0a9d43d3512d51a92df7325f2"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"8c486fef4177be5aed623f50280f4734cff4bd67","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0267d4d1_9846ba64","updated":"2024-05-31 07:29:28.000000000","message":"I\u0027ve only managed to give it a fairly quick parse. Nothing standing out. Maybe will poke at it in my VSAIO on monday. But looking good so far.","commit_id":"fa8eab42ce7b87f0a9d43d3512d51a92df7325f2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"81959f6fd09177003c8c992420fc38299fb661a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"19a2dd2e_be7773f8","updated":"2024-05-30 16:11:31.000000000","message":"recheck\n\nPretty sure those were all git repo ownership issues.","commit_id":"fa8eab42ce7b87f0a9d43d3512d51a92df7325f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3a344059_7acfe3ec","updated":"2024-08-13 16:21:45.000000000","message":"Can\u0027t argue with cross-compat tests - WFM against S3 and vsaio 😊\n\nI\u0027ve only spent time in ``test_input_errors.py`` but wanted to get comments posted before I forget. I think it mostly revolves around \"can we break the long test down into smaller pieces?\".","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8c68a5079ae333e1f2cdcd0200e8ea82db0919c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6b8b3b68_40eb7e5d","updated":"2024-08-22 03:20:22.000000000","message":"There\u0027s still a bunch of areas for potential improvement; let me know where you think they fall on the \"fix it now\" to \"follow-up\" spectrum.","commit_id":"49f18d7bc13e176e3716cd219aa9239b64bd3852"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"5e952e7d_fa73e073","updated":"2024-08-23 17:28:30.000000000","message":"@Tim thanks for restructuring the cross-compat tests\n\nI saw all the cross-compat tests pass against s3 and my saio.\n\nI broke some things and saw tests fail.\n\nI was confused by the apparent inconsistent unsupported sha aliases and the suggested ones like \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027. Maybe that is unavoidable due to cross-compat requirement in the error response??\n\nI think there\u0027s also some missing test coverage around those error responses.\n\nThose minor things stopped me voting +2 but given that I\u0027m away for a while I\u0027m happy if this gets pushed over the line with Matt\u0027s vote.","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cf54c3b2ac8bffa4c14d9438c403ad9c993e2360","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"650adbe8_b69fbfb2","updated":"2024-08-23 18:17:36.000000000","message":"A bunch of stuff really destined for https://review.opendev.org/c/openstack/swift/+/836755 made its way in here. I was debating about whether we should shore it up with tests here and now, drop it until the actual streaming support comes, or just let it be -- I\u0027ll take a stab at trying to delay it until the right patch today.","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"6d430155_aed9c797","updated":"2024-09-03 13:48:42.000000000","message":"this looks ok\n\nsome suggestions for more unit tests, and a refactor (also linked to a paste), here https://review.opendev.org/c/openstack/swift/+/927822","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4507afc6fe4223969df37dd27d0aa7e9a81a611b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"bec1727d_fd8f06a0","updated":"2024-09-04 12:45:28.000000000","message":"@Tim there\u0027s a comment you have that suggests maybe more to come? If not, I\u0027m happy for this to merge.","commit_id":"7bf279779995be5081e3ff9da7e113f20efe4446"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"aa5a7126c1c2a883d2a35f7ccf3edf1c27ee8658","unresolved":true,"context_lines":[{"line_number":474,"context_line":"            if hashed_payload !\u003d \u0027UNSIGNED-PAYLOAD\u0027 and self.method not in ("},{"line_number":475,"context_line":"                    \u0027GET\u0027, \u0027HEAD\u0027):"},{"line_number":476,"context_line":"                if len(hashed_payload) !\u003d 64 or not all("},{"line_number":477,"context_line":"                        c in \u00270123456789abcdef\u0027"},{"line_number":478,"context_line":"                        for c in hashed_payload.lower()):"},{"line_number":479,"context_line":"                    raise InvalidArgument("},{"line_number":480,"context_line":"                        \u0027x-amz-content-sha256\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"855cdc6e_315a9584","line":477,"updated":"2024-05-22 19:50:15.000000000","message":"Where does this come from? Functest for multiupload, right?","commit_id":"1c5b8ab21dfb85957615b40821cb4d3343735a7a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9c4bcc5af99b3cee6229de016b5d44e29136afd","unresolved":false,"context_lines":[{"line_number":474,"context_line":"            if hashed_payload !\u003d \u0027UNSIGNED-PAYLOAD\u0027 and self.method not in ("},{"line_number":475,"context_line":"                    \u0027GET\u0027, \u0027HEAD\u0027):"},{"line_number":476,"context_line":"                if len(hashed_payload) !\u003d 64 or not all("},{"line_number":477,"context_line":"                        c in \u00270123456789abcdef\u0027"},{"line_number":478,"context_line":"                        for c in hashed_payload.lower()):"},{"line_number":479,"context_line":"                    raise InvalidArgument("},{"line_number":480,"context_line":"                        \u0027x-amz-content-sha256\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"bdb06dfd_82c614f1","line":477,"in_reply_to":"55a1aa92_c704e573","updated":"2024-08-22 22:21:15.000000000","message":"Acknowledged","commit_id":"1c5b8ab21dfb85957615b40821cb4d3343735a7a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a25096adc6133ff5c0187d47fef5a188f9441fde","unresolved":true,"context_lines":[{"line_number":474,"context_line":"            if hashed_payload !\u003d \u0027UNSIGNED-PAYLOAD\u0027 and self.method not in ("},{"line_number":475,"context_line":"                    \u0027GET\u0027, \u0027HEAD\u0027):"},{"line_number":476,"context_line":"                if len(hashed_payload) !\u003d 64 or not all("},{"line_number":477,"context_line":"                        c in \u00270123456789abcdef\u0027"},{"line_number":478,"context_line":"                        for c in hashed_payload.lower()):"},{"line_number":479,"context_line":"                    raise InvalidArgument("},{"line_number":480,"context_line":"                        \u0027x-amz-content-sha256\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"55a1aa92_c704e573","line":477,"in_reply_to":"855cdc6e_315a9584","updated":"2024-05-22 21:32:21.000000000","message":"Definitely touches on more than just that -- I added a test under `test/s3api/` that hits it with normal object upload and also passes against AWS.\n\nFWIW, the *motivation* for it is related to `aws-chunked` work and expanding the set of allowed special-cases beyond just `UNSIGNED-PAYLOAD`.","commit_id":"1c5b8ab21dfb85957615b40821cb4d3343735a7a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"8c486fef4177be5aed623f50280f4734cff4bd67","unresolved":true,"context_lines":[{"line_number":1077,"context_line":"                    hashed_payload)"},{"line_number":1078,"context_line":"            # else, length not provided -- Swift will kick out a"},{"line_number":1079,"context_line":"            # 411 Length Required which will get translated back"},{"line_number":1080,"context_line":"            # to a S3-style response in S3Request._swift_error_codes"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        if self._is_header_auth:"},{"line_number":1083,"context_line":"            if \u0027x-amz-date\u0027 in amz_headers:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3293d35d_13bad55d","line":1080,"updated":"2024-05-31 07:29:28.000000000","message":"Love this comment!","commit_id":"fa8eab42ce7b87f0a9d43d3512d51a92df7325f2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9c4bcc5af99b3cee6229de016b5d44e29136afd","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"                    hashed_payload)"},{"line_number":1078,"context_line":"            # else, length not provided -- Swift will kick out a"},{"line_number":1079,"context_line":"            # 411 Length Required which will get translated back"},{"line_number":1080,"context_line":"            # to a S3-style response in S3Request._swift_error_codes"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"        if self._is_header_auth:"},{"line_number":1083,"context_line":"            if \u0027x-amz-date\u0027 in amz_headers:"}],"source_content_type":"text/x-python","patch_set":3,"id":"a72f9221_1b814113","line":1080,"in_reply_to":"3293d35d_13bad55d","updated":"2024-08-22 22:21:15.000000000","message":"Acknowledged","commit_id":"fa8eab42ce7b87f0a9d43d3512d51a92df7325f2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":146,"context_line":"        self._expected \u003d expected_hex_hash"},{"line_number":147,"context_line":"        if content_length \u003d\u003d 0 and \\"},{"line_number":148,"context_line":"                self._hasher.hexdigest() !\u003d self._expected.lower():"},{"line_number":149,"context_line":"            self.close()"},{"line_number":150,"context_line":"            raise XAmzContentSHA256Mismatch("},{"line_number":151,"context_line":"                client_computed_content_s_h_a256\u003dself._expected,"},{"line_number":152,"context_line":"                s3_computed_content_s_h_a256\u003dself._hasher.hexdigest(),"}],"source_content_type":"text/x-python","patch_set":7,"id":"2cf91d0a_556be65f","line":149,"updated":"2024-08-23 17:28:30.000000000","message":"right, and test.unit.common.middleware.s3api.test_s3request.TestHashingInput.test_empty_bad_hash verifies that close is called","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        self._expected \u003d expected_hex_hash"},{"line_number":147,"context_line":"        if content_length \u003d\u003d 0 and \\"},{"line_number":148,"context_line":"                self._hasher.hexdigest() !\u003d self._expected.lower():"},{"line_number":149,"context_line":"            self.close()"},{"line_number":150,"context_line":"            raise XAmzContentSHA256Mismatch("},{"line_number":151,"context_line":"                client_computed_content_s_h_a256\u003dself._expected,"},{"line_number":152,"context_line":"                s3_computed_content_s_h_a256\u003dself._hasher.hexdigest(),"}],"source_content_type":"text/x-python","patch_set":7,"id":"8716e4ed_40d86b1a","line":149,"in_reply_to":"2cf91d0a_556be65f","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":149,"context_line":"            self.close()"},{"line_number":150,"context_line":"            raise XAmzContentSHA256Mismatch("},{"line_number":151,"context_line":"                client_computed_content_s_h_a256\u003dself._expected,"},{"line_number":152,"context_line":"                s3_computed_content_s_h_a256\u003dself._hasher.hexdigest(),"},{"line_number":153,"context_line":"            )"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def read(self, size\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ab1ca708_06077bd0","line":152,"updated":"2024-08-23 17:28:30.000000000","message":"wow, where does these kwargs get morphed to XML ? I know that they are because I saw tests fail (missing ClientComputedContentSHA256) when I removed them.\n\nI guess there some generic exception kwarg-\u003exml translation that I am not familiar with? and I guess the ``_`` is significant w.r.t. capitalisation?","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cf54c3b2ac8bffa4c14d9438c403ad9c993e2360","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            self.close()"},{"line_number":150,"context_line":"            raise XAmzContentSHA256Mismatch("},{"line_number":151,"context_line":"                client_computed_content_s_h_a256\u003dself._expected,"},{"line_number":152,"context_line":"                s3_computed_content_s_h_a256\u003dself._hasher.hexdigest(),"},{"line_number":153,"context_line":"            )"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def read(self, size\u003dNone):"}],"source_content_type":"text/x-python","patch_set":7,"id":"631de576_892ca2e8","line":152,"in_reply_to":"ab1ca708_06077bd0","updated":"2024-08-23 18:17:36.000000000","message":"\u003e I guess there some generic exception kwarg-\u003exml translation that I am not familiar with?\n\nhttps://github.com/openstack/swift/blob/2.33.0/swift/common/middleware/s3api/s3response.py#L268\n\n\u003e I guess the _ is significant w.r.t. capitalisation?\n\nhttps://github.com/openstack/swift/blob/2.33.0/swift/common/middleware/s3api/utils.py#L51-L52","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":159,"context_line":"        short_read \u003d bool(chunk) if size is None else (len(chunk) \u003c size)"},{"line_number":160,"context_line":"        if self._to_read \u003c 0 or (short_read and self._to_read) or ("},{"line_number":161,"context_line":"                self._to_read \u003d\u003d 0 and"},{"line_number":162,"context_line":"                self._hasher.hexdigest() !\u003d self._expected.lower()):"},{"line_number":163,"context_line":"            self.close()"},{"line_number":164,"context_line":"            # Since we don\u0027t return the last chunk, the PUT never completes"},{"line_number":165,"context_line":"            raise S3InputSHA256Mismatch("}],"source_content_type":"text/x-python","patch_set":7,"id":"9e81f7cf_aa88af0a","line":162,"updated":"2024-08-23 17:28:30.000000000","message":"ok, so on master the expected value was lower\u0027d before passing to HashingInput","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        short_read \u003d bool(chunk) if size is None else (len(chunk) \u003c size)"},{"line_number":160,"context_line":"        if self._to_read \u003c 0 or (short_read and self._to_read) or ("},{"line_number":161,"context_line":"                self._to_read \u003d\u003d 0 and"},{"line_number":162,"context_line":"                self._hasher.hexdigest() !\u003d self._expected.lower()):"},{"line_number":163,"context_line":"            self.close()"},{"line_number":164,"context_line":"            # Since we don\u0027t return the last chunk, the PUT never completes"},{"line_number":165,"context_line":"            raise S3InputSHA256Mismatch("}],"source_content_type":"text/x-python","patch_set":7,"id":"bb861411_9b016cd0","line":162,"in_reply_to":"9e81f7cf_aa88af0a","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":472,"context_line":"        if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":473,"context_line":"            # V4 with query parameters only"},{"line_number":474,"context_line":"            hashed_payload \u003d self.headers.get(\u0027X-Amz-Content-SHA256\u0027,"},{"line_number":475,"context_line":"                                              \u0027UNSIGNED-PAYLOAD\u0027)"},{"line_number":476,"context_line":"        elif \u0027X-Amz-Content-SHA256\u0027 not in self.headers:"},{"line_number":477,"context_line":"            msg \u003d \u0027Missing required header for this request: \u0027 \\"},{"line_number":478,"context_line":"                  \u0027x-amz-content-sha256\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"50f7b9f6_c7528862","line":475,"updated":"2024-08-23 17:28:30.000000000","message":"ok, tests failed when I broke this","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":473,"context_line":"            # V4 with query parameters only"},{"line_number":474,"context_line":"            hashed_payload \u003d self.headers.get(\u0027X-Amz-Content-SHA256\u0027,"},{"line_number":475,"context_line":"                                              \u0027UNSIGNED-PAYLOAD\u0027)"},{"line_number":476,"context_line":"        elif \u0027X-Amz-Content-SHA256\u0027 not in self.headers:"},{"line_number":477,"context_line":"            msg \u003d \u0027Missing required header for this request: \u0027 \\"},{"line_number":478,"context_line":"                  \u0027x-amz-content-sha256\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"5d457468_7d43fefc","line":475,"in_reply_to":"50f7b9f6_c7528862","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":883,"context_line":"                aws_sha256)"},{"line_number":884,"context_line":"        elif aws_sha256 \u003d\u003d \u0027UNSIGNED-PAYLOAD\u0027:"},{"line_number":885,"context_line":"            pass"},{"line_number":886,"context_line":"        elif aws_sha256 in ("},{"line_number":887,"context_line":"            \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":888,"context_line":"            \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027,"},{"line_number":889,"context_line":"            \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"7ebcb381_5234d506","line":886,"updated":"2024-08-23 17:28:30.000000000","message":"I removed this elif clause and none of the s3api unit tests failed\n\nbut I hacked a test and triggered this clause\n\n```\ndiff --git a/test/unit/common/middleware/s3api/test_s3request.py b/test/unit/common/middleware/s3api/test_s3request.py\nindex d35adb8e4..c1a9b0650 100644\n--- a/test/unit/common/middleware/s3api/test_s3request.py\n+++ b/test/unit/common/middleware/s3api/test_s3request.py\n@@ -595,7 +595,7 @@ class TestRequest(S3ApiTestCase):\n                 \u0027Credential\u003dtest/%s/us-east-1/s3/aws4_request, \u0027\n                 \u0027SignedHeaders\u003dhost;x-amz-content-sha256;x-amz-date,\u0027\n                 \u0027Signature\u003dX\u0027 % self.get_v4_amz_date_header().split(\u0027T\u0027, 1)[0],\n-            \u0027X-Amz-Content-SHA256\u0027: \u00270\u0027 * 64,\n+            \u0027X-Amz-Content-SHA256\u0027: \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,\n             \u0027Date\u0027: self.get_date_header(),\n             \u0027X-Amz-Date\u0027: x_amz_date}\n```\n\n```\n\u003e           raise S3NotImplemented(\n                \"Don\u0027t know how to validate %s streams\"\nE               swift.common.middleware.s3api.s3response.S3NotImplemented: 501 Not Implemented\n\n../../../../../swift/common/middleware/s3api/s3request.py:893: S3NotImplemented\n```","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cf54c3b2ac8bffa4c14d9438c403ad9c993e2360","unresolved":true,"context_lines":[{"line_number":883,"context_line":"                aws_sha256)"},{"line_number":884,"context_line":"        elif aws_sha256 \u003d\u003d \u0027UNSIGNED-PAYLOAD\u0027:"},{"line_number":885,"context_line":"            pass"},{"line_number":886,"context_line":"        elif aws_sha256 in ("},{"line_number":887,"context_line":"            \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":888,"context_line":"            \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027,"},{"line_number":889,"context_line":"            \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"a45ea3f4_d6edaf0d","line":886,"in_reply_to":"7ebcb381_5234d506","updated":"2024-08-23 18:17:36.000000000","message":"Yeah, this was mostly me getting ahead of myself in the chain, I suppose. I wasn\u0027t even *aware* of most of these modes until we got pretty far into this \"support v4 streaming\" business.","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":883,"context_line":"                aws_sha256)"},{"line_number":884,"context_line":"        elif aws_sha256 \u003d\u003d \u0027UNSIGNED-PAYLOAD\u0027:"},{"line_number":885,"context_line":"            pass"},{"line_number":886,"context_line":"        elif aws_sha256 in ("},{"line_number":887,"context_line":"            \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":888,"context_line":"            \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027,"},{"line_number":889,"context_line":"            \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a6ef832_283f5307","line":886,"in_reply_to":"a45ea3f4_d6edaf0d","updated":"2024-09-03 13:48:42.000000000","message":"Done","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":892,"context_line":"        ):"},{"line_number":893,"context_line":"            raise S3NotImplemented("},{"line_number":894,"context_line":"                \"Don\u0027t know how to validate %s streams\""},{"line_number":895,"context_line":"                % aws_sha256)"},{"line_number":896,"context_line":"        elif isinstance(self, SigV4Mixin) and \\"},{"line_number":897,"context_line":"                \u0027X-Amz-Credential\u0027 not in self.params:"},{"line_number":898,"context_line":"            # XXX: this whole condition has such a smell..."}],"source_content_type":"text/x-python","patch_set":7,"id":"dd536a04_c9cafaa2","line":895,"updated":"2024-08-23 17:28:30.000000000","message":"what happens on master if a client did send one of these?","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":892,"context_line":"        ):"},{"line_number":893,"context_line":"            raise S3NotImplemented("},{"line_number":894,"context_line":"                \"Don\u0027t know how to validate %s streams\""},{"line_number":895,"context_line":"                % aws_sha256)"},{"line_number":896,"context_line":"        elif isinstance(self, SigV4Mixin) and \\"},{"line_number":897,"context_line":"                \u0027X-Amz-Credential\u0027 not in self.params:"},{"line_number":898,"context_line":"            # XXX: this whole condition has such a smell..."}],"source_content_type":"text/x-python","patch_set":7,"id":"cefd1062_322b6275","line":895,"in_reply_to":"005c71ed_6866dd05","updated":"2024-09-03 13:48:42.000000000","message":"Done","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cf54c3b2ac8bffa4c14d9438c403ad9c993e2360","unresolved":true,"context_lines":[{"line_number":892,"context_line":"        ):"},{"line_number":893,"context_line":"            raise S3NotImplemented("},{"line_number":894,"context_line":"                \"Don\u0027t know how to validate %s streams\""},{"line_number":895,"context_line":"                % aws_sha256)"},{"line_number":896,"context_line":"        elif isinstance(self, SigV4Mixin) and \\"},{"line_number":897,"context_line":"                \u0027X-Amz-Credential\u0027 not in self.params:"},{"line_number":898,"context_line":"            # XXX: this whole condition has such a smell..."}],"source_content_type":"text/x-python","patch_set":7,"id":"005c71ed_6866dd05","line":895,"in_reply_to":"dd536a04_c9cafaa2","updated":"2024-08-23 18:17:36.000000000","message":"You (should) get a 501 elsewhere: https://github.com/openstack/swift/blob/master/swift/common/middleware/s3api/s3request.py#L883-L890\n\nAll the `STREAMING` protocols require an `x-amz-decoded-content-length`. If a client tried without it, it\u0027d presumably fail with a SHA mismatch if nothing else.","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":900,"context_line":"                \u0027x-amz-content-sha256\u0027,"},{"line_number":901,"context_line":"                aws_sha256,"},{"line_number":902,"context_line":"                \u0027x-amz-content-sha256 must be UNSIGNED-PAYLOAD, \u0027"},{"line_number":903,"context_line":"                \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER, \u0027"},{"line_number":904,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD, \u0027"},{"line_number":905,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER or \u0027"},{"line_number":906,"context_line":"                \u0027a valid sha256 value.\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"d0040682_244bc5e9","line":903,"updated":"2024-08-23 17:28:30.000000000","message":"I\u0027m confused by this, because at line 887 it seems ``STREAMING-UNSIGNED-PAYLOAD-TRAILER`` etc are NOT supported","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"cf54c3b2ac8bffa4c14d9438c403ad9c993e2360","unresolved":true,"context_lines":[{"line_number":900,"context_line":"                \u0027x-amz-content-sha256\u0027,"},{"line_number":901,"context_line":"                aws_sha256,"},{"line_number":902,"context_line":"                \u0027x-amz-content-sha256 must be UNSIGNED-PAYLOAD, \u0027"},{"line_number":903,"context_line":"                \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER, \u0027"},{"line_number":904,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD, \u0027"},{"line_number":905,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER or \u0027"},{"line_number":906,"context_line":"                \u0027a valid sha256 value.\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"d448fea2_b4bde4a8","line":903,"in_reply_to":"d0040682_244bc5e9","updated":"2024-08-23 18:17:36.000000000","message":"Ugh, yeah -- again, getting ahead of myself. Definitely one of the risks in requesting changes in a large chain ;-)","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":900,"context_line":"                \u0027x-amz-content-sha256\u0027,"},{"line_number":901,"context_line":"                aws_sha256,"},{"line_number":902,"context_line":"                \u0027x-amz-content-sha256 must be UNSIGNED-PAYLOAD, \u0027"},{"line_number":903,"context_line":"                \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER, \u0027"},{"line_number":904,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD, \u0027"},{"line_number":905,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER or \u0027"},{"line_number":906,"context_line":"                \u0027a valid sha256 value.\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"e7d654cc_ceaed067","line":903,"in_reply_to":"d448fea2_b4bde4a8","updated":"2024-09-03 13:48:42.000000000","message":"Done","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":978,"context_line":"            except S3InputSHA256Mismatch as err:"},{"line_number":979,"context_line":"                raise XAmzContentSHA256Mismatch("},{"line_number":980,"context_line":"                    client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":981,"context_line":"                    s3_computed_content_s_h_a256\u003derr.computed,"},{"line_number":982,"context_line":"                )"},{"line_number":983,"context_line":"        else:"},{"line_number":984,"context_line":"            # No (or zero) Content-Length provided, and not chunked transfer;"}],"source_content_type":"text/x-python","patch_set":7,"id":"e2c22b76_72e34e75","line":981,"updated":"2024-08-23 17:28:30.000000000","message":"ok, tests failed when I broke this","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":978,"context_line":"            except S3InputSHA256Mismatch as err:"},{"line_number":979,"context_line":"                raise XAmzContentSHA256Mismatch("},{"line_number":980,"context_line":"                    client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":981,"context_line":"                    s3_computed_content_s_h_a256\u003derr.computed,"},{"line_number":982,"context_line":"                )"},{"line_number":983,"context_line":"        else:"},{"line_number":984,"context_line":"            # No (or zero) Content-Length provided, and not chunked transfer;"}],"source_content_type":"text/x-python","patch_set":7,"id":"51125fcd_1bc1d83f","line":981,"in_reply_to":"e2c22b76_72e34e75","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":1431,"context_line":"                etag \u003d binascii.hexlify(base64.b64decode("},{"line_number":1432,"context_line":"                    env[\u0027HTTP_CONTENT_MD5\u0027]))"},{"line_number":1433,"context_line":"                return BadDigest("},{"line_number":1434,"context_line":"                    expected_digest\u003detag,  # yes, really hex"},{"line_number":1435,"context_line":"                    # TODO: plumb in calculated_digest, as b64"},{"line_number":1436,"context_line":"                )"},{"line_number":1437,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"59f61a87_ed0d4a43","line":1434,"updated":"2024-08-23 17:28:30.000000000","message":"ok, tests failed when I broke this","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":1431,"context_line":"                etag \u003d binascii.hexlify(base64.b64decode("},{"line_number":1432,"context_line":"                    env[\u0027HTTP_CONTENT_MD5\u0027]))"},{"line_number":1433,"context_line":"                return BadDigest("},{"line_number":1434,"context_line":"                    expected_digest\u003detag,  # yes, really hex"},{"line_number":1435,"context_line":"                    # TODO: plumb in calculated_digest, as b64"},{"line_number":1436,"context_line":"                )"},{"line_number":1437,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3d8c84a3_98dc2dfd","line":1434,"in_reply_to":"59f61a87_ed0d4a43","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":1489,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1490,"context_line":"            raise XAmzContentSHA256Mismatch("},{"line_number":1491,"context_line":"                client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":1492,"context_line":"                s3_computed_content_s_h_a256\u003derr.computed,"},{"line_number":1493,"context_line":"            )"},{"line_number":1494,"context_line":"        else:"},{"line_number":1495,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":7,"id":"e7944b9c_71967319","line":1492,"updated":"2024-08-23 17:28:30.000000000","message":"ok, tests failed when I broke this","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":1489,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1490,"context_line":"            raise XAmzContentSHA256Mismatch("},{"line_number":1491,"context_line":"                client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":1492,"context_line":"                s3_computed_content_s_h_a256\u003derr.computed,"},{"line_number":1493,"context_line":"            )"},{"line_number":1494,"context_line":"        else:"},{"line_number":1495,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":7,"id":"6e016177_31017667","line":1492,"in_reply_to":"5f95021f_f3edd590","updated":"2024-09-03 22:55:11.000000000","message":"Done","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":true,"context_lines":[{"line_number":1489,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1490,"context_line":"            raise XAmzContentSHA256Mismatch("},{"line_number":1491,"context_line":"                client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":1492,"context_line":"                s3_computed_content_s_h_a256\u003derr.computed,"},{"line_number":1493,"context_line":"            )"},{"line_number":1494,"context_line":"        else:"},{"line_number":1495,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f95021f_f3edd590","line":1492,"in_reply_to":"e7944b9c_71967319","updated":"2024-09-03 13:48:42.000000000","message":"Actually no unit tests fail - see follow on patch","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a1148723fde88d21632348bb9c347eaa50b1c02c","unresolved":true,"context_lines":[{"line_number":874,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"},{"line_number":875,"context_line":"                      \u0027x-amz-content-sha256\u0027"},{"line_number":876,"context_line":"                raise InvalidRequest(msg)"},{"line_number":877,"context_line":"            # else, v2 or GET/HEAD -- not required"},{"line_number":878,"context_line":"        elif looks_like_sha256:"},{"line_number":879,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":880,"context_line":"                self.environ[\u0027wsgi.input\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"d48608f1_339d375d","line":877,"updated":"2024-08-23 19:51:15.000000000","message":"Or v4 pre-signed-url -- as `test/s3api/test_input_errors.py::TestV4AuthQuery::test_no_md5_no_sha` demonstrates.\n\nI should maybe add more GET tests to `test_input_errors.py`...","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"272873d0e12229a52e05f77f7ede85cb92ae66dc","unresolved":false,"context_lines":[{"line_number":874,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"},{"line_number":875,"context_line":"                      \u0027x-amz-content-sha256\u0027"},{"line_number":876,"context_line":"                raise InvalidRequest(msg)"},{"line_number":877,"context_line":"            # else, v2 or GET/HEAD -- not required"},{"line_number":878,"context_line":"        elif looks_like_sha256:"},{"line_number":879,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":880,"context_line":"                self.environ[\u0027wsgi.input\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"ad6ddc55_4f0e27a3","line":877,"in_reply_to":"8d5cb6cf_23960749","updated":"2024-09-04 14:21:41.000000000","message":"I added a bunch of GET/HEAD tests in the last revision. I think we\u0027re pretty good here.","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4507afc6fe4223969df37dd27d0aa7e9a81a611b","unresolved":true,"context_lines":[{"line_number":874,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"},{"line_number":875,"context_line":"                      \u0027x-amz-content-sha256\u0027"},{"line_number":876,"context_line":"                raise InvalidRequest(msg)"},{"line_number":877,"context_line":"            # else, v2 or GET/HEAD -- not required"},{"line_number":878,"context_line":"        elif looks_like_sha256:"},{"line_number":879,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":880,"context_line":"                self.environ[\u0027wsgi.input\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"8d5cb6cf_23960749","line":877,"in_reply_to":"d48608f1_339d375d","updated":"2024-09-04 12:45:28.000000000","message":"is this still to be done? or stale?","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a1148723fde88d21632348bb9c347eaa50b1c02c","unresolved":true,"context_lines":[{"line_number":891,"context_line":"                aws_sha256,"},{"line_number":892,"context_line":"                \u0027x-amz-content-sha256 must be UNSIGNED-PAYLOAD, or \u0027"},{"line_number":893,"context_line":"                \u0027a valid sha256 value.\u0027)"},{"line_number":894,"context_line":"        elif self.content_length:"},{"line_number":895,"context_line":"            try:"},{"line_number":896,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":897,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"91bdd2d6_76bcf8f1","line":894,"updated":"2024-08-23 19:51:15.000000000","message":"`... is not None`, surely?","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":891,"context_line":"                aws_sha256,"},{"line_number":892,"context_line":"                \u0027x-amz-content-sha256 must be UNSIGNED-PAYLOAD, or \u0027"},{"line_number":893,"context_line":"                \u0027a valid sha256 value.\u0027)"},{"line_number":894,"context_line":"        elif self.content_length:"},{"line_number":895,"context_line":"            try:"},{"line_number":896,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":897,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"}],"source_content_type":"text/x-python","patch_set":8,"id":"df386446_6e3935cc","line":894,"in_reply_to":"91bdd2d6_76bcf8f1","updated":"2024-09-03 22:55:11.000000000","message":"Done","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a1148723fde88d21632348bb9c347eaa50b1c02c","unresolved":true,"context_lines":[{"line_number":893,"context_line":"                \u0027a valid sha256 value.\u0027)"},{"line_number":894,"context_line":"        elif self.content_length:"},{"line_number":895,"context_line":"            try:"},{"line_number":896,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":897,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"},{"line_number":898,"context_line":"                    self.content_length,"},{"line_number":899,"context_line":"                    sha256,"}],"source_content_type":"text/x-python","patch_set":8,"id":"30fdd9f2_36c5d0ea","line":896,"updated":"2024-08-23 19:51:15.000000000","message":"So this bit\u0027s a little funny -- we *know* we\u0027ve got a `aws_sha256` that doesn\u0027t actually *look like* a sha -- so we wrap the input and hope we trip the error we want later? But it\u0027s because we want to make sure we can send back the full sha of what the client sent.","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":893,"context_line":"                \u0027a valid sha256 value.\u0027)"},{"line_number":894,"context_line":"        elif self.content_length:"},{"line_number":895,"context_line":"            try:"},{"line_number":896,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":897,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"},{"line_number":898,"context_line":"                    self.content_length,"},{"line_number":899,"context_line":"                    sha256,"}],"source_content_type":"text/x-python","patch_set":8,"id":"58bb6254_7b093e66","line":896,"in_reply_to":"30fdd9f2_36c5d0ea","updated":"2024-09-03 22:55:11.000000000","message":"Acknowledged","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a1148723fde88d21632348bb9c347eaa50b1c02c","unresolved":true,"context_lines":[{"line_number":898,"context_line":"                    self.content_length,"},{"line_number":899,"context_line":"                    sha256,"},{"line_number":900,"context_line":"                    aws_sha256)"},{"line_number":901,"context_line":"            except S3InputSHA256Mismatch as err:"},{"line_number":902,"context_line":"                raise XAmzContentSHA256Mismatch("},{"line_number":903,"context_line":"                    client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":904,"context_line":"                    s3_computed_content_s_h_a256\u003derr.computed,"}],"source_content_type":"text/x-python","patch_set":8,"id":"8fe425b5_6152f9c3","line":901,"updated":"2024-08-23 19:51:15.000000000","message":"This isn\u0027t needed anymore. At one point, I had `HashingInput` raising `S3InputSHA256Mismatch` consistently, then I got tired of seeing this construct everywhere I went to use it and started raising `XAmzContentSHA256Mismatch` directly.","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":898,"context_line":"                    self.content_length,"},{"line_number":899,"context_line":"                    sha256,"},{"line_number":900,"context_line":"                    aws_sha256)"},{"line_number":901,"context_line":"            except S3InputSHA256Mismatch as err:"},{"line_number":902,"context_line":"                raise XAmzContentSHA256Mismatch("},{"line_number":903,"context_line":"                    client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":904,"context_line":"                    s3_computed_content_s_h_a256\u003derr.computed,"}],"source_content_type":"text/x-python","patch_set":8,"id":"061c690c_d28fdcd2","line":901,"in_reply_to":"8fe425b5_6152f9c3","updated":"2024-09-03 22:55:11.000000000","message":"Done","commit_id":"2f82bd0b3cc5d8af3c86285c122e222f5e63e6c3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":true,"context_lines":[{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # 6. Add payload string at the tail"},{"line_number":472,"context_line":"        if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":473,"context_line":"            # V4 with query parameters only"},{"line_number":474,"context_line":"            hashed_payload \u003d self.headers.get(\u0027X-Amz-Content-SHA256\u0027,"},{"line_number":475,"context_line":"                                              \u0027UNSIGNED-PAYLOAD\u0027)"},{"line_number":476,"context_line":"        elif \u0027X-Amz-Content-SHA256\u0027 not in self.headers:"}],"source_content_type":"text/x-python","patch_set":9,"id":"da678264_b621f11c","line":473,"updated":"2024-09-03 13:48:42.000000000","message":"huh, so the AWS docs state \u0027The x-amz-content-sha256 header is required for all AWS Signature Version 4 requests. \u0027 but this and the tests suggest that with a query-string auth the header is not required\n\nhttps://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4507afc6fe4223969df37dd27d0aa7e9a81a611b","unresolved":false,"context_lines":[{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # 6. Add payload string at the tail"},{"line_number":472,"context_line":"        if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":473,"context_line":"            # V4 with query parameters only"},{"line_number":474,"context_line":"            hashed_payload \u003d self.headers.get(\u0027X-Amz-Content-SHA256\u0027,"},{"line_number":475,"context_line":"                                              \u0027UNSIGNED-PAYLOAD\u0027)"},{"line_number":476,"context_line":"        elif \u0027X-Amz-Content-SHA256\u0027 not in self.headers:"}],"source_content_type":"text/x-python","patch_set":9,"id":"eed69df9_a0f9bfa9","line":473,"in_reply_to":"2ea06581_d7f6fc00","updated":"2024-09-04 12:45:28.000000000","message":"Done","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"35c86e5538340edcc00a03fdb6194ba82df5afe2","unresolved":true,"context_lines":[{"line_number":470,"context_line":""},{"line_number":471,"context_line":"        # 6. Add payload string at the tail"},{"line_number":472,"context_line":"        if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":473,"context_line":"            # V4 with query parameters only"},{"line_number":474,"context_line":"            hashed_payload \u003d self.headers.get(\u0027X-Amz-Content-SHA256\u0027,"},{"line_number":475,"context_line":"                                              \u0027UNSIGNED-PAYLOAD\u0027)"},{"line_number":476,"context_line":"        elif \u0027X-Amz-Content-SHA256\u0027 not in self.headers:"}],"source_content_type":"text/x-python","patch_set":9,"id":"2ea06581_d7f6fc00","line":473,"in_reply_to":"da678264_b621f11c","updated":"2024-09-03 16:00:47.000000000","message":"Yup -- in no small part because the expectation with a presigned URL is that it\u0027ll be used by a browser, or some simple uploader where adding custom headers will be difficult/impossible.","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":true,"context_lines":[{"line_number":473,"context_line":"            # V4 with query parameters only"},{"line_number":474,"context_line":"            hashed_payload \u003d self.headers.get(\u0027X-Amz-Content-SHA256\u0027,"},{"line_number":475,"context_line":"                                              \u0027UNSIGNED-PAYLOAD\u0027)"},{"line_number":476,"context_line":"        elif \u0027X-Amz-Content-SHA256\u0027 not in self.headers:"},{"line_number":477,"context_line":"            msg \u003d \u0027Missing required header for this request: \u0027 \\"},{"line_number":478,"context_line":"                  \u0027x-amz-content-sha256\u0027"},{"line_number":479,"context_line":"            raise InvalidRequest(msg)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9bfaf5e6_6a2d1cb5","line":476,"updated":"2024-09-03 13:48:42.000000000","message":"isn\u0027t this condition now already covered in validate_headers? I removed it and nothing failed in the compat tests or test_s3request.py","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            # V4 with query parameters only"},{"line_number":474,"context_line":"            hashed_payload \u003d self.headers.get(\u0027X-Amz-Content-SHA256\u0027,"},{"line_number":475,"context_line":"                                              \u0027UNSIGNED-PAYLOAD\u0027)"},{"line_number":476,"context_line":"        elif \u0027X-Amz-Content-SHA256\u0027 not in self.headers:"},{"line_number":477,"context_line":"            msg \u003d \u0027Missing required header for this request: \u0027 \\"},{"line_number":478,"context_line":"                  \u0027x-amz-content-sha256\u0027"},{"line_number":479,"context_line":"            raise InvalidRequest(msg)"}],"source_content_type":"text/x-python","patch_set":9,"id":"f0c1ddd1_0c19740a","line":476,"in_reply_to":"9bfaf5e6_6a2d1cb5","updated":"2024-09-03 22:55:11.000000000","message":"Yeah, should be. #willfix","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":true,"context_lines":[{"line_number":867,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":868,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":869,"context_line":"        if not aws_sha256:"},{"line_number":870,"context_line":"            if isinstance(self, SigV4Mixin) and \\"},{"line_number":871,"context_line":"                    \u0027X-Amz-Credential\u0027 not in self.params and \\"},{"line_number":872,"context_line":"                    self.method not in (\u0027GET\u0027, \u0027HEAD\u0027):"},{"line_number":873,"context_line":"                # XXX: this whole condition has such a smell..."}],"source_content_type":"text/x-python","patch_set":9,"id":"fbfdbd5b_f726a399","line":870,"range":{"start_line":870,"start_character":15,"end_line":870,"end_character":43},"updated":"2024-09-03 13:48:42.000000000","message":"maybe break out the V4 specific stuff into the SigV4Mixin\n\nhttps://paste.openstack.org/show/bTcPbhoo57QGqqkTlGvQ/\n\nturns out the v2 validation is a no-op","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":867,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":868,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":869,"context_line":"        if not aws_sha256:"},{"line_number":870,"context_line":"            if isinstance(self, SigV4Mixin) and \\"},{"line_number":871,"context_line":"                    \u0027X-Amz-Credential\u0027 not in self.params and \\"},{"line_number":872,"context_line":"                    self.method not in (\u0027GET\u0027, \u0027HEAD\u0027):"},{"line_number":873,"context_line":"                # XXX: this whole condition has such a smell..."}],"source_content_type":"text/x-python","patch_set":9,"id":"9107025c_a48cda4a","line":870,"range":{"start_line":870,"start_character":15,"end_line":870,"end_character":43},"in_reply_to":"a2d7ed67_6b115810","updated":"2024-09-03 22:55:11.000000000","message":"Done","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"35c86e5538340edcc00a03fdb6194ba82df5afe2","unresolved":true,"context_lines":[{"line_number":867,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":868,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":869,"context_line":"        if not aws_sha256:"},{"line_number":870,"context_line":"            if isinstance(self, SigV4Mixin) and \\"},{"line_number":871,"context_line":"                    \u0027X-Amz-Credential\u0027 not in self.params and \\"},{"line_number":872,"context_line":"                    self.method not in (\u0027GET\u0027, \u0027HEAD\u0027):"},{"line_number":873,"context_line":"                # XXX: this whole condition has such a smell..."}],"source_content_type":"text/x-python","patch_set":9,"id":"a2d7ed67_6b115810","line":870,"range":{"start_line":870,"start_character":15,"end_line":870,"end_character":43},"in_reply_to":"fbfdbd5b_f726a399","updated":"2024-09-03 16:00:47.000000000","message":"Good call, thanks!","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"}],"swift/common/middleware/s3api/s3response.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":449,"context_line":""},{"line_number":450,"context_line":"class InvalidDigest(ErrorResponse):"},{"line_number":451,"context_line":"    _status \u003d \u0027400 Bad Request\u0027"},{"line_number":452,"context_line":"    _msg \u003d \u0027The Content-MD5 you specified was invalid.\u0027"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"class InvalidLocationConstraint(ErrorResponse):"}],"source_content_type":"text/x-python","patch_set":7,"id":"90b1fc7e_e8c6a769","line":452,"updated":"2024-08-23 17:28:30.000000000","message":"ok, tests failed when I broke this","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":449,"context_line":""},{"line_number":450,"context_line":"class InvalidDigest(ErrorResponse):"},{"line_number":451,"context_line":"    _status \u003d \u0027400 Bad Request\u0027"},{"line_number":452,"context_line":"    _msg \u003d \u0027The Content-MD5 you specified was invalid.\u0027"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":""},{"line_number":455,"context_line":"class InvalidLocationConstraint(ErrorResponse):"}],"source_content_type":"text/x-python","patch_set":7,"id":"110edc09_115f5cad","line":452,"in_reply_to":"90b1fc7e_e8c6a769","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"}],"test/s3api/test_input_errors.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a25096adc6133ff5c0187d47fef5a188f9441fde","unresolved":true,"context_lines":[{"line_number":316,"context_line":"        self.conn.v2_auth \u003d True"},{"line_number":317,"context_line":"        self.conn.auth_in_query \u003d True"},{"line_number":318,"context_line":"        resp \u003d self.conn.make_request()"},{"line_number":319,"context_line":"        self.assertEqual(resp.status_code, 200, resp.content)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def test_v4(self):"},{"line_number":322,"context_line":"        self.conn.v2_auth \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"f907dcd2_68d4bd62","line":319,"updated":"2024-05-22 21:32:21.000000000","message":"I\u0027m torn about how much to flesh out these other tests -- as much as anything I just wanted to sanity-check that my custom client would behave reasonably.","commit_id":"1c5b8ab21dfb85957615b40821cb4d3343735a7a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8c68a5079ae333e1f2cdcd0200e8ea82db0919c6","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        self.conn.v2_auth \u003d True"},{"line_number":317,"context_line":"        self.conn.auth_in_query \u003d True"},{"line_number":318,"context_line":"        resp \u003d self.conn.make_request()"},{"line_number":319,"context_line":"        self.assertEqual(resp.status_code, 200, resp.content)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def test_v4(self):"},{"line_number":322,"context_line":"        self.conn.v2_auth \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"100573a7_36f479b1","line":319,"in_reply_to":"f907dcd2_68d4bd62","updated":"2024-08-22 03:20:22.000000000","message":"Acknowledged","commit_id":"1c5b8ab21dfb85957615b40821cb4d3343735a7a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a25096adc6133ff5c0187d47fef5a188f9441fde","unresolved":true,"context_lines":[{"line_number":469,"context_line":"        self.assertIn(\u0027\u003cCode\u003eInvalidArgument\u003c/Code\u003e\u0027, respbody)"},{"line_number":470,"context_line":"        self.assertIn(\u0027\u003cMessage\u003ex-amz-content-sha256 must be \u0027"},{"line_number":471,"context_line":"                      \u0027UNSIGNED-PAYLOAD\u0027, respbody)"},{"line_number":472,"context_line":"        # There can be a whole list here, but Swift only supports these two ATM"},{"line_number":473,"context_line":"        self.assertIn(\u0027or a valid sha256 value.\u003c/Message\u003e\u0027, respbody)"},{"line_number":474,"context_line":"        self.assertIn(\u0027\u003cArgumentName\u003ex-amz-content-sha256\u003c/ArgumentName\u003e\u0027,"},{"line_number":475,"context_line":"                      respbody)"}],"source_content_type":"text/x-python","patch_set":1,"id":"db08893b_32f4e002","line":472,"updated":"2024-05-22 21:32:21.000000000","message":"Open question: Should Swift just include the modes it supports, or should it match the whole error message that AWS responds with and 501 attempts to use modes it doesn\u0027t support?","commit_id":"1c5b8ab21dfb85957615b40821cb4d3343735a7a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        key \u003d key.encode(\u0027utf8\u0027)"},{"line_number":33,"context_line":"    if not isinstance(message, bytes):"},{"line_number":34,"context_line":"        message \u003d message.encode(\u0027utf8\u0027)"},{"line_number":35,"context_line":"    return hmac.new(key, message, digest).digest()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def _sha256(payload\u003db\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"f61ef86f_94b11ba5","line":35,"updated":"2024-08-13 16:21:45.000000000","message":"searching for other uses of ``hmac.new`` it seems that this might be a useful utils function","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        key \u003d key.encode(\u0027utf8\u0027)"},{"line_number":33,"context_line":"    if not isinstance(message, bytes):"},{"line_number":34,"context_line":"        message \u003d message.encode(\u0027utf8\u0027)"},{"line_number":35,"context_line":"    return hmac.new(key, message, digest).digest()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def _sha256(payload\u003db\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fede9b9_30db7ab4","line":35,"in_reply_to":"53ec26c0_3313a73d","updated":"2024-08-23 17:28:30.000000000","message":"Acknowledged","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fb4e6c2db82166f9f12cdeb78cc4d48be43abb24","unresolved":true,"context_lines":[{"line_number":32,"context_line":"        key \u003d key.encode(\u0027utf8\u0027)"},{"line_number":33,"context_line":"    if not isinstance(message, bytes):"},{"line_number":34,"context_line":"        message \u003d message.encode(\u0027utf8\u0027)"},{"line_number":35,"context_line":"    return hmac.new(key, message, digest).digest()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def _sha256(payload\u003db\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":4,"id":"53ec26c0_3313a73d","line":35,"in_reply_to":"f61ef86f_94b11ba5","updated":"2024-08-16 00:18:15.000000000","message":"Maybe? Different places want different output encodings 😕","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4252a7abd0af69d57c37d17b14f9f916099c8539","unresolved":true,"context_lines":[{"line_number":51,"context_line":"EMPTY_SHA256 \u003d _sha256()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class S3Connection(object):"},{"line_number":55,"context_line":"    bucket_in_host \u003d False"},{"line_number":56,"context_line":"    auth_in_query \u003d False"},{"line_number":57,"context_line":"    v2_auth \u003d False"}],"source_content_type":"text/x-python","patch_set":4,"id":"76eab136_c08e550f","line":54,"range":{"start_line":54,"start_character":6,"end_line":54,"end_character":18},"updated":"2024-08-13 21:54:53.000000000","message":"This is badly named -- if we have a bunch of these, they\u0027re all pulling `requests` connections from the same global pool. Probably better to call it `S3Session` or `S3Client` or something, and give it its own `requests.Session` in `__init__`...","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9c4bcc5af99b3cee6229de016b5d44e29136afd","unresolved":false,"context_lines":[{"line_number":51,"context_line":"EMPTY_SHA256 \u003d _sha256()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class S3Connection(object):"},{"line_number":55,"context_line":"    bucket_in_host \u003d False"},{"line_number":56,"context_line":"    auth_in_query \u003d False"},{"line_number":57,"context_line":"    v2_auth \u003d False"}],"source_content_type":"text/x-python","patch_set":4,"id":"ddebfdce_8ced7bef","line":54,"range":{"start_line":54,"start_character":6,"end_line":54,"end_character":18},"in_reply_to":"76eab136_c08e550f","updated":"2024-08-22 22:21:15.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class S3Connection(object):"},{"line_number":55,"context_line":"    bucket_in_host \u003d False"},{"line_number":56,"context_line":"    auth_in_query \u003d False"},{"line_number":57,"context_line":"    v2_auth \u003d False"},{"line_number":58,"context_line":"    default_expiration \u003d 900  # 15 min"}],"source_content_type":"text/x-python","patch_set":4,"id":"710a835e_13b01678","line":55,"updated":"2024-08-13 16:21:45.000000000","message":"(see comment later too) it seems a strange interface to this class that these attributes cannot be set via the constructor, but _are_ set every time an instance of the class is used.","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9c4bcc5af99b3cee6229de016b5d44e29136afd","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class S3Connection(object):"},{"line_number":55,"context_line":"    bucket_in_host \u003d False"},{"line_number":56,"context_line":"    auth_in_query \u003d False"},{"line_number":57,"context_line":"    v2_auth \u003d False"},{"line_number":58,"context_line":"    default_expiration \u003d 900  # 15 min"}],"source_content_type":"text/x-python","patch_set":4,"id":"88df7333_7082dc2f","line":55,"in_reply_to":"710a835e_13b01678","updated":"2024-08-22 22:21:15.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":54,"context_line":"class S3Connection(object):"},{"line_number":55,"context_line":"    bucket_in_host \u003d False"},{"line_number":56,"context_line":"    auth_in_query \u003d False"},{"line_number":57,"context_line":"    v2_auth \u003d False"},{"line_number":58,"context_line":"    default_expiration \u003d 900  # 15 min"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__("}],"source_content_type":"text/x-python","patch_set":4,"id":"467551d4_2cba6b01","line":57,"updated":"2024-08-13 16:21:45.000000000","message":"I might suggest having a v2/v4 subclass - the conditional pieces of code seem reasonably easy to disentangle","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9c4bcc5af99b3cee6229de016b5d44e29136afd","unresolved":false,"context_lines":[{"line_number":54,"context_line":"class S3Connection(object):"},{"line_number":55,"context_line":"    bucket_in_host \u003d False"},{"line_number":56,"context_line":"    auth_in_query \u003d False"},{"line_number":57,"context_line":"    v2_auth \u003d False"},{"line_number":58,"context_line":"    default_expiration \u003d 900  # 15 min"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__("}],"source_content_type":"text/x-python","patch_set":4,"id":"68b0d2fa_49dc593b","line":57,"in_reply_to":"467551d4_2cba6b01","updated":"2024-08-22 22:21:15.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":423,"context_line":"        # Yes, really -- AWS needs b64 in headers, but reflects back hex"},{"line_number":424,"context_line":"        self.assertIn(\u0027\u003cExpectedDigest\u003e%s\u003c/ExpectedDigest\u003e\u0027"},{"line_number":425,"context_line":"                      % hashlib.md5(b\u0027not the body\u0027).hexdigest(), respbody)"},{"line_number":426,"context_line":"        # AWS provides this, but swift doesn\u0027t (yet)"},{"line_number":427,"context_line":"        # self.assertIn(\u0027\u003cCalculatedDigest\u003e%s\u003c/CalculatedDigest\u003e\u0027"},{"line_number":428,"context_line":"        #               % _md5(body), respbody)"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1ab715ec_17f15c0a","line":426,"updated":"2024-08-13 16:21:45.000000000","message":"a TODO might be appropriate to emphasise the gap","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8c68a5079ae333e1f2cdcd0200e8ea82db0919c6","unresolved":false,"context_lines":[{"line_number":423,"context_line":"        # Yes, really -- AWS needs b64 in headers, but reflects back hex"},{"line_number":424,"context_line":"        self.assertIn(\u0027\u003cExpectedDigest\u003e%s\u003c/ExpectedDigest\u003e\u0027"},{"line_number":425,"context_line":"                      % hashlib.md5(b\u0027not the body\u0027).hexdigest(), respbody)"},{"line_number":426,"context_line":"        # AWS provides this, but swift doesn\u0027t (yet)"},{"line_number":427,"context_line":"        # self.assertIn(\u0027\u003cCalculatedDigest\u003e%s\u003c/CalculatedDigest\u003e\u0027"},{"line_number":428,"context_line":"        #               % _md5(body), respbody)"},{"line_number":429,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9d097e83_cde7a41c","line":426,"in_reply_to":"1ab715ec_17f15c0a","updated":"2024-08-22 03:20:22.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":445,"context_line":"            body\u003dbody,"},{"line_number":446,"context_line":"            headers\u003d{"},{"line_number":447,"context_line":"                \u0027x-amz-content-sha256\u0027: \u0027bad\u0027})"},{"line_number":448,"context_line":"        if self.conn.v2_auth or self.conn.auth_in_query:"},{"line_number":449,"context_line":"            self.assertSHA256Mismatch(resp, \u0027bad\u0027, _sha256(body))"},{"line_number":450,"context_line":"        else:"},{"line_number":451,"context_line":"            respbody \u003d resp.content"}],"source_content_type":"text/x-python","patch_set":4,"id":"6fa3211a_f6cdbef8","line":448,"updated":"2024-08-13 16:21:45.000000000","message":"I think I\u0027d prefer it if there was a way to make these separate test cases rather than conditional assertions","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8c68a5079ae333e1f2cdcd0200e8ea82db0919c6","unresolved":false,"context_lines":[{"line_number":445,"context_line":"            body\u003dbody,"},{"line_number":446,"context_line":"            headers\u003d{"},{"line_number":447,"context_line":"                \u0027x-amz-content-sha256\u0027: \u0027bad\u0027})"},{"line_number":448,"context_line":"        if self.conn.v2_auth or self.conn.auth_in_query:"},{"line_number":449,"context_line":"            self.assertSHA256Mismatch(resp, \u0027bad\u0027, _sha256(body))"},{"line_number":450,"context_line":"        else:"},{"line_number":451,"context_line":"            respbody \u003d resp.content"}],"source_content_type":"text/x-python","patch_set":4,"id":"d1003a54_27f00bbb","line":448,"in_reply_to":"6fa3211a_f6cdbef8","updated":"2024-08-22 03:20:22.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":473,"context_line":"            body\u003dbody,"},{"line_number":474,"context_line":"            headers\u003d{"},{"line_number":475,"context_line":"                \u0027X-AMZ-CONTENT-SHA256\u0027: \u0027BAD\u0027})"},{"line_number":476,"context_line":"        if self.conn.v2_auth or self.conn.auth_in_query:"},{"line_number":477,"context_line":"            self.assertSHA256Mismatch(resp, \u0027BAD\u0027, _sha256(body))"},{"line_number":478,"context_line":"        else:"},{"line_number":479,"context_line":"            respbody \u003d resp.content"}],"source_content_type":"text/x-python","patch_set":4,"id":"7d968b08_3a6d2986","line":476,"updated":"2024-08-13 16:21:45.000000000","message":"ditto","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8c68a5079ae333e1f2cdcd0200e8ea82db0919c6","unresolved":false,"context_lines":[{"line_number":473,"context_line":"            body\u003dbody,"},{"line_number":474,"context_line":"            headers\u003d{"},{"line_number":475,"context_line":"                \u0027X-AMZ-CONTENT-SHA256\u0027: \u0027BAD\u0027})"},{"line_number":476,"context_line":"        if self.conn.v2_auth or self.conn.auth_in_query:"},{"line_number":477,"context_line":"            self.assertSHA256Mismatch(resp, \u0027BAD\u0027, _sha256(body))"},{"line_number":478,"context_line":"        else:"},{"line_number":479,"context_line":"            respbody \u003d resp.content"}],"source_content_type":"text/x-python","patch_set":4,"id":"66648ea3_aa6a0d49","line":476,"in_reply_to":"7d968b08_3a6d2986","updated":"2024-08-22 03:20:22.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":492,"context_line":"            self.assertIn(\u0027\u003cArgumentName\u003ex-amz-content-sha256\u003c/ArgumentName\u003e\u0027,"},{"line_number":493,"context_line":"                          respbody)"},{"line_number":494,"context_line":"            self.assertIn(\u0027\u003cArgumentValue\u003eBAD\u003c/ArgumentValue\u003e\u0027,"},{"line_number":495,"context_line":"                          respbody)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_v2(self):"},{"line_number":498,"context_line":"        self.conn.v2_auth \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"81559cba_0775e983","line":495,"updated":"2024-08-13 16:21:45.000000000","message":"that\u0027s a very long test method that has a lot of, IIUC, independent test scenarios...well, independent except for the re-used connection instance. Is it significant to not create new connections for each scenario? If so, could there at least be a number of helper methods to which ``conn`` is passed. That would at least make it a little easier to isolate failings scenarios for debug. Something like:\n\n```\ndo_test_1(conn)\ndo_test_2(conn)\netc\n```","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8c68a5079ae333e1f2cdcd0200e8ea82db0919c6","unresolved":false,"context_lines":[{"line_number":492,"context_line":"            self.assertIn(\u0027\u003cArgumentName\u003ex-amz-content-sha256\u003c/ArgumentName\u003e\u0027,"},{"line_number":493,"context_line":"                          respbody)"},{"line_number":494,"context_line":"            self.assertIn(\u0027\u003cArgumentValue\u003eBAD\u003c/ArgumentValue\u003e\u0027,"},{"line_number":495,"context_line":"                          respbody)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_v2(self):"},{"line_number":498,"context_line":"        self.conn.v2_auth \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"42ab402d_9177cd85","line":495,"in_reply_to":"4a85dfb2_6ce2e81d","updated":"2024-08-22 03:20:22.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4252a7abd0af69d57c37d17b14f9f916099c8539","unresolved":true,"context_lines":[{"line_number":492,"context_line":"            self.assertIn(\u0027\u003cArgumentName\u003ex-amz-content-sha256\u003c/ArgumentName\u003e\u0027,"},{"line_number":493,"context_line":"                          respbody)"},{"line_number":494,"context_line":"            self.assertIn(\u0027\u003cArgumentValue\u003eBAD\u003c/ArgumentValue\u003e\u0027,"},{"line_number":495,"context_line":"                          respbody)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_v2(self):"},{"line_number":498,"context_line":"        self.conn.v2_auth \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"a6766766_d3b227f5","line":495,"in_reply_to":"81559cba_0775e983","updated":"2024-08-13 21:54:53.000000000","message":"Oh good, you didn\u0027t like that, either!\n\n\u003e Is it significant to not create new connections for each scenario?\n\nNo; in fact, subsequent API calls don\u0027t even *necessarily* re-use the socket, since they\u0027re just pulling from `requests`\u0027 default connection pool.\n\nThere is *one* other thing that\u0027s re-used, though: the bucket created up at L360. If we continue using `BaseS3TestCase` as-is, we\u0027d need to create new buckets for every test case since we [delete everything after every test](https://github.com/openstack/swift/blob/2.33.0/test/s3api/__init__.py#L235-L243). This is mostly tolerable when testing locally, but gets annoying testing against AWS, where bucket creation seems to be a more expensive operation.\n\nI\u0027ve got something locally that breaks these out a bit; I\u0027ll try to get it to a state where I can integrate it piece-by-piece into the chain. (Currently it\u0027s hanging off the end, so I worry it might get complicated...)","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"fb4e6c2db82166f9f12cdeb78cc4d48be43abb24","unresolved":true,"context_lines":[{"line_number":492,"context_line":"            self.assertIn(\u0027\u003cArgumentName\u003ex-amz-content-sha256\u003c/ArgumentName\u003e\u0027,"},{"line_number":493,"context_line":"                          respbody)"},{"line_number":494,"context_line":"            self.assertIn(\u0027\u003cArgumentValue\u003eBAD\u003c/ArgumentValue\u003e\u0027,"},{"line_number":495,"context_line":"                          respbody)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_v2(self):"},{"line_number":498,"context_line":"        self.conn.v2_auth \u003d True"}],"source_content_type":"text/x-python","patch_set":4,"id":"4a85dfb2_6ce2e81d","line":495,"in_reply_to":"a6766766_d3b227f5","updated":"2024-08-16 00:18:15.000000000","message":"OK, I put my fix-a-bunch-of-crap patch up anyway -- see what you think of how it turned out: https://review.opendev.org/c/openstack/swift/+/926453/1/test/s3api/test_input_errors.py\n\nhttps://review.opendev.org/c/openstack/swift/+/926453/1/test/s3api/__init__.py feels awkward though -- I should probably see if I can improve on it...","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"33b58853c104ede1cb75af7cafddb2df14b939b2","unresolved":true,"context_lines":[{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_v2(self):"},{"line_number":498,"context_line":"        self.conn.v2_auth \u003d True"},{"line_number":499,"context_line":"        self.conn.auth_in_query \u003d False"},{"line_number":500,"context_line":"        self._do_test()"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def test_v2_query(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"af15e1b2_17305857","line":499,"updated":"2024-08-13 16:21:45.000000000","message":"I\u0027m not a big fan of constructing objects and then immediately mutating their attributes. Given that S3Connection is called just once from setUp(), we could just as well call it once at the start of _do_test() and pass these as args to the constructor. So,\n\n```self._do_test(v2_auth\u003dTrue, auth_in_query\u003dFalse) etc...```","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e9c4bcc5af99b3cee6229de016b5d44e29136afd","unresolved":false,"context_lines":[{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def test_v2(self):"},{"line_number":498,"context_line":"        self.conn.v2_auth \u003d True"},{"line_number":499,"context_line":"        self.conn.auth_in_query \u003d False"},{"line_number":500,"context_line":"        self._do_test()"},{"line_number":501,"context_line":""},{"line_number":502,"context_line":"    def test_v2_query(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"16f198ce_c76bf11f","line":499,"in_reply_to":"af15e1b2_17305857","updated":"2024-08-22 22:21:15.000000000","message":"Done","commit_id":"53e5615eb8f616c463ac08db48e6182c9cff9eb1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":true,"context_lines":[{"line_number":567,"context_line":"            \u0027test-obj\u0027,"},{"line_number":568,"context_line":"            method\u003d\u0027PUT\u0027,"},{"line_number":569,"context_line":"        )"},{"line_number":570,"context_line":"        self.conn.sign_request(request)"},{"line_number":571,"context_line":"        # requests is not our friend here; it\u0027s going to try *real hard* to"},{"line_number":572,"context_line":"        # either send a \"Content-Length\" or \"Transfer-encoding: chunked\" header"},{"line_number":573,"context_line":"        # so dip down to our bufferedhttp to do the sending/parsing"}],"source_content_type":"text/x-python","patch_set":9,"id":"ee85afc0_87c888f3","line":570,"updated":"2024-09-03 13:48:42.000000000","message":"looks like the helper methods are proving useful 😊","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4507afc6fe4223969df37dd27d0aa7e9a81a611b","unresolved":false,"context_lines":[{"line_number":567,"context_line":"            \u0027test-obj\u0027,"},{"line_number":568,"context_line":"            method\u003d\u0027PUT\u0027,"},{"line_number":569,"context_line":"        )"},{"line_number":570,"context_line":"        self.conn.sign_request(request)"},{"line_number":571,"context_line":"        # requests is not our friend here; it\u0027s going to try *real hard* to"},{"line_number":572,"context_line":"        # either send a \"Content-Length\" or \"Transfer-encoding: chunked\" header"},{"line_number":573,"context_line":"        # so dip down to our bufferedhttp to do the sending/parsing"}],"source_content_type":"text/x-python","patch_set":9,"id":"6dfe7e00_1cfe0ac6","line":570,"in_reply_to":"ee85afc0_87c888f3","updated":"2024-09-04 12:45:28.000000000","message":"Done","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"35c86e5538340edcc00a03fdb6194ba82df5afe2","unresolved":true,"context_lines":[{"line_number":902,"context_line":"            request[\u0027https\u0027]"},{"line_number":903,"context_line":"        )"},{"line_number":904,"context_line":"        conn.send(TEST_BODY)"},{"line_number":905,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":906,"context_line":"        body \u003d resp.read()"},{"line_number":907,"context_line":"        self.assertEqual(resp.status, 400, body)"},{"line_number":908,"context_line":"        self.assertIn(b\u0027\u003cCode\u003eInvalidRequest\u003c/Code\u003e\u0027, body)"}],"source_content_type":"text/x-python","patch_set":9,"id":"97990b80_423d1f2a","line":905,"updated":"2024-09-03 16:00:47.000000000","message":"I should maybe DRY this out to a `get_response_no_md5_no_sha_no_content_length` helper on the base class -- I don\u0027t like how the bifurcation for v4-in-headers makes it difficult to verify that the requests (ignoring signing method) are functionally the same. It was bugging me for the other tests, but it\u0027s especially bad here where we need to use `bufferedhttp`.","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c27625b6a5d3eb1c371d25053a5149deeb91e4ac","unresolved":false,"context_lines":[{"line_number":902,"context_line":"            request[\u0027https\u0027]"},{"line_number":903,"context_line":"        )"},{"line_number":904,"context_line":"        conn.send(TEST_BODY)"},{"line_number":905,"context_line":"        resp \u003d conn.getresponse()"},{"line_number":906,"context_line":"        body \u003d resp.read()"},{"line_number":907,"context_line":"        self.assertEqual(resp.status, 400, body)"},{"line_number":908,"context_line":"        self.assertIn(b\u0027\u003cCode\u003eInvalidRequest\u003c/Code\u003e\u0027, body)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a3a2328_0038576f","line":905,"in_reply_to":"97990b80_423d1f2a","updated":"2024-09-03 22:55:11.000000000","message":"Done","commit_id":"70948481f92a26466c23fa2d2cc072b77c6e0e67"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4507afc6fe4223969df37dd27d0aa7e9a81a611b","unresolved":true,"context_lines":[{"line_number":667,"context_line":"                \u0027x-amz-content-sha256\u0027: _sha256(TEST_BODY)})"},{"line_number":668,"context_line":"        self.assertOK(resp)"},{"line_number":669,"context_line":""},{"line_number":670,"context_line":"    def test_no_md5_no_sha(self):"},{"line_number":671,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":672,"context_line":"            self.bucket_name,"},{"line_number":673,"context_line":"            \u0027test-obj\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"285e4635_f69531e8","line":670,"updated":"2024-09-04 12:45:28.000000000","message":"nit: adding all the bucket tests drew my attention to these test methods NOT specifying \u003cmethod\u003e_\u003cresource\u003e e.g. test_put_object_no_md5_no_sha","commit_id":"7bf279779995be5081e3ff9da7e113f20efe4446"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4507afc6fe4223969df37dd27d0aa7e9a81a611b","unresolved":true,"context_lines":[{"line_number":1140,"context_line":"        self.assertIn(\u0027\u003cArgumentValue\u003e%s\u003c/ArgumentValue\u003e\u0027 % sha_in_headers,"},{"line_number":1141,"context_line":"                      respbody)"},{"line_number":1142,"context_line":""},{"line_number":1143,"context_line":"    def test_get_service_no_sha(self):"},{"line_number":1144,"context_line":"        resp \u003d self.conn.make_request()"},{"line_number":1145,"context_line":"        self.assertMissingSHA256(resp)"},{"line_number":1146,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5371943a_907103d4","line":1143,"updated":"2024-09-04 12:45:28.000000000","message":"nit: the tests the mixin that are overridden here could have been in a separate mixin that\u0027s not inherited for this class, so no overriding necessary - possibly clearer but not a big deal","commit_id":"7bf279779995be5081e3ff9da7e113f20efe4446"}],"test/unit/common/middleware/s3api/test_bucket.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":1525,"context_line":"                \u0027Signature\u003dX\u0027,"},{"line_number":1526,"context_line":"            ]),"},{"line_number":1527,"context_line":"            \u0027Date\u0027: self.get_date_header(),"},{"line_number":1528,"context_line":"            \u0027x-amz-content-sha256\u0027: \u00270\u0027 * 64,"},{"line_number":1529,"context_line":"        }"},{"line_number":1530,"context_line":"        req \u003d Request.blank(\u0027/bucket\u0027,"},{"line_number":1531,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"c2094253_0e8e186e","line":1528,"updated":"2024-08-23 17:28:30.000000000","message":"right, it\u0027s gotta be 64 bytes","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":1525,"context_line":"                \u0027Signature\u003dX\u0027,"},{"line_number":1526,"context_line":"            ]),"},{"line_number":1527,"context_line":"            \u0027Date\u0027: self.get_date_header(),"},{"line_number":1528,"context_line":"            \u0027x-amz-content-sha256\u0027: \u00270\u0027 * 64,"},{"line_number":1529,"context_line":"        }"},{"line_number":1530,"context_line":"        req \u003d Request.blank(\u0027/bucket\u0027,"},{"line_number":1531,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"}],"source_content_type":"text/x-python","patch_set":7,"id":"be90d6f8_17cd10f4","line":1528,"in_reply_to":"c2094253_0e8e186e","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":825,"context_line":"                        self.get_v4_amz_date_header().split(\u0027T\u0027, 1)[0]),"},{"line_number":826,"context_line":"                \u0027x-amz-date\u0027: self.get_v4_amz_date_header(),"},{"line_number":827,"context_line":"                \u0027x-amz-storage-class\u0027: \u0027STANDARD\u0027,"},{"line_number":828,"context_line":"                \u0027x-amz-content-sha256\u0027: \u00270\u0027 * 64,"},{"line_number":829,"context_line":"                \u0027Date\u0027: self.get_date_header()},"},{"line_number":830,"context_line":"            body\u003dself.object_body)"},{"line_number":831,"context_line":"        req.date \u003d datetime.now()"}],"source_content_type":"text/x-python","patch_set":7,"id":"f427c335_2a340fbc","line":828,"updated":"2024-08-23 17:28:30.000000000","message":"right, this is 64 bytes but it\u0027s not the body sha","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":825,"context_line":"                        self.get_v4_amz_date_header().split(\u0027T\u0027, 1)[0]),"},{"line_number":826,"context_line":"                \u0027x-amz-date\u0027: self.get_v4_amz_date_header(),"},{"line_number":827,"context_line":"                \u0027x-amz-storage-class\u0027: \u0027STANDARD\u0027,"},{"line_number":828,"context_line":"                \u0027x-amz-content-sha256\u0027: \u00270\u0027 * 64,"},{"line_number":829,"context_line":"                \u0027Date\u0027: self.get_date_header()},"},{"line_number":830,"context_line":"            body\u003dself.object_body)"},{"line_number":831,"context_line":"        req.date \u003d datetime.now()"}],"source_content_type":"text/x-python","patch_set":7,"id":"cd087571_ac56446e","line":828,"in_reply_to":"f427c335_2a340fbc","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"791f2220cbf6efb778893adf673f9e629d3f5e48","unresolved":true,"context_lines":[{"line_number":850,"context_line":"                        self.get_v4_amz_date_header().split(\u0027T\u0027, 1)[0]),"},{"line_number":851,"context_line":"                \u0027x-amz-date\u0027: self.get_v4_amz_date_header(),"},{"line_number":852,"context_line":"                \u0027x-amz-storage-class\u0027: \u0027STANDARD\u0027,"},{"line_number":853,"context_line":"                \u0027x-amz-content-sha256\u0027: \u0027not the hash\u0027,"},{"line_number":854,"context_line":"                \u0027Date\u0027: self.get_date_header()},"},{"line_number":855,"context_line":"            body\u003dself.object_body)"},{"line_number":856,"context_line":"        req.date \u003d datetime.now()"}],"source_content_type":"text/x-python","patch_set":7,"id":"933a12bb_427fd789","line":853,"updated":"2024-08-23 17:28:30.000000000","message":"...whereas this is just invalid","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a4d1483aeca7ca5900a4080bd9c5f0047ed34fa","unresolved":false,"context_lines":[{"line_number":850,"context_line":"                        self.get_v4_amz_date_header().split(\u0027T\u0027, 1)[0]),"},{"line_number":851,"context_line":"                \u0027x-amz-date\u0027: self.get_v4_amz_date_header(),"},{"line_number":852,"context_line":"                \u0027x-amz-storage-class\u0027: \u0027STANDARD\u0027,"},{"line_number":853,"context_line":"                \u0027x-amz-content-sha256\u0027: \u0027not the hash\u0027,"},{"line_number":854,"context_line":"                \u0027Date\u0027: self.get_date_header()},"},{"line_number":855,"context_line":"            body\u003dself.object_body)"},{"line_number":856,"context_line":"        req.date \u003d datetime.now()"}],"source_content_type":"text/x-python","patch_set":7,"id":"6ca0eb39_58c09449","line":853,"in_reply_to":"933a12bb_427fd789","updated":"2024-09-03 13:48:42.000000000","message":"Acknowledged","commit_id":"de0dcd8f697d1cbd6399498b76143559a8dc9953"}]}
