)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62c4e7aac0624bf900ab08e090986ab12e7893a6","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     indianwhocodes \u003cnairashwin952013@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-10-10 09:58:34 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Include accept-range header in s3api response"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ib3fa895ea13a6703b0f146bc8833c4e635976fdd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"dbd6bf15_3c76b685","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":20},"updated":"2023-10-12 21:16:49.000000000","message":"nit: `accept-range`, or `accept-ranges`?","commit_id":"f68a8384eac90330517afca63b558b4d2bc700b3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"5cdc345fc752e34642c63ddd547860b9522fa33c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     indianwhocodes \u003cnairashwin952013@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-10-10 09:58:34 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Include accept-range header in s3api response"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ib3fa895ea13a6703b0f146bc8833c4e635976fdd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1ce9f951_3369c870","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":20},"in_reply_to":"dbd6bf15_3c76b685","updated":"2023-10-13 16:39:45.000000000","message":"Done","commit_id":"f68a8384eac90330517afca63b558b4d2bc700b3"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"62c4e7aac0624bf900ab08e090986ab12e7893a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6e903982_adb31478","updated":"2023-10-12 21:16:49.000000000","message":"Looks about right, though it\u0027s a little funny to not have a unit test. Something like https://review.opendev.org/c/openstack/swift/+/898141 maybe?","commit_id":"c40ae1357e22a2094e6f056dbaefaca02899b8b5"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4ed00df7c12c210212ffba0b17659d2af0a30f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"9fbc6443_cbac97ba","updated":"2023-10-10 15:46:15.000000000","message":"I can confirm this change works functionally (at least where we care about it: object GET responses):\n\nwith s3repsonse reverted:\n\n```\naws s3api get-object --debug --bucket bucket-91417401-99c5-48e5-8e84-59796900d9b5 --key mpu-1056bd17-3fa7-4ca6-aa6f-f7bb015b1921 deleteme\n...\n2023-10-10 15:30:14,997 - MainThread - botocore.parsers - DEBUG - Response headers: {\u0027Content-Type\u0027: \u0027application/octet-stream\u0027, \u0027Last-Modified\u0027: \u0027Thu, 05 Oct 2023 22:34:27 GMT\u0027, \u0027Content-Length\u0027: \u002715728640\u0027, \u0027ETag\u0027: \u0027\"fd453aaf14ea07844745550b30b084d7-3\"\u0027, \u0027x-amz-id-2\u0027: \u0027txbfd5b6d3c42c41b192e33-0065256e06\u0027, \u0027x-amz-request-id\u0027: \u0027txbfd5b6d3c42c41b192e33-0065256e06\u0027, \u0027X-Trans-Id\u0027: \u0027txbfd5b6d3c42c41b192e33-0065256e06\u0027, \u0027X-Openstack-Request-Id\u0027: \u0027txbfd5b6d3c42c41b192e33-0065256e06\u0027, \u0027Date\u0027: \u0027Tue, 10 Oct 2023 15:30:14 GMT\u0027}\n...\n```\n\nwith this change:\n\n```\nvagrant@saio:~$ aws s3api get-object --debug --bucket bucket-91417401-99c5-48e5-8e84-59796900d9b5 --key mpu-1056bd17-3fa7-4ca6-aa6f-f7bb015b1921 deleteme\n...\n2023-10-10 15:31:59,256 - MainThread - botocore.parsers - DEBUG - Response headers: {\u0027Content-Type\u0027: \u0027application/octet-stream\u0027, \u0027Last-Modified\u0027: \u0027Thu, 05 Oct 2023 22:34:27 GMT\u0027, \u0027Accept-Ranges\u0027: \u0027bytes\u0027, \u0027Content-Length\u0027: \u002715728640\u0027, \u0027ETag\u0027: \u0027\"fd453aaf14ea07844745550b30b084d7-3\"\u0027, \u0027x-amz-id-2\u0027: \u0027txcc6ed000b16042559843e-0065256e6f\u0027, \u0027x-amz-request-id\u0027: \u0027txcc6ed000b16042559843e-0065256e6f\u0027, \u0027X-Trans-Id\u0027: \u0027txcc6ed000b16042559843e-0065256e6f\u0027, \u0027X-Openstack-Request-Id\u0027: \u0027txcc6ed000b16042559843e-0065256e6f\u0027, \u0027Date\u0027: \u0027Tue, 10 Oct 2023 15:31:59 GMT\u0027}\n...\n```\n\nI can also see it on object-head (which is nice!)\n\nI think some of the functional test failures are probably reasonable; there\u0027s got to be places where swift/s3api/aws shouldn\u0027t have accept-ranges in the response?\n\ne.g. it seems like the Swift API responds with `Accept-Ranges: bytes` to container listings, but it\u0027s not true - it ignores the Range header.\n\nYou should trim down the asserts.  Even just a few object GET/HEAD requests having the right headers in the response should be sufficient for this patch.  Especially reasonable would be any test that uses a `Range: bytes\u003d` header to GET a range response (where we *obvoiulsy* DO ACCEPT-RANGES!?).\n\nIt\u0027s a bummer than the mw unittest infra doesn\u0027t seem to match the real proxy responses:\n\n```\ndiff --git a/test/unit/common/middleware/s3api/test_obj.py b/test/unit/common/middleware/s3api/test_obj.py\nindex 3b0907edb..50e354483 100644\n--- a/test/unit/common/middleware/s3api/test_obj.py\n+++ b/test/unit/common/middleware/s3api/test_obj.py\n@@ -370,6 +370,7 @@ class TestS3ApiObj(S3ApiTestCase):\n \n         self.assertTrue(\u0027content-range\u0027 in headers)\n         self.assertTrue(headers[\u0027content-range\u0027].startswith(\u0027bytes 0-3\u0027))\n+        self.assertEqual(headers[\u0027Accept-Ranges\u0027], \u0027bytes\u0027)\n \n     @s3acl\n     def test_object_GET_Range_error(self):\n```\n\n... seems to fail.  It would be *really* nice to understand why and if getting it passing would be reasonable (another update to FakeSwift?)  The real swift behavior is somewhat confusing:\n\nhttps://github.com/NVIDIA/swift/blob/master/swift/proxy/controllers/base.py#L1626\nhttps://github.com/NVIDIA/swift/blob/master/swift/proxy/controllers/obj.py#L3055\n!? https://github.com/NVIDIA/swift/blob/master/swift/proxy/controllers/container.py#L203","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"e2ecb64725923fe7418a7a5414d9d51d059133c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"269c6aaf_12784732","updated":"2023-10-09 21:15:42.000000000","message":"This patch looks good and is eligible to be reviewed","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3417dd1630a4d9e222819506becc9f3661ce37f5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3f6fa1a1_9bdb6193","updated":"2023-10-13 21:43:47.000000000","message":"recheck\n\nAnother failure with `new/grenade/projects/70_cinder/resources.sh verify pre-upgrade`","commit_id":"0893cedc3519f4b9cfc3d155e242a8cc334980c7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"49032805fd3cfb447b13aad192452d61bdbd409c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"c00382c7_12c28cf9","updated":"2023-10-13 19:04:11.000000000","message":"recheck\n\ngrenade failure was some cinder verify timeout/error","commit_id":"0893cedc3519f4b9cfc3d155e242a8cc334980c7"}],"test/functional/s3api/test_acl.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4ed00df7c12c210212ffba0b17659d2af0a30f","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        self.assertEqual(status, 200)"},{"line_number":60,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":61,"context_line":"        self.assertEqual(headers[\u0027content-length\u0027], \u00270\u0027)"},{"line_number":62,"context_line":"        self.assertTrue(\u0027accept-ranges\u0027 in headers)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # GET Bucket ACL"},{"line_number":65,"context_line":"        status, headers, body \u003d \\"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ac7445a_653eb72a","line":62,"updated":"2023-10-10 15:46:15.000000000","message":"does a PUT bucket ACL response really want to indicate the resource will accept a byte range request?","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"65aeb74a8e6c10cb9093b247e65560015900fce1","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.assertEqual(status, 200)"},{"line_number":60,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":61,"context_line":"        self.assertEqual(headers[\u0027content-length\u0027], \u00270\u0027)"},{"line_number":62,"context_line":"        self.assertTrue(\u0027accept-ranges\u0027 in headers)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # GET Bucket ACL"},{"line_number":65,"context_line":"        status, headers, body \u003d \\"}],"source_content_type":"text/x-python","patch_set":4,"id":"9b98afcb_d63a612f","line":62,"in_reply_to":"9ac7445a_653eb72a","updated":"2023-10-10 16:45:01.000000000","message":"That was my mistake, we do not expect a PUT bucket ACL response to have accept-ranges in its response.","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"}],"test/functional/s3api/test_object.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4ed00df7c12c210212ffba0b17659d2af0a30f","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        self.assertCommonResponseHeaders(headers, etag)"},{"line_number":143,"context_line":"        self.assertTrue(headers[\u0027last-modified\u0027] is not None)"},{"line_number":144,"context_line":"        self.assertTrue(\u0027content-type\u0027 in headers)"},{"line_number":145,"context_line":"        self.assertEqual(headers[\u0027content-length\u0027], str(len(content)))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        # DELETE Object"},{"line_number":148,"context_line":"        status, headers, body \u003d \\"}],"source_content_type":"text/x-python","patch_set":4,"id":"872c6972_c555d257","line":145,"updated":"2023-10-10 15:46:15.000000000","message":"these un-assuming GET/HEAD requests would be a nice place for:\n\n    self.assertEqual(headers[\u0027Accept-Ranges\u0027], \u0027bytes\u0027)","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4129ab1302b18fb8d0a56ae85cf121256d999744","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        self.assertCommonResponseHeaders(headers, etag)"},{"line_number":143,"context_line":"        self.assertTrue(headers[\u0027last-modified\u0027] is not None)"},{"line_number":144,"context_line":"        self.assertTrue(\u0027content-type\u0027 in headers)"},{"line_number":145,"context_line":"        self.assertEqual(headers[\u0027content-length\u0027], str(len(content)))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        # DELETE Object"},{"line_number":148,"context_line":"        status, headers, body \u003d \\"}],"source_content_type":"text/x-python","patch_set":4,"id":"ee428023_4be477b1","line":145,"in_reply_to":"872c6972_c555d257","updated":"2023-10-10 16:57:51.000000000","message":"Done","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4ed00df7c12c210212ffba0b17659d2af0a30f","unresolved":true,"context_lines":[{"line_number":694,"context_line":"            self.conn.make_request(\u0027GET\u0027, self.bucket, obj, query\u003dquery)"},{"line_number":695,"context_line":"        self.assertEqual(status, 200)"},{"line_number":696,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":697,"context_line":"        self.assertTrue(\u0027accept-ranges\u0027 in headers)"},{"line_number":698,"context_line":"        self.assertEqual(headers[\u0027cache-control\u0027], \u0027private\u0027)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    def test_get_object_response_content_disposition(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"4c14d4e5_4aa8c844","line":697,"updated":"2023-10-10 15:46:15.000000000","message":"i\u0027m not really sure what \"response_cache_control\" is - can you really repeat this request with a `Range: bytes\u003d` header and expect a partial response?","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4129ab1302b18fb8d0a56ae85cf121256d999744","unresolved":false,"context_lines":[{"line_number":694,"context_line":"            self.conn.make_request(\u0027GET\u0027, self.bucket, obj, query\u003dquery)"},{"line_number":695,"context_line":"        self.assertEqual(status, 200)"},{"line_number":696,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":697,"context_line":"        self.assertTrue(\u0027accept-ranges\u0027 in headers)"},{"line_number":698,"context_line":"        self.assertEqual(headers[\u0027cache-control\u0027], \u0027private\u0027)"},{"line_number":699,"context_line":""},{"line_number":700,"context_line":"    def test_get_object_response_content_disposition(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"722bffc5_8ee79a2c","line":697,"in_reply_to":"4c14d4e5_4aa8c844","updated":"2023-10-10 16:57:51.000000000","message":"we use the cache-control header for caching directoves but i realized that this assert might be \"out-of-place\" in the context of this patch, so im gonna go ahead and remove it.","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"3e4ed00df7c12c210212ffba0b17659d2af0a30f","unresolved":true,"context_lines":[{"line_number":735,"context_line":"        self.assertEqual(status, 206)"},{"line_number":736,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":737,"context_line":"        self.assertTrue(\u0027content-length\u0027 in headers)"},{"line_number":738,"context_line":"        self.assertTrue(\u0027accept-ranges\u0027 in headers)"},{"line_number":739,"context_line":"        self.assertEqual(headers[\u0027content-length\u0027], \u00275\u0027)"},{"line_number":740,"context_line":"        self.assertTrue(\u0027x-amz-meta-test\u0027 in headers)"},{"line_number":741,"context_line":"        self.assertEqual(\u0027swift\u0027, headers[\u0027x-amz-meta-test\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"aa4f5001_f1e020f7","line":738,"updated":"2023-10-10 15:46:15.000000000","message":"this single assert is doing most of the work\n\nit would be nice to see a GET request for an object *without* a `Range: bytes\u003d` header *also* gets back the `accept-ranges` header.","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4129ab1302b18fb8d0a56ae85cf121256d999744","unresolved":false,"context_lines":[{"line_number":735,"context_line":"        self.assertEqual(status, 206)"},{"line_number":736,"context_line":"        self.assertCommonResponseHeaders(headers)"},{"line_number":737,"context_line":"        self.assertTrue(\u0027content-length\u0027 in headers)"},{"line_number":738,"context_line":"        self.assertTrue(\u0027accept-ranges\u0027 in headers)"},{"line_number":739,"context_line":"        self.assertEqual(headers[\u0027content-length\u0027], \u00275\u0027)"},{"line_number":740,"context_line":"        self.assertTrue(\u0027x-amz-meta-test\u0027 in headers)"},{"line_number":741,"context_line":"        self.assertEqual(\u0027swift\u0027, headers[\u0027x-amz-meta-test\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"7707b802_a7d21d3f","line":738,"in_reply_to":"aa4f5001_f1e020f7","updated":"2023-10-10 16:57:51.000000000","message":"Done","commit_id":"272d8161d4e83f5e0c060eba8d4fb156a2a317a3"}]}
