)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ee842ddd61246feb49e0ae2f7bee03e95761c6a6","unresolved":true,"context_lines":[{"line_number":11,"context_line":"Make each s3api controller declare an explicit resource_type"},{"line_number":12,"context_line":"instead of deriving protocol strings from the Python class name."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"For copy responses, stop routing XML result element names"},{"line_number":15,"context_line":"through controller metadata and pass CopyObjectResult and"},{"line_number":16,"context_line":"CopyPartResult explicitly at the copy call sites."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Ic63b564c787897f80d5be33735216bf124ac7d2a"},{"line_number":19,"context_line":"Signed-off-by: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"07b1ba06_7a14ac30","line":16,"range":{"start_line":14,"start_character":0,"end_line":16,"end_character":49},"updated":"2026-07-21 12:58:45.000000000","message":"+1, I\u0027d put together a similar change before I saw this","commit_id":"5349794e730f8152be9670429959e22013b792a1"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"ecd32102dad2907c0941d9b90cd801e268bf1bd3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"1cc5e7d3_43caa9d6","updated":"2026-07-21 08:35:06.000000000","message":"LGTM as well.\n\nUsed the following script to verify resource_type names are unchanged:\n\n```\nfrom swift.common.middleware.s3api import controllers\nfrom swift.common.middleware.s3api.utils import camel_to_snake\n\nfor cls in vars(controllers).values():\n    if not (isinstance(cls, type)\n            and issubclass(cls, controllers.Controller)\n            and \u0027resource_type\u0027 in cls.__dict__):\n        continue\n    old \u003d camel_to_snake(cls.__name__[:-len(\u0027Controller\u0027)]).upper()\n    new \u003d cls.resource_type\n    if old !\u003d new:\n        print(\"BAD: \", cls.__name__, old, new)\n    else:\n        print(\" OK: \", cls.__name__, old, new)\n```","commit_id":"5349794e730f8152be9670429959e22013b792a1"}],"swift/common/middleware/s3api/controllers/acl.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ee842ddd61246feb49e0ae2f7bee03e95761c6a6","unresolved":true,"context_lines":[{"line_number":84,"context_line":"    * GET Object acl"},{"line_number":85,"context_line":"    * PUT Object acl"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Those APIs are logged as ACL operations in the S3 server log."},{"line_number":88,"context_line":"    \"\"\""},{"line_number":89,"context_line":"    acl_handler \u003d BaseAclHandler"},{"line_number":90,"context_line":"    resource_type \u003d \u0027ACL\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ef2f4669_0f1e657b","line":87,"range":{"start_line":87,"start_character":19,"end_line":87,"end_character":65},"updated":"2026-07-21 12:58:45.000000000","message":"this is a curious claim","commit_id":"5349794e730f8152be9670429959e22013b792a1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"451f0d3d375fe28a668ab0c6a59550c5c6294163","unresolved":true,"context_lines":[{"line_number":84,"context_line":"    * GET Object acl"},{"line_number":85,"context_line":"    * PUT Object acl"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    Those APIs are logged as ACL operations in the S3 server log."},{"line_number":88,"context_line":"    \"\"\""},{"line_number":89,"context_line":"    acl_handler \u003d BaseAclHandler"},{"line_number":90,"context_line":"    resource_type \u003d \u0027ACL\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"0b0378c8_3ea26222","line":87,"range":{"start_line":87,"start_character":19,"end_line":87,"end_character":65},"in_reply_to":"ef2f4669_0f1e657b","updated":"2026-07-21 14:24:18.000000000","message":"I think it may be referring to AWS logs -- look for \"Operation\" on https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html\n\nFWIW there are several other places with similar wording, which I think can all be traced back to https://opendev.org/x/swift3/commit/bb8d99d1 :\n```\nvagrant@saio:~/swift$ ack \u0027S3 server log\u0027 swift\nswift/common/middleware/s3api/controllers/logging.py\n32:    Those APIs are logged as LOGGING_STATUS operations in the S3 server log.\n\nswift/common/middleware/s3api/controllers/location.py\n27:    S3 server log.\n\nswift/common/middleware/s3api/controllers/acl.py\n86:    Those APIs are logged as ACL operations in the S3 server log.\n\nswift/common/middleware/s3api/controllers/versioning.py\n36:    Those APIs are logged as VERSIONING operations in the S3 server log.\n\nswift/common/middleware/s3api/controllers/multi_upload.py\n184:    Those APIs are logged as PART operations in the S3 server log.\n262:    Those APIs are logged as UPLOADS operations in the S3 server log.\n501:    Those APIs are logged as UPLOAD operations in the S3 server log.\n\nswift/common/middleware/s3api/controllers/multi_delete.py\n37:    operation in the S3 server log.\n\nswift/common/middleware/s3api/controllers/s3_acl.py\n33:    Those APIs are logged as ACL operations in the S3 server log.\n```","commit_id":"5349794e730f8152be9670429959e22013b792a1"}],"swift/common/middleware/s3api/controllers/base.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ee842ddd61246feb49e0ae2f7bee03e95761c6a6","unresolved":true,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @classmethod"},{"line_number":95,"context_line":"    def name(cls):"},{"line_number":96,"context_line":"        return cls.__name__[:-len(\u0027Controller\u0027)]"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @classmethod"},{"line_number":99,"context_line":"    def resource_type(cls):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3df9c7ea_2b871686","side":"PARENT","line":96,"updated":"2026-07-21 12:58:45.000000000","message":"+1, unnecessary complexity","commit_id":"5100a2fc9931e48acc9f7a7d295ccab4afebeaaa"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ee842ddd61246feb49e0ae2f7bee03e95761c6a6","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        Returns the target resource type of this controller."},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        return camel_to_snake(cls.name()).upper()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"class UnsupportedController(Controller):"}],"source_content_type":"text/x-python","patch_set":1,"id":"32e74a6c_b2d30c90","side":"PARENT","line":103,"updated":"2026-07-21 12:58:45.000000000","message":"I verified against AWS S3 that these strings really are upper case in response bodies\n\n```\n\u003cError\u003e\u003cCode\u003eMethodNotAllowed\u003c/Code\u003e\u003cMessage\u003eThe specified method is not allowed against this resource.\u003c/Message\u003e\u003cMethod\u003ePUT\u003c/Method\u003e\u003cResourceType\u003eUPLOADS\u003c/ResourceType\u003e\u003cRequestId\u003eZ40XY19HRK34F488\u003c/RequestId\u003e\u003cHostId\u003eXErWCc6aGRF4LiXgiIHt9O8bvC0h2VThTg0b+2UDxjG5qFztgCHxwh8bpjrfXsbSkb4ekCCmbZiAlr8vv3Ue90UQbXnjarls\u003c/HostId\u003e\u003c/Error\u003e\n```","commit_id":"5100a2fc9931e48acc9f7a7d295ccab4afebeaaa"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ee842ddd61246feb49e0ae2f7bee03e95761c6a6","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        if \u0027X-Amz-Copy-Source\u0027 in req.headers:"},{"line_number":251,"context_line":"            last_modified_ts \u003d S3Timestamp("},{"line_number":252,"context_line":"                parse_date_header(resp.headers[\u0027Last-Modified\u0027]))"},{"line_number":253,"context_line":"            resp.append_copy_resp_body(\u0027CopyPartResult\u0027,"},{"line_number":254,"context_line":"                                       last_modified_ts.s3xmlformat)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        resp.status \u003d 200"}],"source_content_type":"text/x-python","patch_set":1,"id":"647493f9_9d7e4c12","line":253,"updated":"2026-07-21 12:58:45.000000000","message":"+1, explicit is better","commit_id":"5349794e730f8152be9670429959e22013b792a1"}]}
