)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-01-23 12:23:19 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix token issue for base labels"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ibf99b4df9eeaeaee9961f05d11f2f567cf68aef9"},{"line_number":10,"context_line":"Signed-off-by: Yan Xiao \u003cyanxiao@nvidia.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"185cb462_63db6cea","line":7,"updated":"2026-01-29 16:54:03.000000000","message":"The commit message needs to explain what the issue is. Better still, refer to a launchpad bug where anyone can read about what motivated this change in more detail than may be appropriate for a commit message.\n\nIn this case I suggest a launchpad bug describing how we end up seeing \u0027polluted\u0027 account labels (with appropriate redaction of any tokens), then a commit message tag as described here:\n\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#working-on-bugs\n\nThen, explain briefly the strategy for the fix i.e. delegating to auth middlewares.","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-01-23 12:23:19 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix token issue for base labels"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ibf99b4df9eeaeaee9961f05d11f2f567cf68aef9"},{"line_number":10,"context_line":"Signed-off-by: Yan Xiao \u003cyanxiao@nvidia.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"8eaca035_85821be3","line":7,"in_reply_to":"185cb462_63db6cea","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":7,"context_line":"Fix token issue for base labels"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The account label emitted in labeled metrics sometimes could be"},{"line_number":10,"context_line":"incorrectly prefixed with a fernet token. The incorrect label is"},{"line_number":11,"context_line":"from PATH_INFO as observed by the rightmost proxy-logging or other"},{"line_number":12,"context_line":"Swift middlewares on the right side of Swift auth middleware on"},{"line_number":13,"context_line":"pipeline, or backend servers."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"20305e2a_ab7d3b5d","line":10,"range":{"start_line":10,"start_character":28,"end_line":10,"end_character":40},"updated":"2026-03-13 16:00:02.000000000","message":"the problem isn\u0027t specific to fernet tokens IIUC. Isn\u0027t it any s3api request?","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"b20e7a25474ffd07f915b95162cec0c91e73bd25","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Fix token issue for base labels"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The account label emitted in labeled metrics sometimes could be"},{"line_number":10,"context_line":"incorrectly prefixed with a fernet token. The incorrect label is"},{"line_number":11,"context_line":"from PATH_INFO as observed by the rightmost proxy-logging or other"},{"line_number":12,"context_line":"Swift middlewares on the right side of Swift auth middleware on"},{"line_number":13,"context_line":"pipeline, or backend servers."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"cced67f2_1517d40f","line":10,"range":{"start_line":10,"start_character":28,"end_line":10,"end_character":40},"in_reply_to":"20305e2a_ab7d3b5d","updated":"2026-06-29 21:29:09.000000000","message":"indeed, not specific to fernet token even though that was the original user complaint, as some auth middlewares would use other type of access key id","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4822365d_3d2ff9d9","updated":"2026-01-29 16:54:03.000000000","message":"This is a good basis for exploring how we want proxy_logging base_labels to evolve. It\u0027s helped me get a better grasp of where we need changes. \n\nI\u0027d like ot think a bit more about whether the auth middlewares should be updating the labels and path or whether they should be communicating that info to s3api for it to fix up the request environ.\n\ntempauth should get some new unit tests","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3ead5498_f2b0080b","updated":"2026-03-13 16:00:02.000000000","message":"This patch has made me realise a couple of things that may be existing deficiencies:\n\n1. account has no default value in base_labels, this patch makes it an empty string, but that is inconsistent with resource\u0027s default\n2. It seems reasonable to think that other middlewares might add base_labels to the environ (i.e. auth\u0027s!) which breaks an assumption in proxy_logging.\n\nI suggest a helper method, which highlights the concerns, in https://review.opendev.org/c/openstack/swift/+/980485 base_labels: add helper, set if not present\n\nThere should be a new test in test_tempauth.py","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"87668a717fb6e9a4a1f961c7c1b8d4cada2c2cf5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1edfc1ef_f62b7cd5","updated":"2026-03-12 16:19:59.000000000","message":"recheck","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2172532feb47d56dbd517c5ba83152a3c85e15f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"d4f5e071_6c0506ee","updated":"2026-08-06 08:29:14.000000000","message":"@Yan I think you can rebase this patch directly on to master, since it does not depend on the ChainLabelsMap patch","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88085073449a7e8253a037a8036d85cb946448af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"00692441_32a95b85","updated":"2026-08-06 11:38:17.000000000","message":"This doesn\u0027t seem to fix the bug. Unit tests all pass when I revert the change to tempauth.","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8962c0ff91923b86ac75a1d3c0a39659c67a9bde","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a0bc7753_74d14585","updated":"2026-08-28 01:14:35.000000000","message":"I could be wrong, but I\u0027m having trouble judging reasonably about \"correct\" given the state of the foundation.\n\nhttps://review.opendev.org/c/openstack/swift/+/1002696/2/test/unit/common/middleware/test_proxy_logging.py#2512\n\nI think we should stop working on \"improving\" our labeled statsd metrics until we fix the bug at the heart of the statsd client transport:\n\nhttps://review.opendev.org/c/openstack/swift/+/1002696/1/test/unit/common/test_statsd_client.py#721\n\nthe current interfaces requires/expects that clients give us quoted strings or else we allow them BREAK THE PROTOCOL\n\nThe only reasonable fix for that is to ALWAYS QUOTE client provided labels (it doesn\u0027t necessarily have to use url quoting to prevent protocol violations, utf8 bytes are valid AFAICT, but perhaps we might *choose* to reuse url quoting TBD)\n\nHowever, if we MUST quote our inputs the most reasonable *interface* is then that clients *should* send *unquoted* values - currently we\u0027re using ~mostly *quoted* wsgi strings.\n\n```\nreq.environ[\u0027PATH_INFO\u0027] \u003d\u003d \u0027/v1/AUTH_a\"b\u0027\nreq.path \u003d\u003d \u0027/v1/AUTH_a%22b\u0027\n```\n\ndo we want any client that puts path_info in labels to break the protcol?  Do we want to double-quote req.path?\n\nI think in this case that conflict deferred is conflict escalated.\n\n1002711: DNM: contrast backend path and base-label encoding | https://review.opendev.org/c/openstack/swift/+/1002711\n1002714: DNM: characterize unescaped DogStatsD labels | https://review.opendev.org/c/openstack/swift/+/1002714","commit_id":"2fddaa21a3cd85e0d51d1f8ea8b5c999ef80af8c"}],"swift/common/middleware/proxy_logging.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":524,"context_line":"            if is_s3_req(req):"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d \u0027\u0027"},{"line_number":526,"context_line":"            else:"},{"line_number":527,"context_line":"                base_labels[\u0027account\u0027] \u003d acc or \u0027\u0027"},{"line_number":528,"context_line":"            if cont:"},{"line_number":529,"context_line":"                base_labels[\u0027container\u0027] \u003d cont"},{"line_number":530,"context_line":"            req.environ[\u0027swift.base_labels\u0027] \u003d base_labels"}],"source_content_type":"text/x-python","patch_set":2,"id":"53f7e7fb_62c620dc","line":527,"updated":"2026-01-29 16:54:03.000000000","message":"can acc be not None and is_s3_req True? I don\u0027t think that can happen, in which case in both cases we can write ``base_labels[\u0027account\u0027] \u003d acc or \u0027\u0027`` i.e the if/else isn\u0027t necessary","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":524,"context_line":"            if is_s3_req(req):"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d \u0027\u0027"},{"line_number":526,"context_line":"            else:"},{"line_number":527,"context_line":"                base_labels[\u0027account\u0027] \u003d acc or \u0027\u0027"},{"line_number":528,"context_line":"            if cont:"},{"line_number":529,"context_line":"                base_labels[\u0027container\u0027] \u003d cont"},{"line_number":530,"context_line":"            req.environ[\u0027swift.base_labels\u0027] \u003d base_labels"}],"source_content_type":"text/x-python","patch_set":2,"id":"f296add2_a9092d9a","line":527,"in_reply_to":"53f7e7fb_62c620dc","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":528,"context_line":"            if cont:"},{"line_number":529,"context_line":"                base_labels[\u0027container\u0027] \u003d cont"},{"line_number":530,"context_line":"            req.environ[\u0027swift.base_labels\u0027] \u003d base_labels"},{"line_number":531,"context_line":"        elif acc:"},{"line_number":532,"context_line":"            # expected in the right-most proxy_logging instance"},{"line_number":533,"context_line":"            resource_type \u003d self.get_resource_type_from_aco("},{"line_number":534,"context_line":"                req, acc, cont, obj)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5666ff45_ff36fa2e","line":531,"updated":"2026-01-29 16:54:03.000000000","message":"ok, so we still require some middleware to re-write the path to look like a valid swift request path (otherwise ``get_aco_from_path`` returns all None\u0027s), but we\u0027re now also expecting auth middleware to populate ``base_labels[\u0027account\u0027]``\n\nI wonder if we could include both expectations in a comment here at line 532 to replace the existing:\n\n```\n# expected in the right-most proxy_logging instance:\n# - base_labels exists\n# - the request has a valid swift v/a/c/o path so that resource_type can\n    be determined, if it wasn\u0027t already known in left-most proxy_logging\n# - an authoritative auth middleware will have populated \n    base_labels[\u0027account\u0027] if it wasn\u0027t known in left-most proxy_logging\n# -  \n```","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":528,"context_line":"            if cont:"},{"line_number":529,"context_line":"                base_labels[\u0027container\u0027] \u003d cont"},{"line_number":530,"context_line":"            req.environ[\u0027swift.base_labels\u0027] \u003d base_labels"},{"line_number":531,"context_line":"        elif acc:"},{"line_number":532,"context_line":"            # expected in the right-most proxy_logging instance"},{"line_number":533,"context_line":"            resource_type \u003d self.get_resource_type_from_aco("},{"line_number":534,"context_line":"                req, acc, cont, obj)"}],"source_content_type":"text/x-python","patch_set":2,"id":"87bec972_95c30370","line":531,"in_reply_to":"5666ff45_ff36fa2e","updated":"2026-02-05 22:19:44.000000000","message":"Good point, thanks for the comment!","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":516,"context_line":"        :return: a dict of labels associated with the request."},{"line_number":517,"context_line":"        \"\"\""},{"line_number":518,"context_line":"        req_labels \u003d {}"},{"line_number":519,"context_line":"        req_labels[\u0027account\u0027] \u003d acc or \u0027\u0027"},{"line_number":520,"context_line":"        if cont:"},{"line_number":521,"context_line":"            req_labels[\u0027container\u0027] \u003d cont"},{"line_number":522,"context_line":"        req_labels[\u0027resource\u0027] \u003d self.get_resource_type_from_aco("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa8e08db_ad59278a","line":519,"updated":"2026-03-13 16:00:02.000000000","message":"this is a subtle but significant additional change: labels will always have an account key","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"b20e7a25474ffd07f915b95162cec0c91e73bd25","unresolved":false,"context_lines":[{"line_number":516,"context_line":"        :return: a dict of labels associated with the request."},{"line_number":517,"context_line":"        \"\"\""},{"line_number":518,"context_line":"        req_labels \u003d {}"},{"line_number":519,"context_line":"        req_labels[\u0027account\u0027] \u003d acc or \u0027\u0027"},{"line_number":520,"context_line":"        if cont:"},{"line_number":521,"context_line":"            req_labels[\u0027container\u0027] \u003d cont"},{"line_number":522,"context_line":"        req_labels[\u0027resource\u0027] \u003d self.get_resource_type_from_aco("}],"source_content_type":"text/x-python","patch_set":4,"id":"13e2e461_ed29a4bd","line":519,"in_reply_to":"fa8e08db_ad59278a","updated":"2026-06-29 21:29:09.000000000","message":"Ack","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":570,"context_line":"                if base_labels.get(\u0027resource\u0027) \u003d\u003d \u0027UNKNOWN\u0027:"},{"line_number":571,"context_line":"                    # allow a later middleware to update the resource label"},{"line_number":572,"context_line":"                    # once the full swift path is known."},{"line_number":573,"context_line":"                    base_labels.pop(\u0027resource\u0027)"},{"line_number":574,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027S3\u0027"},{"line_number":575,"context_line":"            else:"},{"line_number":576,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027swift\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a1addd7_0ebbd3a2","line":573,"range":{"start_line":573,"start_character":20,"end_line":573,"end_character":47},"updated":"2026-03-13 16:00:02.000000000","message":"this is now inconsistent with the account being unknown: unknown account -\u003e account\u003d\u0027\u0027, unknown resource -\u003e the key is popped\n\nI think we need to decide on one way in which we represent unknown but desired labels: empty string seems to be the candidate (in general we need the key to be present to know that is was a desired label)","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"b20e7a25474ffd07f915b95162cec0c91e73bd25","unresolved":false,"context_lines":[{"line_number":570,"context_line":"                if base_labels.get(\u0027resource\u0027) \u003d\u003d \u0027UNKNOWN\u0027:"},{"line_number":571,"context_line":"                    # allow a later middleware to update the resource label"},{"line_number":572,"context_line":"                    # once the full swift path is known."},{"line_number":573,"context_line":"                    base_labels.pop(\u0027resource\u0027)"},{"line_number":574,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027S3\u0027"},{"line_number":575,"context_line":"            else:"},{"line_number":576,"context_line":"                base_labels[\u0027api\u0027] \u003d \u0027swift\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"4a080b20_b3905097","line":573,"range":{"start_line":573,"start_character":20,"end_line":573,"end_character":47},"in_reply_to":"3a1addd7_0ebbd3a2","updated":"2026-06-29 21:29:09.000000000","message":"Ack, updating per our discussion","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":589,"context_line":"            for k, v in labels.items():"},{"line_number":590,"context_line":"                # if these base_labels are not already set then this is the"},{"line_number":591,"context_line":"                # best idea we have"},{"line_number":592,"context_line":"                if k \u003d\u003d \u0027resource\u0027:"},{"line_number":593,"context_line":"                    base_labels.setdefault(k, v)"},{"line_number":594,"context_line":"            req_labels \u003d ChainMap(labels, base_labels)"},{"line_number":595,"context_line":"        return req_labels"}],"source_content_type":"text/x-python","patch_set":4,"id":"7951ad3b_391624b9","line":592,"updated":"2026-03-13 16:00:02.000000000","message":"there are going to be auth middlewares that have not yet implemented (and may never implement) the required change to update base_labels so I think we still need the original path-parsed account if there is not one already set in base_labels","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":589,"context_line":"            for k, v in labels.items():"},{"line_number":590,"context_line":"                # if these base_labels are not already set then this is the"},{"line_number":591,"context_line":"                # best idea we have"},{"line_number":592,"context_line":"                if k \u003d\u003d \u0027resource\u0027:"},{"line_number":593,"context_line":"                    base_labels.setdefault(k, v)"},{"line_number":594,"context_line":"            req_labels \u003d ChainMap(labels, base_labels)"},{"line_number":595,"context_line":"        return req_labels"}],"source_content_type":"text/x-python","patch_set":4,"id":"9c9a5c20_9da1ed53","line":592,"in_reply_to":"7951ad3b_391624b9","updated":"2026-08-25 21:35:29.000000000","message":"Acknowledged","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":590,"context_line":"                # if these base_labels are not already set then this is the"},{"line_number":591,"context_line":"                # best idea we have"},{"line_number":592,"context_line":"                if k \u003d\u003d \u0027resource\u0027:"},{"line_number":593,"context_line":"                    base_labels.setdefault(k, v)"},{"line_number":594,"context_line":"            req_labels \u003d ChainMap(labels, base_labels)"},{"line_number":595,"context_line":"        return req_labels"},{"line_number":596,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"e4fad0ea_2603346a","line":593,"updated":"2026-03-13 16:00:02.000000000","message":"here we see that inconsistency again: we CAN use setdefault for resource, but in tempauth we cannot use it for account because account key may be set but with empty string value.","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"b20e7a25474ffd07f915b95162cec0c91e73bd25","unresolved":false,"context_lines":[{"line_number":590,"context_line":"                # if these base_labels are not already set then this is the"},{"line_number":591,"context_line":"                # best idea we have"},{"line_number":592,"context_line":"                if k \u003d\u003d \u0027resource\u0027:"},{"line_number":593,"context_line":"                    base_labels.setdefault(k, v)"},{"line_number":594,"context_line":"            req_labels \u003d ChainMap(labels, base_labels)"},{"line_number":595,"context_line":"        return req_labels"},{"line_number":596,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"57d61e74_20123b19","line":593,"in_reply_to":"e4fad0ea_2603346a","updated":"2026-06-29 21:29:09.000000000","message":"Ack","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8962c0ff91923b86ac75a1d3c0a39659c67a9bde","unresolved":true,"context_lines":[{"line_number":491,"context_line":"        return req.environ.get(\u0027swift.source\u0027)"},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"    def get_resource_type(self, req):"},{"line_number":494,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":495,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(swift_path)"},{"line_number":496,"context_line":"        return self.get_resource_type_from_aco(req, acc, cont, obj)"},{"line_number":497,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"780bf244_d35a8af7","line":494,"updated":"2026-08-28 01:14:35.000000000","message":"I\u0027m growing increasingly worried that we\u0027re either not being sufficiently explicit about the type/value for these mw communication channels - or we\u0027re just not thinking hard enough about how complicated and easy-to-get-wrong that dealing with WSGI-strings and quoted-uri\u0027s really is and should be.\n\n```\n  So the existing base-label inputs are worse than “one unfortunate convention”:\n\n   Source                                    Current representation\n  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   Swift account/container via req.path      URI-quoted WSGI path\n  ────────────────────────────────────────  ─────────────────────────────────────────\n   S3 bucket via extract_bucket_and_key()    WSGI string\n  ────────────────────────────────────────  ─────────────────────────────────────────\n   TempAuth user[\u0027url\u0027]                      native URL text, URI-quoted component\n  ────────────────────────────────────────  ─────────────────────────────────────────\n   S3 backend path                           explicitly copied PATH_INFO WSGI string\n```\n\nconsider the difference between:\n\n```\nswift/common/middleware/s3api/s3request.py:2215:\n    self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]\nswift/common/middleware/s3api/s3api.py:477:\n    env[\u0027swift.backend_path\u0027] \u003d env[\u0027s3api.backend_path\u0027]\n```\n\nand `swob.py`\n\n```\n    def path(self):\n        \"Provides the full path of the request, excluding the QUERY_STRING\"\n        return wsgi_quote(self.environ.get(\u0027SCRIPT_NAME\u0027, \u0027\u0027) +\n                          self.environ[\u0027PATH_INFO\u0027])\n```","commit_id":"2fddaa21a3cd85e0d51d1f8ea8b5c999ef80af8c"}],"swift/common/middleware/tempauth.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":513,"context_line":"            return None"},{"line_number":514,"context_line":"        user \u003d self.users[account_user]"},{"line_number":515,"context_line":"        account \u003d account_user.split(\u0027:\u0027, 1)[0]"},{"line_number":516,"context_line":"        account_id \u003d user[\u0027url\u0027].rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":517,"context_line":"        if not s3_auth_details[\u0027check_signature\u0027](user[\u0027key\u0027]):"},{"line_number":518,"context_line":"            return None"},{"line_number":519,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("}],"source_content_type":"text/x-python","patch_set":2,"id":"5633fa0c_91100641","line":516,"updated":"2026-01-29 16:54:03.000000000","message":"we could set base_labels[\u0027account\u0027] here before possibly returning None at line 518: tempauth is authoritative\n\nHowever, we might want to consider making the path re-write and base_labels update always happen together, so to keep this patch simpler it could be a follow-on patch to move BOTH to here.","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":513,"context_line":"            return None"},{"line_number":514,"context_line":"        user \u003d self.users[account_user]"},{"line_number":515,"context_line":"        account \u003d account_user.split(\u0027:\u0027, 1)[0]"},{"line_number":516,"context_line":"        account_id \u003d user[\u0027url\u0027].rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":517,"context_line":"        if not s3_auth_details[\u0027check_signature\u0027](user[\u0027key\u0027]):"},{"line_number":518,"context_line":"            return None"},{"line_number":519,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("}],"source_content_type":"text/x-python","patch_set":2,"id":"f62ba4d7_b2ab1123","line":516,"in_reply_to":"5633fa0c_91100641","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":520,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":521,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d account_id"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        return self._get_user_groups(account, account_user, account_id)"},{"line_number":528,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"cdbf29f7_304d041b","line":525,"range":{"start_line":523,"start_character":12,"end_line":525,"end_character":51},"updated":"2026-01-29 16:54:03.000000000","message":"this can be written:\n``base_labels.setdefault(\u0027account\u0027, account_id)``","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":520,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":521,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d account_id"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        return self._get_user_groups(account, account_user, account_id)"},{"line_number":528,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8b5e5468_df87e839","line":525,"range":{"start_line":523,"start_character":12,"end_line":525,"end_character":51},"in_reply_to":"cdbf29f7_304d041b","updated":"2026-02-05 22:19:44.000000000","message":"that seems to only work if account is None, not empty string?","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":518,"context_line":"            return None"},{"line_number":519,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("},{"line_number":520,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":521,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"}],"source_content_type":"text/x-python","patch_set":4,"id":"59e5941f_6e83f627","line":521,"updated":"2026-03-13 16:00:02.000000000","message":"now that base_labels are becoming visible to other middlewares, I wonder if it would be useful to encapsulate some behaviour in some request_helpers.py helper functions\n\ne.g. \n```\ndef set_base_labels(environ, \u003cdict of labels\u003e):\n    # creates base_labels dict in environ if it does not exist\n    # sets label in dict if it doesn\u0027t already have a truthy value\n```\n\nEvery auth middleware is  going to need to have these 5 lines, or they all use a helper that does the right thing.","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":518,"context_line":"            return None"},{"line_number":519,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("},{"line_number":520,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":521,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"}],"source_content_type":"text/x-python","patch_set":4,"id":"0eee6997_d3c00157","line":521,"in_reply_to":"59e5941f_6e83f627","updated":"2026-08-25 21:35:29.000000000","message":"Acknowledged","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":519,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("},{"line_number":520,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":521,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d account_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"a2010856_e4abe3a1","line":522,"updated":"2026-03-13 16:00:02.000000000","message":"If base_labels is None why would we not create it? let\u0027s say there is no leftmost proxy_logging: the auth middleware knows the account...why shouldn\u0027t it propagate it to the rightmost proxy logging?","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"b20e7a25474ffd07f915b95162cec0c91e73bd25","unresolved":false,"context_lines":[{"line_number":519,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("},{"line_number":520,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":521,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d account_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"e98d7824_3c9fb585","line":522,"in_reply_to":"a2010856_e4abe3a1","updated":"2026-06-29 21:29:09.000000000","message":"good point!","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d account_id"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        return self._get_user_groups(account, account_user, account_id)"},{"line_number":528,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"56fea64c_78e81d18","line":525,"updated":"2026-03-13 16:00:02.000000000","message":"don\u0027t we want to set this as soon as we know account_id i.e. line 516? Then if check_signature fails the base_labels still has an account.\n\nAs it is currently the path will always have the account before base_labels so there isn\u0027t really anything gained vs rightmost proxy-logging parsing the path.\n\nAlso, you can use ``setdefault(\u0027account\u0027, account_id)``\n\nUPDATE: setdefault may not work because you\u0027ve changed proxy-logging to always set the account key","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":522,"context_line":"        if base_labels is not None:"},{"line_number":523,"context_line":"            acc \u003d base_labels.get(\u0027account\u0027)"},{"line_number":524,"context_line":"            if not acc:"},{"line_number":525,"context_line":"                base_labels[\u0027account\u0027] \u003d account_id"},{"line_number":526,"context_line":""},{"line_number":527,"context_line":"        return self._get_user_groups(account, account_user, account_id)"},{"line_number":528,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"274fa348_3f9bc465","line":525,"in_reply_to":"56fea64c_78e81d18","updated":"2026-08-25 21:35:29.000000000","message":"updated","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88085073449a7e8253a037a8036d85cb946448af","unresolved":true,"context_lines":[{"line_number":514,"context_line":"            return None"},{"line_number":515,"context_line":"        user \u003d self.users[account_user]"},{"line_number":516,"context_line":"        account \u003d account_user.split(\u0027:\u0027, 1)[0]"},{"line_number":517,"context_line":"        account_id \u003d user[\u0027url\u0027].rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":518,"context_line":"        if not s3_auth_details[\u0027check_signature\u0027](user[\u0027key\u0027]):"},{"line_number":519,"context_line":"            return None"},{"line_number":520,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("}],"source_content_type":"text/x-python","patch_set":9,"id":"0cc8f7de_be1b22b5","line":517,"updated":"2026-08-06 11:38:17.000000000","message":"we know account_id here, so why not set it in the base_labels here?\n\nThe only reason not to is that the request is maybe going to propagate to other auth middlewares that may have a *different* idea of the account name (is that possible?)","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            return None"},{"line_number":515,"context_line":"        user \u003d self.users[account_user]"},{"line_number":516,"context_line":"        account \u003d account_user.split(\u0027:\u0027, 1)[0]"},{"line_number":517,"context_line":"        account_id \u003d user[\u0027url\u0027].rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":518,"context_line":"        if not s3_auth_details[\u0027check_signature\u0027](user[\u0027key\u0027]):"},{"line_number":519,"context_line":"            return None"},{"line_number":520,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("}],"source_content_type":"text/x-python","patch_set":9,"id":"6c9ee5d7_a2d5c380","line":517,"in_reply_to":"0cc8f7de_be1b22b5","updated":"2026-08-25 21:35:29.000000000","message":"IIUC that would be theoretically possible if there is another definitive auth middleware on the pipeline, which has same account although different auth prefix. Not sure if such would be a correct config","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88085073449a7e8253a037a8036d85cb946448af","unresolved":true,"context_lines":[{"line_number":520,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("},{"line_number":521,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":522,"context_line":"        base_labels \u003d env.setdefault(\u0027swift.base_labels\u0027, LabelsMap())"},{"line_number":523,"context_line":"        base_labels[\u0027account\u0027] \u003d account_id"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        return self._get_user_groups(account, account_user, account_id)"},{"line_number":526,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5365cf28_0760cc4f","line":523,"updated":"2026-08-06 11:38:17.000000000","message":"I think this is *part* of a solution to the bug, but not sufficient on it\u0027s own: when auth fails the account label is still None and rightmost proxy_logging will still parse the path and use that value (a token perhaps) as the account label.\n\nThe cause of the bug is two-fold:\n\n1. s3api inserts access_key in the path account field. Do we understand *why* it does that? is it just an arbitrary choice (\"we need something as the account so let\u0027s use the access_key\") that became wholly inappropriate when access_key became a fernet token, or is it significant to some auth middleware?\n\n2. proxy_logging assumes that the path account IS the account\n\nWe need either:\n\n* s3api to insert something more appropriate in the account field, rather than potentially a token, but I\u0027m not sure what.\n\n* proxy_logging to stop using the account field for the label value. This change helps in that the pattern becomes that the auth middleware sets the account when it is known, but we also need proxy_logging to stop defaulting to whatever is in the path.\n\nAn implication of the latter is that proxy_logging will stop populating the account label for *all* requests until all auth middlewares have been upgraded","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":520,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("},{"line_number":521,"context_line":"            str_to_wsgi(account_user), wsgi_unquote(account_id), 1)"},{"line_number":522,"context_line":"        base_labels \u003d env.setdefault(\u0027swift.base_labels\u0027, LabelsMap())"},{"line_number":523,"context_line":"        base_labels[\u0027account\u0027] \u003d account_id"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"        return self._get_user_groups(account, account_user, account_id)"},{"line_number":526,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"be132cf2_1c07c918","line":523,"in_reply_to":"5365cf28_0760cc4f","updated":"2026-08-25 21:35:29.000000000","message":"updated per our discussion that rightmost proxy_logging should not use path","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8962c0ff91923b86ac75a1d3c0a39659c67a9bde","unresolved":true,"context_lines":[{"line_number":269,"context_line":"                    url \u003d values.pop()"},{"line_number":270,"context_line":"                else:"},{"line_number":271,"context_line":"                    url \u003d \u0027$HOST/v1/%s%s\u0027 % ("},{"line_number":272,"context_line":"                        self.reseller_prefix, quote(account))"},{"line_number":273,"context_line":"                self.users[account + \u0027:\u0027 + username] \u003d {"},{"line_number":274,"context_line":"                    \u0027key\u0027: key, \u0027url\u0027: url, \u0027groups\u0027: values}"},{"line_number":275,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"89393cde_f2bc311b","line":272,"updated":"2026-08-28 01:14:35.000000000","message":"account here is url quoted","commit_id":"2fddaa21a3cd85e0d51d1f8ea8b5c999ef80af8c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8962c0ff91923b86ac75a1d3c0a39659c67a9bde","unresolved":true,"context_lines":[{"line_number":514,"context_line":"            return None"},{"line_number":515,"context_line":"        user \u003d self.users[account_user]"},{"line_number":516,"context_line":"        account \u003d account_user.split(\u0027:\u0027, 1)[0]"},{"line_number":517,"context_line":"        account_id \u003d user[\u0027url\u0027].rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":518,"context_line":"        base_labels \u003d env.setdefault(\u0027swift.base_labels\u0027, LabelsMap())"},{"line_number":519,"context_line":"        base_labels.setdefault(\u0027account\u0027, account_id)"},{"line_number":520,"context_line":"        if not s3_auth_details[\u0027check_signature\u0027](user[\u0027key\u0027]):"}],"source_content_type":"text/x-python","patch_set":10,"id":"e35688dc_2a564521","line":517,"updated":"2026-08-28 01:14:35.000000000","message":"it might have been more obvious if this \"url\" had come from PATH_INFO","commit_id":"2fddaa21a3cd85e0d51d1f8ea8b5c999ef80af8c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8962c0ff91923b86ac75a1d3c0a39659c67a9bde","unresolved":true,"context_lines":[{"line_number":516,"context_line":"        account \u003d account_user.split(\u0027:\u0027, 1)[0]"},{"line_number":517,"context_line":"        account_id \u003d user[\u0027url\u0027].rsplit(\u0027/\u0027, 1)[-1]"},{"line_number":518,"context_line":"        base_labels \u003d env.setdefault(\u0027swift.base_labels\u0027, LabelsMap())"},{"line_number":519,"context_line":"        base_labels.setdefault(\u0027account\u0027, account_id)"},{"line_number":520,"context_line":"        if not s3_auth_details[\u0027check_signature\u0027](user[\u0027key\u0027]):"},{"line_number":521,"context_line":"            return None"},{"line_number":522,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d env[\u0027PATH_INFO\u0027].replace("}],"source_content_type":"text/x-python","patch_set":10,"id":"23e03482_afbbfc80","line":519,"updated":"2026-08-28 01:14:35.000000000","message":"what *is* the interface here?\n\n```\n  No caller holding native text should ever have to do:\n\n  native → UTF-8 bytes → Latin-1 WSGI string → URI quote\n\n  just to populate a metric label. That’s backwards.\n\n  The intended rule should be simple:\n\n  base_labels values are logical native text\n```","commit_id":"2fddaa21a3cd85e0d51d1f8ea8b5c999ef80af8c"}],"test/unit/common/middleware/helpers.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88085073449a7e8253a037a8036d85cb946448af","unresolved":true,"context_lines":[{"line_number":98,"context_line":"        elif isinstance(value, dict):"},{"line_number":99,"context_line":"            return dict([(k, self._partial_copy(v))"},{"line_number":100,"context_line":"                         for k, v in value.items()])"},{"line_number":101,"context_line":"        elif isinstance(value, LabelsMap):"},{"line_number":102,"context_line":"            return LabelsMap([(k, self._partial_copy(v))"},{"line_number":103,"context_line":"                              for k, v in value.items()])"},{"line_number":104,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"895a7804_74d91cb3","line":101,"updated":"2026-08-06 11:38:17.000000000","message":"this is never reached: LabelsMap is a dict\n\nI think it is fine to capture it as a dict because this is just taking a snapshot of the key/value pairs","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        elif isinstance(value, dict):"},{"line_number":99,"context_line":"            return dict([(k, self._partial_copy(v))"},{"line_number":100,"context_line":"                         for k, v in value.items()])"},{"line_number":101,"context_line":"        elif isinstance(value, LabelsMap):"},{"line_number":102,"context_line":"            return LabelsMap([(k, self._partial_copy(v))"},{"line_number":103,"context_line":"                              for k, v in value.items()])"},{"line_number":104,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":9,"id":"044cb3ac_c6818001","line":101,"in_reply_to":"895a7804_74d91cb3","updated":"2026-08-25 21:35:29.000000000","message":"Acknowledged","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"}],"test/unit/common/middleware/s3api/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":42,"context_line":"        self.remote_user \u003d \u0027authorized\u0027"},{"line_number":43,"context_line":"        self.app \u003d app"},{"line_number":44,"context_line":"        self.update_s3_path_info \u003d update_s3_path_info"},{"line_number":45,"context_line":"        self.sw_env \u003d sw_env"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _update_s3_path_info(self, env):"},{"line_number":48,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"140e9470_717c9595","line":45,"updated":"2026-01-29 16:54:03.000000000","message":"I\u0027m not sure this change is necessary:\n1. we can use FakeSwift to capture the request environs\n2. we can just omit FakeAuthApp from the pipeline to simulate auth not updating the request env","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        self.remote_user \u003d \u0027authorized\u0027"},{"line_number":43,"context_line":"        self.app \u003d app"},{"line_number":44,"context_line":"        self.update_s3_path_info \u003d update_s3_path_info"},{"line_number":45,"context_line":"        self.sw_env \u003d sw_env"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _update_s3_path_info(self, env):"},{"line_number":48,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"8fd7a8b8_03d398d6","line":45,"in_reply_to":"140e9470_717c9595","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":54,"context_line":"        tenant_user \u003d swob.str_to_wsgi(env[\u0027s3api.auth_details\u0027][\u0027access_key\u0027])"},{"line_number":55,"context_line":"        tenant, user \u003d tenant_user.rsplit(\u0027:\u0027, 1)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if self.update_s3_path_info:"},{"line_number":58,"context_line":"            acc \u003d \u0027AUTH_\u0027 + tenant"},{"line_number":59,"context_line":"            path \u003d env[\u0027PATH_INFO\u0027]"},{"line_number":60,"context_line":"            # Make sure it\u0027s valid WSGI"}],"source_content_type":"text/x-python","patch_set":2,"id":"172d6a18_67b2ba13","line":57,"updated":"2026-01-29 16:54:03.000000000","message":"At line 80 this method won\u0027t even be called if ``self.update_s3_path_info`` is False.","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        tenant_user \u003d swob.str_to_wsgi(env[\u0027s3api.auth_details\u0027][\u0027access_key\u0027])"},{"line_number":55,"context_line":"        tenant, user \u003d tenant_user.rsplit(\u0027:\u0027, 1)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        if self.update_s3_path_info:"},{"line_number":58,"context_line":"            acc \u003d \u0027AUTH_\u0027 + tenant"},{"line_number":59,"context_line":"            path \u003d env[\u0027PATH_INFO\u0027]"},{"line_number":60,"context_line":"            # Make sure it\u0027s valid WSGI"}],"source_content_type":"text/x-python","patch_set":2,"id":"55b35f2c_6a2de702","line":57,"in_reply_to":"172d6a18_67b2ba13","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":81,"context_line":"            self._update_s3_path_info(env)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        if self.sw_env is not None:"},{"line_number":84,"context_line":"            self.sw_env.append(env)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        if self.remote_user:"},{"line_number":87,"context_line":"            env[\u0027REMOTE_USER\u0027] \u003d self.remote_user"}],"source_content_type":"text/x-python","patch_set":2,"id":"88add444_3671cb0f","line":84,"updated":"2026-01-29 16:54:03.000000000","message":"do we need to capture the request env here? It is already captured in the FakeSwift app - see comment in test_proxy_logging.py","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            self._update_s3_path_info(env)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        if self.sw_env is not None:"},{"line_number":84,"context_line":"            self.sw_env.append(env)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        if self.remote_user:"},{"line_number":87,"context_line":"            env[\u0027REMOTE_USER\u0027] \u003d self.remote_user"}],"source_content_type":"text/x-python","patch_set":2,"id":"07855966_f7097bb1","line":84,"in_reply_to":"88add444_3671cb0f","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":62,"context_line":"        if base_labels is not None:"},{"line_number":63,"context_line":"            base_labels[\u0027account\u0027] \u003d acc"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @staticmethod"},{"line_number":66,"context_line":"    def authorize_cb(req):"}],"source_content_type":"text/x-python","patch_set":4,"id":"daff56b5_9588688c","line":63,"updated":"2026-03-13 16:00:02.000000000","message":"this is different from the tempauth change in that account is set regardless of it having a truthy value already.\n\nAnother reason to consider having a request_helpers function to encapsulate the right behaviour in one place?","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":62,"context_line":"        if base_labels is not None:"},{"line_number":63,"context_line":"            base_labels[\u0027account\u0027] \u003d acc"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @staticmethod"},{"line_number":66,"context_line":"    def authorize_cb(req):"}],"source_content_type":"text/x-python","patch_set":4,"id":"eca42de3_2d268d86","line":63,"in_reply_to":"daff56b5_9588688c","updated":"2026-08-25 21:35:29.000000000","message":"updated per recent changes to LabelsMap","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88085073449a7e8253a037a8036d85cb946448af","unresolved":true,"context_lines":[{"line_number":58,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d path.replace(tenant_user, acc)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":61,"context_line":"        if base_labels is not None:"},{"line_number":62,"context_line":"            base_labels.setdefault(\u0027account\u0027, acc)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":9,"id":"89c59c2d_6500d3c1","line":61,"updated":"2026-08-06 11:38:17.000000000","message":"is this deliberately different from tempauth, which creates base_labels if it does not exist in the env?","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d path.replace(tenant_user, acc)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        base_labels \u003d env.get(\u0027swift.base_labels\u0027)"},{"line_number":61,"context_line":"        if base_labels is not None:"},{"line_number":62,"context_line":"            base_labels.setdefault(\u0027account\u0027, acc)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":9,"id":"3ff15838_b3fac2a8","line":61,"in_reply_to":"89c59c2d_6500d3c1","updated":"2026-08-25 21:35:29.000000000","message":"updated","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8962c0ff91923b86ac75a1d3c0a39659c67a9bde","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d path.replace(tenant_user, acc)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        base_labels \u003d env.setdefault(\u0027swift.base_labels\u0027, LabelsMap())"},{"line_number":62,"context_line":"        base_labels.setdefault(\u0027account\u0027, acc)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    @staticmethod"},{"line_number":65,"context_line":"    def authorize_cb(req):"}],"source_content_type":"text/x-python","patch_set":10,"id":"d0ef3ab0_a6122a10","line":62,"updated":"2026-08-28 01:14:35.000000000","message":"so this is a wsgi-string, unquoted\n\nwhy is that correct?","commit_id":"2fddaa21a3cd85e0d51d1f8ea8b5c999ef80af8c"}],"test/unit/common/middleware/test_proxy_logging.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":1682,"context_line":"            {"},{"line_number":1683,"context_line":"                \u0027resource\u0027: \u0027object\u0027,"},{"line_number":1684,"context_line":"                \u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1685,"context_line":"                \u0027account\u0027: \u0027a\u0027,"},{"line_number":1686,"context_line":"                \u0027container\u0027: \u0027c\u0027,"},{"line_number":1687,"context_line":"            },"},{"line_number":1688,"context_line":"            self._do_test_swift_base_labels("}],"source_content_type":"text/x-python","patch_set":2,"id":"76cc2d33_c8b5583a","side":"PARENT","line":1685,"updated":"2026-01-29 16:54:03.000000000","message":"this change is counter-intuitive: IIUC, with this patch, if ``base_labels`` exists it always has an ``account`` key, correct?","commit_id":"a572a08b3d7fd89d467f7ad92d7c723b78e7b723"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":1682,"context_line":"            {"},{"line_number":1683,"context_line":"                \u0027resource\u0027: \u0027object\u0027,"},{"line_number":1684,"context_line":"                \u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1685,"context_line":"                \u0027account\u0027: \u0027a\u0027,"},{"line_number":1686,"context_line":"                \u0027container\u0027: \u0027c\u0027,"},{"line_number":1687,"context_line":"            },"},{"line_number":1688,"context_line":"            self._do_test_swift_base_labels("}],"source_content_type":"text/x-python","patch_set":2,"id":"eee9899f_0aa0f8d5","side":"PARENT","line":1685,"in_reply_to":"76cc2d33_c8b5583a","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"a572a08b3d7fd89d467f7ad92d7c723b78e7b723"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":1950,"context_line":"    def _do_test_base_labels_end_to_end(self, orig_path, new_path\u003dNone,"},{"line_number":1951,"context_line":"                                        req_hdrs\u003dNone):"},{"line_number":1952,"context_line":"        # if new_path is given then pretend an s3api/auth middleware"},{"line_number":1953,"context_line":"        # combination replaces the request path with new_path"},{"line_number":1954,"context_line":"        mw_conf \u003d {}"},{"line_number":1955,"context_line":"        base_labels \u003d []"},{"line_number":1956,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a37faa9_393163df","line":1953,"updated":"2026-01-29 16:54:03.000000000","message":"we could add another option to this helper:\n```\n# if new_account is given then pretend an auth middleware sets the new_account in base_labels\n```","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":1950,"context_line":"    def _do_test_base_labels_end_to_end(self, orig_path, new_path\u003dNone,"},{"line_number":1951,"context_line":"                                        req_hdrs\u003dNone):"},{"line_number":1952,"context_line":"        # if new_path is given then pretend an s3api/auth middleware"},{"line_number":1953,"context_line":"        # combination replaces the request path with new_path"},{"line_number":1954,"context_line":"        mw_conf \u003d {}"},{"line_number":1955,"context_line":"        base_labels \u003d []"},{"line_number":1956,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"82eb4c67_851198a5","line":1953,"in_reply_to":"1a37faa9_393163df","updated":"2026-02-05 22:19:44.000000000","message":"updated unit tests","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2024,"context_line":"            \u0027/\u0027, \u0027/v1/a\u0027, req_hdrs)"},{"line_number":2025,"context_line":"        self.assertEqual("},{"line_number":2026,"context_line":"            [{\u0027account\u0027: \u0027\u0027, \u0027method\u0027: \u0027PUT\u0027, \u0027api\u0027: \u0027S3\u0027},"},{"line_number":2027,"context_line":"             {\u0027account\u0027: \u0027\u0027, \u0027method\u0027: \u0027PUT\u0027, \u0027resource\u0027: \u0027account\u0027,"},{"line_number":2028,"context_line":"              \u0027api\u0027: \u0027S3\u0027}],"},{"line_number":2029,"context_line":"            base_labels)"},{"line_number":2030,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ba4e9c98_581151b2","line":2027,"updated":"2026-01-29 16:54:03.000000000","message":"ok, before the rightmost would extract account from new_path, now it doesn\u0027t","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2024,"context_line":"            \u0027/\u0027, \u0027/v1/a\u0027, req_hdrs)"},{"line_number":2025,"context_line":"        self.assertEqual("},{"line_number":2026,"context_line":"            [{\u0027account\u0027: \u0027\u0027, \u0027method\u0027: \u0027PUT\u0027, \u0027api\u0027: \u0027S3\u0027},"},{"line_number":2027,"context_line":"             {\u0027account\u0027: \u0027\u0027, \u0027method\u0027: \u0027PUT\u0027, \u0027resource\u0027: \u0027account\u0027,"},{"line_number":2028,"context_line":"              \u0027api\u0027: \u0027S3\u0027}],"},{"line_number":2029,"context_line":"            base_labels)"},{"line_number":2030,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"b9cd3ca3_2db7ea34","line":2027,"in_reply_to":"ba4e9c98_581151b2","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2439,"context_line":"        )"},{"line_number":2440,"context_line":"        status, headers, body \u003d self._do_test_call_app(req, app)"},{"line_number":2441,"context_line":"        self.assertEqual(\u0027404 Not Found\u0027, status)"},{"line_number":2442,"context_line":"        self.assertEqual(sw_env[0][\u0027PATH_INFO\u0027],"},{"line_number":2443,"context_line":"                         \u0027/v1/AUTH_test/bucket/object\u0027)"},{"line_number":2444,"context_line":"        self.assertEqual(sw_env[0][\u0027swift.base_labels\u0027], {"},{"line_number":2445,"context_line":"            \u0027resource\u0027: \u0027object\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"138779e7_3038200a","line":2442,"range":{"start_line":2442,"start_character":25,"end_line":2442,"end_character":34},"updated":"2026-01-29 16:54:03.000000000","message":"this could be ``swift.call_list[0].env`` - or is there a subtle difference?\n\nUnless it is necessary I\u0027d much prefer to stick with the existing pattern of capturing requests in FakeSwift. If it does need to be different then please add a comment to justify/explain the deviation from the normal pattern. Thanks.","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2439,"context_line":"        )"},{"line_number":2440,"context_line":"        status, headers, body \u003d self._do_test_call_app(req, app)"},{"line_number":2441,"context_line":"        self.assertEqual(\u0027404 Not Found\u0027, status)"},{"line_number":2442,"context_line":"        self.assertEqual(sw_env[0][\u0027PATH_INFO\u0027],"},{"line_number":2443,"context_line":"                         \u0027/v1/AUTH_test/bucket/object\u0027)"},{"line_number":2444,"context_line":"        self.assertEqual(sw_env[0][\u0027swift.base_labels\u0027], {"},{"line_number":2445,"context_line":"            \u0027resource\u0027: \u0027object\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"63e27ccf_4ed319c4","line":2442,"range":{"start_line":2442,"start_character":25,"end_line":2442,"end_character":34},"in_reply_to":"138779e7_3038200a","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2451,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2452,"context_line":"                         \u0027/v1/AUTH_test/bucket/object\u0027)"},{"line_number":2453,"context_line":""},{"line_number":2454,"context_line":"    def test_s3_not_update_path_info_base_labels(self):"},{"line_number":2455,"context_line":"        sw_env \u003d []"},{"line_number":2456,"context_line":"        app, swift \u003d self._make_logged_pipeline(rewrite_path\u003dFalse,"},{"line_number":2457,"context_line":"                                                update_s3_path_info\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":2,"id":"639bd223_79f0a6a1","line":2454,"updated":"2026-01-29 16:54:03.000000000","message":"I think that this test is trying to show that if the auth middleware does not fix the path and populate base_labels then they remain unchanged. That feels like a test for an auth middleware - AFAICT it does not assert any behaviour of proxy_logging.\n\nI can get the same result by just excluding FakeAuthApp from the pipeline (and using FakeSwift to capture the calls)\n\n```\ndiff --git a/test/unit/common/middleware/test_proxy_logging.py b/test/unit/common/middleware/test_proxy_logging.py\nindex 209db5ca2..6b134d55c 100644\n--- a/test/unit/common/middleware/test_proxy_logging.py\n+++ b/test/unit/common/middleware/test_proxy_logging.py\n@@ -2402,8 +2402,8 @@ class TestProxyLogging(BaseTestProxyLogging):\n         }, logger\u003dself.logger)\n         if rewrite_path:\n             app \u003d PathRewritingApp(app, self.logger)\n-        app \u003d FakeAuthApp(app, update_s3_path_info\u003dupdate_s3_path_info,\n-                          sw_env\u003dout_sw_env)\n+        # app \u003d FakeAuthApp(app, update_s3_path_info\u003dupdate_s3_path_info,\n+        #                   sw_env\u003dout_sw_env)\n         app._pipeline_final_app \u003d fake_swift\n         app \u003d s3api_filter_factory({\n             \u0027force_swift_request_proxy_log\u0027: False,\n@@ -2470,9 +2470,9 @@ class TestProxyLogging(BaseTestProxyLogging):\n         )\n         status, headers, body \u003d self._do_test_call_app(req, app)\n         self.assertEqual(\u0027404 Not Found\u0027, status)\n-        self.assertEqual(sw_env[0][\u0027PATH_INFO\u0027],\n+        self.assertEqual(swift.call_list[0].env[\u0027PATH_INFO\u0027],\n                          \u0027/v1/test:tester/bucket/object\u0027)\n-        self.assertEqual(sw_env[0][\u0027swift.base_labels\u0027], {\n+        self.assertEqual(swift.call_list[0].env[\u0027swift.base_labels\u0027], {\n             \u0027resource\u0027: \u0027object\u0027,\n             \u0027method\u0027: \u0027GET\u0027,\n             \u0027account\u0027: \u0027\u0027,\n\n```\n\nWhat I _do_ think would be interesting would be to have the rightmost proxy_logging in the pipeline and assert that IT does not add account to the base_labels in the way that it used to IF the auth middleware doesn\u0027t do its job.\n\nUPDATE: I think my last point is addressed by the end-to-end tests above","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2451,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2452,"context_line":"                         \u0027/v1/AUTH_test/bucket/object\u0027)"},{"line_number":2453,"context_line":""},{"line_number":2454,"context_line":"    def test_s3_not_update_path_info_base_labels(self):"},{"line_number":2455,"context_line":"        sw_env \u003d []"},{"line_number":2456,"context_line":"        app, swift \u003d self._make_logged_pipeline(rewrite_path\u003dFalse,"},{"line_number":2457,"context_line":"                                                update_s3_path_info\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5d4e6a1d_da2de6d6","line":2454,"in_reply_to":"639bd223_79f0a6a1","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2482,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2483,"context_line":"                         \u0027/v1/test:tester/bucket/object\u0027)"},{"line_number":2484,"context_line":""},{"line_number":2485,"context_line":"    def _do_test_s3_tempauth(self, check_sig\u003dTrue):"},{"line_number":2486,"context_line":"        # proxy_logging s3api tempauth proxy_logging fake_swift"},{"line_number":2487,"context_line":"        fake_swift \u003d FakeSwift()"},{"line_number":2488,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware(fake_swift, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"0f1849b4_6554ab23","line":2485,"range":{"start_line":2485,"start_character":35,"end_line":2485,"end_character":44},"updated":"2026-01-29 16:54:03.000000000","message":"nit: this is actually the ``check_signature`` result, rather than a boolean controlling if the signature should be checked or not, so maybe better named ``check_sig_result`` ?","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2482,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2483,"context_line":"                         \u0027/v1/test:tester/bucket/object\u0027)"},{"line_number":2484,"context_line":""},{"line_number":2485,"context_line":"    def _do_test_s3_tempauth(self, check_sig\u003dTrue):"},{"line_number":2486,"context_line":"        # proxy_logging s3api tempauth proxy_logging fake_swift"},{"line_number":2487,"context_line":"        fake_swift \u003d FakeSwift()"},{"line_number":2488,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware(fake_swift, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"21926440_ad0eb1a6","line":2485,"range":{"start_line":2485,"start_character":35,"end_line":2485,"end_character":44},"in_reply_to":"0f1849b4_6554ab23","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2514,"context_line":"            headers\u003d{\u0027Authorization\u0027: \u0027AWS test:tester:sig\u0027,"},{"line_number":2515,"context_line":"                     \u0027Date\u0027: date_header},"},{"line_number":2516,"context_line":"        )"},{"line_number":2517,"context_line":"        with mock.patch(\u0027swift.common.middleware.s3api.s3request.\u0027"},{"line_number":2518,"context_line":"                        \u0027SigCheckerV2.check_signature\u0027,"},{"line_number":2519,"context_line":"                        mock.MagicMock(side_effect\u003d[check_sig])) as mock_cs:"},{"line_number":2520,"context_line":"            status, headers, body \u003d self._do_test_call_app(req, app)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ba862d68_2b437501","line":2517,"updated":"2026-01-29 16:54:03.000000000","message":"could you add a comment to remind us that\n\n```\ncheck_signature is called by tempauth while it first handles the request\n```","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2514,"context_line":"            headers\u003d{\u0027Authorization\u0027: \u0027AWS test:tester:sig\u0027,"},{"line_number":2515,"context_line":"                     \u0027Date\u0027: date_header},"},{"line_number":2516,"context_line":"        )"},{"line_number":2517,"context_line":"        with mock.patch(\u0027swift.common.middleware.s3api.s3request.\u0027"},{"line_number":2518,"context_line":"                        \u0027SigCheckerV2.check_signature\u0027,"},{"line_number":2519,"context_line":"                        mock.MagicMock(side_effect\u003d[check_sig])) as mock_cs:"},{"line_number":2520,"context_line":"            status, headers, body \u003d self._do_test_call_app(req, app)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d9189dca_317a5a06","line":2517,"in_reply_to":"ba862d68_2b437501","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2538,"context_line":"            \u0027api\u0027: \u0027S3\u0027,"},{"line_number":2539,"context_line":"        })"},{"line_number":2540,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2541,"context_line":"                         \u0027/v1/AUTH_test/bucket/object\u0027)"},{"line_number":2542,"context_line":""},{"line_number":2543,"context_line":"    def test_tempauth_base_labels_with_s3api_authorization_invalid(self):"},{"line_number":2544,"context_line":"        req, status \u003d self._do_test_s3_tempauth(False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d6c45224_3983e40a","line":2541,"updated":"2026-01-29 16:54:03.000000000","message":"ok, tempauth is the authz for the request\n\ncan we assert the env[\u0027swift.base_labels\u0027] of the requests reaching fake_swift","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2538,"context_line":"            \u0027api\u0027: \u0027S3\u0027,"},{"line_number":2539,"context_line":"        })"},{"line_number":2540,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2541,"context_line":"                         \u0027/v1/AUTH_test/bucket/object\u0027)"},{"line_number":2542,"context_line":""},{"line_number":2543,"context_line":"    def test_tempauth_base_labels_with_s3api_authorization_invalid(self):"},{"line_number":2544,"context_line":"        req, status \u003d self._do_test_s3_tempauth(False)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1128df2f_5e33a4d8","line":2541,"in_reply_to":"d6c45224_3983e40a","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2551,"context_line":"            \u0027api\u0027: \u0027S3\u0027,"},{"line_number":2552,"context_line":"        })"},{"line_number":2553,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2554,"context_line":"                         \u0027/v1/test:tester/bucket/object\u0027)"},{"line_number":2555,"context_line":""},{"line_number":2556,"context_line":"    def test_xfer_stats_put_s3api(self):"},{"line_number":2557,"context_line":"        app, swift \u003d self._make_logged_pipeline(rewrite_path\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"01bd7867_93bfb80f","line":2554,"updated":"2026-01-29 16:54:03.000000000","message":"IIUC this is an \u0027early\u0027 403, returned before the request reaches the rightmost proxy_logging and the proxy app, and therefore the authorize callback is called.\n\ncan we assert there were no fake swift requests","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2551,"context_line":"            \u0027api\u0027: \u0027S3\u0027,"},{"line_number":2552,"context_line":"        })"},{"line_number":2553,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2554,"context_line":"                         \u0027/v1/test:tester/bucket/object\u0027)"},{"line_number":2555,"context_line":""},{"line_number":2556,"context_line":"    def test_xfer_stats_put_s3api(self):"},{"line_number":2557,"context_line":"        app, swift \u003d self._make_logged_pipeline(rewrite_path\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"b650bcca_db389381","line":2554,"in_reply_to":"01bd7867_93bfb80f","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0abf718489d0bfe2778e20ad94400326792f5235","unresolved":true,"context_lines":[{"line_number":2552,"context_line":"        })"},{"line_number":2553,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2554,"context_line":"                         \u0027/v1/test:tester/bucket/object\u0027)"},{"line_number":2555,"context_line":""},{"line_number":2556,"context_line":"    def test_xfer_stats_put_s3api(self):"},{"line_number":2557,"context_line":"        app, swift \u003d self._make_logged_pipeline(rewrite_path\u003dTrue)"},{"line_number":2558,"context_line":"        buffer_str \u003d (b\u0027some stuff\\n\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"0082e6cc_341c3f94","line":2555,"updated":"2026-01-29 16:54:03.000000000","message":"is there a case missing? tempauth succeeds in get_groups but then denies the request in ``authorize``? the path and base_labels *should be updated*","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"25aed6d674ab06b6df5d415ea6b32f42371a5013","unresolved":false,"context_lines":[{"line_number":2552,"context_line":"        })"},{"line_number":2553,"context_line":"        self.assertEqual(req.environ[\u0027swift.backend_path\u0027],"},{"line_number":2554,"context_line":"                         \u0027/v1/test:tester/bucket/object\u0027)"},{"line_number":2555,"context_line":""},{"line_number":2556,"context_line":"    def test_xfer_stats_put_s3api(self):"},{"line_number":2557,"context_line":"        app, swift \u003d self._make_logged_pipeline(rewrite_path\u003dTrue)"},{"line_number":2558,"context_line":"        buffer_str \u003d (b\u0027some stuff\\n\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"62590358_4ac5522c","line":2555,"in_reply_to":"0082e6cc_341c3f94","updated":"2026-02-05 22:19:44.000000000","message":"Acknowledged","commit_id":"2abf0f8e9abc930d525c635ebe98369a9e8a35e6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d24d292ffc1f88ce56425366e441c2b11c210cff","unresolved":true,"context_lines":[{"line_number":697,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":698,"context_line":"        exp_labels \u003d {\u0027resource\u0027: \u0027UNKNOWN\u0027,"},{"line_number":699,"context_line":"                      \u0027method\u0027: \u0027GET\u0027,"},{"line_number":700,"context_line":"                      \u0027account\u0027: \u0027\u0027,"},{"line_number":701,"context_line":"                      \u0027api\u0027: \u0027swift\u0027,"},{"line_number":702,"context_line":"                      \u0027status\u0027: 200}"},{"line_number":703,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"86e502aa_574212fc","line":700,"updated":"2026-03-13 16:00:02.000000000","message":"this feels like it is an existing bug that could be fixed a priori","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88085073449a7e8253a037a8036d85cb946448af","unresolved":false,"context_lines":[{"line_number":697,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":698,"context_line":"        exp_labels \u003d {\u0027resource\u0027: \u0027UNKNOWN\u0027,"},{"line_number":699,"context_line":"                      \u0027method\u0027: \u0027GET\u0027,"},{"line_number":700,"context_line":"                      \u0027account\u0027: \u0027\u0027,"},{"line_number":701,"context_line":"                      \u0027api\u0027: \u0027swift\u0027,"},{"line_number":702,"context_line":"                      \u0027status\u0027: 200}"},{"line_number":703,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"92bd00ec_9327c96b","line":700,"in_reply_to":"86e502aa_574212fc","updated":"2026-08-06 11:38:17.000000000","message":"Done","commit_id":"cbca693e9bb5b59fa7ffb80c305c6a153abdb0ec"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f086ed1c393877b38cf5c35ed970f4f2a73f051a","unresolved":false,"context_lines":[{"line_number":3124,"context_line":"               \u0027AUTH_test\u0027, \u0027bucket%252Bsegments\u0027]"},{"line_number":3125,"context_line":"        self.assertEqual(exp, log_parts)"},{"line_number":3126,"context_line":""},{"line_number":3127,"context_line":"    #TODO:"},{"line_number":3128,"context_line":"    def test_leftmost_only_stats_and_logs_modified_subrequest(self):"},{"line_number":3129,"context_line":"        # Verify the stats and logs emitted by leftmost proxy-logging when"},{"line_number":3130,"context_line":"        # there is no rightmost proxy-logging. The subrequest path is modified"}],"source_content_type":"text/x-python","patch_set":8,"id":"a521be83_8eda2e34","line":3127,"updated":"2026-07-13 22:46:25.000000000","message":"pep8: E265 block comment should start with \u0027# \u0027","commit_id":"1fb93399053f3eb4e01b5c68b8d736c8ccbcd650"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"88085073449a7e8253a037a8036d85cb946448af","unresolved":true,"context_lines":[{"line_number":2556,"context_line":"        self.assertEqual(req.environ[\u0027swift.base_labels\u0027], {"},{"line_number":2557,"context_line":"            \u0027resource\u0027: \u0027object\u0027,"},{"line_number":2558,"context_line":"            \u0027method\u0027: \u0027GET\u0027,"},{"line_number":2559,"context_line":"            \u0027account\u0027: \u0027test%3Atester\u0027,"},{"line_number":2560,"context_line":"            \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":2561,"context_line":"            \u0027api\u0027: \u0027S3\u0027,"},{"line_number":2562,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":9,"id":"8b4e6f98_1fa60894","line":2559,"range":{"start_line":2559,"start_character":12,"end_line":2559,"end_character":39},"updated":"2026-08-06 11:38:17.000000000","message":"this IS the bug: the account label is the s3 access_key from ``\u0027Authorization\u0027: \u0027AWS test:tester:sig\u0027``","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"325e3fd46b4a607fcd2ae057c2e93753a899d0c4","unresolved":false,"context_lines":[{"line_number":2556,"context_line":"        self.assertEqual(req.environ[\u0027swift.base_labels\u0027], {"},{"line_number":2557,"context_line":"            \u0027resource\u0027: \u0027object\u0027,"},{"line_number":2558,"context_line":"            \u0027method\u0027: \u0027GET\u0027,"},{"line_number":2559,"context_line":"            \u0027account\u0027: \u0027test%3Atester\u0027,"},{"line_number":2560,"context_line":"            \u0027container\u0027: \u0027bucket\u0027,"},{"line_number":2561,"context_line":"            \u0027api\u0027: \u0027S3\u0027,"},{"line_number":2562,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":9,"id":"47d18f3e_0df207e0","line":2559,"range":{"start_line":2559,"start_character":12,"end_line":2559,"end_character":39},"in_reply_to":"8b4e6f98_1fa60894","updated":"2026-08-25 21:35:29.000000000","message":"Acknowledged","commit_id":"29de6a5582a89d8ab2fd5bd982d6d5c18ca0b13c"}]}
