)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2025-05-06 16:52:44 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"stats: s3 helper functions"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":10,"context_line":"Co-Authored-By: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":11,"context_line":"Co-Authored-By: Shreeya Deshpande \u003cshreeyad@nvidia.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"1c680c80_c657b57e","line":8,"updated":"2025-05-07 13:30:40.000000000","message":"nit: it never hurts to say \"why\" in a commit message e.g.\n\n```\nRefactor to provide some s3 helper methods for other middlewares to use.\n```","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2025-05-06 16:52:44 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"stats: s3 helper functions"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":10,"context_line":"Co-Authored-By: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"},{"line_number":11,"context_line":"Co-Authored-By: Shreeya Deshpande \u003cshreeyad@nvidia.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"db3663ab_8f003e40","line":8,"in_reply_to":"1c680c80_c657b57e","updated":"2025-05-08 19:56:32.000000000","message":"Acknowledged","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fbc96bb2a800424d343bb564f1a0579640d8fd50","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shreeya Deshpande \u003cshreeyad@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-10-02 14:43:39 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Provide some s3 helper methods for other middlewares to use."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Alistair Coles \u003calistairncoles@gmail.com\u003e"},{"line_number":10,"context_line":"Co-Authored-By: Clay Gerrard \u003cclay.gerrard@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":32,"id":"f57d208c_58b8d0ae","line":7,"updated":"2025-10-06 01:25:35.000000000","message":"Can you then go on to add the helper methods you\u0027ve added. This commit message it too generic for my liking.","commit_id":"615393f49ea53cccbc36321399a5d85caeca16d1"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d7c5241e_bc601b5a","updated":"2025-02-07 14:57:59.000000000","message":"I think this is the right direction, but needs some fixes.\n\nWe\u0027ll need to update proxy-server.conf-sample to reflect that the conf options need to be in DEFAULT section.\n\nI\u0027ve not yet looked to see if we can share any existing code with the new helpers. Let\u0027s get the patch and tests working first.\n\nI put some suggested tests and fixes here https://review.opendev.org/c/openstack/swift/+/940973","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"cd5abb6f_dff39bf7","updated":"2025-02-19 12:13:36.000000000","message":"-1 because:\n\n - ``storage_domain`` (singular) conf option should be the same for proxy_logging and s3api\n\n- I\u0027m not sure we want to enforce dns compliant bucket names on the labels.\n\n- some test cleanup\n\n- Please add the option to the proxy_logging filter section in proxy-server.conf-sample, something like:\n\n```\n# The proxy_logging middleware attempts to translate s3api request paths to swift\n# paths. To do so it needs to know which, if any, storage domains are configured\n# for virtual-hosted style requests. This option should be a comma-separated list\n# of host names, exactly the same as that set for the s3api middleware.\n# storage_domain \u003d\n```","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"7efab79a_db6cd17c","updated":"2025-05-07 13:30:40.000000000","message":"-1 for soem cleanup, a few more docstrings and tests, but otherwise the scope and intent of the patch looks good.","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a43e74b999366daab089e8bb97ed9594e46017fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"d3caf56f_7dd6c77c","updated":"2025-05-12 09:19:28.000000000","message":"The original methods in S3Request still need to be removed.","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"67f2910afd5228d5d4de3149c6f0198c33a63f16","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"4a7a7cdf_f9a291eb","updated":"2025-05-13 17:14:33.000000000","message":"-1 because there\u0027s still an unused method to remove from S3Request\n\nsome suggestions to increase the test coverage here https://paste.openstack.org/show/bSHgb37IPcnMVm06eEwm/","commit_id":"5c4c62660acfd671c38966d9301ca78830b26f45"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"73ea803b339da57e2d4b7e9926fef820342d5b96","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"9f1e977a_002f41fe","updated":"2025-05-13 15:17:47.000000000","message":"recheck","commit_id":"5c4c62660acfd671c38966d9301ca78830b26f45"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"851c33d3cbd90c7bcd111803710ff0af1b855e45","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"75468041_b119fc75","updated":"2025-05-21 11:30:15.000000000","message":"LGTM but I\u0027m holding off merging until we have the dependant patch ready which actually uses these new helper functions","commit_id":"e21838a53a7aebf5ab16a33bd1b21bfe877b3d27"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"be939a27482a442120ef3180de669d422a5add97","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"4485c918_9e0765e8","updated":"2025-05-22 16:42:43.000000000","message":"recheck","commit_id":"f5546e62ad2ca87422c4898d0f556e43a38f129a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e269fb7908f1ef903e86e5cbbea4fb1ee2d0ef2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"e43354b0_a35c8877","updated":"2025-08-25 05:27:56.000000000","message":"Some of the methods in utils aren\u0027t being used, but am assuming they\u0027re for further in the chain.\n\nLooking good, just a few tidy ups. But otherwise almost ready to go.","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"296598e1afab507e655abc33fb68e07d2c710ef0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"2c50b5b0_1bf09a48","updated":"2025-08-27 20:23:13.000000000","message":"There are multiple methods in this patch that are written for the next patch as prerequisites. The next patch will be merged together with this patch!","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"e056fe6b5ab06f9dca2da0778c86510b3e314b3a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5a799ee7_844c65f5","updated":"2025-08-22 01:41:53.000000000","message":"Would like to see this patch introducing us with a few cross compat-tests. kindly look at the test i suggested and let me know if it works for you","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ca379e4680fdd139c962b1f3cbbeef0ec645643d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"41ab9238_aaf81a86","in_reply_to":"5a799ee7_844c65f5","updated":"2025-09-03 19:28:12.000000000","message":"Done","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"81b843ae30588c9a006a4f3ba3a2def25fe7180f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"092b2b93_38d402e7","updated":"2025-09-02 13:20:35.000000000","message":"please run flake8 checks before pushing to gerrit","commit_id":"120e31e182803b97cbc2908e9786297ca5775770"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"31e57ac00c553c9f633f96c91a1b402bc06a3d8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"afcf6bf9_0933f79a","updated":"2025-08-27 21:01:41.000000000","message":"recheck","commit_id":"120e31e182803b97cbc2908e9786297ca5775770"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"d03a9021f43e535575e690216a1362e382eca34f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"5900b94c_063cc224","updated":"2025-09-02 19:57:35.000000000","message":"recheck","commit_id":"dc25a4c63297a9a5fbc9392364e63e3f7c147762"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f34c7aa4230ddea363c7fdf879aea5debc33abf9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"17e702eb_9b1c921f","updated":"2025-09-02 20:38:48.000000000","message":"recheck","commit_id":"9b57c987181266a52a7a420694592b07856d4884"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"415809a6a8963b5574861007e359ec80c271596b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"8f02874f_ac974156","updated":"2025-09-24 18:15:35.000000000","message":"Oh! Also: we should make it very clear in the docstrings that we\u0027re expecting `swob.Request`s, rather than `S3Request`s. I feel like having just `:param req: a request` leaves it ambiguous in this context.","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b64312fa59807dc5bf46a2720c5044de8ab46db","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"55ef9ddd_efac0e5e","updated":"2025-09-24 17:32:57.000000000","message":"We oughta fix the cross-compat test, or drop it for now. Might could stand to reduce some of the churn in tests, too.","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ca379e4680fdd139c962b1f3cbbeef0ec645643d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"6e377865_b38ded9a","updated":"2025-09-03 19:28:12.000000000","message":"recheck","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"1dbd9e76c5401a49edbae3a1582c44f6599484fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"e37c3280_1206ee90","updated":"2025-09-03 19:28:53.000000000","message":"recheck","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92aac2090cf23575a4c55a656f020520a61fbf6c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"5ab5a1cf_e61fb30f","updated":"2025-10-13 15:33:59.000000000","message":"wait to merge with follow-on patch","commit_id":"a3f8b0ab4573bf1588744d568fc49bc08c40f5df"}],"swift/common/middleware/proxy_logging.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":152,"context_line":"            log_conf,"},{"line_number":153,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"},{"line_number":154,"context_line":"            statsd_tail_prefix\u003d\u0027proxy-server\u0027)"},{"line_number":155,"context_line":"        global tmp_logger"},{"line_number":156,"context_line":"        tmp_logger \u003d self.access_logger"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        self.statsd \u003d get_labeled_statsd_client("},{"line_number":159,"context_line":"            log_conf, self.access_logger.logger)"},{"line_number":160,"context_line":"        self.reveal_sensitive_prefix \u003d int("}],"source_content_type":"text/x-python","patch_set":1,"id":"055632ec_318f77ac","line":157,"range":{"start_line":155,"start_character":0,"end_line":157,"end_character":0},"updated":"2025-02-07 14:57:59.000000000","message":"this is unused? and unnecessary I guess","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            log_conf,"},{"line_number":153,"context_line":"            log_route\u003dconf.get(\u0027access_log_route\u0027, \u0027proxy-access\u0027),"},{"line_number":154,"context_line":"            statsd_tail_prefix\u003d\u0027proxy-server\u0027)"},{"line_number":155,"context_line":"        global tmp_logger"},{"line_number":156,"context_line":"        tmp_logger \u003d self.access_logger"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        self.statsd \u003d get_labeled_statsd_client("},{"line_number":159,"context_line":"            log_conf, self.access_logger.logger)"},{"line_number":160,"context_line":"        self.reveal_sensitive_prefix \u003d int("}],"source_content_type":"text/x-python","patch_set":1,"id":"1e6abb0b_7587aabe","line":157,"range":{"start_line":155,"start_character":0,"end_line":157,"end_character":0},"in_reply_to":"055632ec_318f77ac","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def __call__(self, env, start_response):"},{"line_number":438,"context_line":"        req \u003d Request(env)"},{"line_number":439,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":440,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(swift_path)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        path_parts \u003d env.get(\u0027swift.path_parts\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"60985de5_f2ac36a9","line":439,"range":{"start_line":439,"start_character":37,"end_line":439,"end_character":57},"updated":"2025-02-07 14:57:59.000000000","message":"can swift.backend_path ever be set at the point when proxy_logging middleware is called? I\u0027m not sure it can, because it is set in the s3api response path. Worth being sure, because there\u0027s 2x test scenarios to write if the path really can be either swift.backend_path or req.path!","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def __call__(self, env, start_response):"},{"line_number":438,"context_line":"        req \u003d Request(env)"},{"line_number":439,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":440,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(swift_path)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        path_parts \u003d env.get(\u0027swift.path_parts\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"c329ed05_76bc0cbd","line":439,"updated":"2025-02-07 14:57:59.000000000","message":"this is already a long method - we could have the path_parts handling broken out into another method","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def __call__(self, env, start_response):"},{"line_number":438,"context_line":"        req \u003d Request(env)"},{"line_number":439,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":440,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(swift_path)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        path_parts \u003d env.get(\u0027swift.path_parts\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5474c76b_848b78bb","line":439,"range":{"start_line":439,"start_character":37,"end_line":439,"end_character":57},"in_reply_to":"60985de5_f2ac36a9","updated":"2025-02-12 16:21:39.000000000","message":"Indeed should not use swift.backend_path","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def __call__(self, env, start_response):"},{"line_number":438,"context_line":"        req \u003d Request(env)"},{"line_number":439,"context_line":"        swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)"},{"line_number":440,"context_line":"        acc, cont, obj \u003d self.get_aco_from_path(swift_path)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        path_parts \u003d env.get(\u0027swift.path_parts\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"09fa2e87_24775731","line":439,"in_reply_to":"c329ed05_76bc0cbd","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":444,"context_line":"            # expected in the left-most proxy_logging instance"},{"line_number":445,"context_line":"            if acc is None and is_s3_req(req):"},{"line_number":446,"context_line":"                try:"},{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"037f4821_4e1e1a95","line":447,"range":{"start_line":447,"start_character":32,"end_line":447,"end_character":54},"updated":"2025-02-07 14:57:59.000000000","message":"the call signature is wrong, it should be ``(req, storage_domains, dns_compliant_bucket_names)``","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":444,"context_line":"            # expected in the left-most proxy_logging instance"},{"line_number":445,"context_line":"            if acc is None and is_s3_req(req):"},{"line_number":446,"context_line":"                try:"},{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"}],"source_content_type":"text/x-python","patch_set":1,"id":"6451c2d7_b1bd7339","line":447,"range":{"start_line":447,"start_character":32,"end_line":447,"end_character":54},"in_reply_to":"037f4821_4e1e1a95","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":446,"context_line":"                try:"},{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"},{"line_number":451,"context_line":"                    pass"},{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"}],"source_content_type":"text/x-python","patch_set":1,"id":"582636a0_1fc51c90","line":449,"range":{"start_line":449,"start_character":29,"end_line":449,"end_character":55},"updated":"2025-02-07 14:57:59.000000000","message":"I\u0027m not sure we want to validate for dns_compliant_bucket_names here - we\u0027ll just get less info in our stats (i.e. no path_parts) instead of a stat labeled with some 4xx response from s3api and labeled with the invalid bucket name. \n\nI think it would be better to have a stat with labels like\n\n{status: 400, account: None, container: \u0027BAD-BUCKET\u0027}\n\nvs\n\n{status: 400, account: None, container: None}\n\nThat also removes one of the conf options that need to bleed into proxy_logging.","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":446,"context_line":"                try:"},{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"},{"line_number":451,"context_line":"                    pass"},{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"}],"source_content_type":"text/x-python","patch_set":1,"id":"28953556_46d6b41a","line":449,"updated":"2025-02-07 14:57:59.000000000","message":"these conf attributes are undefined\n\ntest_path_parts_put_s3api reaches line 452 with ``AttributeError(\"\u0027ProxyLoggingMiddleware\u0027 object has no attribute \u0027storage_domains\u0027\")``","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                try:"},{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"},{"line_number":451,"context_line":"                    pass"},{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1d8f2ac3_096a339e","line":449,"in_reply_to":"28953556_46d6b41a","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                try:"},{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"},{"line_number":451,"context_line":"                    pass"},{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f1252d0_f310469e","line":449,"range":{"start_line":449,"start_character":29,"end_line":449,"end_character":55},"in_reply_to":"582636a0_1fc51c90","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"},{"line_number":451,"context_line":"                    pass"},{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"},{"line_number":453,"context_line":"        elif path_parts[0] is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"e16852f0_1738e23e","line":450,"range":{"start_line":450,"start_character":23,"end_line":450,"end_character":32},"updated":"2025-02-07 14:57:59.000000000","message":"try to make this catch a narrower scope of Exception (so for example the AttibuteError is not squashed).\n\nOr, how about moving the exception handling to ``extract_bucket_and_key`` so that it just returns ``None, None`` if it cannot extract the parts, in a similar way to how ``get_aco_from_path`` may return ``None, None, None``? Then all the s3 specific exceptions can be kept in s3 utils.","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":447,"context_line":"                    cont, obj \u003d extract_bucket_and_key("},{"line_number":448,"context_line":"                        self.storage_domains,"},{"line_number":449,"context_line":"                        self.dns_compliant_bucket_names, req)"},{"line_number":450,"context_line":"                except Exception:"},{"line_number":451,"context_line":"                    pass"},{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"},{"line_number":453,"context_line":"        elif path_parts[0] is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"08474372_4065fff6","line":450,"range":{"start_line":450,"start_character":23,"end_line":450,"end_character":32},"in_reply_to":"e16852f0_1738e23e","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"},{"line_number":453,"context_line":"        elif path_parts[0] is None:"},{"line_number":454,"context_line":"            # expected in the right-most proxy_logging instance"},{"line_number":455,"context_line":"            env[\u0027swift.path_parts\u0027][0] \u003d acc"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        if self.req_already_logged(env):"},{"line_number":458,"context_line":"            return self.app(env, start_response)"}],"source_content_type":"text/x-python","patch_set":1,"id":"64aaf204_cdda2546","line":455,"range":{"start_line":455,"start_character":12,"end_line":455,"end_character":35},"updated":"2025-02-07 14:57:59.000000000","message":"this is the same object instance as ``path_parts``","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":452,"context_line":"            env[\u0027swift.path_parts\u0027] \u003d [acc, cont, obj]"},{"line_number":453,"context_line":"        elif path_parts[0] is None:"},{"line_number":454,"context_line":"            # expected in the right-most proxy_logging instance"},{"line_number":455,"context_line":"            env[\u0027swift.path_parts\u0027][0] \u003d acc"},{"line_number":456,"context_line":""},{"line_number":457,"context_line":"        if self.req_already_logged(env):"},{"line_number":458,"context_line":"            return self.app(env, start_response)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a010a0a_c64ae0bc","line":455,"range":{"start_line":455,"start_character":12,"end_line":455,"end_character":35},"in_reply_to":"64aaf204_cdda2546","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":489,"context_line":"                    start_response_args[0][1].append("},{"line_number":490,"context_line":"                        (\u0027Content-Length\u0027, str(content_length)))"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"            req \u003d Request(env)"},{"line_number":493,"context_line":"            method \u003d self.method_from_req(req)"},{"line_number":494,"context_line":"            if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":495,"context_line":"                content_length \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"c1d7e55a_8a9bd9db","line":492,"updated":"2025-02-07 14:57:59.000000000","message":"we already have a req instantiated now","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":489,"context_line":"                    start_response_args[0][1].append("},{"line_number":490,"context_line":"                        (\u0027Content-Length\u0027, str(content_length)))"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"            req \u003d Request(env)"},{"line_number":493,"context_line":"            method \u003d self.method_from_req(req)"},{"line_number":494,"context_line":"            if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":495,"context_line":"                content_length \u003d 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"d9d4f893_8d0c573f","line":492,"in_reply_to":"c1d7e55a_8a9bd9db","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        # convert it now to prevent useless convertion later."},{"line_number":128,"context_line":"        self.anonymization_method \u003d conf.get(\u0027log_anonymization_method\u0027, \u0027md5\u0027)"},{"line_number":129,"context_line":"        self.anonymization_salt \u003d conf.get(\u0027log_anonymization_salt\u0027, \u0027\u0027)"},{"line_number":130,"context_line":"        self.storage_domains \u003d list_from_csv(conf.get(\u0027storage_domains\u0027, \u0027\u0027))"},{"line_number":131,"context_line":"        self.dns_compliant_bucket_names \u003d config_true_value("},{"line_number":132,"context_line":"            conf.get(\u0027dns_compliant_bucket_names\u0027, True))"},{"line_number":133,"context_line":"        self.log_hdrs \u003d config_true_value(conf.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"0398ba01_1a2a01e4","line":130,"range":{"start_line":130,"start_character":55,"end_line":130,"end_character":70},"updated":"2025-02-19 12:13:36.000000000","message":"s3api uses ``storage_domain`` (singular). We ought to stick with that otherwise ops need to configure the same value twice.\n\nIn fact, we could have a test, similar to the one you already have added, which constructs a pipeline with proxy logging and s3api, uses the *same* conf for both middlewares with ``storage_domain`` set, and checks that a bucket in host request ends up with the correct ``swift.path_parts``","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        # convert it now to prevent useless convertion later."},{"line_number":128,"context_line":"        self.anonymization_method \u003d conf.get(\u0027log_anonymization_method\u0027, \u0027md5\u0027)"},{"line_number":129,"context_line":"        self.anonymization_salt \u003d conf.get(\u0027log_anonymization_salt\u0027, \u0027\u0027)"},{"line_number":130,"context_line":"        self.storage_domains \u003d list_from_csv(conf.get(\u0027storage_domains\u0027, \u0027\u0027))"},{"line_number":131,"context_line":"        self.dns_compliant_bucket_names \u003d config_true_value("},{"line_number":132,"context_line":"            conf.get(\u0027dns_compliant_bucket_names\u0027, True))"},{"line_number":133,"context_line":"        self.log_hdrs \u003d config_true_value(conf.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"7c5ac1ac_7199e25a","line":130,"range":{"start_line":130,"start_character":55,"end_line":130,"end_character":70},"in_reply_to":"0398ba01_1a2a01e4","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":129,"context_line":"        self.anonymization_salt \u003d conf.get(\u0027log_anonymization_salt\u0027, \u0027\u0027)"},{"line_number":130,"context_line":"        self.storage_domains \u003d list_from_csv(conf.get(\u0027storage_domains\u0027, \u0027\u0027))"},{"line_number":131,"context_line":"        self.dns_compliant_bucket_names \u003d config_true_value("},{"line_number":132,"context_line":"            conf.get(\u0027dns_compliant_bucket_names\u0027, True))"},{"line_number":133,"context_line":"        self.log_hdrs \u003d config_true_value(conf.get("},{"line_number":134,"context_line":"            \u0027access_log_headers\u0027,"},{"line_number":135,"context_line":"            conf.get(\u0027log_headers\u0027, \u0027no\u0027)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"66770de5_02e4d49b","line":132,"updated":"2025-02-19 12:13:36.000000000","message":"please add a ``test_init_storage_domain`` in test_proxy_logging to verify the default and that a list gets parsed.\n\n\nI didn\u0027t find a *great* example to follow, but something like (but simpler than!) test_init_statsd_options_log_prefix","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        self.anonymization_salt \u003d conf.get(\u0027log_anonymization_salt\u0027, \u0027\u0027)"},{"line_number":130,"context_line":"        self.storage_domains \u003d list_from_csv(conf.get(\u0027storage_domains\u0027, \u0027\u0027))"},{"line_number":131,"context_line":"        self.dns_compliant_bucket_names \u003d config_true_value("},{"line_number":132,"context_line":"            conf.get(\u0027dns_compliant_bucket_names\u0027, True))"},{"line_number":133,"context_line":"        self.log_hdrs \u003d config_true_value(conf.get("},{"line_number":134,"context_line":"            \u0027access_log_headers\u0027,"},{"line_number":135,"context_line":"            conf.get(\u0027log_headers\u0027, \u0027no\u0027)))"}],"source_content_type":"text/x-python","patch_set":3,"id":"baca34e6_3bb853a1","line":132,"in_reply_to":"66770de5_02e4d49b","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"}],"swift/common/middleware/s3api/exception.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class InvalidBucketNameParseError(S3Exception):"},{"line_number":30,"context_line":"    _msg \u003d \u0027The specified bucket is not valid\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, bucket):"},{"line_number":33,"context_line":"        self.bucket_name \u003d bucket"}],"source_content_type":"text/x-python","patch_set":17,"id":"d52168a9_a963cfc3","line":30,"updated":"2025-05-07 13:30:40.000000000","message":"I don\u0027t think the ``_msg`` or ``_str`` are used for either of these new Exceptions - they get transformed to InvalidBucketName or InvalidURI which specify the message that is returned in the HTTP response body.","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class InvalidBucketNameParseError(S3Exception):"},{"line_number":30,"context_line":"    _msg \u003d \u0027The specified bucket is not valid\u0027"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def __init__(self, bucket):"},{"line_number":33,"context_line":"        self.bucket_name \u003d bucket"}],"source_content_type":"text/x-python","patch_set":17,"id":"26220830_857eb059","line":30,"in_reply_to":"d52168a9_a963cfc3","updated":"2025-05-08 19:56:32.000000000","message":"Acknowledged","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"e056fe6b5ab06f9dca2da0778c86510b3e314b3a","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class InvalidBucketNameParseError(S3Exception):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, bucket):"},{"line_number":32,"context_line":"        self.bucket_name \u003d bucket"}],"source_content_type":"text/x-python","patch_set":26,"id":"4efc92ce_6f4e5737","line":29,"updated":"2025-08-22 01:41:53.000000000","message":"I have a problem with us not using the official S3 Error Response for invalid bucket names that is listed here, ref: https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList and we also raise and use it in a bunch of our code, which we should be using and is specified here, ref: https://github.com/NVIDIA/swift/blob/master/swift/common/middleware/s3api/s3response.py#L447, which guarantees and ensures s3 compatibility!\n\nIf i write a simple cross-compat test i am sure to know that it validates our bucket_name logic with s3api as well:\n```\ndiff --git a/test/s3api/test_input_errors.py b/test/s3api/test_input_errors.py\nindex d5205948b..e5feae7e8 100644\n--- a/test/s3api/test_input_errors.py\n+++ b/test/s3api/test_input_errors.py\n@@ -1733,6 +1733,49 @@ class TestV4AuthHeaders(InputErrorsMixin, BaseS3TestCaseWithBucket):\n             \u0027x-amz-content-sha256\u0027: \u0027invalid\u0027})\n         self.assertInvalidSHA256(resp, \u0027invalid\u0027)\n \n+    def test_invalid_bucket_names(self):\n+        invalid_names \u003d [\n+            \u0027a\u0027,\n+            \u0027a\u0027 * 64,\n+            \u0027invalid..dots\u0027,\n+            \u0027invalid.-dots\u0027,\n+        ]\n+        for bucket in invalid_names:\n+            with self.subTest(bucket\u003dbucket):\n+                resp \u003d self.conn.make_request(\n+                    method\u003d\u0027PUT\u0027,\n+                    bucket\u003dbucket,\n+                    headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027}\n+                )\n+                self.assertInvalidBucketName(resp)\n+\n+    def test_nonexistent_but_valid_bucket_names(self):\n+        valid_but_missing \u003d [\n+            \u0027invalid_bucket\u0027,\n+            \u0027-invalidstart\u0027,\n+            \u0027invalidend-\u0027,\n+        ]\n+        for bucket in valid_but_missing:\n+            with self.subTest(bucket\u003dbucket):\n+                resp \u003d self.conn.make_request(\n+                    method\u003d\u0027GET\u0027,\n+                    bucket\u003dbucket,\n+                    headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027}\n+                )\n+                self.assertNoSuchBucket(resp, bucket)\n+\n+    def assertInvalidBucketName(self, resp):\n+        body \u003d resp.content.decode(\u0027utf8\u0027) if not isinstance(resp.content, str) else resp.content\n+        self.assertEqual((resp.status_code, resp.reason), (400, \u0027Bad Request\u0027), body)\n+        self.assertIn(\u0027\u003cCode\u003eInvalidBucketName\u003c/Code\u003e\u0027, body)\n+        self.assertIn(\u0027\u003cMessage\u003eThe specified bucket is not valid.\u003c/Message\u003e\u0027, body)\n+\n+    def assertNoSuchBucket(self, resp, bucket):\n+        body \u003d resp.content.decode(\u0027utf8\u0027) if not isinstance(resp.content, str) else resp.content\n+        self.assertEqual((resp.status_code, resp.reason), (404, \u0027Not Found\u0027), body)\n+        self.assertIn(\u0027\u003cCode\u003eNoSuchBucket\u003c/Code\u003e\u0027, body)\n+        self.assertIn(\u0027\u003cMessage\u003eThe specified bucket does not exist\u003c/Message\u003e\u0027, body)\n+        self.assertIn(f\u0027\u003cBucketName\u003e{bucket}\u003c/BucketName\u003e\u0027, body)\n+\n\n```","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"296598e1afab507e655abc33fb68e07d2c710ef0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    pass"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class InvalidBucketNameParseError(S3Exception):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, bucket):"},{"line_number":32,"context_line":"        self.bucket_name \u003d bucket"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa3f375f_e0bbb36d","line":29,"in_reply_to":"4efc92ce_6f4e5737","updated":"2025-08-27 20:23:13.000000000","message":"Acknowledged","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":650,"context_line":"        self.location \u003d self.conf.location"},{"line_number":651,"context_line":"        self._timestamp \u003d None"},{"line_number":652,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":653,"context_line":"        self.bucket_in_host \u003d self._parse_host()"},{"line_number":654,"context_line":"        self.container_name, self.object_name \u003d self._parse_uri()"},{"line_number":655,"context_line":"        self._validate_headers()"},{"line_number":656,"context_line":"        if isinstance(self, SigV4Mixin):"}],"source_content_type":"text/x-python","patch_set":17,"id":"040816ec_86994cc9","side":"PARENT","line":653,"updated":"2025-05-07 13:30:40.000000000","message":"``_parse_host()`` needs to be removed - no longer used\n\nsame for ``_parse_uri``","commit_id":"a5160909acb1339923039fd10ca4cf0e95253b4c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        self.location \u003d self.conf.location"},{"line_number":651,"context_line":"        self._timestamp \u003d None"},{"line_number":652,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":653,"context_line":"        self.bucket_in_host \u003d self._parse_host()"},{"line_number":654,"context_line":"        self.container_name, self.object_name \u003d self._parse_uri()"},{"line_number":655,"context_line":"        self._validate_headers()"},{"line_number":656,"context_line":"        if isinstance(self, SigV4Mixin):"}],"source_content_type":"text/x-python","patch_set":17,"id":"b9129366_60f43802","side":"PARENT","line":653,"in_reply_to":"040816ec_86994cc9","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"a5160909acb1339923039fd10ca4cf0e95253b4c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":121,"context_line":"                    doc\u003d\u0027Get and set the %s acl property\u0027 % resource)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def _parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":125,"context_line":"    try:"},{"line_number":126,"context_line":"        return parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names)"},{"line_number":127,"context_line":"    except InvalidURIParseError as err:"}],"source_content_type":"text/x-python","patch_set":17,"id":"e33e2ddb_d2305b9f","line":124,"updated":"2025-05-07 13:30:40.000000000","message":"nit: we tend to use just ``req`` or ``request`` pretty universally - elsewhere in this module it is ``req``","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                    doc\u003d\u0027Get and set the %s acl property\u0027 % resource)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"def _parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":125,"context_line":"    try:"},{"line_number":126,"context_line":"        return parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names)"},{"line_number":127,"context_line":"    except InvalidURIParseError as err:"}],"source_content_type":"text/x-python","patch_set":17,"id":"b38f86af_ae7cf063","line":124,"in_reply_to":"e33e2ddb_d2305b9f","updated":"2025-05-08 19:56:32.000000000","message":"Acknowledged","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":661,"context_line":"        self._timestamp \u003d None"},{"line_number":662,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":663,"context_line":"        self.bucket_in_host \u003d parse_host("},{"line_number":664,"context_line":"            self.conf.storage_domains, self.environ)"},{"line_number":665,"context_line":"        self.container_name, self.object_name \u003d _parse_path("},{"line_number":666,"context_line":"            self, self.bucket_in_host, self.conf.dns_compliant_bucket_names)"},{"line_number":667,"context_line":"        self._validate_headers()"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a134bce_e0049e4d","line":664,"updated":"2025-05-07 13:30:40.000000000","message":"in other calls the first arg tends to be ``self`` i.e. the request instance. We could make this consistent by passing ``self`` first and having ``parse_host`` dig out ``req.environ``","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        self._timestamp \u003d None"},{"line_number":662,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":663,"context_line":"        self.bucket_in_host \u003d parse_host("},{"line_number":664,"context_line":"            self.conf.storage_domains, self.environ)"},{"line_number":665,"context_line":"        self.container_name, self.object_name \u003d _parse_path("},{"line_number":666,"context_line":"            self, self.bucket_in_host, self.conf.dns_compliant_bucket_names)"},{"line_number":667,"context_line":"        self._validate_headers()"}],"source_content_type":"text/x-python","patch_set":17,"id":"aaccebf2_09c89c7c","line":664,"in_reply_to":"1a134bce_e0049e4d","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a43e74b999366daab089e8bb97ed9594e46017fb","unresolved":true,"context_lines":[{"line_number":661,"context_line":"        self._timestamp \u003d None"},{"line_number":662,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":663,"context_line":"        self.bucket_in_host \u003d parse_host("},{"line_number":664,"context_line":"            self, self.conf.storage_domains)"},{"line_number":665,"context_line":"        self.container_name, self.object_name \u003d _parse_path("},{"line_number":666,"context_line":"            self, self.bucket_in_host, self.conf.dns_compliant_bucket_names)"},{"line_number":667,"context_line":"        self._validate_headers()"}],"source_content_type":"text/x-python","patch_set":18,"id":"6df6518a_def10f26","line":664,"updated":"2025-05-12 09:19:28.000000000","message":"nit: this can be on one line","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"c968cb3dca22247f012295b42cf3c0465f560167","unresolved":false,"context_lines":[{"line_number":661,"context_line":"        self._timestamp \u003d None"},{"line_number":662,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":663,"context_line":"        self.bucket_in_host \u003d parse_host("},{"line_number":664,"context_line":"            self, self.conf.storage_domains)"},{"line_number":665,"context_line":"        self.container_name, self.object_name \u003d _parse_path("},{"line_number":666,"context_line":"            self, self.bucket_in_host, self.conf.dns_compliant_bucket_names)"},{"line_number":667,"context_line":"        self._validate_headers()"}],"source_content_type":"text/x-python","patch_set":18,"id":"1c5feab0_ff7157c0","line":664,"in_reply_to":"6df6518a_def10f26","updated":"2025-05-13 12:52:30.000000000","message":"Acknowledged","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"67f2910afd5228d5d4de3149c6f0198c33a63f16","unresolved":true,"context_lines":[{"line_number":792,"context_line":""},{"line_number":793,"context_line":"        return None"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    def _parse_uri(self):"},{"line_number":796,"context_line":"        # NB: returns WSGI strings"},{"line_number":797,"context_line":"        if not check_utf8(swob.wsgi_to_str(self.environ[\u0027PATH_INFO\u0027])):"},{"line_number":798,"context_line":"            raise InvalidURI(self.path)"}],"source_content_type":"text/x-python","patch_set":19,"id":"e4682765_ad6e70d6","side":"PARENT","line":795,"range":{"start_line":795,"start_character":4,"end_line":795,"end_character":24},"updated":"2025-05-13 17:14:33.000000000","message":"this also needs to be removed","commit_id":"a5160909acb1339923039fd10ca4cf0e95253b4c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2f7cce175a4401e16b94f42b6dcbe47b5d9d84b7","unresolved":false,"context_lines":[{"line_number":792,"context_line":""},{"line_number":793,"context_line":"        return None"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    def _parse_uri(self):"},{"line_number":796,"context_line":"        # NB: returns WSGI strings"},{"line_number":797,"context_line":"        if not check_utf8(swob.wsgi_to_str(self.environ[\u0027PATH_INFO\u0027])):"},{"line_number":798,"context_line":"            raise InvalidURI(self.path)"}],"source_content_type":"text/x-python","patch_set":19,"id":"22b6a4f8_4024f2fe","side":"PARENT","line":795,"range":{"start_line":795,"start_character":4,"end_line":795,"end_character":24},"in_reply_to":"e4682765_ad6e70d6","updated":"2025-05-15 02:51:59.000000000","message":"Done","commit_id":"a5160909acb1339923039fd10ca4cf0e95253b4c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"e056fe6b5ab06f9dca2da0778c86510b3e314b3a","unresolved":true,"context_lines":[{"line_number":177,"context_line":"    except InvalidURIParseError as err:"},{"line_number":178,"context_line":"        raise InvalidURI(err.uri)"},{"line_number":179,"context_line":"    except InvalidBucketNameParseError as err:"},{"line_number":180,"context_line":"        raise InvalidBucketName(err.bucket_name)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"class HashingInput(InputProxy):"}],"source_content_type":"text/x-python","patch_set":26,"id":"a6acd847_74891836","line":180,"updated":"2025-08-22 01:41:53.000000000","message":"ah i see, you do actually map it here","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"296598e1afab507e655abc33fb68e07d2c710ef0","unresolved":false,"context_lines":[{"line_number":177,"context_line":"    except InvalidURIParseError as err:"},{"line_number":178,"context_line":"        raise InvalidURI(err.uri)"},{"line_number":179,"context_line":"    except InvalidBucketNameParseError as err:"},{"line_number":180,"context_line":"        raise InvalidBucketName(err.bucket_name)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"class HashingInput(InputProxy):"}],"source_content_type":"text/x-python","patch_set":26,"id":"1275052e_e9b4447c","line":180,"in_reply_to":"a6acd847_74891836","updated":"2025-08-27 20:23:13.000000000","message":"Done","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fbc96bb2a800424d343bb564f1a0579640d8fd50","unresolved":false,"context_lines":[{"line_number":70,"context_line":"from swift.common.middleware.s3api.subresource import decode_acl, encode_acl"},{"line_number":71,"context_line":"from swift.common.middleware.s3api.utils import sysmeta_header, \\"},{"line_number":72,"context_line":"    parse_host, parse_path, InvalidURIParseError, \\"},{"line_number":73,"context_line":"    InvalidBucketNameParseError, Config"},{"line_number":74,"context_line":"from swift.common.middleware.s3api.acl_utils import handle_acl_header"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"6c6d24f4_e086450c","line":73,"updated":"2025-10-06 01:25:35.000000000","message":"Is there a reason that we import the Errors from `s3api.utils` and not `s3api.exception` a few lines above?","commit_id":"615393f49ea53cccbc36321399a5d85caeca16d1"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8818adbb2a3c8a45c84759fa8293ecccef910c4b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"from swift.common.middleware.s3api.subresource import decode_acl, encode_acl"},{"line_number":71,"context_line":"from swift.common.middleware.s3api.utils import sysmeta_header, \\"},{"line_number":72,"context_line":"    parse_host, parse_path, InvalidURIParseError, \\"},{"line_number":73,"context_line":"    InvalidBucketNameParseError, Config"},{"line_number":74,"context_line":"from swift.common.middleware.s3api.acl_utils import handle_acl_header"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9a7c5c41_1298d87f","line":73,"in_reply_to":"6c6d24f4_e086450c","updated":"2025-10-08 18:45:02.000000000","message":"Good point, it would make more sense to directly get \nfrom swift.common.middleware.s3api.exception import InvalidBucketNameParseError, InvalidURIParseError","commit_id":"615393f49ea53cccbc36321399a5d85caeca16d1"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fbc96bb2a800424d343bb564f1a0579640d8fd50","unresolved":false,"context_lines":[{"line_number":177,"context_line":"    except InvalidURIParseError as err:"},{"line_number":178,"context_line":"        raise InvalidURI(err.uri)"},{"line_number":179,"context_line":"    except InvalidBucketNameParseError as err:"},{"line_number":180,"context_line":"        raise InvalidBucketName(err.bucket_name)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"class HashingInput(InputProxy):"}],"source_content_type":"text/x-python","patch_set":32,"id":"275ded99_1b0e4bec","line":180,"updated":"2025-10-06 01:25:35.000000000","message":"OK so this is just catching and changing the exceptions we return, cool.","commit_id":"615393f49ea53cccbc36321399a5d85caeca16d1"}],"swift/common/middleware/s3api/utils.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":189,"context_line":"    return parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"class InvalidBucketNameParseError(Exception):"},{"line_number":193,"context_line":"    _msg \u003d \u0027The specified bucket is not valid\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def __init__(self, bucket):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3c33244a_2f0add88","line":192,"updated":"2025-02-07 14:57:59.000000000","message":"I understand why you made these new exception classes, but I\u0027m not sure it\u0027s really necessary vs catching the ErrorResponse exception types raised in the original version of the functions. Particularly if we catch the exceptions here in s3 utils (see comment in proxy_logging)","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ddba8a3f0e96e32adf8a98256298f0e27d5e9024","unresolved":false,"context_lines":[{"line_number":189,"context_line":"    return parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"class InvalidBucketNameParseError(Exception):"},{"line_number":193,"context_line":"    _msg \u003d \u0027The specified bucket is not valid\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    def __init__(self, bucket):"}],"source_content_type":"text/x-python","patch_set":1,"id":"2062057f_77bd1b3c","line":192,"in_reply_to":"3c33244a_2f0add88","updated":"2025-02-13 20:31:58.000000000","message":"Resolving per our discussion on possibly importing exception classes from S3Response","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def get_s3_access_key_id(req):"},{"line_number":111,"context_line":"    # Return the S3 user for the request,"},{"line_number":112,"context_line":"    # or None if it does not look like an S3 request"},{"line_number":113,"context_line":"    authorization \u003d req.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":114,"context_line":"    if authorization.startswith(\u0027AWS \u0027):"},{"line_number":115,"context_line":"        # v2"}],"source_content_type":"text/x-python","patch_set":3,"id":"55aab89b_90c8de06","line":112,"range":{"start_line":111,"start_character":4,"end_line":112,"end_character":52},"updated":"2025-02-19 12:13:36.000000000","message":"nit: please turn this into a docstring","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def get_s3_access_key_id(req):"},{"line_number":111,"context_line":"    # Return the S3 user for the request,"},{"line_number":112,"context_line":"    # or None if it does not look like an S3 request"},{"line_number":113,"context_line":"    authorization \u003d req.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":114,"context_line":"    if authorization.startswith(\u0027AWS \u0027):"},{"line_number":115,"context_line":"        # v2"}],"source_content_type":"text/x-python","patch_set":3,"id":"9d2d6c18_6ed2833c","line":112,"range":{"start_line":111,"start_character":4,"end_line":112,"end_character":52},"in_reply_to":"55aab89b_90c8de06","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"def is_s3_req(req):"},{"line_number":131,"context_line":"    # Check whether a request looks like it ought to be an S3 request"},{"line_number":132,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d082014f_c1c3f2db","line":131,"updated":"2025-02-19 12:13:36.000000000","message":"nit: please turn this into a docstring","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"def is_s3_req(req):"},{"line_number":131,"context_line":"    # Check whether a request looks like it ought to be an S3 request"},{"line_number":132,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2bbfd0fe_f7553e7a","line":131,"in_reply_to":"d082014f_c1c3f2db","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"def extract_bucket_and_key(swob_req, storage_domains,"},{"line_number":187,"context_line":"                           dns_compliant_bucket_names):"},{"line_number":188,"context_line":"    try:"},{"line_number":189,"context_line":"        bucket_in_host \u003d parse_host(storage_domains, swob_req.environ)"},{"line_number":190,"context_line":"        bucket, key \u003d parse_path("}],"source_content_type":"text/x-python","patch_set":3,"id":"4be27e7b_7b4258b4","line":187,"updated":"2025-02-19 12:13:36.000000000","message":"nit: please add a docstring","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"def extract_bucket_and_key(swob_req, storage_domains,"},{"line_number":187,"context_line":"                           dns_compliant_bucket_names):"},{"line_number":188,"context_line":"    try:"},{"line_number":189,"context_line":"        bucket_in_host \u003d parse_host(storage_domains, swob_req.environ)"},{"line_number":190,"context_line":"        bucket, key \u003d parse_path("}],"source_content_type":"text/x-python","patch_set":3,"id":"49495c3f_90987791","line":187,"in_reply_to":"4be27e7b_7b4258b4","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":194,"context_line":"    return bucket, key"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class InvalidBucketNameParseError(Exception):"},{"line_number":198,"context_line":"    _msg \u003d \u0027The specified bucket is not valid\u0027"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def __init__(self, bucket):"},{"line_number":201,"context_line":"        self.bucket_name \u003d bucket"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def __str__(self):"},{"line_number":204,"context_line":"        return \u0027%s: %s\u0027 % (self._msg, self.bucket_name)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"class InvalidURIParseError(Exception):"},{"line_number":208,"context_line":"    _msg \u003d \u0027Couldn\\\u0027t parse the specified URI\u0027"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def __init__(self, uri):"},{"line_number":211,"context_line":"        self.uri \u003d uri"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def __str__(self):"},{"line_number":214,"context_line":"        return \u0027%s: %s\u0027 % (self._msg, self.uri)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"class S3Timestamp(utils.Timestamp):"}],"source_content_type":"text/x-python","patch_set":3,"id":"c7b3e808_ca4defda","line":214,"range":{"start_line":197,"start_character":0,"end_line":214,"end_character":47},"updated":"2025-02-19 12:13:36.000000000","message":"these should probably go in swift/common/middleware/s3api/exception.py and could extend S3Exception","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    return bucket, key"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class InvalidBucketNameParseError(Exception):"},{"line_number":198,"context_line":"    _msg \u003d \u0027The specified bucket is not valid\u0027"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def __init__(self, bucket):"},{"line_number":201,"context_line":"        self.bucket_name \u003d bucket"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def __str__(self):"},{"line_number":204,"context_line":"        return \u0027%s: %s\u0027 % (self._msg, self.bucket_name)"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"class InvalidURIParseError(Exception):"},{"line_number":208,"context_line":"    _msg \u003d \u0027Couldn\\\u0027t parse the specified URI\u0027"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def __init__(self, uri):"},{"line_number":211,"context_line":"        self.uri \u003d uri"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def __str__(self):"},{"line_number":214,"context_line":"        return \u0027%s: %s\u0027 % (self._msg, self.uri)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"class S3Timestamp(utils.Timestamp):"}],"source_content_type":"text/x-python","patch_set":3,"id":"86cf37e6_14195541","line":214,"range":{"start_line":197,"start_character":0,"end_line":214,"end_character":47},"in_reply_to":"c7b3e808_ca4defda","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def get_s3_access_key_id(req):"},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":"    Return the S3 user for the request,"},{"line_number":115,"context_line":"    or None if it does not look like an S3 request."},{"line_number":116,"context_line":"    \"\"\""},{"line_number":117,"context_line":"    authorization \u003d req.headers.get(\u0027Authorization\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"c7866ee2_5051b4a6","line":114,"range":{"start_line":114,"start_character":15,"end_line":114,"end_character":22},"updated":"2025-05-07 13:30:40.000000000","message":"strictly I think we refer to this as the S3 access_key_id","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"def get_s3_access_key_id(req):"},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":"    Return the S3 user for the request,"},{"line_number":115,"context_line":"    or None if it does not look like an S3 request."},{"line_number":116,"context_line":"    \"\"\""},{"line_number":117,"context_line":"    authorization \u003d req.headers.get(\u0027Authorization\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dd5a8751_5f619f22","line":114,"range":{"start_line":114,"start_character":15,"end_line":114,"end_character":22},"in_reply_to":"c7866ee2_5051b4a6","updated":"2025-05-08 19:56:32.000000000","message":"Acknowledged","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":112,"context_line":"def get_s3_access_key_id(req):"},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":"    Return the S3 user for the request,"},{"line_number":115,"context_line":"    or None if it does not look like an S3 request."},{"line_number":116,"context_line":"    \"\"\""},{"line_number":117,"context_line":"    authorization \u003d req.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":118,"context_line":"    if authorization.startswith(\u0027AWS \u0027):"}],"source_content_type":"text/x-python","patch_set":17,"id":"fcbcf365_be3e66fa","line":115,"updated":"2025-05-07 13:30:40.000000000","message":"please add :param: and :returns: tags to complete the docstring","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":112,"context_line":"def get_s3_access_key_id(req):"},{"line_number":113,"context_line":"    \"\"\""},{"line_number":114,"context_line":"    Return the S3 user for the request,"},{"line_number":115,"context_line":"    or None if it does not look like an S3 request."},{"line_number":116,"context_line":"    \"\"\""},{"line_number":117,"context_line":"    authorization \u003d req.headers.get(\u0027Authorization\u0027, \u0027\u0027)"},{"line_number":118,"context_line":"    if authorization.startswith(\u0027AWS \u0027):"}],"source_content_type":"text/x-python","patch_set":17,"id":"49ddac8c_50f1acfb","line":115,"in_reply_to":"fcbcf365_be3e66fa","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"def is_s3_req(req):"},{"line_number":135,"context_line":"    \"\"\""},{"line_number":136,"context_line":"    Check whether a request looks like it ought to be an S3 request."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"29a33f38_27b6b4e8","line":136,"updated":"2025-05-07 13:30:40.000000000","message":"please add :param: and :returns: tags to complete the docstring","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"def is_s3_req(req):"},{"line_number":135,"context_line":"    \"\"\""},{"line_number":136,"context_line":"    Check whether a request looks like it ought to be an S3 request."},{"line_number":137,"context_line":"    \"\"\""},{"line_number":138,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"3fd4dc26_3e0b3929","line":136,"in_reply_to":"29a33f38_27b6b4e8","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":138,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"def parse_host(storage_domains, environ):"},{"line_number":142,"context_line":"    \"\"\""},{"line_number":143,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":144,"context_line":"    ``.``-separated host. If the host ends with any of the given"}],"source_content_type":"text/x-python","patch_set":17,"id":"7ef0ec6d_7663e397","line":141,"updated":"2025-05-07 13:30:40.000000000","message":"other functions in this module take a swob Request arg, and it is the first arg. This function could follow the same pattern by passing in the req (rather than req.environ) and switching the arg order i.e.\n\n```\nparse_host(req, storage_domains)\n```","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"def parse_host(storage_domains, environ):"},{"line_number":142,"context_line":"    \"\"\""},{"line_number":143,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":144,"context_line":"    ``.``-separated host. If the host ends with any of the given"}],"source_content_type":"text/x-python","patch_set":17,"id":"60e78847_8c2109b9","line":141,"in_reply_to":"7ef0ec6d_7663e397","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":168,"context_line":"        if given_domain.endswith(storage_domain):"},{"line_number":169,"context_line":"            return given_domain[:-len(storage_domain)]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    return None"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"}],"source_content_type":"text/x-python","patch_set":17,"id":"a44dcc68_7530e4fd","line":171,"updated":"2025-05-07 13:30:40.000000000","message":"ok, this was S3Request._parse_host","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        if given_domain.endswith(storage_domain):"},{"line_number":169,"context_line":"            return given_domain[:-len(storage_domain)]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    return None"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"}],"source_content_type":"text/x-python","patch_set":17,"id":"b603d4e9_a54d9258","line":171,"in_reply_to":"a44dcc68_7530e4fd","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    return None"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":175,"context_line":"    # NB: returns WSGI strings"},{"line_number":176,"context_line":"    if not check_utf8(wsgi_to_str(swob_req.environ[\u0027PATH_INFO\u0027])):"},{"line_number":177,"context_line":"        raise InvalidURIParseError(swob_req.path)"}],"source_content_type":"text/x-python","patch_set":17,"id":"79d9a7d2_1b9fe133","line":174,"updated":"2025-05-07 13:30:40.000000000","message":"nit: we tend to use just ``req`` or ``request`` pretty universally - elsewhere in this module it is ``req``\n\nnot nit: please add a docstring not this is a helper intended to be more widely used","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    return None"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":175,"context_line":"    # NB: returns WSGI strings"},{"line_number":176,"context_line":"    if not check_utf8(wsgi_to_str(swob_req.environ[\u0027PATH_INFO\u0027])):"},{"line_number":177,"context_line":"        raise InvalidURIParseError(swob_req.path)"}],"source_content_type":"text/x-python","patch_set":17,"id":"d7da4542_a29ece96","line":174,"in_reply_to":"79d9a7d2_1b9fe133","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":175,"context_line":"    # NB: returns WSGI strings"},{"line_number":176,"context_line":"    if not check_utf8(wsgi_to_str(swob_req.environ[\u0027PATH_INFO\u0027])):"},{"line_number":177,"context_line":"        raise InvalidURIParseError(swob_req.path)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"df5c039c_4f87a234","line":175,"updated":"2025-05-07 13:30:40.000000000","message":"this comment can become part of a docstring","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"def parse_path(swob_req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":175,"context_line":"    # NB: returns WSGI strings"},{"line_number":176,"context_line":"    if not check_utf8(wsgi_to_str(swob_req.environ[\u0027PATH_INFO\u0027])):"},{"line_number":177,"context_line":"        raise InvalidURIParseError(swob_req.path)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"0d16fe16_01c27428","line":175,"in_reply_to":"df5c039c_4f87a234","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":186,"context_line":"            bucket, dns_compliant_bucket_names):"},{"line_number":187,"context_line":"        # Ignore GET service case"},{"line_number":188,"context_line":"        raise InvalidBucketNameParseError(bucket)"},{"line_number":189,"context_line":"    return bucket, obj"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def extract_bucket_and_key(swob_req, storage_domains,"}],"source_content_type":"text/x-python","patch_set":17,"id":"abe81b84_dca108eb","line":189,"updated":"2025-05-07 13:30:40.000000000","message":"ok, this was S3Request._parse_uri","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            bucket, dns_compliant_bucket_names):"},{"line_number":187,"context_line":"        # Ignore GET service case"},{"line_number":188,"context_line":"        raise InvalidBucketNameParseError(bucket)"},{"line_number":189,"context_line":"    return bucket, obj"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def extract_bucket_and_key(swob_req, storage_domains,"}],"source_content_type":"text/x-python","patch_set":17,"id":"2abb3685_34fd03b8","line":189,"in_reply_to":"abe81b84_dca108eb","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":189,"context_line":"    return bucket, obj"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def extract_bucket_and_key(swob_req, storage_domains,"},{"line_number":193,"context_line":"                           dns_compliant_bucket_names):"},{"line_number":194,"context_line":"    \"\"\""},{"line_number":195,"context_line":"    Extract the bucket and object key from the request\u0027s PATH_INFO. Support"}],"source_content_type":"text/x-python","patch_set":17,"id":"20adebab_e9fef018","line":192,"updated":"2025-05-07 13:30:40.000000000","message":"nit: as above, perhaps rename `swob_req`` to just ``req``","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":189,"context_line":"    return bucket, obj"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"def extract_bucket_and_key(swob_req, storage_domains,"},{"line_number":193,"context_line":"                           dns_compliant_bucket_names):"},{"line_number":194,"context_line":"    \"\"\""},{"line_number":195,"context_line":"    Extract the bucket and object key from the request\u0027s PATH_INFO. Support"}],"source_content_type":"text/x-python","patch_set":17,"id":"486686c3_5ec65ec0","line":192,"in_reply_to":"20adebab_e9fef018","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":200,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":201,"context_line":"                            is supported."},{"line_number":202,"context_line":"    :param dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":203,"context_line":"                                       name must be dns compliant"},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":"    try:"},{"line_number":206,"context_line":"        bucket_in_host \u003d parse_host(storage_domains, swob_req.environ)"}],"source_content_type":"text/x-python","patch_set":17,"id":"0b508676_7d13c105","line":203,"updated":"2025-05-07 13:30:40.000000000","message":"please add :return: tag to docstring \n\n```\n:returns: a tuple of (bucket, key). If the request path is invalid the the tuple (None, None) is returned.\n```","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":200,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":201,"context_line":"                            is supported."},{"line_number":202,"context_line":"    :param dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":203,"context_line":"                                       name must be dns compliant"},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":"    try:"},{"line_number":206,"context_line":"        bucket_in_host \u003d parse_host(storage_domains, swob_req.environ)"}],"source_content_type":"text/x-python","patch_set":17,"id":"6477407c_de86db20","line":203,"in_reply_to":"0b508676_7d13c105","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":201,"context_line":"                            is supported."},{"line_number":202,"context_line":"    :param dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":203,"context_line":"                                       name must be dns compliant"},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":"    try:"},{"line_number":206,"context_line":"        bucket_in_host \u003d parse_host(storage_domains, swob_req.environ)"},{"line_number":207,"context_line":"        bucket, key \u003d parse_path("}],"source_content_type":"text/x-python","patch_set":17,"id":"16ddfce5_751ca1fd","line":204,"updated":"2025-05-07 13:30:40.000000000","message":"please add :raises: and :returns: tags t complete the docstring","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                            is supported."},{"line_number":202,"context_line":"    :param dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":203,"context_line":"                                       name must be dns compliant"},{"line_number":204,"context_line":"    \"\"\""},{"line_number":205,"context_line":"    try:"},{"line_number":206,"context_line":"        bucket_in_host \u003d parse_host(storage_domains, swob_req.environ)"},{"line_number":207,"context_line":"        bucket, key \u003d parse_path("}],"source_content_type":"text/x-python","patch_set":17,"id":"2ae44f70_a5cbbfab","line":204,"in_reply_to":"16ddfce5_751ca1fd","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":208,"context_line":"            swob_req, bucket_in_host, dns_compliant_bucket_names)"},{"line_number":209,"context_line":"    except (InvalidBucketNameParseError, InvalidURIParseError):"},{"line_number":210,"context_line":"        bucket, key \u003d None, None"},{"line_number":211,"context_line":"    return bucket, key"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"class S3Timestamp(utils.Timestamp):"}],"source_content_type":"text/x-python","patch_set":17,"id":"6f489a55_84155749","line":211,"updated":"2025-05-07 13:30:40.000000000","message":"so this is a new helper that we will make us of in proxy_logging in the next patch. It is not currently used (except in tests) so we may choose to move it to the next patch where it is used, but I\u0027m ok with it staying here if the two patches are likely to merge together.","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            swob_req, bucket_in_host, dns_compliant_bucket_names)"},{"line_number":209,"context_line":"    except (InvalidBucketNameParseError, InvalidURIParseError):"},{"line_number":210,"context_line":"        bucket, key \u003d None, None"},{"line_number":211,"context_line":"    return bucket, key"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"class S3Timestamp(utils.Timestamp):"}],"source_content_type":"text/x-python","patch_set":17,"id":"505cc963_1f0d66a6","line":211,"in_reply_to":"6f489a55_84155749","updated":"2025-05-08 19:56:32.000000000","message":"Acknowledged","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a43e74b999366daab089e8bb97ed9594e46017fb","unresolved":true,"context_lines":[{"line_number":144,"context_line":"    :param req: a request"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    :returns: True if access_key_id is available, False if not"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    \"\"\""},{"line_number":149,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"095434fa_6334f2dc","line":147,"updated":"2025-05-12 09:19:28.000000000","message":"nit: unnecessary empty line","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"c968cb3dca22247f012295b42cf3c0465f560167","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    :param req: a request"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    :returns: True if access_key_id is available, False if not"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    \"\"\""},{"line_number":149,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"86f39f00_8b78084c","line":147,"in_reply_to":"095434fa_6334f2dc","updated":"2025-05-13 12:52:30.000000000","message":"Done","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a43e74b999366daab089e8bb97ed9594e46017fb","unresolved":true,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":160,"context_line":"                            is supported."},{"line_number":161,"context_line":"    :param req: a request"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    environ \u003d req.environ"},{"line_number":164,"context_line":"    if not storage_domains:"}],"source_content_type":"text/x-python","patch_set":18,"id":"fab586af_b6306fa8","line":161,"updated":"2025-05-12 09:19:28.000000000","message":"please add :returns: tag\n\nAlso, convention is to list the :params: in the order of the function signature","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"c968cb3dca22247f012295b42cf3c0465f560167","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":160,"context_line":"                            is supported."},{"line_number":161,"context_line":"    :param req: a request"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    environ \u003d req.environ"},{"line_number":164,"context_line":"    if not storage_domains:"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8524bb_7d4d01d3","line":161,"in_reply_to":"fab586af_b6306fa8","updated":"2025-05-13 12:52:30.000000000","message":"Done","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a43e74b999366daab089e8bb97ed9594e46017fb","unresolved":true,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"def parse_path(req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":187,"context_line":"    \u0027\u0027\u0027"},{"line_number":188,"context_line":"    :params req: a request"},{"line_number":189,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as the first part of a"},{"line_number":190,"context_line":"                            ``.``-separated host."}],"source_content_type":"text/x-python","patch_set":18,"id":"4238fd6a_f02a62ec","line":187,"updated":"2025-05-12 09:19:28.000000000","message":"nit: it\u0027s not a requirement, but it is recommended, for consistency, to use double quotes to wrap docstrings i.e. ``\"\"\"...\"\"\"``\n\nhttps://peps.python.org/pep-0257/","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"c968cb3dca22247f012295b42cf3c0465f560167","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"def parse_path(req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":187,"context_line":"    \u0027\u0027\u0027"},{"line_number":188,"context_line":"    :params req: a request"},{"line_number":189,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as the first part of a"},{"line_number":190,"context_line":"                            ``.``-separated host."}],"source_content_type":"text/x-python","patch_set":18,"id":"cae8c74b_7f79e34f","line":187,"in_reply_to":"4238fd6a_f02a62ec","updated":"2025-05-13 12:52:30.000000000","message":"Acknowledged","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a43e74b999366daab089e8bb97ed9594e46017fb","unresolved":true,"context_lines":[{"line_number":225,"context_line":"    :returns: a tuple of (bucket, key). If the request path is invalid"},{"line_number":226,"context_line":"              the tuple (None, None) is returned."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    \"\"\""},{"line_number":229,"context_line":"    try:"},{"line_number":230,"context_line":"        bucket_in_host \u003d parse_host(req, storage_domains)"},{"line_number":231,"context_line":"        bucket, key \u003d parse_path("}],"source_content_type":"text/x-python","patch_set":18,"id":"9588ecf0_acaa0979","line":228,"updated":"2025-05-12 09:19:28.000000000","message":"nit: unnecessary empty line","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"c968cb3dca22247f012295b42cf3c0465f560167","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    :returns: a tuple of (bucket, key). If the request path is invalid"},{"line_number":226,"context_line":"              the tuple (None, None) is returned."},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    \"\"\""},{"line_number":229,"context_line":"    try:"},{"line_number":230,"context_line":"        bucket_in_host \u003d parse_host(req, storage_domains)"},{"line_number":231,"context_line":"        bucket, key \u003d parse_path("}],"source_content_type":"text/x-python","patch_set":18,"id":"43c348a5_e95d79ca","line":228,"in_reply_to":"9588ecf0_acaa0979","updated":"2025-05-13 12:52:30.000000000","message":"Done","commit_id":"228dd4fffd6c88aa7a3b82e44af78866c0dd3fbf"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e269fb7908f1ef903e86e5cbbea4fb1ee2d0ef2","unresolved":true,"context_lines":[{"line_number":151,"context_line":"def parse_host(req, storage_domains):"},{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":154,"context_line":"    ``.``-separated host. If the host ends with any of the given"},{"line_number":155,"context_line":"    storage_domains then the bucket name is returned. Otherwise ``None`` is"},{"line_number":156,"context_line":"    returned."},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"e7441e1d_27e402b3","line":154,"range":{"start_line":154,"start_character":3,"end_line":154,"end_character":24},"updated":"2025-08-25 05:27:56.000000000","message":"Also known as a sub-domain.\n\nSo maybe we can say something like:\n\n```\n...  the first part of a ``.``-separated host (or sub-domain)\n```","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"296598e1afab507e655abc33fb68e07d2c710ef0","unresolved":false,"context_lines":[{"line_number":151,"context_line":"def parse_host(req, storage_domains):"},{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":154,"context_line":"    ``.``-separated host. If the host ends with any of the given"},{"line_number":155,"context_line":"    storage_domains then the bucket name is returned. Otherwise ``None`` is"},{"line_number":156,"context_line":"    returned."},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"97af770d_fc6f05db","line":154,"range":{"start_line":154,"start_character":3,"end_line":154,"end_character":24},"in_reply_to":"e7441e1d_27e402b3","updated":"2025-08-27 20:23:13.000000000","message":"Acknowledged","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e269fb7908f1ef903e86e5cbbea4fb1ee2d0ef2","unresolved":true,"context_lines":[{"line_number":158,"context_line":"    :param req: a request"},{"line_number":159,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":160,"context_line":"                            is supported."},{"line_number":161,"context_line":"    :returns: host name string"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    environ \u003d req.environ"},{"line_number":164,"context_line":"    if not storage_domains:"}],"source_content_type":"text/x-python","patch_set":26,"id":"139f8634_24303c61","line":161,"range":{"start_line":161,"start_character":14,"end_line":161,"end_character":30},"updated":"2025-08-25 05:27:56.000000000","message":"Actually it returns the bucket name or None right?","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"296598e1afab507e655abc33fb68e07d2c710ef0","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    :param req: a request"},{"line_number":159,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":160,"context_line":"                            is supported."},{"line_number":161,"context_line":"    :returns: host name string"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    environ \u003d req.environ"},{"line_number":164,"context_line":"    if not storage_domains:"}],"source_content_type":"text/x-python","patch_set":26,"id":"18aa0dcd_26ef5e6d","line":161,"range":{"start_line":161,"start_character":14,"end_line":161,"end_character":30},"in_reply_to":"139f8634_24303c61","updated":"2025-08-27 20:23:13.000000000","message":"Acknowledged","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e269fb7908f1ef903e86e5cbbea4fb1ee2d0ef2","unresolved":true,"context_lines":[{"line_number":161,"context_line":"    :returns: host name string"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    environ \u003d req.environ"},{"line_number":164,"context_line":"    if not storage_domains:"},{"line_number":165,"context_line":"        return None"},{"line_number":166,"context_line":"    if \u0027HTTP_HOST\u0027 in environ:"},{"line_number":167,"context_line":"        given_domain \u003d environ[\u0027HTTP_HOST\u0027]"},{"line_number":168,"context_line":"    elif \u0027SERVER_NAME\u0027 in environ:"}],"source_content_type":"text/x-python","patch_set":26,"id":"29d1aaa0_adb20342","line":165,"range":{"start_line":164,"start_character":4,"end_line":165,"end_character":19},"updated":"2025-08-25 05:27:56.000000000","message":"Seeing as this is short circuit, we can probably move this to before we bother creating the eviron local variable on line 163.\n\nOr even just use `req.eviron` in the 4 cases below?","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"296598e1afab507e655abc33fb68e07d2c710ef0","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    :returns: host name string"},{"line_number":162,"context_line":"    \"\"\""},{"line_number":163,"context_line":"    environ \u003d req.environ"},{"line_number":164,"context_line":"    if not storage_domains:"},{"line_number":165,"context_line":"        return None"},{"line_number":166,"context_line":"    if \u0027HTTP_HOST\u0027 in environ:"},{"line_number":167,"context_line":"        given_domain \u003d environ[\u0027HTTP_HOST\u0027]"},{"line_number":168,"context_line":"    elif \u0027SERVER_NAME\u0027 in environ:"}],"source_content_type":"text/x-python","patch_set":26,"id":"d7d8c770_0f7f1562","line":165,"range":{"start_line":164,"start_character":4,"end_line":165,"end_character":19},"in_reply_to":"29d1aaa0_adb20342","updated":"2025-08-27 20:23:13.000000000","message":"Done","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"6e269fb7908f1ef903e86e5cbbea4fb1ee2d0ef2","unresolved":true,"context_lines":[{"line_number":185,"context_line":"def parse_path(req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":186,"context_line":"    \"\"\""},{"line_number":187,"context_line":"    :params req: a request"},{"line_number":188,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as"},{"line_number":189,"context_line":"                            the first part of a ``.``-separated host."},{"line_number":190,"context_line":"    :params dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":191,"context_line":"                                        name must be dns compliant"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"af655d4f_7668def1","line":189,"range":{"start_line":188,"start_character":27,"end_line":189,"end_character":69},"updated":"2025-08-25 05:27:56.000000000","message":"Hmm, maybe something like:\n```\nA bucket-in-host request has a the bucket name as the sub-domain portion of fqdn host \n```\n\nBut meh :shrug:","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"296598e1afab507e655abc33fb68e07d2c710ef0","unresolved":false,"context_lines":[{"line_number":185,"context_line":"def parse_path(req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":186,"context_line":"    \"\"\""},{"line_number":187,"context_line":"    :params req: a request"},{"line_number":188,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as"},{"line_number":189,"context_line":"                            the first part of a ``.``-separated host."},{"line_number":190,"context_line":"    :params dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":191,"context_line":"                                        name must be dns compliant"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"d3019328_6d11029a","line":189,"range":{"start_line":188,"start_character":27,"end_line":189,"end_character":69},"in_reply_to":"af655d4f_7668def1","updated":"2025-08-27 20:23:13.000000000","message":"Done","commit_id":"f7c69412ad30693b81983366b2d173f85296d6c7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e01188f848420a14daccb580e3a47aad83a591bd","unresolved":true,"context_lines":[{"line_number":151,"context_line":"def parse_host(req, storage_domains):"},{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":154,"context_line":"    ``.``-separated host (or a sub-domain. If the host ends with any of"},{"line_number":155,"context_line":"    the given storage_domains then the bucket name is returned."},{"line_number":156,"context_line":"    Otherwise ``None`` is returned."},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"b62de146_eef10b25","line":154,"range":{"start_line":154,"start_character":25,"end_line":154,"end_character":41},"updated":"2025-09-03 14:44:41.000000000","message":"missing closing parenthesis, BUT is this actually adding clarity? this _could_ be read as  \"the first part of a .-separated host or the first part of a sub-domain\" which is incorrect. \n \n And strictly, a subdomain isn\u0027t necessarily the first part of a .-separated host. From RFC 1034 [1]:\n \n \u003e For example, A.B.C.D is a subdomain of B.C.D, C.D, D, and \" \".\n \n So IMHO it might be best to leave this docstring unchanged.\n \n [1] https://www.rfc-editor.org/rfc/rfc1034.html","commit_id":"9b57c987181266a52a7a420694592b07856d4884"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ca379e4680fdd139c962b1f3cbbeef0ec645643d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"def parse_host(req, storage_domains):"},{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":154,"context_line":"    ``.``-separated host (or a sub-domain. If the host ends with any of"},{"line_number":155,"context_line":"    the given storage_domains then the bucket name is returned."},{"line_number":156,"context_line":"    Otherwise ``None`` is returned."},{"line_number":157,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"5c2e7cb4_40c96593","line":154,"range":{"start_line":154,"start_character":25,"end_line":154,"end_character":41},"in_reply_to":"b62de146_eef10b25","updated":"2025-09-03 19:28:12.000000000","message":"Done","commit_id":"9b57c987181266a52a7a420694592b07856d4884"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e01188f848420a14daccb580e3a47aad83a591bd","unresolved":true,"context_lines":[{"line_number":186,"context_line":"    \"\"\""},{"line_number":187,"context_line":"    :params req: a request"},{"line_number":188,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as"},{"line_number":189,"context_line":"                            the sub-domain portion of fqdn host."},{"line_number":190,"context_line":"    :params dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":191,"context_line":"                                        name must be dns compliant"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7706d6c6_8d3f4ac6","line":189,"updated":"2025-09-03 14:44:41.000000000","message":"FIWI I found the original docstring more helpful and consistent with parse_host. If we\u0027re going to use the FQDN acronyms then let\u0027s at least capitalize it. And I\u0027m not sure the expanded \"portion of fully qualified domain name host.\" makes sense, it should be \"portion of a fully qualified domain name.\" or \"portion of a FQDN.\" But, as I say, the original was fine IMHO.\n\nAlso, see comment at line 154 re interpretation of \"sub-domain\".","commit_id":"9b57c987181266a52a7a420694592b07856d4884"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ca379e4680fdd139c962b1f3cbbeef0ec645643d","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    \"\"\""},{"line_number":187,"context_line":"    :params req: a request"},{"line_number":188,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as"},{"line_number":189,"context_line":"                            the sub-domain portion of fqdn host."},{"line_number":190,"context_line":"    :params dns_compliant_bucket_names: whether to validate that the bucket"},{"line_number":191,"context_line":"                                        name must be dns compliant"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"889d93d2_f71e4880","line":189,"in_reply_to":"7706d6c6_8d3f4ac6","updated":"2025-09-03 19:28:12.000000000","message":"Acknowledged","commit_id":"9b57c987181266a52a7a420694592b07856d4884"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b64312fa59807dc5bf46a2720c5044de8ab46db","unresolved":true,"context_lines":[{"line_number":148,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"def parse_host(req, storage_domains):"},{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":154,"context_line":"    ``.``-separated host. If the host ends with any of"}],"source_content_type":"text/x-python","patch_set":30,"id":"8cdd6f0c_d15e0b1d","line":151,"range":{"start_line":151,"start_character":15,"end_line":151,"end_character":18},"updated":"2025-09-24 17:32:57.000000000","message":"I think it might be better to pass `environ` here instead; it\u0027s pretty easy to go from a request to its environment, but going the other way is a little heavier-weight and we only actually *need* the environment.","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ffc6b8d746e6df8c604ac38fcf259734f346a572","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    return bool(get_s3_access_key_id(req))"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"def parse_host(req, storage_domains):"},{"line_number":152,"context_line":"    \"\"\""},{"line_number":153,"context_line":"    A bucket-in-host request has the bucket name as the first part of a"},{"line_number":154,"context_line":"    ``.``-separated host. If the host ends with any of"}],"source_content_type":"text/x-python","patch_set":30,"id":"1889ff8a_b0aec6da","line":151,"range":{"start_line":151,"start_character":15,"end_line":151,"end_character":18},"in_reply_to":"8cdd6f0c_d15e0b1d","updated":"2025-10-02 19:28:53.000000000","message":"Agree!","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b64312fa59807dc5bf46a2720c5044de8ab46db","unresolved":true,"context_lines":[{"line_number":177,"context_line":"            storage_domain \u003d \u0027.\u0027 + storage_domain"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if given_domain.endswith(storage_domain):"},{"line_number":180,"context_line":"            return given_domain[:-len(storage_domain)]"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    return None"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"95af0072_fe05b5d0","line":180,"updated":"2025-09-24 17:32:57.000000000","message":"This reminds me of https://review.opendev.org/c/openstack/swift/+/898679 -- should we document that `storage_domains` should be sorted longest-to-shortest, or should we do the sorting here in the helper?","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ffc6b8d746e6df8c604ac38fcf259734f346a572","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            storage_domain \u003d \u0027.\u0027 + storage_domain"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        if given_domain.endswith(storage_domain):"},{"line_number":180,"context_line":"            return given_domain[:-len(storage_domain)]"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    return None"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"961f3498_9cb61357","line":180,"in_reply_to":"95af0072_fe05b5d0","updated":"2025-10-02 19:28:53.000000000","message":"Done","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ae40eb4e74734ff61ca67b2d413f55256af90e29","unresolved":true,"context_lines":[{"line_number":170,"context_line":"    if \u0027:\u0027 in given_domain:"},{"line_number":171,"context_line":"        given_domain \u003d given_domain.rsplit(\u0027:\u0027, 1)[0]"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    # storage_domains are sorted longest to shortest when configs are read"},{"line_number":174,"context_line":"    for storage_domain in storage_domains:"},{"line_number":175,"context_line":"        if not storage_domain.startswith(\u0027.\u0027):"},{"line_number":176,"context_line":"            storage_domain \u003d \u0027.\u0027 + storage_domain"}],"source_content_type":"text/x-python","patch_set":34,"id":"4b431904_81be86ef","line":173,"updated":"2025-10-09 10:37:58.000000000","message":"this isn\u0027t true\n\nI think Tim\u0027s comment here https://review.opendev.org/c/openstack/swift/+/940791/comment/95af0072_fe05b5d0/ was that reviewing this change has reminded him there\u0027s an existing bug, addressed by https://review.opendev.org/c/openstack/swift/+/898679\n\n@shreeyad@nvidia.com: I don\u0027t think *this* patch should address the sorting. I suggest removing this new comment, and if you could review Tim\u0027s patch then maybe we could get that merged while we have been reminded.","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4191641e54ddcc0c20a39c2668d5690f2d89a811","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    if \u0027:\u0027 in given_domain:"},{"line_number":171,"context_line":"        given_domain \u003d given_domain.rsplit(\u0027:\u0027, 1)[0]"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    # storage_domains are sorted longest to shortest when configs are read"},{"line_number":174,"context_line":"    for storage_domain in storage_domains:"},{"line_number":175,"context_line":"        if not storage_domain.startswith(\u0027.\u0027):"},{"line_number":176,"context_line":"            storage_domain \u003d \u0027.\u0027 + storage_domain"}],"source_content_type":"text/x-python","patch_set":34,"id":"93000a81_1d911603","line":173,"in_reply_to":"4b431904_81be86ef","updated":"2025-10-10 16:32:35.000000000","message":"Acknowledged","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0eacfefc4eb13dbd31c40914953740fe0bda6ada","unresolved":true,"context_lines":[{"line_number":114,"context_line":"    Return the S3 access_key_id user for the request,"},{"line_number":115,"context_line":"    or None if it does not look like an S3 request."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    :param req: a request"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    :returns: access_key_id if available, else None"},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"35b47f1e_96ba9993","line":117,"updated":"2025-10-13 14:38:23.000000000","message":"I noticed that Tim left a summary comment earlier\n\n\"\nOh! Also: we should make it very clear in the docstrings that we\u0027re expecting swob.Requests, rather than S3Requests. I feel like having just :param req: a request leaves it ambiguous in this context.\n\"\n\nso s/a request/a swob.Request instance/","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"1e48327ebc53f3def1e310bd00b4bac62cb9ac0f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"    Return the S3 access_key_id user for the request,"},{"line_number":115,"context_line":"    or None if it does not look like an S3 request."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    :param req: a request"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    :returns: access_key_id if available, else None"},{"line_number":120,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"3e7d1292_6601fa1a","line":117,"in_reply_to":"35b47f1e_96ba9993","updated":"2025-10-13 14:55:36.000000000","message":"Done","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0eacfefc4eb13dbd31c40914953740fe0bda6ada","unresolved":true,"context_lines":[{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    Check whether a request looks like it ought to be an S3 request."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    :param req: a request"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    :returns: True if access_key_id is available, False if not"},{"line_number":147,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"9aed7113_f43e6c4b","line":144,"updated":"2025-10-13 14:38:23.000000000","message":"s/a request/a swob.Request instance/","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"1e48327ebc53f3def1e310bd00b4bac62cb9ac0f","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    Check whether a request looks like it ought to be an S3 request."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    :param req: a request"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    :returns: True if access_key_id is available, False if not"},{"line_number":147,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":36,"id":"0cae5992_1a54d32b","line":144,"in_reply_to":"9aed7113_f43e6c4b","updated":"2025-10-13 14:55:36.000000000","message":"Done","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0eacfefc4eb13dbd31c40914953740fe0bda6ada","unresolved":true,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def parse_path(req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    :params req: a request"},{"line_number":186,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as"},{"line_number":187,"context_line":"                            the first part of a ``.``-separated host."},{"line_number":188,"context_line":"    :params dns_compliant_bucket_names: whether to validate that the bucket"}],"source_content_type":"text/x-python","patch_set":36,"id":"26067623_f7db64fb","line":185,"updated":"2025-10-13 14:38:23.000000000","message":"so s/a request/a swob.Request instance/","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"1e48327ebc53f3def1e310bd00b4bac62cb9ac0f","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def parse_path(req, bucket_in_host, dns_compliant_bucket_names):"},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    :params req: a request"},{"line_number":186,"context_line":"    :params bucket_in_host: A bucket-in-host request has the bucket name as"},{"line_number":187,"context_line":"                            the first part of a ``.``-separated host."},{"line_number":188,"context_line":"    :params dns_compliant_bucket_names: whether to validate that the bucket"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a9b19fa_e002c75d","line":185,"in_reply_to":"26067623_f7db64fb","updated":"2025-10-13 14:55:36.000000000","message":"Done","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0eacfefc4eb13dbd31c40914953740fe0bda6ada","unresolved":true,"context_lines":[{"line_number":213,"context_line":"    bucket-in-host if storage_domains and HTTP_HOST or SERVER_NAME are"},{"line_number":214,"context_line":"    specified. Otherwise the bucket is parsed from PATH_INFO."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    :param req: a request"},{"line_number":217,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":218,"context_line":"                            is supported."},{"line_number":219,"context_line":"    :param dns_compliant_bucket_names: whether to validate that the bucket"}],"source_content_type":"text/x-python","patch_set":36,"id":"078d76ce_e4307282","line":216,"updated":"2025-10-13 14:38:23.000000000","message":"so s/a request/a swob.Request instance/","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"1e48327ebc53f3def1e310bd00b4bac62cb9ac0f","unresolved":false,"context_lines":[{"line_number":213,"context_line":"    bucket-in-host if storage_domains and HTTP_HOST or SERVER_NAME are"},{"line_number":214,"context_line":"    specified. Otherwise the bucket is parsed from PATH_INFO."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    :param req: a request"},{"line_number":217,"context_line":"    :param storage_domains: a list of storage domains for which bucket-in-host"},{"line_number":218,"context_line":"                            is supported."},{"line_number":219,"context_line":"    :param dns_compliant_bucket_names: whether to validate that the bucket"}],"source_content_type":"text/x-python","patch_set":36,"id":"0a152ac5_24acdb04","line":216,"in_reply_to":"078d76ce_e4307282","updated":"2025-10-13 14:55:36.000000000","message":"Done","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"}],"test/s3api/test_input_errors.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"81b843ae30588c9a006a4f3ba3a2def25fe7180f","unresolved":true,"context_lines":[{"line_number":1744,"context_line":"                    headers \u003d {\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})"},{"line_number":1745,"context_line":"                self.assertNoSuchBucket(resp, bucket)"},{"line_number":1746,"context_line":""},{"line_number":1747,"context_line":"    def assertInvalidBucketName(self, resp):"},{"line_number":1748,"context_line":"        body \u003d resp.content.decode(\u0027utf8\u0027) \\"},{"line_number":1749,"context_line":"            if not isinstance(resp.content, str) \\"},{"line_number":1750,"context_line":"            else resp.content"}],"source_content_type":"text/x-python","patch_set":27,"id":"99a89a2c_a5205d3a","line":1747,"updated":"2025-09-02 13:20:35.000000000","message":"please move these new assert methods up to line 1727 to be adjacent to the other custom assert methods","commit_id":"120e31e182803b97cbc2908e9786297ca5775770"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ca379e4680fdd139c962b1f3cbbeef0ec645643d","unresolved":false,"context_lines":[{"line_number":1744,"context_line":"                    headers \u003d {\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})"},{"line_number":1745,"context_line":"                self.assertNoSuchBucket(resp, bucket)"},{"line_number":1746,"context_line":""},{"line_number":1747,"context_line":"    def assertInvalidBucketName(self, resp):"},{"line_number":1748,"context_line":"        body \u003d resp.content.decode(\u0027utf8\u0027) \\"},{"line_number":1749,"context_line":"            if not isinstance(resp.content, str) \\"},{"line_number":1750,"context_line":"            else resp.content"}],"source_content_type":"text/x-python","patch_set":27,"id":"2c640e9b_0d6ab03e","line":1747,"in_reply_to":"99a89a2c_a5205d3a","updated":"2025-09-03 19:28:12.000000000","message":"Done","commit_id":"120e31e182803b97cbc2908e9786297ca5775770"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b64312fa59807dc5bf46a2720c5044de8ab46db","unresolved":true,"context_lines":[{"line_number":1764,"context_line":"                    headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})"},{"line_number":1765,"context_line":"                self.assertInvalidBucketName(resp)"},{"line_number":1766,"context_line":""},{"line_number":1767,"context_line":"    def test_nonexistent_but_valid_bucket_names(self):"},{"line_number":1768,"context_line":"        valid_but_missing \u003d [\u0027invalid_bucket\u0027, \u0027-invalidstart\u0027, \u0027invalidend-\u0027]"},{"line_number":1769,"context_line":""},{"line_number":1770,"context_line":"        for bucket in valid_but_missing:"}],"source_content_type":"text/x-python","patch_set":30,"id":"c436120c_7474e53d","line":1767,"updated":"2025-09-24 17:32:57.000000000","message":"This test fails against AWS for me, like\n```\n    self.assertEqual((resp.status_code, resp.reason), (400, \u0027Bad Request\u0027),\nE   AssertionError: Tuples differ: (404, \u0027Not Found\u0027) !\u003d (400, \u0027Bad Request\u0027)\nE   \nE   First differing element 0:\nE   404\nE   400\nE   \nE   - (404, \u0027Not Found\u0027)\nE   + (400, \u0027Bad Request\u0027) : \u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e\nE   \u003cError\u003e\u003cCode\u003eNoSuchBucket\u003c/Code\u003e\u003cMessage\u003eThe specified bucket does not exist\u003c/Message\u003e\u003cBucketName\u003einvalidend-\u003c/BucketName\u003e\u003cRequestId\u003eQG8B9P281CQ5F4FV\u003c/RequestId\u003e\u003cHostId\u003e2VhluOP5/zN7IgvWfVmYYSCvA4HuK6ZhmoR4zo7H4djik4dGsruaGXP8h4xgw+YB23CzzNPu4W0\u003d\u003c/HostId\u003e\u003c/Error\u003e\n```\nWe ought to fix s3api to also 404 on GET...\n\nSpeaking of, did you mean for this to be a GET test, or a PUT test (like `test_invalid_bucket_names`)?","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ffc6b8d746e6df8c604ac38fcf259734f346a572","unresolved":false,"context_lines":[{"line_number":1764,"context_line":"                    headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})"},{"line_number":1765,"context_line":"                self.assertInvalidBucketName(resp)"},{"line_number":1766,"context_line":""},{"line_number":1767,"context_line":"    def test_nonexistent_but_valid_bucket_names(self):"},{"line_number":1768,"context_line":"        valid_but_missing \u003d [\u0027invalid_bucket\u0027, \u0027-invalidstart\u0027, \u0027invalidend-\u0027]"},{"line_number":1769,"context_line":""},{"line_number":1770,"context_line":"        for bucket in valid_but_missing:"}],"source_content_type":"text/x-python","patch_set":30,"id":"e36a3f1a_f6aaab1a","line":1767,"in_reply_to":"5836d7de_3156dd94","updated":"2025-10-02 19:28:53.000000000","message":"https://jirasw.nvidia.com/browse/NSVISCS-10260","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"2d6fb5c0a24c1a924f523eb65e2b22d7f6e97d82","unresolved":true,"context_lines":[{"line_number":1764,"context_line":"                    headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})"},{"line_number":1765,"context_line":"                self.assertInvalidBucketName(resp)"},{"line_number":1766,"context_line":""},{"line_number":1767,"context_line":"    def test_nonexistent_but_valid_bucket_names(self):"},{"line_number":1768,"context_line":"        valid_but_missing \u003d [\u0027invalid_bucket\u0027, \u0027-invalidstart\u0027, \u0027invalidend-\u0027]"},{"line_number":1769,"context_line":""},{"line_number":1770,"context_line":"        for bucket in valid_but_missing:"}],"source_content_type":"text/x-python","patch_set":30,"id":"5836d7de_3156dd94","line":1767,"in_reply_to":"c436120c_7474e53d","updated":"2025-10-02 16:09:37.000000000","message":"When i suggested this test, i wanted it to be a `PUT` test but it cannot hurt to have coverage for both","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"}],"test/unit/common/middleware/helpers.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"},{"line_number":194,"context_line":"        return self.app(env, start_response)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class FakeSwift(object):"}],"source_content_type":"text/x-python","patch_set":17,"id":"31843483_1aa5ea1c","line":194,"updated":"2025-05-07 13:30:40.000000000","message":"ok, relocated from ``test/unit/common/middleware/s3api/__init__.py``","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"},{"line_number":194,"context_line":"        return self.app(env, start_response)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class FakeSwift(object):"}],"source_content_type":"text/x-python","patch_set":17,"id":"4a0e5c35_9e6aa3d5","line":194,"in_reply_to":"31843483_1aa5ea1c","updated":"2025-05-08 19:56:32.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"67f2910afd5228d5d4de3149c6f0198c33a63f16","unresolved":true,"context_lines":[{"line_number":141,"context_line":"    return parsed.path + normalize_query_string(parsed.query)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class FakeAuthApp(object):"},{"line_number":145,"context_line":"    container_existence_skip_cache \u003d 0.0"},{"line_number":146,"context_line":"    account_existence_skip_cache \u003d 0.0"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"0e1f1e41_3ff7010b","line":144,"updated":"2025-05-13 17:14:33.000000000","message":"IIRC this is moving because we\u0027ll make use of it in the following proxy-logging patch","commit_id":"5c4c62660acfd671c38966d9301ca78830b26f45"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2f7cce175a4401e16b94f42b6dcbe47b5d9d84b7","unresolved":true,"context_lines":[{"line_number":141,"context_line":"    return parsed.path + normalize_query_string(parsed.query)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class FakeAuthApp(object):"},{"line_number":145,"context_line":"    container_existence_skip_cache \u003d 0.0"},{"line_number":146,"context_line":"    account_existence_skip_cache \u003d 0.0"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"b7123cd1_68218ce0","line":144,"in_reply_to":"0e1f1e41_3ff7010b","updated":"2025-05-15 02:51:59.000000000","message":"Acknowledged","commit_id":"5c4c62660acfd671c38966d9301ca78830b26f45"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"be939a27482a442120ef3180de669d422a5add97","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    return parsed.path + normalize_query_string(parsed.query)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class FakeAuthApp(object):"},{"line_number":145,"context_line":"    container_existence_skip_cache \u003d 0.0"},{"line_number":146,"context_line":"    account_existence_skip_cache \u003d 0.0"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"18ced94b_e999e2e2","line":144,"in_reply_to":"b7123cd1_68218ce0","updated":"2025-05-22 16:42:43.000000000","message":"Keeping in this patch since we are merging all patches in this chain together!","commit_id":"5c4c62660acfd671c38966d9301ca78830b26f45"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b64312fa59807dc5bf46a2720c5044de8ab46db","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        For S3 requests, Swift auth middleware replaces a user name in"},{"line_number":155,"context_line":"        env[\u0027PATH_INFO\u0027] with a valid tenant id."},{"line_number":156,"context_line":"        E.g. \u0027/v1/test:tester/bucket/object\u0027 will become"},{"line_number":157,"context_line":"        \u0027/v1/AUTH_test/bucket/object\u0027. This method emulates the behavior."},{"line_number":158,"context_line":"        \"\"\""},{"line_number":159,"context_line":"        tenant_user \u003d swob.str_to_wsgi(env[\u0027s3api.auth_details\u0027][\u0027access_key\u0027])"},{"line_number":160,"context_line":"        tenant, user \u003d tenant_user.rsplit(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":30,"id":"f72de7b6_a7338048","line":157,"updated":"2025-09-24 17:32:57.000000000","message":"Why\u0027d we move this out to here? This all seems very S3-specific behavior; `test/unit/common/middleware/s3api/__init__.py` isn\u0027t an obviously bad place for it (to me, anyway).\n\nI guess it\u0027s \u0027cause you want to use it in `test_proxy_logging.py` in the next patch, but then, it\u0027s also already importing `from test.unit.common.middleware.s3api`...","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ae40eb4e74734ff61ca67b2d413f55256af90e29","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        For S3 requests, Swift auth middleware replaces a user name in"},{"line_number":155,"context_line":"        env[\u0027PATH_INFO\u0027] with a valid tenant id."},{"line_number":156,"context_line":"        E.g. \u0027/v1/test:tester/bucket/object\u0027 will become"},{"line_number":157,"context_line":"        \u0027/v1/AUTH_test/bucket/object\u0027. This method emulates the behavior."},{"line_number":158,"context_line":"        \"\"\""},{"line_number":159,"context_line":"        tenant_user \u003d swob.str_to_wsgi(env[\u0027s3api.auth_details\u0027][\u0027access_key\u0027])"},{"line_number":160,"context_line":"        tenant, user \u003d tenant_user.rsplit(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9893b1a8_3afd7b5b","line":157,"in_reply_to":"23422fd8_26d5595f","updated":"2025-10-09 10:37:58.000000000","message":"It\u0027s possible that I was responsible for relocating this. I accept that maybe it didn\u0027t need to move, given other imports. But IIRC this class is actually emulating tempauth (or auth in general) so not s3-specific, and I guess I may have thought it made sense to locate it with the other Fake pipeline components.\n\nUPDATE: it *is* s3 specific because it returns early if it\u0027s not got s3 auth details! So my defence for it moving is weak. I guess that I thought it was more general purpose than it is.\n\n@shreeyad@nvidia.com - could you revert please? less diff is always good, and this was simply a code relocation, the code was not changed.","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"826a479294984c530623fd1470041f7c78860a8a","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        For S3 requests, Swift auth middleware replaces a user name in"},{"line_number":155,"context_line":"        env[\u0027PATH_INFO\u0027] with a valid tenant id."},{"line_number":156,"context_line":"        E.g. \u0027/v1/test:tester/bucket/object\u0027 will become"},{"line_number":157,"context_line":"        \u0027/v1/AUTH_test/bucket/object\u0027. This method emulates the behavior."},{"line_number":158,"context_line":"        \"\"\""},{"line_number":159,"context_line":"        tenant_user \u003d swob.str_to_wsgi(env[\u0027s3api.auth_details\u0027][\u0027access_key\u0027])"},{"line_number":160,"context_line":"        tenant, user \u003d tenant_user.rsplit(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":30,"id":"d340ac7f_15ff9301","line":157,"in_reply_to":"9893b1a8_3afd7b5b","updated":"2025-10-13 12:27:22.000000000","message":"@shreeyad@nvidia.com I think my reply was maybe obscured by this comment thread being \u0027resolved\u0027\n\ncould you please revert FakeAuth to be as it was in the s3api test module?","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0eacfefc4eb13dbd31c40914953740fe0bda6ada","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        For S3 requests, Swift auth middleware replaces a user name in"},{"line_number":155,"context_line":"        env[\u0027PATH_INFO\u0027] with a valid tenant id."},{"line_number":156,"context_line":"        E.g. \u0027/v1/test:tester/bucket/object\u0027 will become"},{"line_number":157,"context_line":"        \u0027/v1/AUTH_test/bucket/object\u0027. This method emulates the behavior."},{"line_number":158,"context_line":"        \"\"\""},{"line_number":159,"context_line":"        tenant_user \u003d swob.str_to_wsgi(env[\u0027s3api.auth_details\u0027][\u0027access_key\u0027])"},{"line_number":160,"context_line":"        tenant, user \u003d tenant_user.rsplit(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":30,"id":"1e8f04f1_87fa25ba","line":157,"in_reply_to":"d340ac7f_15ff9301","updated":"2025-10-13 14:38:23.000000000","message":"Done","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ffc6b8d746e6df8c604ac38fcf259734f346a572","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        For S3 requests, Swift auth middleware replaces a user name in"},{"line_number":155,"context_line":"        env[\u0027PATH_INFO\u0027] with a valid tenant id."},{"line_number":156,"context_line":"        E.g. \u0027/v1/test:tester/bucket/object\u0027 will become"},{"line_number":157,"context_line":"        \u0027/v1/AUTH_test/bucket/object\u0027. This method emulates the behavior."},{"line_number":158,"context_line":"        \"\"\""},{"line_number":159,"context_line":"        tenant_user \u003d swob.str_to_wsgi(env[\u0027s3api.auth_details\u0027][\u0027access_key\u0027])"},{"line_number":160,"context_line":"        tenant, user \u003d tenant_user.rsplit(\u0027:\u0027, 1)"}],"source_content_type":"text/x-python","patch_set":30,"id":"23422fd8_26d5595f","line":157,"in_reply_to":"f72de7b6_a7338048","updated":"2025-10-02 19:28:53.000000000","message":"This was done quite a few revisions ago. Mostly probably because we did not want FakeAuth in utils and I moved it to be around FakeSwift. If there\u0027s a better place for FakeAuth to be, we can move it!","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2b64312fa59807dc5bf46a2720c5044de8ab46db","unresolved":true,"context_lines":[{"line_number":187,"context_line":"            env[\u0027swift.authorize\u0027] \u003d lambda req: None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if \u0027swift.authorize_override\u0027 in env:"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"}],"source_content_type":"text/x-python","patch_set":30,"id":"f1cccd29_fa84ea09","line":190,"updated":"2025-09-24 17:32:57.000000000","message":"I know this is how it was in `test/unit/common/middleware/s3api/__init__.py`, but man this logic is weird: if this key is in `env`, return, otherwise ... implicitly return anyway?","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4191641e54ddcc0c20a39c2668d5690f2d89a811","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            env[\u0027swift.authorize\u0027] \u003d lambda req: None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if \u0027swift.authorize_override\u0027 in env:"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"}],"source_content_type":"text/x-python","patch_set":30,"id":"cd83d521_9fc3fb6e","line":190,"in_reply_to":"6baa78cc_d86d694a","updated":"2025-10-10 16:32:35.000000000","message":"Acknowledged","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ae40eb4e74734ff61ca67b2d413f55256af90e29","unresolved":true,"context_lines":[{"line_number":187,"context_line":"            env[\u0027swift.authorize\u0027] \u003d lambda req: None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if \u0027swift.authorize_override\u0027 in env:"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"}],"source_content_type":"text/x-python","patch_set":30,"id":"6baa78cc_d86d694a","line":190,"in_reply_to":"9200b4dd_85b7b888","updated":"2025-10-09 10:37:58.000000000","message":"hmmm, I wonder if this ought to be at the start rather than the end of the method, as it is in the equivalent tempauth path here https://github.com/openstack/swift/blob/32eaab20b1799807995ce5edc0d7c99355d0aa61/swift/common/middleware/tempauth.py#L295-L296 ?\n\nHowever, I don\u0027t think FakeAuthApp is ever used (currently) with authorize_override anyway, and it looks like we ought to revert this relocation. So it\u0027s moot.","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ffc6b8d746e6df8c604ac38fcf259734f346a572","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            env[\u0027swift.authorize\u0027] \u003d lambda req: None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if \u0027swift.authorize_override\u0027 in env:"},{"line_number":190,"context_line":"            return"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"}],"source_content_type":"text/x-python","patch_set":30,"id":"9200b4dd_85b7b888","line":190,"in_reply_to":"f1cccd29_fa84ea09","updated":"2025-10-02 19:28:53.000000000","message":"Agree, an explicit return statement is not necessarily needed! It\u0027s going to return anyway!","commit_id":"d4a254ddbfade515959995043f1a577d5e8f8715"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ae40eb4e74734ff61ca67b2d413f55256af90e29","unresolved":true,"context_lines":[{"line_number":187,"context_line":"            env[\u0027swift.authorize\u0027] \u003d lambda req: None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        # if \u0027swift.authorize_override\u0027 in env:"},{"line_number":190,"context_line":"        #     return"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"}],"source_content_type":"text/x-python","patch_set":34,"id":"8ae4a401_dcfb6492","line":190,"updated":"2025-10-09 10:37:58.000000000","message":"nit: if it\u0027s unnecessary code then just delete it - but this is moot if you revert - just don\u0027t change the original","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4191641e54ddcc0c20a39c2668d5690f2d89a811","unresolved":false,"context_lines":[{"line_number":187,"context_line":"            env[\u0027swift.authorize\u0027] \u003d lambda req: None"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        # if \u0027swift.authorize_override\u0027 in env:"},{"line_number":190,"context_line":"        #     return"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def __call__(self, env, start_response):"},{"line_number":193,"context_line":"        self.handle(env)"}],"source_content_type":"text/x-python","patch_set":34,"id":"fd2e347c_0b2a8455","line":190,"in_reply_to":"8ae4a401_dcfb6492","updated":"2025-10-10 16:32:35.000000000","message":"Acknowledged","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"}],"test/unit/common/middleware/s3api/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"0eacfefc4eb13dbd31c40914953740fe0bda6ada","unresolved":true,"context_lines":[{"line_number":70,"context_line":"            return"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        if \u0027swift.authorize_override\u0027 in env:"},{"line_number":73,"context_line":"            return"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if self.remote_user:"},{"line_number":76,"context_line":"            env[\u0027REMOTE_USER\u0027] \u003d self.remote_user"}],"source_content_type":"text/x-python","patch_set":36,"id":"7698bb4b_cd930805","line":73,"updated":"2025-10-13 14:38:23.000000000","message":"this change has become unrelated to this patch (and actually, if we were going to move this clause I think it should be at line 67). But now we\u0027ve decided NOT to move FakeAuthApp, then let\u0027s just leave it exactly as it is on master rather than trying to make it better as a \u0027drive-by\u0027.","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"1e48327ebc53f3def1e310bd00b4bac62cb9ac0f","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            return"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        if \u0027swift.authorize_override\u0027 in env:"},{"line_number":73,"context_line":"            return"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if self.remote_user:"},{"line_number":76,"context_line":"            env[\u0027REMOTE_USER\u0027] \u003d self.remote_user"}],"source_content_type":"text/x-python","patch_set":36,"id":"1fb33317_2b0bcc6f","line":73,"in_reply_to":"7698bb4b_cd930805","updated":"2025-10-13 14:55:36.000000000","message":"Acknowledged","commit_id":"5b1052c7bbab23750a4ab487e9d4ad5ee2869ad0"}],"test/unit/common/middleware/s3api/test_utils.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":127,"context_line":"                         utils.extract_bucket_and_key(req, [], False))"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        self.assertEqual((None, None),"},{"line_number":130,"context_line":"                         utils.extract_bucket_and_key(req, [], True))"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def test_get_s3_access_key_id_not_s3_req(self):"},{"line_number":133,"context_line":"        headers \u003d {\u0027Authorization\u0027: \u0027not AWS my_access_key_id:signature\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"eb9aabb6_173e4318","line":130,"updated":"2025-02-19 12:13:36.000000000","message":"what do you think about my previous comment at perhaps we DO want to include an non-dns compliant bucket name in the stat label, rather than ``None``?\n\nPresumably the request will get an error response from s3api, for which we\u0027ll emit a metric, so labelling the metric with the non-compliant bucket name could be useful?","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":127,"context_line":"                         utils.extract_bucket_and_key(req, [], False))"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        self.assertEqual((None, None),"},{"line_number":130,"context_line":"                         utils.extract_bucket_and_key(req, [], True))"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def test_get_s3_access_key_id_not_s3_req(self):"},{"line_number":133,"context_line":"        headers \u003d {\u0027Authorization\u0027: \u0027not AWS my_access_key_id:signature\u0027}"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ca46c65_23ec1716","line":130,"in_reply_to":"eb9aabb6_173e4318","updated":"2025-02-28 20:22:31.000000000","message":"Agreed","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"918dab674ae4cff3ddef63fc7b84f5c94983574c","unresolved":true,"context_lines":[{"line_number":183,"context_line":"        req \u003d Request.blank(\u0027/v1/a/\u0027,"},{"line_number":184,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":185,"context_line":"                            headers\u003dheaders)"},{"line_number":186,"context_line":"        self.assertIs(True, utils.is_s3_req(req))"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_mktime(self):"},{"line_number":189,"context_line":"        date_headers \u003d ["}],"source_content_type":"text/x-python","patch_set":17,"id":"db6c7c80_bfe21c36","line":186,"updated":"2025-05-07 13:30:40.000000000","message":"great! new tests\n\ncould you have go at adding some for the new parse_host and parse_path helpers? the test_extract_bucket_and_key* tests above might be a good starting point.","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"806230644ef1cad314831de596cb0972318f3f34","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        req \u003d Request.blank(\u0027/v1/a/\u0027,"},{"line_number":184,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":185,"context_line":"                            headers\u003dheaders)"},{"line_number":186,"context_line":"        self.assertIs(True, utils.is_s3_req(req))"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_mktime(self):"},{"line_number":189,"context_line":"        date_headers \u003d ["}],"source_content_type":"text/x-python","patch_set":17,"id":"78beb469_d7482e72","line":186,"in_reply_to":"c8810a6e_068a0b07","updated":"2025-05-13 14:23:57.000000000","message":"Done","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6ba87e01a83ed66b4b0d8db76ae81885b315c531","unresolved":true,"context_lines":[{"line_number":183,"context_line":"        req \u003d Request.blank(\u0027/v1/a/\u0027,"},{"line_number":184,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":185,"context_line":"                            headers\u003dheaders)"},{"line_number":186,"context_line":"        self.assertIs(True, utils.is_s3_req(req))"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_mktime(self):"},{"line_number":189,"context_line":"        date_headers \u003d ["}],"source_content_type":"text/x-python","patch_set":17,"id":"c8810a6e_068a0b07","line":186,"in_reply_to":"db6c7c80_bfe21c36","updated":"2025-05-08 19:56:32.000000000","message":"Acknowledged","commit_id":"70bd16d5bb983854951e1dba4badc8738f2f0d6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"67f2910afd5228d5d4de3149c6f0198c33a63f16","unresolved":true,"context_lines":[{"line_number":150,"context_line":"            },"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":"        self.assertEqual(utils.parse_host(req, []), None)"},{"line_number":153,"context_line":"        self.assertEqual(utils.parse_host(req, [\u0027localhost\u0027]), \u0027buckets\u0027)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def test_parse_path(self):"},{"line_number":156,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":19,"id":"da87f08c_1499e937","line":153,"updated":"2025-05-13 17:14:33.000000000","message":"nice\n\nI think there\u0027s some other interesting assertions that could be made https://paste.openstack.org/show/bSHgb37IPcnMVm06eEwm/","commit_id":"5c4c62660acfd671c38966d9301ca78830b26f45"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2f7cce175a4401e16b94f42b6dcbe47b5d9d84b7","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            },"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":"        self.assertEqual(utils.parse_host(req, []), None)"},{"line_number":153,"context_line":"        self.assertEqual(utils.parse_host(req, [\u0027localhost\u0027]), \u0027buckets\u0027)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def test_parse_path(self):"},{"line_number":156,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":19,"id":"1d7ecbd9_b09e0faa","line":153,"in_reply_to":"da87f08c_1499e937","updated":"2025-05-15 02:51:59.000000000","message":"Acknowledged","commit_id":"5c4c62660acfd671c38966d9301ca78830b26f45"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ae40eb4e74734ff61ca67b2d413f55256af90e29","unresolved":true,"context_lines":[{"line_number":149,"context_line":"                \u0027SERVER_NAME\u0027: \u0027foo.boo\u0027"},{"line_number":150,"context_line":"            },"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":"        del req.environ[\u0027HTTP_HOST\u0027]"},{"line_number":153,"context_line":"        self.assertEqual(utils.parse_host(req.environ, []), None)"},{"line_number":154,"context_line":"        self.assertEqual(utils.parse_host(req.environ, [\u0027boo\u0027]), \u0027foo\u0027)"},{"line_number":155,"context_line":"        environ \u003d {"}],"source_content_type":"text/x-python","patch_set":34,"id":"ccdbee3f_d01c8780","line":152,"updated":"2025-10-09 10:37:58.000000000","message":"so perhaps we didn\u0027t strictly need to construct a request now, to just get the environ dict, but I actually like the fact that we do, so that the environ dict is representative of whatever a typical request would have.","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4191641e54ddcc0c20a39c2668d5690f2d89a811","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                \u0027SERVER_NAME\u0027: \u0027foo.boo\u0027"},{"line_number":150,"context_line":"            },"},{"line_number":151,"context_line":"        )"},{"line_number":152,"context_line":"        del req.environ[\u0027HTTP_HOST\u0027]"},{"line_number":153,"context_line":"        self.assertEqual(utils.parse_host(req.environ, []), None)"},{"line_number":154,"context_line":"        self.assertEqual(utils.parse_host(req.environ, [\u0027boo\u0027]), \u0027foo\u0027)"},{"line_number":155,"context_line":"        environ \u003d {"}],"source_content_type":"text/x-python","patch_set":34,"id":"5d635edb_ad902528","line":152,"in_reply_to":"ccdbee3f_d01c8780","updated":"2025-10-10 16:32:35.000000000","message":"Done","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ae40eb4e74734ff61ca67b2d413f55256af90e29","unresolved":true,"context_lines":[{"line_number":156,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":157,"context_line":"            \u0027HTTP_HOST\u0027: \u0027buckets.localhost\u0027,"},{"line_number":158,"context_line":"            \u0027SERVER_NAME\u0027: \u0027foo.localhost\u0027,"},{"line_number":159,"context_line":"        }"},{"line_number":160,"context_line":"        self.assertEqual(utils.parse_host(environ, []), None)"},{"line_number":161,"context_line":"        self.assertEqual(utils.parse_host(environ, [\u0027notlocalhost\u0027]), None)"},{"line_number":162,"context_line":"        self.assertEqual(utils.parse_host(environ, [\u0027localhost\u0027]), \u0027buckets\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7ff3e8eb_e425db71","line":159,"updated":"2025-10-09 10:37:58.000000000","message":"nit: following on from comment above, perhaps this should have also continued to construct a request and then get its environ dict?","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4191641e54ddcc0c20a39c2668d5690f2d89a811","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":157,"context_line":"            \u0027HTTP_HOST\u0027: \u0027buckets.localhost\u0027,"},{"line_number":158,"context_line":"            \u0027SERVER_NAME\u0027: \u0027foo.localhost\u0027,"},{"line_number":159,"context_line":"        }"},{"line_number":160,"context_line":"        self.assertEqual(utils.parse_host(environ, []), None)"},{"line_number":161,"context_line":"        self.assertEqual(utils.parse_host(environ, [\u0027notlocalhost\u0027]), None)"},{"line_number":162,"context_line":"        self.assertEqual(utils.parse_host(environ, [\u0027localhost\u0027]), \u0027buckets\u0027)"}],"source_content_type":"text/x-python","patch_set":34,"id":"aaa813c0_12bc6172","line":159,"in_reply_to":"7ff3e8eb_e425db71","updated":"2025-10-10 16:32:35.000000000","message":"Acknowledged","commit_id":"17111ccac98839d9eb8a0144ca3cd97c6a418f2a"}],"test/unit/common/middleware/test_proxy_logging.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":1483,"context_line":"                    \u0027container\u0027: \u0027c\u0027}})"},{"line_number":1484,"context_line":"        ], app)"},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    def test_path_parts_put_s3api(self):"},{"line_number":1487,"context_line":"        def call_s3api(req, app):"},{"line_number":1488,"context_line":"            req.headers.setdefault(\"User-Agent\", \"Mozzarella Foxfire\")"},{"line_number":1489,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d6454d5e_e80ebcd8","line":1486,"updated":"2025-02-07 14:57:59.000000000","message":"I think it would be good to have more abbreviated test(s) to target the swift.path_parts behaviour specifically. There\u0027s a lot about statsd etc in this test which feels like it may be more relevant in the next patch when we use path_parts to label the metrics.","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ddba8a3f0e96e32adf8a98256298f0e27d5e9024","unresolved":false,"context_lines":[{"line_number":1483,"context_line":"                    \u0027container\u0027: \u0027c\u0027}})"},{"line_number":1484,"context_line":"        ], app)"},{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    def test_path_parts_put_s3api(self):"},{"line_number":1487,"context_line":"        def call_s3api(req, app):"},{"line_number":1488,"context_line":"            req.headers.setdefault(\"User-Agent\", \"Mozzarella Foxfire\")"},{"line_number":1489,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"f67777cc_882f7b4f","line":1486,"in_reply_to":"d6454d5e_e80ebcd8","updated":"2025-02-13 20:31:58.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":1562,"context_line":"                         req.environ[\u0027swift.backend_path\u0027])"},{"line_number":1563,"context_line":"        path_parts \u003d req.environ.get(\u0027swift.path_parts\u0027, None)"},{"line_number":1564,"context_line":"        self.assertTrue(path_parts is not None)"},{"line_number":1565,"context_line":"        self.assertEqual(\u0027AUTH_test\u0027, path_parts[0])"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"        self.assertEqual(swift.calls, ["},{"line_number":1568,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"e477ad41_47b0ed56","line":1565,"updated":"2025-02-07 14:57:59.000000000","message":"ok but this is more interesting:\n\n```\n        self.assertEqual([\u0027AUTH_test\u0027, \u0027bucket\u0027, \u0027object\u0027], path_parts)\n```\n\nwhich results in\n\n```\nFAILED\ntest/unit/common/middleware/test_proxy_logging.py:1661 (TestProxyLogging.test_path_parts_put_s3api)\n[\u0027AUTH_test\u0027, None, None] !\u003d [\u0027AUTH_test\u0027, \u0027bucket\u0027, \u0027object\u0027]\n\nExpected :[\u0027AUTH_test\u0027, \u0027bucket\u0027, \u0027object\u0027]\nActual   :[\u0027AUTH_test\u0027, None, None]\n```\n\nbecause of the AttributeError in proxy_logging","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ddba8a3f0e96e32adf8a98256298f0e27d5e9024","unresolved":false,"context_lines":[{"line_number":1562,"context_line":"                         req.environ[\u0027swift.backend_path\u0027])"},{"line_number":1563,"context_line":"        path_parts \u003d req.environ.get(\u0027swift.path_parts\u0027, None)"},{"line_number":1564,"context_line":"        self.assertTrue(path_parts is not None)"},{"line_number":1565,"context_line":"        self.assertEqual(\u0027AUTH_test\u0027, path_parts[0])"},{"line_number":1566,"context_line":""},{"line_number":1567,"context_line":"        self.assertEqual(swift.calls, ["},{"line_number":1568,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f854c2a_96471828","line":1565,"in_reply_to":"e477ad41_47b0ed56","updated":"2025-02-13 20:31:58.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":1567,"context_line":"        self.assertEqual(swift.calls, ["},{"line_number":1568,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":1569,"context_line":"        ])"},{"line_number":1570,"context_line":"        self.assertUpdateStats(["},{"line_number":1571,"context_line":"            (\u0027object.PUT.200.xfer\u0027, buffer_len, {}),"},{"line_number":1572,"context_line":"            (\u0027object.policy.0.PUT.200.xfer\u0027, buffer_len, {}),"},{"line_number":1573,"context_line":"            (\u0027swift_proxy_request_body_bytes\u0027, buffer_len, {"}],"source_content_type":"text/x-python","patch_set":1,"id":"69322b0e_6b5465f5","line":1570,"updated":"2025-02-07 14:57:59.000000000","message":"this seems off-topic for this test in this patch - the stats are not (yet) using swift.path_parts","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ddba8a3f0e96e32adf8a98256298f0e27d5e9024","unresolved":false,"context_lines":[{"line_number":1567,"context_line":"        self.assertEqual(swift.calls, ["},{"line_number":1568,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"},{"line_number":1569,"context_line":"        ])"},{"line_number":1570,"context_line":"        self.assertUpdateStats(["},{"line_number":1571,"context_line":"            (\u0027object.PUT.200.xfer\u0027, buffer_len, {}),"},{"line_number":1572,"context_line":"            (\u0027object.policy.0.PUT.200.xfer\u0027, buffer_len, {}),"},{"line_number":1573,"context_line":"            (\u0027swift_proxy_request_body_bytes\u0027, buffer_len, {"}],"source_content_type":"text/x-python","patch_set":1,"id":"844aa4c4_73405551","line":1570,"in_reply_to":"69322b0e_6b5465f5","updated":"2025-02-13 20:31:58.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"4e28835da6d07f48a02e99b66e999524311e228d","unresolved":true,"context_lines":[{"line_number":1592,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":1593,"context_line":"                            headers\u003d{\u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":1594,"context_line":"                                     \u0027Date\u0027: date_header})"},{"line_number":1595,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1596,"context_line":"        self.assertEqual(status.split()[0], \u0027200\u0027)"},{"line_number":1597,"context_line":""},{"line_number":1598,"context_line":"    def test_log_query_string(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bc524337_de7f1b8f","line":1595,"range":{"start_line":1595,"start_character":32,"end_line":1595,"end_character":42},"updated":"2025-02-07 14:57:59.000000000","message":"what is this request call testing? it seems superfluous","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ddba8a3f0e96e32adf8a98256298f0e27d5e9024","unresolved":false,"context_lines":[{"line_number":1592,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":1593,"context_line":"                            headers\u003d{\u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":1594,"context_line":"                                     \u0027Date\u0027: date_header})"},{"line_number":1595,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1596,"context_line":"        self.assertEqual(status.split()[0], \u0027200\u0027)"},{"line_number":1597,"context_line":""},{"line_number":1598,"context_line":"    def test_log_query_string(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"082662a0_a76f0c29","line":1595,"range":{"start_line":1595,"start_character":32,"end_line":1595,"end_character":42},"in_reply_to":"bc524337_de7f1b8f","updated":"2025-02-13 20:31:58.000000000","message":"Acknowledged","commit_id":"50db954da1b00a259211cfb4e1e0e2d0e3c9fda1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"956f23bf26584a01a157ab59b5e5ee70e4b4ae10","unresolved":true,"context_lines":[{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    def _do_test_swift_path_parts(self, mw_conf, path, req_hdrs,"},{"line_number":1487,"context_line":"                                  extra_environ\u003dNone):"},{"line_number":1488,"context_line":"        req_environs \u003d []"},{"line_number":1489,"context_line":""},{"line_number":1490,"context_line":"        def fake_app(env, start_response):"},{"line_number":1491,"context_line":"            req_environs.append(env)"},{"line_number":1492,"context_line":"            return HTTPOk()(env, start_response)"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"        mw \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":1495,"context_line":"            fake_app, mw_conf, logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ed17633c_6f8d119c","line":1492,"range":{"start_line":1488,"start_character":8,"end_line":1492,"end_character":48},"updated":"2025-02-12 12:06:00.000000000","message":"if https://review.opendev.org/c/openstack/swift/+/941365 merges then we can get rid of the fake app and just capture swift.path_parts in FakeSwift","commit_id":"0540a79255c98653ba1f53aee8294cacaf33d4e5"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"1452130ee18bce39f0fa3250b4b1e09de2f5ee18","unresolved":false,"context_lines":[{"line_number":1485,"context_line":""},{"line_number":1486,"context_line":"    def _do_test_swift_path_parts(self, mw_conf, path, req_hdrs,"},{"line_number":1487,"context_line":"                                  extra_environ\u003dNone):"},{"line_number":1488,"context_line":"        req_environs \u003d []"},{"line_number":1489,"context_line":""},{"line_number":1490,"context_line":"        def fake_app(env, start_response):"},{"line_number":1491,"context_line":"            req_environs.append(env)"},{"line_number":1492,"context_line":"            return HTTPOk()(env, start_response)"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"        mw \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":1495,"context_line":"            fake_app, mw_conf, logger\u003dself.logger)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ed1e6489_56f593c3","line":1492,"range":{"start_line":1488,"start_character":8,"end_line":1492,"end_character":48},"in_reply_to":"ed17633c_6f8d119c","updated":"2025-02-12 16:21:39.000000000","message":"Acknowledged","commit_id":"0540a79255c98653ba1f53aee8294cacaf33d4e5"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":38,"context_line":"    debug_statsd_client, debug_labeled_statsd_client"},{"line_number":39,"context_line":"from test.unit import patch_policies"},{"line_number":40,"context_line":"from test.unit.common.middleware.helpers import FakeAppThatExcepts, FakeSwift"},{"line_number":41,"context_line":"from test.unit.common.middleware.s3api import FakeAuthApp, \\"},{"line_number":42,"context_line":"    filter_factory as s3api_filter_factory"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c8884c8f_e47ef249","line":41,"range":{"start_line":41,"start_character":46,"end_line":41,"end_character":57},"updated":"2025-02-19 12:13:36.000000000","message":"probably makes sense to move ``FakeAuthApp`` to test/unit/common/middleware/helpers.py to live alongside FakeSwift. Looks like it is only imported in one other place so not a lot of churn.","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    debug_statsd_client, debug_labeled_statsd_client"},{"line_number":39,"context_line":"from test.unit import patch_policies"},{"line_number":40,"context_line":"from test.unit.common.middleware.helpers import FakeAppThatExcepts, FakeSwift"},{"line_number":41,"context_line":"from test.unit.common.middleware.s3api import FakeAuthApp, \\"},{"line_number":42,"context_line":"    filter_factory as s3api_filter_factory"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"009d2a83_db10e2c4","line":41,"range":{"start_line":41,"start_character":46,"end_line":41,"end_character":57},"in_reply_to":"c8884c8f_e47ef249","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1659,"context_line":"            [None, \u0027bucket\u0027, \u0027obj\u0027],"},{"line_number":1660,"context_line":"            self._do_test_swift_path_parts(mw_conf, \u0027/bucket/obj\u0027, req_hdrs))"},{"line_number":1661,"context_line":""},{"line_number":1662,"context_line":"    def test_path_parts_put_s3api(self):"},{"line_number":1663,"context_line":"        def call_s3api(req, app):"},{"line_number":1664,"context_line":"            req.headers.setdefault(\"User-Agent\", \"Mozzarella Foxfire\")"},{"line_number":1665,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e95a6f5d_11b93ca1","line":1662,"range":{"start_line":1662,"start_character":8,"end_line":1662,"end_character":33},"updated":"2025-02-19 12:13:36.000000000","message":"could we have a similar test with a swift request?\n\nThe test should still use a pipeline with s3api (whcih will pass a swift request on unchanged) so you might want to break the pipeline construction to a helper method and just vary the request headers and path.","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1659,"context_line":"            [None, \u0027bucket\u0027, \u0027obj\u0027],"},{"line_number":1660,"context_line":"            self._do_test_swift_path_parts(mw_conf, \u0027/bucket/obj\u0027, req_hdrs))"},{"line_number":1661,"context_line":""},{"line_number":1662,"context_line":"    def test_path_parts_put_s3api(self):"},{"line_number":1663,"context_line":"        def call_s3api(req, app):"},{"line_number":1664,"context_line":"            req.headers.setdefault(\"User-Agent\", \"Mozzarella Foxfire\")"},{"line_number":1665,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"985376f5_78ff0f2b","line":1662,"range":{"start_line":1662,"start_character":8,"end_line":1662,"end_character":33},"in_reply_to":"e95a6f5d_11b93ca1","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1663,"context_line":"        def call_s3api(req, app):"},{"line_number":1664,"context_line":"            req.headers.setdefault(\"User-Agent\", \"Mozzarella Foxfire\")"},{"line_number":1665,"context_line":""},{"line_number":1666,"context_line":"            status \u003d [None]"},{"line_number":1667,"context_line":"            headers \u003d [None]"},{"line_number":1668,"context_line":""},{"line_number":1669,"context_line":"            def start_response(s, h, ei\u003dNone):"},{"line_number":1670,"context_line":"                status[0] \u003d s"},{"line_number":1671,"context_line":"                headers[0] \u003d HeaderKeyDict(h)"},{"line_number":1672,"context_line":""},{"line_number":1673,"context_line":"            body_iter \u003d app(req.environ, start_response)"},{"line_number":1674,"context_line":"            body \u003d b\u0027\u0027"},{"line_number":1675,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"2793b6ef_88989197","line":1672,"range":{"start_line":1666,"start_character":12,"end_line":1672,"end_character":0},"updated":"2025-02-19 12:13:36.000000000","message":"these steps are provided by \n\n```\nstatus, headers, body_iter \u003d req.call_application(app)\n```","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"        def call_s3api(req, app):"},{"line_number":1664,"context_line":"            req.headers.setdefault(\"User-Agent\", \"Mozzarella Foxfire\")"},{"line_number":1665,"context_line":""},{"line_number":1666,"context_line":"            status \u003d [None]"},{"line_number":1667,"context_line":"            headers \u003d [None]"},{"line_number":1668,"context_line":""},{"line_number":1669,"context_line":"            def start_response(s, h, ei\u003dNone):"},{"line_number":1670,"context_line":"                status[0] \u003d s"},{"line_number":1671,"context_line":"                headers[0] \u003d HeaderKeyDict(h)"},{"line_number":1672,"context_line":""},{"line_number":1673,"context_line":"            body_iter \u003d app(req.environ, start_response)"},{"line_number":1674,"context_line":"            body \u003d b\u0027\u0027"},{"line_number":1675,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"457286b2_b43f1c4e","line":1672,"range":{"start_line":1666,"start_character":12,"end_line":1672,"end_character":0},"in_reply_to":"2793b6ef_88989197","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1676,"context_line":"                for chunk in body_iter:"},{"line_number":1677,"context_line":"                    body +\u003d chunk"},{"line_number":1678,"context_line":"            except Exception:"},{"line_number":1679,"context_line":"                raise"},{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"            return status[0], headers[0], body"},{"line_number":1682,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4a0c7ecd_40226ab1","line":1679,"updated":"2025-02-19 12:13:36.000000000","message":"the try/except isn\u0027t necessary when the exception is just raised anyway\n\nso this can all simplify to \n\n```\nbody \u003d b\u0027\u0027.join(body_iter)\n```","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1676,"context_line":"                for chunk in body_iter:"},{"line_number":1677,"context_line":"                    body +\u003d chunk"},{"line_number":1678,"context_line":"            except Exception:"},{"line_number":1679,"context_line":"                raise"},{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"            return status[0], headers[0], body"},{"line_number":1682,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"78611b7b_1eb00f25","line":1679,"in_reply_to":"4a0c7ecd_40226ab1","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1678,"context_line":"            except Exception:"},{"line_number":1679,"context_line":"                raise"},{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"            return status[0], headers[0], body"},{"line_number":1682,"context_line":""},{"line_number":1683,"context_line":"        conf \u003d {"},{"line_number":1684,"context_line":"            \u0027log_headers\u0027: \u0027yes\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"f523f8f5_3369357e","line":1681,"updated":"2025-02-19 12:13:36.000000000","message":"this method is only called once, so once it is cleaned up and reduced it may not be worth having the method","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1678,"context_line":"            except Exception:"},{"line_number":1679,"context_line":"                raise"},{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"            return status[0], headers[0], body"},{"line_number":1682,"context_line":""},{"line_number":1683,"context_line":"        conf \u003d {"},{"line_number":1684,"context_line":"            \u0027log_headers\u0027: \u0027yes\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"d42b6420_736319d5","line":1681,"in_reply_to":"f523f8f5_3369357e","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"            return status[0], headers[0], body"},{"line_number":1682,"context_line":""},{"line_number":1683,"context_line":"        conf \u003d {"},{"line_number":1684,"context_line":"            \u0027log_headers\u0027: \u0027yes\u0027,"},{"line_number":1685,"context_line":"            \u0027statsd_label_mode\u0027: \u0027dogstatsd\u0027,"},{"line_number":1686,"context_line":"        }"},{"line_number":1687,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":1688,"context_line":"        buffer_str \u003d b\u0027some stuff\\n\u0027 + \\"},{"line_number":1689,"context_line":"                     b\u0027some other stuff\\n\u0027 + \\"},{"line_number":1690,"context_line":"                     b\u0027some additional stuff\\n\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"48465a26_e880a40b","line":1687,"range":{"start_line":1683,"start_character":8,"end_line":1687,"end_character":55},"updated":"2025-02-19 12:13:36.000000000","message":"this test doesn\u0027t make any assertions about statsd metrics so I\u0027m not sure this is necessary","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"            return status[0], headers[0], body"},{"line_number":1682,"context_line":""},{"line_number":1683,"context_line":"        conf \u003d {"},{"line_number":1684,"context_line":"            \u0027log_headers\u0027: \u0027yes\u0027,"},{"line_number":1685,"context_line":"            \u0027statsd_label_mode\u0027: \u0027dogstatsd\u0027,"},{"line_number":1686,"context_line":"        }"},{"line_number":1687,"context_line":"        self.statsd \u003d debug_labeled_statsd_client(conf)"},{"line_number":1688,"context_line":"        buffer_str \u003d b\u0027some stuff\\n\u0027 + \\"},{"line_number":1689,"context_line":"                     b\u0027some other stuff\\n\u0027 + \\"},{"line_number":1690,"context_line":"                     b\u0027some additional stuff\\n\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"f0576191_9be027d3","line":1687,"range":{"start_line":1683,"start_character":8,"end_line":1687,"end_character":55},"in_reply_to":"48465a26_e880a40b","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1697,"context_line":"                       HTTPCreated,"},{"line_number":1698,"context_line":"                       {\u0027etag\u0027: etag,"},{"line_number":1699,"context_line":"                        \u0027last-modified\u0027: last_modified,"},{"line_number":1700,"context_line":"                        \u0027Content-Length\u0027: 0},"},{"line_number":1701,"context_line":"                       None)"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"        date_header \u003d email.utils.formatdate(time.time() + 0)"}],"source_content_type":"text/x-python","patch_set":3,"id":"f67371a5_33d75387","line":1700,"range":{"start_line":1700,"start_character":41,"end_line":1700,"end_character":43},"updated":"2025-02-19 12:13:36.000000000","message":"in reality this would be the length of buffer_str\n\nI\u0027m not sure if this test needs to care too much about the FakeSwift PUT response headers being accurate, or being defined at all.","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1697,"context_line":"                       HTTPCreated,"},{"line_number":1698,"context_line":"                       {\u0027etag\u0027: etag,"},{"line_number":1699,"context_line":"                        \u0027last-modified\u0027: last_modified,"},{"line_number":1700,"context_line":"                        \u0027Content-Length\u0027: 0},"},{"line_number":1701,"context_line":"                       None)"},{"line_number":1702,"context_line":""},{"line_number":1703,"context_line":"        date_header \u003d email.utils.formatdate(time.time() + 0)"}],"source_content_type":"text/x-python","patch_set":3,"id":"e498b02e_7ab7e15f","line":1700,"range":{"start_line":1700,"start_character":41,"end_line":1700,"end_character":43},"in_reply_to":"f67371a5_33d75387","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1724,"context_line":""},{"line_number":1725,"context_line":"        conf.update({"},{"line_number":1726,"context_line":"            \u0027access_log_route\u0027: \u0027proxy-access\u0027,"},{"line_number":1727,"context_line":"        })"},{"line_number":1728,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"}],"source_content_type":"text/x-python","patch_set":3,"id":"83029b40_2b5f73fb","line":1727,"updated":"2025-02-19 12:13:36.000000000","message":"this is updating the conf that was used for statsd client? But then the proxy_logging statsd client is replace at line 1731, so there seems no need to be passing statsd options to the proxy logging middleware. Probably cleaner/less confusing to just use a new conf dict here.\n\nIn fact, the logger is replaced at line 1730 so I think this conf has no effect at all?\n\nAnd then the test makes no assertions about statd or logs anyway...(which is appropriate, this test is just verifying that the req environ is modified)","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1724,"context_line":""},{"line_number":1725,"context_line":"        conf.update({"},{"line_number":1726,"context_line":"            \u0027access_log_route\u0027: \u0027proxy-access\u0027,"},{"line_number":1727,"context_line":"        })"},{"line_number":1728,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"}],"source_content_type":"text/x-python","patch_set":3,"id":"869c5b08_0801dcee","line":1727,"in_reply_to":"83029b40_2b5f73fb","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1727,"context_line":"        })"},{"line_number":1728,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"},{"line_number":1731,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":1732,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1733,"context_line":""},{"line_number":1734,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ee2ae1f1_adadc0d9","line":1731,"range":{"start_line":1730,"start_character":8,"end_line":1731,"end_character":32},"updated":"2025-02-19 12:13:36.000000000","message":"this doesn\u0027t seem necessary","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1727,"context_line":"        })"},{"line_number":1728,"context_line":"        app \u003d proxy_logging.ProxyLoggingMiddleware("},{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"},{"line_number":1731,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":1732,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1733,"context_line":""},{"line_number":1734,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"}],"source_content_type":"text/x-python","patch_set":3,"id":"b9ff935f_0af47c5a","line":1731,"range":{"start_line":1730,"start_character":8,"end_line":1731,"end_character":32},"in_reply_to":"ee2ae1f1_adadc0d9","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"},{"line_number":1731,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":1732,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1733,"context_line":""},{"line_number":1734,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":1735,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"886da417_7bc79b7a","line":1732,"range":{"start_line":1732,"start_character":32,"end_line":1732,"end_character":42},"updated":"2025-02-19 12:13:36.000000000","message":"``call_s3api`` reads the request body. I think it would be interesting to make the assertion about ``swift.path_parts`` *before* the body is read (because that is when we need it to be fully populated for the xfer bytes stats labels). And then also check ``swift.path_parts`` *after* the body has been read...which probably means bringing the call_s3api code back inline here.","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"},{"line_number":1731,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":1732,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1733,"context_line":""},{"line_number":1734,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":1735,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"93f79446_1e2858d6","line":1732,"updated":"2025-02-19 12:13:36.000000000","message":"great! the pipeline is proxy_logging:s3api:fake-auth:proxy-logging:fake-swift\n\ns3api modifies the path to have access key id in account part\nfake-auth modifies the path to have swift account in the account part\nproxy-logging copies the account to swift.path_parts","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"},{"line_number":1731,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":1732,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1733,"context_line":""},{"line_number":1734,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":1735,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"60fec79f_5873e19e","line":1732,"range":{"start_line":1732,"start_character":32,"end_line":1732,"end_character":42},"in_reply_to":"886da417_7bc79b7a","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1729,"context_line":"            app, conf, logger\u003dself.logger)"},{"line_number":1730,"context_line":"        app.logger \u003d self.logger"},{"line_number":1731,"context_line":"        app.statsd \u003d self.statsd"},{"line_number":1732,"context_line":"        status, headers, body \u003d call_s3api(req, app)"},{"line_number":1733,"context_line":""},{"line_number":1734,"context_line":"        self.assertEqual(\u0027200 OK\u0027, status)"},{"line_number":1735,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1e45aea5_278e830d","line":1732,"in_reply_to":"93f79446_1e2858d6","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1736,"context_line":"        self.assertEqual(\u0027/v1/AUTH_test/bucket/object\u0027,"},{"line_number":1737,"context_line":"                         req.environ[\u0027swift.backend_path\u0027])"},{"line_number":1738,"context_line":"        path_parts \u003d req.environ.get(\u0027swift.path_parts\u0027, None)"},{"line_number":1739,"context_line":"        self.assertTrue(path_parts is not None)"},{"line_number":1740,"context_line":"        self.assertEqual([\u0027AUTH_test\u0027, \u0027bucket\u0027, \u0027object\u0027], path_parts)"},{"line_number":1741,"context_line":""},{"line_number":1742,"context_line":"        self.assertEqual(swift.calls, ["}],"source_content_type":"text/x-python","patch_set":3,"id":"8a0063f5_a8d946f9","line":1739,"range":{"start_line":1739,"start_character":8,"end_line":1739,"end_character":47},"updated":"2025-02-19 12:13:36.000000000","message":"this isn\u0027t necessary given the next line\n\nAlso, if this was necessary then use ``self.assertIsNotNone(path_parts)``","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1736,"context_line":"        self.assertEqual(\u0027/v1/AUTH_test/bucket/object\u0027,"},{"line_number":1737,"context_line":"                         req.environ[\u0027swift.backend_path\u0027])"},{"line_number":1738,"context_line":"        path_parts \u003d req.environ.get(\u0027swift.path_parts\u0027, None)"},{"line_number":1739,"context_line":"        self.assertTrue(path_parts is not None)"},{"line_number":1740,"context_line":"        self.assertEqual([\u0027AUTH_test\u0027, \u0027bucket\u0027, \u0027object\u0027], path_parts)"},{"line_number":1741,"context_line":""},{"line_number":1742,"context_line":"        self.assertEqual(swift.calls, ["}],"source_content_type":"text/x-python","patch_set":3,"id":"d0c8ef3f_60bebc4d","line":1739,"range":{"start_line":1739,"start_character":8,"end_line":1739,"end_character":47},"in_reply_to":"8a0063f5_a8d946f9","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1eeaa18031ee17dc70607e48f1663f1baf1e7e49","unresolved":true,"context_lines":[{"line_number":1737,"context_line":"                         req.environ[\u0027swift.backend_path\u0027])"},{"line_number":1738,"context_line":"        path_parts \u003d req.environ.get(\u0027swift.path_parts\u0027, None)"},{"line_number":1739,"context_line":"        self.assertTrue(path_parts is not None)"},{"line_number":1740,"context_line":"        self.assertEqual([\u0027AUTH_test\u0027, \u0027bucket\u0027, \u0027object\u0027], path_parts)"},{"line_number":1741,"context_line":""},{"line_number":1742,"context_line":"        self.assertEqual(swift.calls, ["},{"line_number":1743,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"19735545_263222b0","line":1740,"updated":"2025-02-19 12:13:36.000000000","message":"right! 😊","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"c05a97c367526d4022a8d2d01c731e4c6a52a4d2","unresolved":false,"context_lines":[{"line_number":1737,"context_line":"                         req.environ[\u0027swift.backend_path\u0027])"},{"line_number":1738,"context_line":"        path_parts \u003d req.environ.get(\u0027swift.path_parts\u0027, None)"},{"line_number":1739,"context_line":"        self.assertTrue(path_parts is not None)"},{"line_number":1740,"context_line":"        self.assertEqual([\u0027AUTH_test\u0027, \u0027bucket\u0027, \u0027object\u0027], path_parts)"},{"line_number":1741,"context_line":""},{"line_number":1742,"context_line":"        self.assertEqual(swift.calls, ["},{"line_number":1743,"context_line":"            (\u0027PUT\u0027, \u0027/v1/AUTH_test/bucket/object\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"b4e7c86d_413c060e","line":1740,"in_reply_to":"19735545_263222b0","updated":"2025-02-28 20:22:31.000000000","message":"Acknowledged","commit_id":"dc2812e2aab06c8082ae921261941360f7a7cc6c"}]}
