)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"307a510748b7599f587c6e85e9df7c2343eb2c14","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d0a751f9_5cc42c25","updated":"2026-08-21 20:40:29.000000000","message":"i think it\u0027s weird to fix s3api compatibility bugs w/o s3-cross-compat tests:\n\n1001893: sq? Test chunked checksum errors in S3 API | https://review.opendev.org/c/openstack/swift/+/1001893\n\nif you add content-length to the new `test_object_PUT_chunked_transfer_with_checksum` request it will 200 - but it *should* still 501\n\nhttps://review.opendev.org/c/openstack/swift/+/1001893/2/test/unit/common/middleware/s3api/test_obj.py#863\n\nFWIW 50% of the new unit tests here are just validating existing behavior is unchagned; with the change reverted only the 500\u003d\u003e501 tests fail:\n\n```\nFAILED test/unit/common/middleware/s3api/test_multi_delete.py::TestS3ApiMultiDeleteNoAcl::test_object_multi_DELETE_chunked_transfer_with_checksum\nFAILED test/unit/common/middleware/s3api/test_multi_delete.py::TestS3ApiMultiDeleteAcl::test_object_multi_DELETE_chunked_transfer_with_checksum\nFAILED test/unit/common/middleware/s3api/test_obj.py::TestS3ApiObj::test_object_PUT_chunked_transfer_with_checksum\nFAILED test/unit/common/middleware/s3api/test_obj.py::TestS3ApiObjNonUTC::test_object_PUT_chunked_transfer_with_checksum\nFAILED test/unit/common/middleware/s3api/test_obj.py::TestS3ApiObjAcl::test_object_PUT_chunked_transfer_with_checksum\nFAILED test/unit/common/middleware/s3api/test_obj.py::TestS3ApiObjNonUTCAcl::test_object_PUT_chunked_transfer_with_checksum\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 6 failed, 374 passed in 4.41s \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n```\n\nI think some of the existing chunked-transfer\u003d\u003e200 behaviors are already tested elsewhere, e.g.\n\nhttps://review.opendev.org/c/openstack/swift/+/927177/4/test/unit/common/middleware/s3api/test_acl.py#a138\n\n... so what\u0027s inspiring us to add NEW tests here for behavior that we\u0027re not changing and we\u0027re not even sure we want?  I think the diff would be tighter if it only tested the 500\u003d\u003e501 fix leaving the pre-existing 200 handling as open question w/o any presumption that the existing test suite isn\u0027t already doing a sufficient job of maintaining the questionable non-confirming behavior i.e. this bug fix would be WRONG place to FURTHER enshire the 200 behavior as \"correct to maintain\"\n\nI suggest we just drop the new 200 tests for now","commit_id":"779d0a3336e94995d14689e16c6995ab88f46568"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"307a510748b7599f587c6e85e9df7c2343eb2c14","unresolved":true,"context_lines":[{"line_number":1631,"context_line":"        # Swift\u0027s extension for checksum-free HTTP-chunked PUTs."},{"line_number":1632,"context_line":"        if (self.content_length is None and"},{"line_number":1633,"context_line":"                self.headers.get("},{"line_number":1634,"context_line":"                    \u0027Transfer-Encoding\u0027, \u0027\u0027).lower() \u003d\u003d \u0027chunked\u0027):"},{"line_number":1635,"context_line":"            raise S3NotImplemented("},{"line_number":1636,"context_line":"                \u0027A header you provided implies functionality that is \u0027"},{"line_number":1637,"context_line":"                \u0027not implemented\u0027, header\u003d\u0027Transfer-Encoding\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"30f4e725_68a47180","line":1634,"updated":"2026-08-21 20:40:29.000000000","message":"this feels like we\u0027ll allow (ignore?) transfer-encoding when content-length is NOT None - I don\u0027t think that\u0027s how the RFC says that\u0027s supposed to work:\n\nhttps://www.rfc-editor.org/info/rfc9112/#section-6.3\n\n\u003e If a message is received with both a Transfer-Encoding and a Content-Length header field, the Transfer-Encoding overrides the Content-Length","commit_id":"779d0a3336e94995d14689e16c6995ab88f46568"}],"test/unit/common/middleware/s3api/test_multi_delete.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"307a510748b7599f587c6e85e9df7c2343eb2c14","unresolved":true,"context_lines":[{"line_number":187,"context_line":"        self.assertIsNone(req.content_length)"},{"line_number":188,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        self.assertEqual(\u0027501 Not Implemented\u0027, status)"},{"line_number":191,"context_line":"        self.assertEqual(\u0027NotImplemented\u0027, self._get_error_code(body))"},{"line_number":192,"context_line":"        self.assertIn(b\u0027\u003cHeader\u003eTransfer-Encoding\u003c/Header\u003e\u0027, body)"},{"line_number":193,"context_line":"        self.assertEqual([], self.swift.calls)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e2c28790_224e9497","line":190,"updated":"2026-08-21 20:40:29.000000000","message":"where did you even come up with the idea to test this - AFAICT aws s3 will 200 this request and s3api should not 501 in this case?\n\nhttps://review.opendev.org/c/openstack/swift/+/1001893/1/test/s3api/test_input_errors.py#1740","commit_id":"779d0a3336e94995d14689e16c6995ab88f46568"}],"test/unit/common/middleware/s3api/test_obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"307a510748b7599f587c6e85e9df7c2343eb2c14","unresolved":true,"context_lines":[{"line_number":845,"context_line":"        self.assertIsNone(req.content_length)"},{"line_number":846,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":847,"context_line":""},{"line_number":848,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":849,"context_line":"        self.assertEqual(b\u0027\u0027, body)"},{"line_number":850,"context_line":"        self.assertEqual(self.object_body, self.swift.call_list[-1].body)"},{"line_number":851,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d7dcc7ad_ed8adac0","line":848,"updated":"2026-08-21 20:40:29.000000000","message":"this seems to be existing behavior","commit_id":"779d0a3336e94995d14689e16c6995ab88f46568"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"307a510748b7599f587c6e85e9df7c2343eb2c14","unresolved":true,"context_lines":[{"line_number":868,"context_line":"        self.assertIsNone(req.content_length)"},{"line_number":869,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":870,"context_line":""},{"line_number":871,"context_line":"        self.assertEqual(\u0027501 Not Implemented\u0027, status)"},{"line_number":872,"context_line":"        self.assertEqual(\u0027NotImplemented\u0027, self._get_error_code(body))"},{"line_number":873,"context_line":"        self.assertIn(b\u0027\u003cHeader\u003eTransfer-Encoding\u003c/Header\u003e\u0027, body)"},{"line_number":874,"context_line":"        self.assertEqual([], self.swift.calls)"}],"source_content_type":"text/x-python","patch_set":1,"id":"402a52a3_3e754084","line":871,"updated":"2026-08-21 20:40:29.000000000","message":"ok, so this change is NBD\n```\n\u003e       self.assertEqual(\u0027501 Not Implemented\u0027, status)\nE       AssertionError: \u0027501 Not Implemented\u0027 !\u003d \u0027500 Internal Server Error\u0027\nE       - 501 Not Implemented\nE       + 500 Internal Server Error\n```\n\nit\u0027s happening here:\n\n```\n  File \"/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 281, in chunk_update\n    if self.bytes_received \u003c self._expected_length:\n       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nTypeError: \u0027\u003c\u0027 not supported between instances of \u0027int\u0027 and \u0027NoneType\u0027\n```","commit_id":"779d0a3336e94995d14689e16c6995ab88f46568"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"307a510748b7599f587c6e85e9df7c2343eb2c14","unresolved":true,"context_lines":[{"line_number":905,"context_line":"        self.assertIsNone(req.content_length)"},{"line_number":906,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":907,"context_line":""},{"line_number":908,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":909,"context_line":"        self.assertEqual(b\u0027\u0027, body)"},{"line_number":910,"context_line":"        self.assertEqual(self.object_body, self.swift.call_list[-1].body)"},{"line_number":911,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"edf44578_3479bea2","line":908,"updated":"2026-08-21 20:40:29.000000000","message":"this seems to test existing behavior","commit_id":"779d0a3336e94995d14689e16c6995ab88f46568"}]}
