)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"80931d60c6b3d5f7481dc4564cd9cceb6ccdb85f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"b478fa62_61fbfb78","updated":"2025-01-28 16:44:05.000000000","message":"some left over comments; maybe not relevant anymore","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"97f5b4fa_d88c43a7","updated":"2025-01-29 21:24:19.000000000","message":"If I get some more time and you don\u0027t beat me too it - I\u0027ll try to add a fake-statsd-client to the base test so we can observe the metrics we\u0027d get from the existing requests int the existing tests and then fix the label classification so it\u0027s case-insensitive with the header\u003d\u003emetric_label and more consistent with the well known values and value classification (maybe with some tests around the value classification function - esp for \"unknown\" value types)","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8740df60_30c68034","updated":"2025-01-31 15:43:12.000000000","message":"I don\u0027t think we can carry this yet because we\u0027re still putting too many header values into in as label values *directly*\n\npretty much NO header value should go in as a label value directly unless we\u0027ve whitelisted it or classified it.\n\nBut I think the shape is coming along nicely!","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"adf939f77beedc122dce7b2858a06bd1d8797fd8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"161a1ea7_5bdf3e32","updated":"2025-01-31 16:43:10.000000000","message":"I did my best to clean the patch up today. There’s still some aspects I’m not sure about:\n\n* I think including the Authorization header might be a mis-step\n* whether we want to explicitly call out invalid hash values or just have them classified as unexpected types\n* what do we actually want from Content-Encoding/Tranfer-Encoding - at the moment we just include them if they have aws-chunked\n* What do we want from X-Amz-Trailer\n\nI\u0027ve not yet had time to test this functionally.","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d173ccf7e8c8b8b044df2d3e9a90c5d5236bb898","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3e4107f3_dd888a3a","updated":"2025-01-31 21:15:37.000000000","message":"I haven\u0027t actually looked at any of these metrics in a vsaio w/ promethus\n\nI would imagine now that we have a statsd_client in the base TestCase we could instrument some existing tests with assert\u0027s on their increments and that would probably be reassuring that it doesn\u0027t require some new/special magic behavior on the client to start tripping these stats - we\u0027ll get them for *existing* requests and errors as well as new ones with funny values.","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9f3c4fa6b9133f1f4414caca8cdba6da5310bca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e639ad88_50c80e0c","updated":"2025-02-03 13:49:28.000000000","message":"Played with this in my vsaio.\n\n-1 because:\n*  I realised that there is no \u0027server type\u0027 label so a bucket listing metric looks the same as an object GET.\n\n* The real-world SHA256 checksum isn\u0027t matching any valid base64 length\n\nFixes to squash on this patch https://review.opendev.org/c/openstack/swift/+/940623\n\n\n```\nvagrant@vagrant:~$ pip freeze|grep boto3\nboto3\u003d\u003d1.34.152\n\nvagrant@vagrant:~$ aws s3api list-objects --bucket test\n\nvagrant@vagrant:~$ aws s3api get-object --bucket test --key test -\n\nmetrics:\n\nswift_s3_checksum_algo_request:1|c|#account:AUTH_test,container:test,header_x_amz_content_sha256:hash_64,method:GET,status:200\nswift_s3_checksum_algo_request:1|c|#account:AUTH_test,container:test,header_x_amz_content_sha256:hash_64,method:GET,status:200\n```\n\nI can see the difference between older and newer boto3 versions doing an object PUT\n\n```\nvagrant@vagrant:~$ pip freeze|grep boto3\nboto3\u003d\u003d1.34.152\n\nvagrant@vagrant:~$ aws s3api put-object --bucket test --key test\n\nmetrics:\nswift_s3_checksum_algo_request:1|c|#account:AUTH_test,container:test,header_content_md5:b64_24,header_x_amz_content_sha256:hash_64,method:PUT,status:200\n\n\nvagrant@vagrant:~$ pip freeze|grep boto3\nboto3\u003d\u003d1.36.11\n\nvagrant@vagrant:~$ aws s3api put-object --bucket test --key test\n\nmetrics:\n\nswift_s3_checksum_algo_request:1|c|#account:AUTH_test,container:test,header_x_amz_checksum_crc32:b64_8,header_x_amz_content_sha256:hash_64,header_x_amz_sdk_checksum_algorithm:CRC32,method:PUT,status:200\n```\n\nNot matching sha256 checksum (note \"unknown\" label value)...\n\n```\nvagrant@vagrant:~/swift$ aws s3api put-object --bucket test --key test  --checksum-algorithm sha256 --debug\n\nswift_s3_checksum_algo_request:1|c|#account:AUTH_test,container:test,header_x_amz_checksum_sha256:unknown,header_x_amz_content_sha256:hash_64,header_x_amz_sdk_checksum_algorithm:SHA256,method:PUT,status:200\n```","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"15b7b9dabb3a753ffc71bc8b7262fc4ababd8a6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"ecbb69e5_c69864bf","updated":"2025-02-03 17:40:10.000000000","message":"recheck","commit_id":"c54dac02863c30183e4f8c587aa463b8943be55a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ea2569ca6e342b0d8a68ac26c252f4f61495c73a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"c0dbc40d_ca30c6e3","updated":"2025-03-25 17:09:45.000000000","message":"why is the amz-trailer a boolean?","commit_id":"aed3257c4ba4ccac55f9d7bb5bf9f428257f66a2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7368482e62c2961794a9e68930b4ad042ee502e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"aacfddbd_45e29c57","updated":"2025-05-21 21:20:39.000000000","message":"recheck\n\nFailure to upload logs?","commit_id":"1bf307126e406cb1ba98bf3dc9d5027a20417aa0"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8f6bb23052507730fd799a9efe4278dfe5e78a2c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":41,"id":"10f0e483_b425dea6","updated":"2025-07-09 20:42:41.000000000","message":"recheck","commit_id":"151fc267a14d5cd5ef057bc3c7d94f7340c1e19a"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"30642d653d762f8bd18c6c8991163aa011c81c8f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":42,"id":"e86fb2f3_2bea6b45","updated":"2025-07-11 16:05:09.000000000","message":"recheck","commit_id":"4a66a16a657b03daef351bc14db25bf10945d22a"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"955971662a32bda5000ffded81c83df5c0be82e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"e9fcab90_e37c5cb6","updated":"2025-07-17 02:48:17.000000000","message":"recheck","commit_id":"d3997395844e2d3be0bc6be7521e7412177ed55d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8078fcb296476929996eae01682e4e3f682e59c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"4e629eaf_3dc2c428","updated":"2025-08-18 18:13:31.000000000","message":"this is still providing us some value - mostly in confirming 1) most clients don\u0027t use aws-chunked or alt-checksum yet 2) of those (small minority) of requests that do crc64nvme and crc32 are the most popular (aws-cli \u0026 boto respectively).","commit_id":"d3997395844e2d3be0bc6be7521e7412177ed55d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":46,"id":"c9eee390_105e7ffc","updated":"2025-10-01 21:11:21.000000000","message":"I\u0027m worried about the cardinality of timeseries, I\u0027m not clear on how robust we want to make `classify_checksum_header_value`, and I\u0027m inclined to say that the lengths in labels ought to be for the decoded length rather than the encoded length. Maybe I could get talked out of that last one?","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1eac5066fbe42de0930e678516c5e10e3d30cd77","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"e6822992_7dfef705","updated":"2025-12-17 16:20:49.000000000","message":"I think Tim\u0027s comments are mostly pointing out the current classification code may need to be improved depending on what sort of crazy values we see getting sent from clients - and I think that\u0027s probably correct:\n\n971351: test: s3 checksum header classification is weird | https://review.opendev.org/c/openstack/swift/+/971351\n\nI think the off-topic comment about the NameError in the code path that probably only happens in dev/test is an unfortunate discovery that I\u0027m not sure what to do with - but also not a blocker for this change.\n\nI didn\u0027t see any ideas suggested what to do about multiple values for transfer-encoding - luckily I also don\u0027t think that\u0027s something we\u0027d observed so we can defer the decision until we have more information about the imagined problem.","commit_id":"01d7eef889c23e11a8befa2bd2fecbef9906c135"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"36270c8d4c65811ec11dcda406012eda0b43d2bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"594c4a04_2ac00ac7","updated":"2025-12-18 16:55:22.000000000","message":"recheck","commit_id":"01d7eef889c23e11a8befa2bd2fecbef9906c135"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"a5343947ac616209db404af9ca156375fb0b6795","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"ce88c949_a118314c","updated":"2025-12-08 18:30:35.000000000","message":"recheck","commit_id":"01d7eef889c23e11a8befa2bd2fecbef9906c135"}],"swift/common/middleware/s3api/s3api.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"80931d60c6b3d5f7481dc4564cd9cceb6ccdb85f","unresolved":true,"context_lines":[{"line_number":369,"context_line":"                \u0027summary\u0027: err_resp.summary"},{"line_number":370,"context_line":"            }"},{"line_number":371,"context_line":"            self.statsd.increment("},{"line_number":372,"context_line":"                \u0027501.NotImplemented\u0027,"},{"line_number":373,"context_line":"                labels \u003d labels,"},{"line_number":374,"context_line":"            )"},{"line_number":375,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"810c8397_4f6e3c5b","line":372,"updated":"2025-01-28 16:44:05.000000000","message":"labeled metrics shouldn\u0027t have `.` in the *name* - that\u0027s is a legacy format thing because statds metrics used to lack the ability to add extra demenisions/labels so we faked it with statsd name and used queries with globs instead of multi-dimension filters","commit_id":"2fb0aaa1fd7251dc88a6029099e09b63d332289c"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                \u0027summary\u0027: err_resp.summary"},{"line_number":370,"context_line":"            }"},{"line_number":371,"context_line":"            self.statsd.increment("},{"line_number":372,"context_line":"                \u0027501.NotImplemented\u0027,"},{"line_number":373,"context_line":"                labels \u003d labels,"},{"line_number":374,"context_line":"            )"},{"line_number":375,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"4617a001_2f252b6c","line":372,"in_reply_to":"810c8397_4f6e3c5b","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"2fb0aaa1fd7251dc88a6029099e09b63d332289c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16a488367db03db1ffa16b2aad87ba156057d842","unresolved":true,"context_lines":[{"line_number":322,"context_line":"        labels, tmp_labels \u003d {}, {}"},{"line_number":323,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":324,"context_line":"            tmp_labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":325,"context_line":"        if \u0027PATH_INFO\u0027 in env:"},{"line_number":326,"context_line":"            tmp_labels[\u0027path\u0027] \u003d env.get(\u0027PATH_INFO\u0027)"},{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fce2e013_f65f36da","line":326,"range":{"start_line":325,"start_character":8,"end_line":326,"end_character":53},"updated":"2025-01-24 18:14:32.000000000","message":"If it available we might want to base this on Yan\u0027s patch to add a swift.path_parts data struct to the environ so that we can have discrete labels for account, container\n\nBut for expediency we could use the environ ``s3api|swift.backend_path`` initially","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8314a743d2b6b7f02a6f9dada83c55d10accb9d4","unresolved":false,"context_lines":[{"line_number":322,"context_line":"        labels, tmp_labels \u003d {}, {}"},{"line_number":323,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":324,"context_line":"            tmp_labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":325,"context_line":"        if \u0027PATH_INFO\u0027 in env:"},{"line_number":326,"context_line":"            tmp_labels[\u0027path\u0027] \u003d env.get(\u0027PATH_INFO\u0027)"},{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4e89fc_6554a649","line":326,"range":{"start_line":325,"start_character":8,"end_line":326,"end_character":53},"in_reply_to":"fce2e013_f65f36da","updated":"2025-01-27 20:35:32.000000000","message":"Acknowledged","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16a488367db03db1ffa16b2aad87ba156057d842","unresolved":true,"context_lines":[{"line_number":324,"context_line":"            tmp_labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":325,"context_line":"        if \u0027PATH_INFO\u0027 in env:"},{"line_number":326,"context_line":"            tmp_labels[\u0027path\u0027] \u003d env.get(\u0027PATH_INFO\u0027)"},{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"},{"line_number":330,"context_line":"            labels[temp] \u003d tmp_labels[temp]"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"dab7af77_98134a88","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":46},"updated":"2025-01-24 18:14:32.000000000","message":"hmmm, does this imply that there are ErrorResponse classes that don\u0027t have a status attribute? I\u0027d assumed that was commonly available","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            tmp_labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":325,"context_line":"        if \u0027PATH_INFO\u0027 in env:"},{"line_number":326,"context_line":"            tmp_labels[\u0027path\u0027] \u003d env.get(\u0027PATH_INFO\u0027)"},{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"},{"line_number":330,"context_line":"            labels[temp] \u003d tmp_labels[temp]"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb91368_2c3d2a42","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":46},"in_reply_to":"023493a1_9b6a8948","updated":"2025-01-29 17:24:13.000000000","message":"Done","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8314a743d2b6b7f02a6f9dada83c55d10accb9d4","unresolved":false,"context_lines":[{"line_number":324,"context_line":"            tmp_labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":325,"context_line":"        if \u0027PATH_INFO\u0027 in env:"},{"line_number":326,"context_line":"            tmp_labels[\u0027path\u0027] \u003d env.get(\u0027PATH_INFO\u0027)"},{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"},{"line_number":330,"context_line":"            labels[temp] \u003d tmp_labels[temp]"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"de0041ce_6be608ea","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":46},"in_reply_to":"dab7af77_98134a88","updated":"2025-01-27 20:35:32.000000000","message":"ErrorResponse classes do have status attribute. I put it down there to be on a safer side. I guess it isn\u0027t needed and we always have a status!","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3f7d090055c2bb17b553088870c97c49c800ef97","unresolved":true,"context_lines":[{"line_number":324,"context_line":"            tmp_labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":325,"context_line":"        if \u0027PATH_INFO\u0027 in env:"},{"line_number":326,"context_line":"            tmp_labels[\u0027path\u0027] \u003d env.get(\u0027PATH_INFO\u0027)"},{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"},{"line_number":330,"context_line":"            labels[temp] \u003d tmp_labels[temp]"},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"023493a1_9b6a8948","line":328,"range":{"start_line":327,"start_character":8,"end_line":328,"end_character":46},"in_reply_to":"de0041ce_6be608ea","updated":"2025-01-27 21:18:54.000000000","message":"There are a couple of instances that do not have any status:\n\nhttps://gitlab-master.nvidia.com/-/snippets/8464\n\nSo we may need that!","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16a488367db03db1ffa16b2aad87ba156057d842","unresolved":true,"context_lines":[{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"},{"line_number":330,"context_line":"            labels[temp] \u003d tmp_labels[temp]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        headers2stats_bucket \u003d ["},{"line_number":333,"context_line":"            # ((headers to match), increment_bucket_stat),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3b28f04d_d6520de1","line":330,"updated":"2025-01-24 18:14:32.000000000","message":"not sure what\u0027s going on here, why the two dicts?","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8314a743d2b6b7f02a6f9dada83c55d10accb9d4","unresolved":false,"context_lines":[{"line_number":327,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":328,"context_line":"            tmp_labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        for temp in tmp_labels:"},{"line_number":330,"context_line":"            labels[temp] \u003d tmp_labels[temp]"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        headers2stats_bucket \u003d ["},{"line_number":333,"context_line":"            # ((headers to match), increment_bucket_stat),"}],"source_content_type":"text/x-python","patch_set":3,"id":"36a71620_893229c5","line":330,"in_reply_to":"3b28f04d_d6520de1","updated":"2025-01-27 20:35:32.000000000","message":"My bad, the code lines were left by because of some previous change that I thought! Removed the duplication!","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16a488367db03db1ffa16b2aad87ba156057d842","unresolved":true,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        headers2stats_bucket \u003d ["},{"line_number":333,"context_line":"            # ((headers to match), increment_bucket_stat),"},{"line_number":334,"context_line":"            ((\u0027Content-MD5\u0027,), \u0027header.s3.content.md5\u0027),"},{"line_number":335,"context_line":"            ((\u0027X-Amz-Trailer\u0027,), \u0027header.s3.trailer\u0027),"},{"line_number":336,"context_line":"            ((\u0027X-Amz-Checksum-Crc32\u0027, \u0027X-Amz-Content-SHA256\u0027),"},{"line_number":337,"context_line":"             \u0027header.s3.checksum.crc32-SHA256\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"b617f48e_31157ba9","line":334,"range":{"start_line":334,"start_character":42,"end_line":334,"end_character":53},"updated":"2025-01-24 18:14:32.000000000","message":"IIRC there is a convention that a \u0027.\u0027 in metric names is used as a \u0027hierarchy\u0027 delimiter to filter metrics, so (modulo the next comment) this should be header.s3.content_md5\n\nI\u0027m not sure if the \u0027-\u0027 needs to drop to \u0027_\u0027","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8314a743d2b6b7f02a6f9dada83c55d10accb9d4","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"        headers2stats_bucket \u003d ["},{"line_number":333,"context_line":"            # ((headers to match), increment_bucket_stat),"},{"line_number":334,"context_line":"            ((\u0027Content-MD5\u0027,), \u0027header.s3.content.md5\u0027),"},{"line_number":335,"context_line":"            ((\u0027X-Amz-Trailer\u0027,), \u0027header.s3.trailer\u0027),"},{"line_number":336,"context_line":"            ((\u0027X-Amz-Checksum-Crc32\u0027, \u0027X-Amz-Content-SHA256\u0027),"},{"line_number":337,"context_line":"             \u0027header.s3.checksum.crc32-SHA256\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"10e8b364_9e1878ab","line":334,"range":{"start_line":334,"start_character":42,"end_line":334,"end_character":53},"in_reply_to":"b617f48e_31157ba9","updated":"2025-01-27 20:35:32.000000000","message":"Acknowledged","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16a488367db03db1ffa16b2aad87ba156057d842","unresolved":true,"context_lines":[{"line_number":335,"context_line":"            ((\u0027X-Amz-Trailer\u0027,), \u0027header.s3.trailer\u0027),"},{"line_number":336,"context_line":"            ((\u0027X-Amz-Checksum-Crc32\u0027, \u0027X-Amz-Content-SHA256\u0027),"},{"line_number":337,"context_line":"             \u0027header.s3.checksum.crc32-SHA256\u0027),"},{"line_number":338,"context_line":"        ]"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        if hasattr(resp, \u0027headers\u0027):"},{"line_number":341,"context_line":"            # first header existence stats"}],"source_content_type":"text/x-python","patch_set":3,"id":"001b308a_9b05dd97","line":338,"updated":"2025-01-24 18:14:32.000000000","message":"do we want several different metrics that each get labels, or a single metric with more labels? \n\ni.e. there might be a single new metric like \u0027header.s3\u0027 with label \u0027key\u0027, and key can be one of content_md5, trailer, X-Amz-Content-SHA256 etc\n\ne.g labels \u003d {X-Amz-Content-SHA256: True, X-Amz-Trailer: True}\n\nOR (perhaps better)\n\nlabels \u003d {checksum_hdr: X-Amz-Content-SHA256}","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8314a743d2b6b7f02a6f9dada83c55d10accb9d4","unresolved":false,"context_lines":[{"line_number":335,"context_line":"            ((\u0027X-Amz-Trailer\u0027,), \u0027header.s3.trailer\u0027),"},{"line_number":336,"context_line":"            ((\u0027X-Amz-Checksum-Crc32\u0027, \u0027X-Amz-Content-SHA256\u0027),"},{"line_number":337,"context_line":"             \u0027header.s3.checksum.crc32-SHA256\u0027),"},{"line_number":338,"context_line":"        ]"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        if hasattr(resp, \u0027headers\u0027):"},{"line_number":341,"context_line":"            # first header existence stats"}],"source_content_type":"text/x-python","patch_set":3,"id":"ddb540d5_62a193f7","line":338,"in_reply_to":"001b308a_9b05dd97","updated":"2025-01-27 20:35:32.000000000","message":"Acknowledged","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"16a488367db03db1ffa16b2aad87ba156057d842","unresolved":true,"context_lines":[{"line_number":435,"context_line":"            env[\u0027swift.backend_path\u0027] \u003d env[\u0027s3api.backend_path\u0027]"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        if resp:"},{"line_number":438,"context_line":"            self._emit_response_header_stats(env, resp)"},{"line_number":439,"context_line":"        return resp(env, start_response)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    def handle_request(self, req):"}],"source_content_type":"text/x-python","patch_set":3,"id":"f7b3ad1f_4b3ae1df","line":438,"range":{"start_line":438,"start_character":50,"end_line":438,"end_character":54},"updated":"2025-01-24 18:14:32.000000000","message":"I think you want to be looking at the *request* headers for the checksum-related ones we\u0027re interested in.\n\nBut emitting the stat once we have a resp means that we can label the metric with account and status_int, so this looks like the right place to be emitting the stat.","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"8314a743d2b6b7f02a6f9dada83c55d10accb9d4","unresolved":false,"context_lines":[{"line_number":435,"context_line":"            env[\u0027swift.backend_path\u0027] \u003d env[\u0027s3api.backend_path\u0027]"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        if resp:"},{"line_number":438,"context_line":"            self._emit_response_header_stats(env, resp)"},{"line_number":439,"context_line":"        return resp(env, start_response)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    def handle_request(self, req):"}],"source_content_type":"text/x-python","patch_set":3,"id":"42be9824_5dee902c","line":438,"range":{"start_line":438,"start_character":50,"end_line":438,"end_character":54},"in_reply_to":"f7b3ad1f_4b3ae1df","updated":"2025-01-27 20:35:32.000000000","message":"Acknowledged","commit_id":"a7228d9f62b62efef8ae05c69148b89016f0ec42"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":318,"context_line":"        # Not S3, apparently"},{"line_number":319,"context_line":"        return False"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _is_valid_sha256_hash(hash_string):"},{"line_number":322,"context_line":"        \"\"\""},{"line_number":323,"context_line":"        Check if the given string is a valid SHA-256 hash."},{"line_number":324,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"da6debea_fcaa8e52","line":321,"updated":"2025-01-28 15:53:19.000000000","message":"this is a class method but does not define the first arg ``self`` so can only be called as ``self._is_valid_sha256_hash()`` which makes me think it is never called in the unit test\n\nTo be valid it should be \n\n```\ndef _is_valid_sha256_hash(self, hash_string):\n```\n\nHowever, this doesn\u0027t need to be a class method (it doesn\u0027t use self) and could be shared (see s3request.py line 263) so I suggest moving this to be a function is common/middleware/s3api/utils.py","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        # Not S3, apparently"},{"line_number":319,"context_line":"        return False"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def _is_valid_sha256_hash(hash_string):"},{"line_number":322,"context_line":"        \"\"\""},{"line_number":323,"context_line":"        Check if the given string is a valid SHA-256 hash."},{"line_number":324,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"e5ac5be9_c890e569","line":321,"in_reply_to":"da6debea_fcaa8e52","updated":"2025-01-29 17:24:13.000000000","message":"Moving this to utils!","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _emit_response_header_stats(self, env, req):"},{"line_number":336,"context_line":"        labels, labels_copy \u003d {}, {}"},{"line_number":337,"context_line":"        if hasattr(req, \u0027status\u0027):"},{"line_number":338,"context_line":"            labels[\u0027status\u0027] \u003d req.status"},{"line_number":339,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":340,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"51733c75_d7ac8c3a","line":337,"updated":"2025-01-28 15:53:19.000000000","message":"status is an attribute of a swob.Response not the req","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    def _emit_response_header_stats(self, env, req):"},{"line_number":336,"context_line":"        labels, labels_copy \u003d {}, {}"},{"line_number":337,"context_line":"        if hasattr(req, \u0027status\u0027):"},{"line_number":338,"context_line":"            labels[\u0027status\u0027] \u003d req.status"},{"line_number":339,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":340,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a2f0313_868238cd","line":337,"in_reply_to":"51733c75_d7ac8c3a","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":336,"context_line":"        labels, labels_copy \u003d {}, {}"},{"line_number":337,"context_line":"        if hasattr(req, \u0027status\u0027):"},{"line_number":338,"context_line":"            labels[\u0027status\u0027] \u003d req.status"},{"line_number":339,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":340,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":341,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":342,"context_line":"            labels[\u0027path\u0027] \u003d env.get(\u0027swift.backend_path\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"43309c1d_04a1bc06","line":339,"updated":"2025-01-28 15:53:19.000000000","message":"``req.method`` is sufficient - the req will have a method","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        labels, labels_copy \u003d {}, {}"},{"line_number":337,"context_line":"        if hasattr(req, \u0027status\u0027):"},{"line_number":338,"context_line":"            labels[\u0027status\u0027] \u003d req.status"},{"line_number":339,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":340,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":341,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":342,"context_line":"            labels[\u0027path\u0027] \u003d env.get(\u0027swift.backend_path\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"a0f7192b_325f17c2","line":339,"in_reply_to":"43309c1d_04a1bc06","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"b7cc8c3d14be574447b66d6da36b78c74f30c7f9","unresolved":true,"context_lines":[{"line_number":339,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":340,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":341,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":342,"context_line":"            labels[\u0027path\u0027] \u003d env.get(\u0027swift.backend_path\u0027)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        headers2stats_bucket \u003d ["},{"line_number":345,"context_line":"            # ((headers to match), labeled_bucket_stat),"}],"source_content_type":"text/x-python","patch_set":4,"id":"250f3ce7_bd51d19a","line":342,"updated":"2025-01-28 16:02:03.000000000","message":"IIUC we don\u0027t want any label to have a high cardinality of values (I could be wrong on that?)...but backend_path is going to vary for every a/c/o - don\u0027t we need to trim this to just account/container (which is tricky)","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"147ec3963ed6c43ef3244c20e9f707b21440dabb","unresolved":true,"context_lines":[{"line_number":339,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":340,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":341,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":342,"context_line":"            labels[\u0027path\u0027] \u003d env.get(\u0027swift.backend_path\u0027)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        headers2stats_bucket \u003d ["},{"line_number":345,"context_line":"            # ((headers to match), labeled_bucket_stat),"}],"source_content_type":"text/x-python","patch_set":4,"id":"81af70cc_ae816540","line":342,"in_reply_to":"250f3ce7_bd51d19a","updated":"2025-01-28 16:51:08.000000000","message":"Clay reminded me that swift.backend_path *can* be reliably parsed for account/container/object if it is present\n\nSee proxy_logging.py#L274-L275\n\nThen we can set just ``labels[\u0027account\u0027] \u003d acc `` which has lower cardinality than the full path","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":339,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":340,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":341,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":342,"context_line":"            labels[\u0027path\u0027] \u003d env.get(\u0027swift.backend_path\u0027)"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"        headers2stats_bucket \u003d ["},{"line_number":345,"context_line":"            # ((headers to match), labeled_bucket_stat),"}],"source_content_type":"text/x-python","patch_set":4,"id":"74688da2_b03512f9","line":342,"in_reply_to":"81af70cc_ae816540","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":352,"context_line":"             \u0027x_amz_sdk_checksum_algorithm\u0027),"},{"line_number":353,"context_line":"        ]"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        if hasattr(req, \u0027headers\u0027):"},{"line_number":356,"context_line":"            # first header existence stats"},{"line_number":357,"context_line":"            for headers, bucket in headers2stats_bucket:"},{"line_number":358,"context_line":"                if all([header in req.headers for header in headers]):"}],"source_content_type":"text/x-python","patch_set":4,"id":"589c6df2_52157432","line":355,"updated":"2025-01-28 15:53:19.000000000","message":"or \n\n```\nreq_headers \u003d HeaderEnvironProxy(env)\n```","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":352,"context_line":"             \u0027x_amz_sdk_checksum_algorithm\u0027),"},{"line_number":353,"context_line":"        ]"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"        if hasattr(req, \u0027headers\u0027):"},{"line_number":356,"context_line":"            # first header existence stats"},{"line_number":357,"context_line":"            for headers, bucket in headers2stats_bucket:"},{"line_number":358,"context_line":"                if all([header in req.headers for header in headers]):"}],"source_content_type":"text/x-python","patch_set":4,"id":"eb6fd01f_630078d3","line":355,"in_reply_to":"589c6df2_52157432","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":355,"context_line":"        if hasattr(req, \u0027headers\u0027):"},{"line_number":356,"context_line":"            # first header existence stats"},{"line_number":357,"context_line":"            for headers, bucket in headers2stats_bucket:"},{"line_number":358,"context_line":"                if all([header in req.headers for header in headers]):"},{"line_number":359,"context_line":"                    labels_copy.clear()"},{"line_number":360,"context_line":"                    labels_copy \u003d labels"},{"line_number":361,"context_line":"                    labels_copy[\u0027headers\u0027] \u003d bucket"}],"source_content_type":"text/x-python","patch_set":4,"id":"04a4cd4d_18320b5c","line":358,"range":{"start_line":358,"start_character":19,"end_line":358,"end_character":22},"updated":"2025-01-28 15:53:19.000000000","message":"I only see one header in each item in headers2stats. But even if there were more than one, do we require them `all` to be present or just `any` to be present in order add a label?","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        if hasattr(req, \u0027headers\u0027):"},{"line_number":356,"context_line":"            # first header existence stats"},{"line_number":357,"context_line":"            for headers, bucket in headers2stats_bucket:"},{"line_number":358,"context_line":"                if all([header in req.headers for header in headers]):"},{"line_number":359,"context_line":"                    labels_copy.clear()"},{"line_number":360,"context_line":"                    labels_copy \u003d labels"},{"line_number":361,"context_line":"                    labels_copy[\u0027headers\u0027] \u003d bucket"}],"source_content_type":"text/x-python","patch_set":4,"id":"57ddb2e9_b0a6b50b","line":358,"range":{"start_line":358,"start_character":19,"end_line":358,"end_character":22},"in_reply_to":"04a4cd4d_18320b5c","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":357,"context_line":"            for headers, bucket in headers2stats_bucket:"},{"line_number":358,"context_line":"                if all([header in req.headers for header in headers]):"},{"line_number":359,"context_line":"                    labels_copy.clear()"},{"line_number":360,"context_line":"                    labels_copy \u003d labels"},{"line_number":361,"context_line":"                    labels_copy[\u0027headers\u0027] \u003d bucket"},{"line_number":362,"context_line":"                    self.statsd.increment(\"swift_s3_checksum_algo_request\","},{"line_number":363,"context_line":"                                          labels_copy)"}],"source_content_type":"text/x-python","patch_set":4,"id":"592eda96_d0a881bc","line":360,"updated":"2025-01-28 15:53:19.000000000","message":"better to get a fresh copy by writing:\n\n```\nlabels_copy \u003d dict(labels)\n```\n\nand then you could even write\n\n```\nlabels_copy \u003d dict(labels, headers\u003dbucket)\n```\n\nif you feel you need to make a copy every time.\n\nAlternatively, to avoid copying dicts, just init a new dict each time with all the keys (req,  status, headers).","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            for headers, bucket in headers2stats_bucket:"},{"line_number":358,"context_line":"                if all([header in req.headers for header in headers]):"},{"line_number":359,"context_line":"                    labels_copy.clear()"},{"line_number":360,"context_line":"                    labels_copy \u003d labels"},{"line_number":361,"context_line":"                    labels_copy[\u0027headers\u0027] \u003d bucket"},{"line_number":362,"context_line":"                    self.statsd.increment(\"swift_s3_checksum_algo_request\","},{"line_number":363,"context_line":"                                          labels_copy)"}],"source_content_type":"text/x-python","patch_set":4,"id":"041841f2_e3c84c50","line":360,"in_reply_to":"592eda96_d0a881bc","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":413,"context_line":"            req_class \u003d get_request_class(env, self.conf.s3_acl)"},{"line_number":414,"context_line":"            req \u003d req_class(env, self.app, self.conf)"},{"line_number":415,"context_line":"            resp \u003d self.handle_request(req)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        except NotS3Request:"},{"line_number":418,"context_line":"            resp \u003d self.app"},{"line_number":419,"context_line":"        except InvalidSubresource as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"53e4ad53_0026505e","line":416,"updated":"2025-01-28 15:53:19.000000000","message":"unnecessary whitespace","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            req_class \u003d get_request_class(env, self.conf.s3_acl)"},{"line_number":414,"context_line":"            req \u003d req_class(env, self.app, self.conf)"},{"line_number":415,"context_line":"            resp \u003d self.handle_request(req)"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        except NotS3Request:"},{"line_number":418,"context_line":"            resp \u003d self.app"},{"line_number":419,"context_line":"        except InvalidSubresource as e:"}],"source_content_type":"text/x-python","patch_set":4,"id":"689bdd79_78674c8a","line":416,"in_reply_to":"53e4ad53_0026505e","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":430,"context_line":"            self.statsd.increment("},{"line_number":431,"context_line":"                \u0027swift_s3_checksum_algo_request_some_name\u0027,"},{"line_number":432,"context_line":"                labels\u003dlabels,"},{"line_number":433,"context_line":"            )"},{"line_number":434,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"},{"line_number":435,"context_line":"            if isinstance(err_resp, InternalError):"},{"line_number":436,"context_line":"                self.logger.exception(err_resp)"}],"source_content_type":"text/x-python","patch_set":4,"id":"2be2c8a5_7f3e1c21","line":433,"updated":"2025-01-28 15:53:19.000000000","message":"So this looks like a labeled version of the legacy state emitted at line 429? I don\u0027t think it has anything to do with checksum algos. Could be ``swift_s3_err_resp``??","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":430,"context_line":"            self.statsd.increment("},{"line_number":431,"context_line":"                \u0027swift_s3_checksum_algo_request_some_name\u0027,"},{"line_number":432,"context_line":"                labels\u003dlabels,"},{"line_number":433,"context_line":"            )"},{"line_number":434,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"},{"line_number":435,"context_line":"            if isinstance(err_resp, InternalError):"},{"line_number":436,"context_line":"                self.logger.exception(err_resp)"}],"source_content_type":"text/x-python","patch_set":4,"id":"2ff3bccd_58daf664","line":433,"in_reply_to":"2be2c8a5_7f3e1c21","updated":"2025-01-29 17:24:13.000000000","message":"Acknowledged","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":447,"context_line":"            env[\u0027swift.backend_path\u0027] \u003d env[\u0027s3api.backend_path\u0027]"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        try:"},{"line_number":450,"context_line":"            if resp:"},{"line_number":451,"context_line":"                self._emit_response_header_stats(env, req)"},{"line_number":452,"context_line":"        except Exception as e:"},{"line_number":453,"context_line":"            self.logger.exception(e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa92e749_1f5ad853","line":450,"updated":"2025-01-28 15:53:19.000000000","message":"there must always be a resp otherwise line 455 would blow up","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":447,"context_line":"            env[\u0027swift.backend_path\u0027] \u003d env[\u0027s3api.backend_path\u0027]"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        try:"},{"line_number":450,"context_line":"            if resp:"},{"line_number":451,"context_line":"                self._emit_response_header_stats(env, req)"},{"line_number":452,"context_line":"        except Exception as e:"},{"line_number":453,"context_line":"            self.logger.exception(e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"2566232e_bf0753c3","line":450,"in_reply_to":"fa92e749_1f5ad853","updated":"2025-01-29 17:24:13.000000000","message":"Done","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        try:"},{"line_number":450,"context_line":"            if resp:"},{"line_number":451,"context_line":"                self._emit_response_header_stats(env, req)"},{"line_number":452,"context_line":"        except Exception as e:"},{"line_number":453,"context_line":"            self.logger.exception(e)"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"afe11714_483e6dc4","line":451,"updated":"2025-01-28 15:53:19.000000000","message":"I expected the signature to be ``(env, resp)``\n\n``req`` may not be defined (see line 414 may raise an exception)\n\n``resp`` is needed because it gives us the status int","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"f9d026e4249c854720245bb141c6a9ec4aca1ce3","unresolved":false,"context_lines":[{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        try:"},{"line_number":450,"context_line":"            if resp:"},{"line_number":451,"context_line":"                self._emit_response_header_stats(env, req)"},{"line_number":452,"context_line":"        except Exception as e:"},{"line_number":453,"context_line":"            self.logger.exception(e)"},{"line_number":454,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"421b95af_0ea46a88","line":451,"in_reply_to":"afe11714_483e6dc4","updated":"2025-01-29 17:24:13.000000000","message":"Done","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":323,"context_line":"        labels \u003d {}"},{"line_number":324,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":325,"context_line":"            # (Pdb) resp.method/ resp.status"},{"line_number":326,"context_line":"            # *** AttributeError: \u0027ListingEtagMiddleware\u0027"},{"line_number":327,"context_line":"            # object has no attribute \u0027method\u0027 or \u0027status\u0027"},{"line_number":328,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"}],"source_content_type":"text/x-python","patch_set":6,"id":"8783c5cf_9e30fe1f","line":326,"updated":"2025-01-29 21:24:19.000000000","message":"sounds like a test bug somehow...","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":323,"context_line":"        labels \u003d {}"},{"line_number":324,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":325,"context_line":"            # (Pdb) resp.method/ resp.status"},{"line_number":326,"context_line":"            # *** AttributeError: \u0027ListingEtagMiddleware\u0027"},{"line_number":327,"context_line":"            # object has no attribute \u0027method\u0027 or \u0027status\u0027"},{"line_number":328,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ee2ef449_4694c5ad","line":326,"in_reply_to":"5ede476a_07770a11","updated":"2025-01-31 16:22:41.000000000","message":"Code bug rather than test bug...the tests are not using s3 requests, so the s3api middleware does not want to handle them and \u0027resp\u0027 is actually self.app, which is ListingEtagMiddleware.\n\nWe don\u0027t want to get here for non-s3-requests (unless we want t ocount metrics for weird Swift requests that have s3 headers??)","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":true,"context_lines":[{"line_number":323,"context_line":"        labels \u003d {}"},{"line_number":324,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":325,"context_line":"            # (Pdb) resp.method/ resp.status"},{"line_number":326,"context_line":"            # *** AttributeError: \u0027ListingEtagMiddleware\u0027"},{"line_number":327,"context_line":"            # object has no attribute \u0027method\u0027 or \u0027status\u0027"},{"line_number":328,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"}],"source_content_type":"text/x-python","patch_set":6,"id":"5ede476a_07770a11","line":326,"in_reply_to":"8783c5cf_9e30fe1f","updated":"2025-01-30 22:52:51.000000000","message":"Just these 3 tests:\nTestListingMiddleware::test_s3_etag_in_json\nTestListingMiddleware::test_s3_etag_non_json\nTestS3ApiMiddleware::test_non_s3_request_passthrough","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        labels \u003d {}"},{"line_number":324,"context_line":"        if hasattr(resp, \u0027status\u0027):"},{"line_number":325,"context_line":"            # (Pdb) resp.method/ resp.status"},{"line_number":326,"context_line":"            # *** AttributeError: \u0027ListingEtagMiddleware\u0027"},{"line_number":327,"context_line":"            # object has no attribute \u0027method\u0027 or \u0027status\u0027"},{"line_number":328,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fe642b7a_b07dbc0e","line":326,"in_reply_to":"ee2ef449_4694c5ad","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":326,"context_line":"            # *** AttributeError: \u0027ListingEtagMiddleware\u0027"},{"line_number":327,"context_line":"            # object has no attribute \u0027method\u0027 or \u0027status\u0027"},{"line_number":328,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":330,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":331,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":332,"context_line":"            path \u003d env.get(\u0027swift.backend_path\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e089c4db_45e3783b","line":329,"updated":"2025-01-29 21:24:19.000000000","message":"can you have an env w/o REQUEST_METHOD?\n\nmaybe reasonable to be defensive, or `resp.req.method` might even be a thing.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":false,"context_lines":[{"line_number":326,"context_line":"            # *** AttributeError: \u0027ListingEtagMiddleware\u0027"},{"line_number":327,"context_line":"            # object has no attribute \u0027method\u0027 or \u0027status\u0027"},{"line_number":328,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":330,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":331,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":332,"context_line":"            path \u003d env.get(\u0027swift.backend_path\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"2bc6fbbb_fd9618c1","line":329,"in_reply_to":"5996b02d_2bb3280c","updated":"2025-01-31 15:43:12.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":true,"context_lines":[{"line_number":326,"context_line":"            # *** AttributeError: \u0027ListingEtagMiddleware\u0027"},{"line_number":327,"context_line":"            # object has no attribute \u0027method\u0027 or \u0027status\u0027"},{"line_number":328,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":329,"context_line":"        if \u0027REQUEST_METHOD\u0027 in env:"},{"line_number":330,"context_line":"            labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":331,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":332,"context_line":"            path \u003d env.get(\u0027swift.backend_path\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5996b02d_2bb3280c","line":329,"in_reply_to":"e089c4db_45e3783b","updated":"2025-01-30 22:52:51.000000000","message":"It seems env always has a \u0027REQUEST_METHOD\u0027\nresp.method: sometimes\nresp.req.method: never","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":336,"context_line":"                acc \u003d path.split(\"/\")[-3]"},{"line_number":337,"context_line":"                labels[\u0027account\u0027] \u003d acc"},{"line_number":338,"context_line":"                labels[\u0027container\u0027] \u003d cont"},{"line_number":339,"context_line":"                labels[\u0027object\u0027] \u003d obj"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        headers2stats_bucket \u003d {"},{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"}],"source_content_type":"text/x-python","patch_set":6,"id":"e1c9d6cf_b56c44f2","line":339,"updated":"2025-01-29 21:24:19.000000000","message":"we never put object in labels.\n\nwe always use utils.split_path when parsing swift paths - look to proxy-logging for existing examples.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":336,"context_line":"                acc \u003d path.split(\"/\")[-3]"},{"line_number":337,"context_line":"                labels[\u0027account\u0027] \u003d acc"},{"line_number":338,"context_line":"                labels[\u0027container\u0027] \u003d cont"},{"line_number":339,"context_line":"                labels[\u0027object\u0027] \u003d obj"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        headers2stats_bucket \u003d {"},{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"}],"source_content_type":"text/x-python","patch_set":6,"id":"2c122d5f_65b8936b","line":339,"in_reply_to":"e1c9d6cf_b56c44f2","updated":"2025-01-30 22:52:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":338,"context_line":"                labels[\u0027container\u0027] \u003d cont"},{"line_number":339,"context_line":"                labels[\u0027object\u0027] \u003d obj"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        headers2stats_bucket \u003d {"},{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"},{"line_number":343,"context_line":"            \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":344,"context_line":"            \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"82292763_b8e88215","line":341,"updated":"2025-01-29 21:24:19.000000000","message":"if you want to be able to pull header keys out of this map directly you should probably make this a HeaderKeyDict - you could also make it a constant.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                labels[\u0027container\u0027] \u003d cont"},{"line_number":339,"context_line":"                labels[\u0027object\u0027] \u003d obj"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        headers2stats_bucket \u003d {"},{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"},{"line_number":343,"context_line":"            \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":344,"context_line":"            \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"64250a63_a9a6606b","line":341,"in_reply_to":"82292763_b8e88215","updated":"2025-01-30 22:52:51.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        headers2stats_bucket \u003d {"},{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"},{"line_number":343,"context_line":"            \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":344,"context_line":"            \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"},{"line_number":345,"context_line":"            \u0027X-Amz-Checksum-Crc32\u0027: \u0027header_x_amz_checksum_crc32\u0027,"},{"line_number":346,"context_line":"            \u0027Content-Encoding\u0027: \u0027header_content_encoding\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"e7fea08f_19b703b6","line":343,"updated":"2025-01-29 21:24:19.000000000","message":"this one might be tough to classify... I see values like:\n\n```\n\u0027Authorization\u0027: b\u0027AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250124/us-east-1/s3/aws4_request, SignedHeaders\u003dhost;x-amz-checksum-sha1;x-amz-content-sha256;x-amz-date;x-amz-sdk-checksum-algorithm, Signature\u003d3b02e811d8a5279ee9c360c6ae1d915f4f66e3e5a001f001951b8465f52f2f99\u0027,\n```","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        headers2stats_bucket \u003d {"},{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"},{"line_number":343,"context_line":"            \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":344,"context_line":"            \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"},{"line_number":345,"context_line":"            \u0027X-Amz-Checksum-Crc32\u0027: \u0027header_x_amz_checksum_crc32\u0027,"},{"line_number":346,"context_line":"            \u0027Content-Encoding\u0027: \u0027header_content_encoding\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ec470cdb_200a4da9","line":343,"in_reply_to":"aee85c44_e9553b92","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":true,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        headers2stats_bucket \u003d {"},{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"},{"line_number":343,"context_line":"            \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":344,"context_line":"            \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"},{"line_number":345,"context_line":"            \u0027X-Amz-Checksum-Crc32\u0027: \u0027header_x_amz_checksum_crc32\u0027,"},{"line_number":346,"context_line":"            \u0027Content-Encoding\u0027: \u0027header_content_encoding\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"aee85c44_e9553b92","line":343,"in_reply_to":"e7fea08f_19b703b6","updated":"2025-01-30 22:52:51.000000000","message":"Do we need \u0027Authorization\u0027 as a label? As we had discussed, I hadn\u0027t added it prior, but Matt had added it in his code. So I added that as an extra way of tracking. Happy to remove it if we don\u0027t want it!","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"},{"line_number":343,"context_line":"            \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":344,"context_line":"            \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"},{"line_number":345,"context_line":"            \u0027X-Amz-Checksum-Crc32\u0027: \u0027header_x_amz_checksum_crc32\u0027,"},{"line_number":346,"context_line":"            \u0027Content-Encoding\u0027: \u0027header_content_encoding\u0027,"},{"line_number":347,"context_line":"            \u0027Transfer-Encoding\u0027: \u0027header_transfer_encoding\u0027,"},{"line_number":348,"context_line":"            \u0027X-Amz-Trailer\u0027: \u0027header_swift_s3_trailer\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7b8cc17d_c6b56aa7","line":345,"updated":"2025-01-29 21:24:19.000000000","message":"I\u0027m also seeing at least `x-amz-checksum-sha1` and `x-amz-checksum-crc32`\n\nwe might want to \"make up\" `x-amz-checksum-md5` for exhaustiveness.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2f8c4ddace0095b6ae3461adb9ce6ad7c04e258e","unresolved":false,"context_lines":[{"line_number":342,"context_line":"            # (headers to match, labeled_bucket_stat),"},{"line_number":343,"context_line":"            \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":344,"context_line":"            \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"},{"line_number":345,"context_line":"            \u0027X-Amz-Checksum-Crc32\u0027: \u0027header_x_amz_checksum_crc32\u0027,"},{"line_number":346,"context_line":"            \u0027Content-Encoding\u0027: \u0027header_content_encoding\u0027,"},{"line_number":347,"context_line":"            \u0027Transfer-Encoding\u0027: \u0027header_transfer_encoding\u0027,"},{"line_number":348,"context_line":"            \u0027X-Amz-Trailer\u0027: \u0027header_swift_s3_trailer\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9ba7be46_67937043","line":345,"in_reply_to":"7b8cc17d_c6b56aa7","updated":"2025-01-31 01:03:01.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":350,"context_line":"             \u0027header_x_amz_sdk_checksum_algorithm\u0027,"},{"line_number":351,"context_line":"            \u0027V4aStreamingBodySha256\u0027: \u0027header_v4a_streaming_body_SHA256\u0027,"},{"line_number":352,"context_line":"            \u0027V4aStreamingBodySha256WithTrailer\u0027:"},{"line_number":353,"context_line":"                \u0027header_v4a_streaming_body_SHA256_with_trailer\u0027"},{"line_number":354,"context_line":"        }"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        if hasattr(resp, \u0027headers\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"19bea4ef_2e937f02","line":353,"updated":"2025-01-29 21:24:19.000000000","message":"I don\u0027t think these are headers - these are the names of constants in defined in the aws-sdk-net:\n\nhttps://github.com/aws/aws-sdk-net/blob/main/sdk/src/Core/Amazon.Runtime/Internal/Auth/AWS4Signer.cs#L33-L55\n\nI think they\u0027re used to decide what should be sent fo the value of the \"x-amz-content-sha256 header\"\n\nhttps://github.com/aws/aws-sdk-net/blob/main/extensions/src/AWSSDK.Extensions.CrtIntegration/CrtAWS4aSigner.cs#L127-L130","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"e906023cd5df7a66c4e2fe7f5ab3c1d112b3716c","unresolved":false,"context_lines":[{"line_number":350,"context_line":"             \u0027header_x_amz_sdk_checksum_algorithm\u0027,"},{"line_number":351,"context_line":"            \u0027V4aStreamingBodySha256\u0027: \u0027header_v4a_streaming_body_SHA256\u0027,"},{"line_number":352,"context_line":"            \u0027V4aStreamingBodySha256WithTrailer\u0027:"},{"line_number":353,"context_line":"                \u0027header_v4a_streaming_body_SHA256_with_trailer\u0027"},{"line_number":354,"context_line":"        }"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        if hasattr(resp, \u0027headers\u0027):"}],"source_content_type":"text/x-python","patch_set":6,"id":"eb2deab1_17b84e9b","line":353,"in_reply_to":"19bea4ef_2e937f02","updated":"2025-01-30 23:36:42.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":353,"context_line":"                \u0027header_v4a_streaming_body_SHA256_with_trailer\u0027"},{"line_number":354,"context_line":"        }"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        if hasattr(resp, \u0027headers\u0027):"},{"line_number":357,"context_line":"            req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"b01949c0_cd3c46e4","line":356,"updated":"2025-01-29 21:24:19.000000000","message":"this seems *really* defensive; I try to start with code that will *blow up loudly* when I have a bug - and only add defensiveness when I can convince myself that it\u0027s NOT a bug for a resp to not have a headers attribute (how is it not a bug for a response not to have a headers attribute!?)","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":353,"context_line":"                \u0027header_v4a_streaming_body_SHA256_with_trailer\u0027"},{"line_number":354,"context_line":"        }"},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"        if hasattr(resp, \u0027headers\u0027):"},{"line_number":357,"context_line":"            req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"}],"source_content_type":"text/x-python","patch_set":6,"id":"15e1ae79_088cdbf5","line":356,"in_reply_to":"b01949c0_cd3c46e4","updated":"2025-01-30 22:52:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":356,"context_line":"        if hasattr(resp, \u0027headers\u0027):"},{"line_number":357,"context_line":"            req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"},{"line_number":360,"context_line":"                    labels.clear()"},{"line_number":361,"context_line":"                    if key \u003d\u003d header:"},{"line_number":362,"context_line":"                        labels[\u0027status\u0027] \u003d \u0027200\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"324c8ef7_f9395dd2","line":359,"updated":"2025-01-29 21:24:19.000000000","message":"does the order of this O(n2) loop loops matter in terms of runtime?\n\nmaybe we can use the index\u0027d nature of a map to our advantage:\n\n```\nfor k, v in req_headers.items():\n   metric_label \u003d headers2stats_bucket.get(k)\n   if not metric_label:\n       continue\n   labels[metric_label] \u003d classify_value(v)\n```","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":356,"context_line":"        if hasattr(resp, \u0027headers\u0027):"},{"line_number":357,"context_line":"            req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"},{"line_number":360,"context_line":"                    labels.clear()"},{"line_number":361,"context_line":"                    if key \u003d\u003d header:"},{"line_number":362,"context_line":"                        labels[\u0027status\u0027] \u003d \u0027200\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"76cf73de_f327c194","line":359,"in_reply_to":"324c8ef7_f9395dd2","updated":"2025-01-30 22:52:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":357,"context_line":"            req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"},{"line_number":360,"context_line":"                    labels.clear()"},{"line_number":361,"context_line":"                    if key \u003d\u003d header:"},{"line_number":362,"context_line":"                        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":363,"context_line":"                        labels[\u0027method\u0027] \u003d \u0027GET\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"d63d1bd6_fd2cffa1","line":360,"updated":"2025-01-29 21:24:19.000000000","message":"a) I didn\u0027t even know dict *had* a clear method!  Apparently it\u0027s not something you need very often when creating a new dict is probably most of the time going to be more memory efficient.\n\n```\n\u003e\u003e\u003e d \u003d {\u0027foo\u0027: \u0027bar\u0027}\n\u003e\u003e\u003e d\n{\u0027foo\u0027: \u0027bar\u0027}\n\u003e\u003e\u003e d.clear()\n\u003e\u003e\u003e d\n{}\n```\n\nb) why are we throwing away all the work we just did for every req header multiple times?","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":357,"context_line":"            req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"},{"line_number":360,"context_line":"                    labels.clear()"},{"line_number":361,"context_line":"                    if key \u003d\u003d header:"},{"line_number":362,"context_line":"                        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":363,"context_line":"                        labels[\u0027method\u0027] \u003d \u0027GET\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"835bfb10_37ffe4d3","line":360,"in_reply_to":"d63d1bd6_fd2cffa1","updated":"2025-01-30 22:52:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"},{"line_number":360,"context_line":"                    labels.clear()"},{"line_number":361,"context_line":"                    if key \u003d\u003d header:"},{"line_number":362,"context_line":"                        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":363,"context_line":"                        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":364,"context_line":"                        labels[bucket] \u003d value"}],"source_content_type":"text/x-python","patch_set":6,"id":"f225b0f5_20ad0d9b","line":361,"updated":"2025-01-29 21:24:19.000000000","message":"how is this Comparision handling the case-insensitivity of headers?\n\n```\n\u003e\u003e\u003e CHECKSUM_METRIC_HEADER_MAP \u003d HeaderKeyDict({\u0027x-amz-content-sha256\u0027: \u0027header_x_amz_content_sha256\u0027})\n\u003e\u003e\u003e \u0027X-Amz-Content-Sha256\u0027 in CHECKSUM_METRIC_HEADER_MAP\nTrue\n\u003e\u003e\u003e \u0027x-aMz-conTent-shA256\u0027 in CHECKSUM_METRIC_HEADER_MAP\nTrue\n```","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            for header, bucket in headers2stats_bucket.items():"},{"line_number":359,"context_line":"                for key, value in req_headers.items():"},{"line_number":360,"context_line":"                    labels.clear()"},{"line_number":361,"context_line":"                    if key \u003d\u003d header:"},{"line_number":362,"context_line":"                        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":363,"context_line":"                        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":364,"context_line":"                        labels[bucket] \u003d value"}],"source_content_type":"text/x-python","patch_set":6,"id":"af04bc63_f6f50977","line":361,"in_reply_to":"f225b0f5_20ad0d9b","updated":"2025-01-30 22:52:51.000000000","message":"if key.casefold() in header.casefold():\n                    labels[bucket] \u003d value","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":363,"context_line":"                        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":364,"context_line":"                        labels[bucket] \u003d value"},{"line_number":365,"context_line":"                        self.statsd.increment("},{"line_number":366,"context_line":"                            \"swift_s3_checksum_algo_request\", labels)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"            sha256_value \u003d resp.headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":369,"context_line":"            if sha256_value is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"98f9d6c9_fe77ef5c","line":366,"updated":"2025-01-29 21:24:19.000000000","message":"this doesn\u0027t look right - we should only call `increment` once per env/resp","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":363,"context_line":"                        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":364,"context_line":"                        labels[bucket] \u003d value"},{"line_number":365,"context_line":"                        self.statsd.increment("},{"line_number":366,"context_line":"                            \"swift_s3_checksum_algo_request\", labels)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"            sha256_value \u003d resp.headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":369,"context_line":"            if sha256_value is not None:"}],"source_content_type":"text/x-python","patch_set":6,"id":"59e6248b_412ec705","line":366,"in_reply_to":"98f9d6c9_fe77ef5c","updated":"2025-01-30 22:52:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":365,"context_line":"                        self.statsd.increment("},{"line_number":366,"context_line":"                            \"swift_s3_checksum_algo_request\", labels)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"            sha256_value \u003d resp.headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":369,"context_line":"            if sha256_value is not None:"},{"line_number":370,"context_line":"                labels.clear()"},{"line_number":371,"context_line":"                if sha256_value \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"b66aef0f_d390358b","line":368,"updated":"2025-01-29 21:24:19.000000000","message":"it really seems to me like this header should just go in the main loop with all the other `CHECKSUM_METRIC_HEADER_MAP` keys we care about.\n\nFor any given header we care about either it\u0027s a `WELL_KNOWN_SPECIFIC_VALUES` and that\u0027s the label value, or we should try and `classify_checksum_header_value` and use that as the label value.\n\nThen after we\u0027ve accumulated ALL the labels for all the headers we care about and classified their values we emit a single labeled metric with those labels.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                        self.statsd.increment("},{"line_number":366,"context_line":"                            \"swift_s3_checksum_algo_request\", labels)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"            sha256_value \u003d resp.headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":369,"context_line":"            if sha256_value is not None:"},{"line_number":370,"context_line":"                labels.clear()"},{"line_number":371,"context_line":"                if sha256_value \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"}],"source_content_type":"text/x-python","patch_set":6,"id":"d602f93b_d763a1c6","line":368,"in_reply_to":"b66aef0f_d390358b","updated":"2025-01-30 22:52:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":368,"context_line":"            sha256_value \u003d resp.headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":369,"context_line":"            if sha256_value is not None:"},{"line_number":370,"context_line":"                labels.clear()"},{"line_number":371,"context_line":"                if sha256_value \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"},{"line_number":372,"context_line":"                    labels[\u0027header_x_amz_content_SHA256\u0027] \u003d \\"},{"line_number":373,"context_line":"                        \u0027checksum_SHA256_streaming_unsigned_payload_trailer\u0027"},{"line_number":374,"context_line":"                    self.statsd.increment(\"swift_s3_checksum_algo_request\","}],"source_content_type":"text/x-python","patch_set":6,"id":"34186966_fc8073a8","line":371,"updated":"2025-01-29 21:24:19.000000000","message":"I think when the value of a header is a known value we can just use THAT as the value of the label.\n\ni.e.\n\n```\nif value in WELL_KNOWN_SPECIFIC_VALUES:\n    labels[\u0027header_x_amz_content_sha256\u0027] \u003d value\n```\n\nN.B. I could see some case normalization being reasonable... like we don\u0027t want different counters for `STREAMING-UNSIGNED-PAYLOAD-TRAILER` and `streaming-unsigned-payload-trailer` although *probably* we want `streaming-unsigned-payload-trailer` to go in `unknown` - and only start counting it if clients are really sending that!","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":368,"context_line":"            sha256_value \u003d resp.headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":369,"context_line":"            if sha256_value is not None:"},{"line_number":370,"context_line":"                labels.clear()"},{"line_number":371,"context_line":"                if sha256_value \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"},{"line_number":372,"context_line":"                    labels[\u0027header_x_amz_content_SHA256\u0027] \u003d \\"},{"line_number":373,"context_line":"                        \u0027checksum_SHA256_streaming_unsigned_payload_trailer\u0027"},{"line_number":374,"context_line":"                    self.statsd.increment(\"swift_s3_checksum_algo_request\","}],"source_content_type":"text/x-python","patch_set":6,"id":"d960b7c6_a745322b","line":371,"in_reply_to":"34186966_fc8073a8","updated":"2025-01-30 22:52:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":380,"context_line":"                                          labels)"},{"line_number":381,"context_line":"                elif is_valid_sha256_hash(sha256_value):"},{"line_number":382,"context_line":"                    labels[\u0027header_x_amz_content_SHA256\u0027] \u003d \\"},{"line_number":383,"context_line":"                        \u0027checksum_SHA256_valid_hash\u0027"},{"line_number":384,"context_line":"                    self.statsd.increment(\"swift_s3_checksum_algo_request\","},{"line_number":385,"context_line":"                                          labels)"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7c5fa88a_db9742b6","line":383,"updated":"2025-01-29 21:24:19.000000000","message":"this part looks right, because we\u0027ve already collected a decent sized set of valid values and I think we\u0027ll probably have to grow it over time; I would suggest a slightly shorter normalized form like...\n\n```\ndef classify_checksum_header_value(value):\n    if is_hash(value):\n       if len(value) in valid_lengths:\n           return \u0027hash_%d\u0027 % len(value)\n    elif is_b64(value):\n        if len(value) in valid_lenghts:\n            return \u0027b64_%d\u0027 % len(value)\n    return \u0027unknown\u0027\n    \nif value not in WELL_KNOWN_SPECIFIC_VALUES:\n    # we\u0027ve already determined this is a header care about, so\n    # if we can\u0027t classify the value this will return \"unknown\"\n    value \u003d classify_checksum_header_value(value)\nlabels[metric_label] \u003d value\n```","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2f8c4ddace0095b6ae3461adb9ce6ad7c04e258e","unresolved":false,"context_lines":[{"line_number":380,"context_line":"                                          labels)"},{"line_number":381,"context_line":"                elif is_valid_sha256_hash(sha256_value):"},{"line_number":382,"context_line":"                    labels[\u0027header_x_amz_content_SHA256\u0027] \u003d \\"},{"line_number":383,"context_line":"                        \u0027checksum_SHA256_valid_hash\u0027"},{"line_number":384,"context_line":"                    self.statsd.increment(\"swift_s3_checksum_algo_request\","},{"line_number":385,"context_line":"                                          labels)"},{"line_number":386,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"82ad43d8_74fbeb1f","line":383,"in_reply_to":"7c5fa88a_db9742b6","updated":"2025-01-31 01:03:01.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"9fa71651d44c1fc5cac66bc116fa79b29878f98d","unresolved":true,"context_lines":[{"line_number":388,"context_line":"        origin \u003d env.get(\u0027HTTP_ORIGIN\u0027)"},{"line_number":389,"context_line":"        if self.conf.cors_preflight_allow_origin and \\"},{"line_number":390,"context_line":"                self.is_s3_cors_preflight(env):"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"            # I guess it\u0027s likely going to be an S3 request? *shrug*"},{"line_number":393,"context_line":"            if self.conf.cors_preflight_allow_origin !\u003d [\u0027*\u0027] and \\"},{"line_number":394,"context_line":"                    origin not in self.conf.cors_preflight_allow_origin:"}],"source_content_type":"text/x-python","patch_set":6,"id":"b0a5abd0_9db865b7","line":391,"updated":"2025-01-29 19:24:57.000000000","message":"Unnecessary","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":388,"context_line":"        origin \u003d env.get(\u0027HTTP_ORIGIN\u0027)"},{"line_number":389,"context_line":"        if self.conf.cors_preflight_allow_origin and \\"},{"line_number":390,"context_line":"                self.is_s3_cors_preflight(env):"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"            # I guess it\u0027s likely going to be an S3 request? *shrug*"},{"line_number":393,"context_line":"            if self.conf.cors_preflight_allow_origin !\u003d [\u0027*\u0027] and \\"},{"line_number":394,"context_line":"                    origin not in self.conf.cors_preflight_allow_origin:"}],"source_content_type":"text/x-python","patch_set":6,"id":"c2e6f319_0c06affe","line":391,"in_reply_to":"b0a5abd0_9db865b7","updated":"2025-01-30 22:52:51.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"9fa71651d44c1fc5cac66bc116fa79b29878f98d","unresolved":true,"context_lines":[{"line_number":418,"context_line":"            req_class \u003d get_request_class(env, self.conf.s3_acl)"},{"line_number":419,"context_line":"            req \u003d req_class(env, self.app, self.conf)"},{"line_number":420,"context_line":"            resp \u003d self.handle_request(req)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        except NotS3Request:"},{"line_number":423,"context_line":"            resp \u003d self.app"},{"line_number":424,"context_line":"        except InvalidSubresource as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"6d623a01_f3071061","line":421,"updated":"2025-01-29 19:24:57.000000000","message":"Unnecessary","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":418,"context_line":"            req_class \u003d get_request_class(env, self.conf.s3_acl)"},{"line_number":419,"context_line":"            req \u003d req_class(env, self.app, self.conf)"},{"line_number":420,"context_line":"            resp \u003d self.handle_request(req)"},{"line_number":421,"context_line":""},{"line_number":422,"context_line":"        except NotS3Request:"},{"line_number":423,"context_line":"            resp \u003d self.app"},{"line_number":424,"context_line":"        except InvalidSubresource as e:"}],"source_content_type":"text/x-python","patch_set":6,"id":"bf1f1c0c_80c4edab","line":421,"in_reply_to":"6d623a01_f3071061","updated":"2025-01-30 22:52:51.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":432,"context_line":"                \u0027summary\u0027: resp.summary"},{"line_number":433,"context_line":"            }"},{"line_number":434,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":435,"context_line":"            self.statsd.increment(\u0027swift_s3_err_resp\u0027, labels\u003dlabels)"},{"line_number":436,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"},{"line_number":437,"context_line":"            if isinstance(err_resp, InternalError):"},{"line_number":438,"context_line":"                self.logger.exception(err_resp)"}],"source_content_type":"text/x-python","patch_set":6,"id":"b01493a1_f827daf1","line":435,"updated":"2025-01-29 21:24:19.000000000","message":"oh neat; this is kind of like a drive-by - probably a good idea!","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2b87cd7bcc85d945befcd510c234e2b359d50763","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                \u0027summary\u0027: resp.summary"},{"line_number":433,"context_line":"            }"},{"line_number":434,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":435,"context_line":"            self.statsd.increment(\u0027swift_s3_err_resp\u0027, labels\u003dlabels)"},{"line_number":436,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"},{"line_number":437,"context_line":"            if isinstance(err_resp, InternalError):"},{"line_number":438,"context_line":"                self.logger.exception(err_resp)"}],"source_content_type":"text/x-python","patch_set":6,"id":"cbee9ce7_1774d01c","line":435,"in_reply_to":"b01493a1_f827daf1","updated":"2025-01-30 22:52:51.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":169,"context_line":"    register_sensitive_header, register_sensitive_param"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"HeaderKeyDict \u003d {"},{"line_number":173,"context_line":"    # (headers to match, labeled_bucket_stat),"},{"line_number":174,"context_line":"    \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":175,"context_line":"    \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"230f09cc_e5cfc7f1","line":172,"range":{"start_line":172,"start_character":0,"end_line":172,"end_character":13},"updated":"2025-01-31 16:22:41.000000000","message":"HeaderKeyDict is the name of a helper class to wrap dicts and do case-insensitive lookups. The advantage would be that whatever the case of the header name, it would map to one of the metrics.\n\nHowever, all but one of the mappings seem to be deterministic (header_ + snake_case of the header) so do we even need this dict? and do we need the header_ prefix when the stat is specifically for counting headers?","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":169,"context_line":"    register_sensitive_header, register_sensitive_param"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"HeaderKeyDict \u003d {"},{"line_number":173,"context_line":"    # (headers to match, labeled_bucket_stat),"},{"line_number":174,"context_line":"    \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":175,"context_line":"    \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ed2c9035_0f0ba645","line":172,"updated":"2025-01-31 15:43:12.000000000","message":"this constant variable name shadows the swob.HeaderKeyDict class - please pick a different name to avoid confusion.  Also make the constant an instance of swob.HeaderKeyDict and it will be case insensitive when you use it, e.g.\n\n\n```\nfor key in req.headers:\n    if key in CHECKSUM_HEADER_LABELS:\n        label[CHECKSUM_HEADER_LABELS[key]] \u003d classify_value(req.headers[key])\n```","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    register_sensitive_header, register_sensitive_param"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"HeaderKeyDict \u003d {"},{"line_number":173,"context_line":"    # (headers to match, labeled_bucket_stat),"},{"line_number":174,"context_line":"    \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":175,"context_line":"    \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"e6ace060_b5525219","line":172,"range":{"start_line":172,"start_character":0,"end_line":172,"end_character":13},"in_reply_to":"230f09cc_e5cfc7f1","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    register_sensitive_header, register_sensitive_param"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"HeaderKeyDict \u003d {"},{"line_number":173,"context_line":"    # (headers to match, labeled_bucket_stat),"},{"line_number":174,"context_line":"    \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":175,"context_line":"    \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"494bfd7f_5fdbcfae","line":172,"in_reply_to":"ed2c9035_0f0ba645","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"HeaderKeyDict \u003d {"},{"line_number":173,"context_line":"    # (headers to match, labeled_bucket_stat),"},{"line_number":174,"context_line":"    \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":175,"context_line":"    \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"},{"line_number":176,"context_line":"    \u0027x-amz-checksum-sha1\u0027: \u0027header_x_amz_checksum_sha1\u0027,"},{"line_number":177,"context_line":"    \u0027X-Amz-Checksum-Crc32\u0027: \u0027header_x_amz_checksum_crc32\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fe4ec30c_0824f46b","line":174,"updated":"2025-01-31 15:43:12.000000000","message":"\u003e Do we need \u0027Authorization\u0027 as a label?\n\nI don\u0027t think I want it yet, I say cut it out for now.\n\nWe definitely cannot emit the label with every unique signature value.\n\nBut we may eventually discover (like header_x_amz_checksum_sha256:hash_64) we want to add a kind of \"valid looking sigv4 header\" type that classifies the client value into a more constrained cardinality; i.e.\n\nheader_authorization: \u0027AWS4-HMAC-SHA256 (sigv4)\u0027\n... but we can do that later.","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"HeaderKeyDict \u003d {"},{"line_number":173,"context_line":"    # (headers to match, labeled_bucket_stat),"},{"line_number":174,"context_line":"    \u0027Authorization\u0027: \u0027header_authorization\u0027,"},{"line_number":175,"context_line":"    \u0027Content-MD5\u0027: \u0027header_content_md5\u0027,"},{"line_number":176,"context_line":"    \u0027x-amz-checksum-sha1\u0027: \u0027header_x_amz_checksum_sha1\u0027,"},{"line_number":177,"context_line":"    \u0027X-Amz-Checksum-Crc32\u0027: \u0027header_x_amz_checksum_crc32\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"8f17702d_54001529","line":174,"in_reply_to":"fe4ec30c_0824f46b","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":345,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":346,"context_line":"        labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":347,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":348,"context_line":"            boo, acc, con \u003d split_path("},{"line_number":349,"context_line":"                env.get(\u0027swift.backend_path\u0027), 1, 3, True)"},{"line_number":350,"context_line":"            if con and con.count(\u0027/\u0027) \u003e 0:"},{"line_number":351,"context_line":"                con \u003d con.split(\u0027/\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"47f03497_16245cf5","line":348,"updated":"2025-01-31 15:43:12.000000000","message":"lol @ `boo` - that\u0027s the `_ver`, right?","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":345,"context_line":"            labels[\u0027status\u0027] \u003d resp.status"},{"line_number":346,"context_line":"        labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":347,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":348,"context_line":"            boo, acc, con \u003d split_path("},{"line_number":349,"context_line":"                env.get(\u0027swift.backend_path\u0027), 1, 3, True)"},{"line_number":350,"context_line":"            if con and con.count(\u0027/\u0027) \u003e 0:"},{"line_number":351,"context_line":"                con \u003d con.split(\u0027/\u0027)[0]"}],"source_content_type":"text/x-python","patch_set":7,"id":"67dd8250_ea563d83","line":348,"in_reply_to":"47f03497_16245cf5","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":347,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":348,"context_line":"            boo, acc, con \u003d split_path("},{"line_number":349,"context_line":"                env.get(\u0027swift.backend_path\u0027), 1, 3, True)"},{"line_number":350,"context_line":"            if con and con.count(\u0027/\u0027) \u003e 0:"},{"line_number":351,"context_line":"                con \u003d con.split(\u0027/\u0027)[0]"},{"line_number":352,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":353,"context_line":"            labels[\u0027container\u0027] \u003d con"}],"source_content_type":"text/x-python","patch_set":7,"id":"cec283fc_a26e3812","line":350,"updated":"2025-01-31 15:43:12.000000000","message":"I think you can force the object out of the `con` component w/ min_seg\u003d4 (or maybe `reset_with_last\u003dFalse` ???","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":348,"context_line":"            boo, acc, con \u003d split_path("},{"line_number":349,"context_line":"                env.get(\u0027swift.backend_path\u0027), 1, 3, True)"},{"line_number":350,"context_line":"            if con and con.count(\u0027/\u0027) \u003e 0:"},{"line_number":351,"context_line":"                con \u003d con.split(\u0027/\u0027)[0]"},{"line_number":352,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":353,"context_line":"            labels[\u0027container\u0027] \u003d con"}],"source_content_type":"text/x-python","patch_set":7,"id":"696771a7_71e5a802","line":350,"in_reply_to":"cec283fc_a26e3812","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":351,"context_line":"                con \u003d con.split(\u0027/\u0027)[0]"},{"line_number":352,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":353,"context_line":"            labels[\u0027container\u0027] \u003d con"},{"line_number":354,"context_line":"        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":355,"context_line":"        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"550ffc47_d898bd02","line":355,"range":{"start_line":354,"start_character":8,"end_line":355,"end_character":32},"updated":"2025-01-31 16:22:41.000000000","message":"this doesn\u0027t look right, they should be coming from the resp and env","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":352,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":353,"context_line":"            labels[\u0027container\u0027] \u003d con"},{"line_number":354,"context_line":"        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":355,"context_line":"        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"3e412862_1312d188","line":355,"updated":"2025-01-31 15:43:12.000000000","message":"wat?  we shouldn\u0027t override these here; we already set method and status correctly above...","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":352,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":353,"context_line":"            labels[\u0027container\u0027] \u003d con"},{"line_number":354,"context_line":"        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":355,"context_line":"        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"7cca93f8_7fda55e4","line":355,"in_reply_to":"3e412862_1312d188","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":351,"context_line":"                con \u003d con.split(\u0027/\u0027)[0]"},{"line_number":352,"context_line":"            labels[\u0027account\u0027] \u003d acc"},{"line_number":353,"context_line":"            labels[\u0027container\u0027] \u003d con"},{"line_number":354,"context_line":"        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":355,"context_line":"        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"}],"source_content_type":"text/x-python","patch_set":7,"id":"85e42de1_3c4870b9","line":355,"range":{"start_line":354,"start_character":8,"end_line":355,"end_character":32},"in_reply_to":"550ffc47_d898bd02","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":354,"context_line":"        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":355,"context_line":"        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"},{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"}],"source_content_type":"text/x-python","patch_set":7,"id":"6d2ccb3f_2309f2f0","line":357,"updated":"2025-01-31 15:43:12.000000000","message":"I\u0027m not sure I\u0027ve ever seen an EnvironProxy used directly like this...","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"92e6215eeefb685c5f5655c36baa1624b39c7cfa","unresolved":false,"context_lines":[{"line_number":354,"context_line":"        labels[\u0027status\u0027] \u003d \u0027200\u0027"},{"line_number":355,"context_line":"        labels[\u0027method\u0027] \u003d \u0027GET\u0027"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"},{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"}],"source_content_type":"text/x-python","patch_set":7,"id":"b30c693b_e02ba7b2","line":357,"in_reply_to":"6d2ccb3f_2309f2f0","updated":"2025-02-02 14:55:48.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"},{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"},{"line_number":361,"context_line":"                continue"},{"line_number":362,"context_line":"            labels[metric_label] \u003d value"}],"source_content_type":"text/x-python","patch_set":7,"id":"2e47dc63_7818e783","line":359,"updated":"2025-01-31 15:43:12.000000000","message":"this was confusing because I thought this was a `common.header_key_dict.HeaderKeyDict`","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":356,"context_line":""},{"line_number":357,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":358,"context_line":"        for key, value in req_headers.items():"},{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"},{"line_number":361,"context_line":"                continue"},{"line_number":362,"context_line":"            labels[metric_label] \u003d value"}],"source_content_type":"text/x-python","patch_set":7,"id":"8e5691e0_2984e4fc","line":359,"in_reply_to":"2e47dc63_7818e783","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"},{"line_number":361,"context_line":"                continue"},{"line_number":362,"context_line":"            labels[metric_label] \u003d value"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        sha256_value \u003d req_headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":365,"context_line":"        if sha256_value:"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a1f640e_fd1a32e1","line":362,"updated":"2025-01-31 15:43:12.000000000","message":"we can\u0027t do this - esp for stuff like the authorization header and X-Amz-Checksum-Crc32 which will have a bazillion different values\n\neach pair of unique metric_label/value is a new counter in the metrics store.","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"},{"line_number":361,"context_line":"                continue"},{"line_number":362,"context_line":"            labels[metric_label] \u003d value"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        sha256_value \u003d req_headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":365,"context_line":"        if sha256_value:"}],"source_content_type":"text/x-python","patch_set":7,"id":"1bccc3e6_be58a6f5","line":362,"range":{"start_line":362,"start_character":35,"end_line":362,"end_character":40},"updated":"2025-01-31 16:22:41.000000000","message":"we do not want to use the value for headers like content-md5 or any x-amz-checksum-* header. We should always check that the value belongs in a well-known constrained set before using it in a label.","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"},{"line_number":361,"context_line":"                continue"},{"line_number":362,"context_line":"            labels[metric_label] \u003d value"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        sha256_value \u003d req_headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":365,"context_line":"        if sha256_value:"}],"source_content_type":"text/x-python","patch_set":7,"id":"8782a629_46c81785","line":362,"range":{"start_line":362,"start_character":35,"end_line":362,"end_character":40},"in_reply_to":"1bccc3e6_be58a6f5","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":359,"context_line":"            metric_label \u003d HeaderKeyDict.get(key)"},{"line_number":360,"context_line":"            if not metric_label:"},{"line_number":361,"context_line":"                continue"},{"line_number":362,"context_line":"            labels[metric_label] \u003d value"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        sha256_value \u003d req_headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":365,"context_line":"        if sha256_value:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9e6f85bf_1d158bf1","line":362,"in_reply_to":"5a1f640e_fd1a32e1","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":364,"context_line":"        sha256_value \u003d req_headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":365,"context_line":"        if sha256_value:"},{"line_number":366,"context_line":"            if sha256_value in WELL_KNOWN_SPECIFIC_SHA256_VALUES:"},{"line_number":367,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d sha256_value.lower()"},{"line_number":368,"context_line":"            else:"},{"line_number":369,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d \\"},{"line_number":370,"context_line":"                    classify_checksum_header_value(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ee0b9365_fcbb6971","line":367,"range":{"start_line":367,"start_character":68,"end_line":367,"end_character":76},"updated":"2025-01-31 16:22:41.000000000","message":"do we need label values to be lower case? I think I\u0027d prefer to see \u0027STREAMING-AWS4-ECDSA-P256-SHA256-PAYLOAD\u0027 etc everywhere rather than train my eyes to also recognise the lower case version","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":364,"context_line":"        sha256_value \u003d req_headers.get(\u0027X-Amz-Content-SHA256\u0027)"},{"line_number":365,"context_line":"        if sha256_value:"},{"line_number":366,"context_line":"            if sha256_value in WELL_KNOWN_SPECIFIC_SHA256_VALUES:"},{"line_number":367,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d sha256_value.lower()"},{"line_number":368,"context_line":"            else:"},{"line_number":369,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d \\"},{"line_number":370,"context_line":"                    classify_checksum_header_value(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"417721c6_48dd5426","line":367,"range":{"start_line":367,"start_character":68,"end_line":367,"end_character":76},"in_reply_to":"ee0b9365_fcbb6971","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":367,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d sha256_value.lower()"},{"line_number":368,"context_line":"            else:"},{"line_number":369,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d \\"},{"line_number":370,"context_line":"                    classify_checksum_header_value(value)"},{"line_number":371,"context_line":"        self.statsd.increment(\"swift_s3_checksum_algo_request\", labels)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def __call__(self, env, start_response):"}],"source_content_type":"text/x-python","patch_set":7,"id":"e5157bfc_01b77c9b","line":370,"updated":"2025-01-31 15:43:12.000000000","message":"I think we could use basically this same logic on *all* the \"interesting checksum headers\"","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":367,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d sha256_value.lower()"},{"line_number":368,"context_line":"            else:"},{"line_number":369,"context_line":"                labels[\u0027header_x_amz_content_sha256\u0027] \u003d \\"},{"line_number":370,"context_line":"                    classify_checksum_header_value(value)"},{"line_number":371,"context_line":"        self.statsd.increment(\"swift_s3_checksum_algo_request\", labels)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    def __call__(self, env, start_response):"}],"source_content_type":"text/x-python","patch_set":7,"id":"b077d85a_6b903304","line":370,"in_reply_to":"e5157bfc_01b77c9b","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":413,"context_line":"            labels \u003d {"},{"line_number":414,"context_line":"                \u0027method\u0027: method,"},{"line_number":415,"context_line":"                \u0027status_int\u0027: resp.status_int,"},{"line_number":416,"context_line":"                \u0027summary\u0027: resp.summary"},{"line_number":417,"context_line":"            }"},{"line_number":418,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":419,"context_line":"            self.statsd.increment(\u0027swift_s3_err_resp\u0027, labels\u003dlabels)"}],"source_content_type":"text/x-python","patch_set":7,"id":"e14ddef3_030bb75c","line":416,"updated":"2025-01-31 15:43:12.000000000","message":"it seems like some of this will be duplicated by `_emit_response_header_stats`","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":413,"context_line":"            labels \u003d {"},{"line_number":414,"context_line":"                \u0027method\u0027: method,"},{"line_number":415,"context_line":"                \u0027status_int\u0027: resp.status_int,"},{"line_number":416,"context_line":"                \u0027summary\u0027: resp.summary"},{"line_number":417,"context_line":"            }"},{"line_number":418,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":419,"context_line":"            self.statsd.increment(\u0027swift_s3_err_resp\u0027, labels\u003dlabels)"}],"source_content_type":"text/x-python","patch_set":7,"id":"52126da3_2a21fc8a","line":416,"in_reply_to":"e14ddef3_030bb75c","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":408,"context_line":"        except InvalidSubresource as e:"},{"line_number":409,"context_line":"            self.logger.debug(e.cause)"},{"line_number":410,"context_line":"        except ErrorResponse as err_resp:"},{"line_number":411,"context_line":"            resp \u003d err_resp"},{"line_number":412,"context_line":"            method \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":413,"context_line":"            labels \u003d {"},{"line_number":414,"context_line":"                \u0027method\u0027: method,"},{"line_number":415,"context_line":"                \u0027status_int\u0027: resp.status_int,"},{"line_number":416,"context_line":"                \u0027summary\u0027: resp.summary"},{"line_number":417,"context_line":"            }"},{"line_number":418,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":419,"context_line":"            self.statsd.increment(\u0027swift_s3_err_resp\u0027, labels\u003dlabels)"},{"line_number":420,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"},{"line_number":421,"context_line":"            if isinstance(err_resp, InternalError):"},{"line_number":422,"context_line":"                self.logger.exception(err_resp)"}],"source_content_type":"text/x-python","patch_set":7,"id":"13469153_56e68503","line":419,"range":{"start_line":411,"start_character":0,"end_line":419,"end_character":69},"updated":"2025-01-31 16:22:41.000000000","message":"It will be good to have this labeled metric version of the existing stats and should be part of the upgrade to labeled metrics. However, AFAICT this part of the patch has no test coverage, and it is not necessary to achieve our immediate goal of assessing client header demographics, so I propose to shift this to a follow-on patch where we can develop tests.","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"9dd30999a611e3be149a527ee45dc8a69693ce7c","unresolved":false,"context_lines":[{"line_number":408,"context_line":"        except InvalidSubresource as e:"},{"line_number":409,"context_line":"            self.logger.debug(e.cause)"},{"line_number":410,"context_line":"        except ErrorResponse as err_resp:"},{"line_number":411,"context_line":"            resp \u003d err_resp"},{"line_number":412,"context_line":"            method \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":413,"context_line":"            labels \u003d {"},{"line_number":414,"context_line":"                \u0027method\u0027: method,"},{"line_number":415,"context_line":"                \u0027status_int\u0027: resp.status_int,"},{"line_number":416,"context_line":"                \u0027summary\u0027: resp.summary"},{"line_number":417,"context_line":"            }"},{"line_number":418,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":419,"context_line":"            self.statsd.increment(\u0027swift_s3_err_resp\u0027, labels\u003dlabels)"},{"line_number":420,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"},{"line_number":421,"context_line":"            if isinstance(err_resp, InternalError):"},{"line_number":422,"context_line":"                self.logger.exception(err_resp)"}],"source_content_type":"text/x-python","patch_set":7,"id":"a618fb35_cf555530","line":419,"range":{"start_line":411,"start_character":0,"end_line":419,"end_character":69},"in_reply_to":"13469153_56e68503","updated":"2025-01-31 18:41:21.000000000","message":"940535: WIP s3api: add labeled version of error response metric | https://review.opendev.org/c/openstack/swift/+/940535","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":432,"context_line":"        if \u0027s3api.backend_path\u0027 in env and \u0027swift.backend_path\u0027 not in env:"},{"line_number":433,"context_line":"            env[\u0027swift.backend_path\u0027] \u003d env[\u0027s3api.backend_path\u0027]"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        self._emit_response_header_stats(env, resp)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        return resp(env, start_response)"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e8b0e14a_6f7ea339","line":435,"updated":"2025-01-31 15:43:12.000000000","message":"this implementation is currently very specific to the checksum_algo stat - is the idea it grows more generic over time?","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":432,"context_line":"        if \u0027s3api.backend_path\u0027 in env and \u0027swift.backend_path\u0027 not in env:"},{"line_number":433,"context_line":"            env[\u0027swift.backend_path\u0027] \u003d env[\u0027s3api.backend_path\u0027]"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"        self._emit_response_header_stats(env, resp)"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"        return resp(env, start_response)"},{"line_number":438,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"23294ce2_4636b7ef","line":435,"in_reply_to":"e8b0e14a_6f7ea339","updated":"2025-01-31 17:46:51.000000000","message":"Right, I assume!","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":181,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html"},{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear as to whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bb76d865_e2cad3d7","line":184,"updated":"2025-01-31 16:22:41.000000000","message":"if anyone is certain then please rip out one or other form","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a677f74b0ca4db229881607ad6113d73a4a6b984","unresolved":false,"context_lines":[{"line_number":181,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html"},{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear as to whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"715a1f4e_1b2ae7ba","line":184,"in_reply_to":"bb76d865_e2cad3d7","updated":"2025-04-10 15:45:20.000000000","message":"Done","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"42f67f4655b6825360f442633bd2c631b53e3d2a","unresolved":true,"context_lines":[{"line_number":353,"context_line":"        for hdr_key, hdr_val in req_headers.items():"},{"line_number":354,"context_line":"            label_val \u003d None"},{"line_number":355,"context_line":"            hdr_key \u003d hdr_key.lower()"},{"line_number":356,"context_line":"            label_key \u003d kebab_to_snake(hdr_key)"},{"line_number":357,"context_line":"            if hdr_key \u003d\u003d \u0027content-encoding\u0027:"},{"line_number":358,"context_line":"                if \u0027aws-chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":359,"context_line":"                    label_val \u003d \u0027aws-chunked\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"51775d6b_0480e9ec","line":356,"updated":"2025-01-31 18:08:50.000000000","message":"discussed and agreed reverting this to \n\n``\u0027header_\u0027 + kebab_to_snake(hdr_key)``","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        for hdr_key, hdr_val in req_headers.items():"},{"line_number":354,"context_line":"            label_val \u003d None"},{"line_number":355,"context_line":"            hdr_key \u003d hdr_key.lower()"},{"line_number":356,"context_line":"            label_key \u003d kebab_to_snake(hdr_key)"},{"line_number":357,"context_line":"            if hdr_key \u003d\u003d \u0027content-encoding\u0027:"},{"line_number":358,"context_line":"                if \u0027aws-chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":359,"context_line":"                    label_val \u003d \u0027aws-chunked\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"a1b935ae_986cf5e5","line":356,"in_reply_to":"51775d6b_0480e9ec","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":356,"context_line":"            label_key \u003d kebab_to_snake(hdr_key)"},{"line_number":357,"context_line":"            if hdr_key \u003d\u003d \u0027content-encoding\u0027:"},{"line_number":358,"context_line":"                if \u0027aws-chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":359,"context_line":"                    label_val \u003d \u0027aws-chunked\u0027"},{"line_number":360,"context_line":"            elif hdr_key \u003d\u003d \u0027transfer-encoding\u0027:"},{"line_number":361,"context_line":"                if \u0027chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":362,"context_line":"                    label_val \u003d \u0027chunked\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"a1de727e_25dbc39c","line":359,"updated":"2025-01-31 17:07:42.000000000","message":"I assume we\u0027re not interest in ``gzip`` etc","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c7505a71d0a33bf03226d06042957fb6f3b5d990","unresolved":true,"context_lines":[{"line_number":356,"context_line":"            label_key \u003d kebab_to_snake(hdr_key)"},{"line_number":357,"context_line":"            if hdr_key \u003d\u003d \u0027content-encoding\u0027:"},{"line_number":358,"context_line":"                if \u0027aws-chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":359,"context_line":"                    label_val \u003d \u0027aws-chunked\u0027"},{"line_number":360,"context_line":"            elif hdr_key \u003d\u003d \u0027transfer-encoding\u0027:"},{"line_number":361,"context_line":"                if \u0027chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":362,"context_line":"                    label_val \u003d \u0027chunked\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"908a48be_d96cbc0d","line":359,"in_reply_to":"61b0dd91_d60aab93","updated":"2025-03-31 11:13:45.000000000","message":"NB \u0027+\u0027 is not a valid character in a label value (nor is any other common delimiter other than \u0027.\u0027)","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d173ccf7e8c8b8b044df2d3e9a90c5d5236bb898","unresolved":true,"context_lines":[{"line_number":356,"context_line":"            label_key \u003d kebab_to_snake(hdr_key)"},{"line_number":357,"context_line":"            if hdr_key \u003d\u003d \u0027content-encoding\u0027:"},{"line_number":358,"context_line":"                if \u0027aws-chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":359,"context_line":"                    label_val \u003d \u0027aws-chunked\u0027"},{"line_number":360,"context_line":"            elif hdr_key \u003d\u003d \u0027transfer-encoding\u0027:"},{"line_number":361,"context_line":"                if \u0027chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":362,"context_line":"                    label_val \u003d \u0027chunked\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"ac105ab4_f99b5b36","line":359,"in_reply_to":"a1de727e_25dbc39c","updated":"2025-01-31 21:15:37.000000000","message":"yeah i don\u0027t know what to do about the header keys that can have multiple csv values.\n\nif some clients were sending `content-encoding: aws-chunked` and some new client started sending `content-encodeing: aws-chunked,v5`\n\nprobably we *would* want to know there\u0027s a difference; but I\u0027m not sure how we can predict that.","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9f3c4fa6b9133f1f4414caca8cdba6da5310bca","unresolved":true,"context_lines":[{"line_number":356,"context_line":"            label_key \u003d kebab_to_snake(hdr_key)"},{"line_number":357,"context_line":"            if hdr_key \u003d\u003d \u0027content-encoding\u0027:"},{"line_number":358,"context_line":"                if \u0027aws-chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":359,"context_line":"                    label_val \u003d \u0027aws-chunked\u0027"},{"line_number":360,"context_line":"            elif hdr_key \u003d\u003d \u0027transfer-encoding\u0027:"},{"line_number":361,"context_line":"                if \u0027chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":362,"context_line":"                    label_val \u003d \u0027chunked\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"fef854f2_97238486","line":359,"in_reply_to":"ac105ab4_f99b5b36","updated":"2025-02-03 13:49:28.000000000","message":"we could as a start have two variants of the label value: ``aws-chunked`` and ``aws-chunked+other`` (or ``aws-chunked,other``) ?","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"6b6eb7e3a4ae8e59af865998952da192a564a190","unresolved":true,"context_lines":[{"line_number":356,"context_line":"            label_key \u003d kebab_to_snake(hdr_key)"},{"line_number":357,"context_line":"            if hdr_key \u003d\u003d \u0027content-encoding\u0027:"},{"line_number":358,"context_line":"                if \u0027aws-chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":359,"context_line":"                    label_val \u003d \u0027aws-chunked\u0027"},{"line_number":360,"context_line":"            elif hdr_key \u003d\u003d \u0027transfer-encoding\u0027:"},{"line_number":361,"context_line":"                if \u0027chunked\u0027 in list_from_csv(hdr_val.lower()):"},{"line_number":362,"context_line":"                    label_val \u003d \u0027chunked\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"61b0dd91_d60aab93","line":359,"in_reply_to":"fef854f2_97238486","updated":"2025-02-03 17:39:53.000000000","message":"Note: Tackle this next release","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":372,"context_line":"            elif hdr_key in (\u0027content-md5\u0027,"},{"line_number":373,"context_line":"                             \u0027x-amz-checksum-crc32\u0027,"},{"line_number":374,"context_line":"                             \u0027x-amz-checksum-crc32c\u0027,"},{"line_number":375,"context_line":"                             \u0027x-amz-checksum-sha1\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"fade8848_b96f6881","line":375,"updated":"2025-01-31 17:07:42.000000000","message":"oops I have missed off ``x-amz-checksum-crc64nvme``","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            elif hdr_key in (\u0027content-md5\u0027,"},{"line_number":373,"context_line":"                             \u0027x-amz-checksum-crc32\u0027,"},{"line_number":374,"context_line":"                             \u0027x-amz-checksum-crc32c\u0027,"},{"line_number":375,"context_line":"                             \u0027x-amz-checksum-sha1\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"977d2cfe_64f0050f","line":375,"in_reply_to":"fade8848_b96f6881","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                             \u0027x-amz-checksum-sha1\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7b66b4bc_5e4914be","line":378,"updated":"2025-01-31 17:07:42.000000000","message":"what else to say? IIUC the header value could be one of many variations","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d173ccf7e8c8b8b044df2d3e9a90c5d5236bb898","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                             \u0027x-amz-checksum-sha1\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"}],"source_content_type":"text/x-python","patch_set":8,"id":"a7ed3b5d_25480cf6","line":378,"in_reply_to":"7b66b4bc_5e4914be","updated":"2025-01-31 21:15:37.000000000","message":"this is a variation on the csv problem I guess... if more clients send:\n\n```\n\u0027X-Amz-Trailer\u0027: b\u0027x-amz-checksum-crc32\u0027,\n```\n\nthan\n\n```\n\u0027X-Amz-Trailer\u0027: b\u0027x-amz-checksum-crc64nvme\u0027,\n```\n\nI *would* want to know that; but presumably it would/should match the (one and only?) value they sent as their checksum?\n\nWe can start with \"true\" just to see how interesting it is; and then change to \"match_crc32\" or \"unknown\" or something if we have to dig in later.","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9f3c4fa6b9133f1f4414caca8cdba6da5310bca","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                             \u0027x-amz-checksum-sha1\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"}],"source_content_type":"text/x-python","patch_set":8,"id":"e1bd3585_3ac143ec","line":378,"in_reply_to":"99fe8842_1d982af0","updated":"2025-02-03 13:49:28.000000000","message":"as per chunked-encoding, transfer-encoding... we could perhaps have label values for the expected cases:\n\nwhen there\u0027s only one header specified in the trailer list:\n```\nx-amz-checksum-crc32\nx-amz-checksum-crc32c\netc\n```\n\nand in each case a variant of the label when there\u0027s other headers in the trailer list:\n```\nx-amz-checksum-crc32,other\nx-amz-checksum-crc32c,other\netc\n```","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"92e6215eeefb685c5f5655c36baa1624b39c7cfa","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                             \u0027x-amz-checksum-sha1\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"}],"source_content_type":"text/x-python","patch_set":8,"id":"99fe8842_1d982af0","line":378,"in_reply_to":"a7ed3b5d_25480cf6","updated":"2025-02-02 14:55:48.000000000","message":"Acknowledged","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"},{"line_number":382,"context_line":"                    label_val \u003d hdr_val.upper()"},{"line_number":383,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"d669890c_03f12447","line":380,"updated":"2025-01-31 17:07:42.000000000","message":"I\u0027ve definitely seen both of these headers in AWS docs but ``x-amz-sdk-checksum-algorithm`` is more commonly referred to","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"},{"line_number":382,"context_line":"                    label_val \u003d hdr_val.upper()"},{"line_number":383,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bcd03ac9_d22cfb87","line":380,"in_reply_to":"d669890c_03f12447","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":385,"context_line":"            elif hdr_key \u003d\u003d \u0027authorization\u0027:"},{"line_number":386,"context_line":"                # TODO: including this means we catch a lot of requests that"},{"line_number":387,"context_line":"                #   don\u0027t have any interesting checksum headers"},{"line_number":388,"context_line":"                label_val \u003d True"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"            if label_val is not None:"},{"line_number":391,"context_line":"                labels[label_key] \u003d label_val"}],"source_content_type":"text/x-python","patch_set":8,"id":"3e9ce4c6_3ea7a761","line":388,"updated":"2025-01-31 17:07:42.000000000","message":"think I saw @Clay also advocate removing this","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":385,"context_line":"            elif hdr_key \u003d\u003d \u0027authorization\u0027:"},{"line_number":386,"context_line":"                # TODO: including this means we catch a lot of requests that"},{"line_number":387,"context_line":"                #   don\u0027t have any interesting checksum headers"},{"line_number":388,"context_line":"                label_val \u003d True"},{"line_number":389,"context_line":""},{"line_number":390,"context_line":"            if label_val is not None:"},{"line_number":391,"context_line":"                labels[label_key] \u003d label_val"}],"source_content_type":"text/x-python","patch_set":8,"id":"bfd958e7_f7d6a4b2","line":388,"in_reply_to":"3e9ce4c6_3ea7a761","updated":"2025-01-31 17:46:51.000000000","message":"Done","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":390,"context_line":"            if label_val is not None:"},{"line_number":391,"context_line":"                labels[label_key] \u003d label_val"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        if not labels:"},{"line_number":394,"context_line":"            return"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        labels[\u0027status\u0027] \u003d resp.status_int"}],"source_content_type":"text/x-python","patch_set":8,"id":"281e0414_6073432b","line":393,"updated":"2025-01-31 17:07:42.000000000","message":"I think we only want the stat if there\u0027s something of interest??","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":390,"context_line":"            if label_val is not None:"},{"line_number":391,"context_line":"                labels[label_key] \u003d label_val"},{"line_number":392,"context_line":""},{"line_number":393,"context_line":"        if not labels:"},{"line_number":394,"context_line":"            return"},{"line_number":395,"context_line":""},{"line_number":396,"context_line":"        labels[\u0027status\u0027] \u003d resp.status_int"}],"source_content_type":"text/x-python","patch_set":8,"id":"084667ce_c18ea858","line":393,"in_reply_to":"281e0414_6073432b","updated":"2025-01-31 17:46:51.000000000","message":"Right!","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":437,"context_line":"            req \u003d req_class(env, self.app, self.conf)"},{"line_number":438,"context_line":"            resp \u003d self.handle_request(req)"},{"line_number":439,"context_line":"        except NotS3Request:"},{"line_number":440,"context_line":"            return self.app(env, start_response)"},{"line_number":441,"context_line":"        except InvalidSubresource as e:"},{"line_number":442,"context_line":"            self.logger.debug(e.cause)"},{"line_number":443,"context_line":"        except ErrorResponse as err_resp:"}],"source_content_type":"text/x-python","patch_set":8,"id":"b27a9ed7_17adabd3","line":440,"updated":"2025-01-31 17:07:42.000000000","message":"I normally try to avoid returning from mid-way through a method, but I don\u0027t _think_ there\u0027s anything below that is relevant to a non-s3 request, and we need to not try to do resp.status when resp\u003dself.app!","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            req \u003d req_class(env, self.app, self.conf)"},{"line_number":438,"context_line":"            resp \u003d self.handle_request(req)"},{"line_number":439,"context_line":"        except NotS3Request:"},{"line_number":440,"context_line":"            return self.app(env, start_response)"},{"line_number":441,"context_line":"        except InvalidSubresource as e:"},{"line_number":442,"context_line":"            self.logger.debug(e.cause)"},{"line_number":443,"context_line":"        except ErrorResponse as err_resp:"}],"source_content_type":"text/x-python","patch_set":8,"id":"788bd0c3_a08e148c","line":440,"in_reply_to":"b27a9ed7_17adabd3","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":439,"context_line":"        except NotS3Request:"},{"line_number":440,"context_line":"            return self.app(env, start_response)"},{"line_number":441,"context_line":"        except InvalidSubresource as e:"},{"line_number":442,"context_line":"            self.logger.debug(e.cause)"},{"line_number":443,"context_line":"        except ErrorResponse as err_resp:"},{"line_number":444,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":445,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"}],"source_content_type":"text/x-python","patch_set":8,"id":"2e08053b_d4e5acc0","line":442,"updated":"2025-01-31 17:07:42.000000000","message":"off-topic: there is NO resp declared here. I wonder what it ought to be... ``InvalidRequest`` or such-like?","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d173ccf7e8c8b8b044df2d3e9a90c5d5236bb898","unresolved":true,"context_lines":[{"line_number":439,"context_line":"        except NotS3Request:"},{"line_number":440,"context_line":"            return self.app(env, start_response)"},{"line_number":441,"context_line":"        except InvalidSubresource as e:"},{"line_number":442,"context_line":"            self.logger.debug(e.cause)"},{"line_number":443,"context_line":"        except ErrorResponse as err_resp:"},{"line_number":444,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":445,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"}],"source_content_type":"text/x-python","patch_set":8,"id":"e2b202e3_9b0d7e26","line":442,"in_reply_to":"2e08053b_d4e5acc0","updated":"2025-01-31 21:15:37.000000000","message":"LOL, wat!?  so we just *NameError* currently!!???","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"596a56b3e3c1b82c57ba26f97e2b9ca52a2cc94d","unresolved":true,"context_lines":[{"line_number":439,"context_line":"        except NotS3Request:"},{"line_number":440,"context_line":"            return self.app(env, start_response)"},{"line_number":441,"context_line":"        except InvalidSubresource as e:"},{"line_number":442,"context_line":"            self.logger.debug(e.cause)"},{"line_number":443,"context_line":"        except ErrorResponse as err_resp:"},{"line_number":444,"context_line":"            self.logger.increment(err_resp.metric_name)"},{"line_number":445,"context_line":"            append_log_info(env, \u0027s3:err:%s\u0027 % err_resp.summary)"}],"source_content_type":"text/x-python","patch_set":8,"id":"876c46b6_2e025072","line":442,"in_reply_to":"e2b202e3_9b0d7e26","updated":"2025-05-12 19:50:47.000000000","message":"FWIW, there\u0027s only [one place that it can get raised](https://github.com/openstack/swift/blob/2.35.0/swift/common/middleware/s3api/subresource.py#L124) and it\u0027s while parsing something that we ourselves should have written down -- I\u0027m not sure we _can_ hit this code path, at least not outside dev envs.","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d173ccf7e8c8b8b044df2d3e9a90c5d5236bb898","unresolved":true,"context_lines":[{"line_number":350,"context_line":"    def _emit_response_header_stats(self, env, resp):"},{"line_number":351,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":352,"context_line":"        labels \u003d {}"},{"line_number":353,"context_line":"        for hdr_key, hdr_val in req_headers.items():"},{"line_number":354,"context_line":"            label_val \u003d None"},{"line_number":355,"context_line":"            hdr_key \u003d hdr_key.lower()"},{"line_number":356,"context_line":"            label_key \u003d make_header_label(hdr_key)"}],"source_content_type":"text/x-python","patch_set":10,"id":"d28a7847_d3fb1e76","line":353,"updated":"2025-01-31 21:15:37.000000000","message":"so I guess the iteration of the req_headers.items() somehow does the lower-normalization","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"92e6215eeefb685c5f5655c36baa1624b39c7cfa","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    def _emit_response_header_stats(self, env, resp):"},{"line_number":351,"context_line":"        req_headers \u003d swob.HeaderEnvironProxy(env)"},{"line_number":352,"context_line":"        labels \u003d {}"},{"line_number":353,"context_line":"        for hdr_key, hdr_val in req_headers.items():"},{"line_number":354,"context_line":"            label_val \u003d None"},{"line_number":355,"context_line":"            hdr_key \u003d hdr_key.lower()"},{"line_number":356,"context_line":"            label_key \u003d make_header_label(hdr_key)"}],"source_content_type":"text/x-python","patch_set":10,"id":"cd4335c7_1c3acc4a","line":353,"in_reply_to":"d28a7847_d3fb1e76","updated":"2025-02-02 14:55:48.000000000","message":"I don\u0027t think so, lines 355, 358, etc take care of it","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e4e3222a2cfa1fd5715d969c58f08285b790cad","unresolved":true,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        labels[\u0027status\u0027] \u003d resp.status_int"},{"line_number":393,"context_line":"        labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":394,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":395,"context_line":"            vers, acc, con, obj \u003d split_path("},{"line_number":396,"context_line":"                env.get(\u0027swift.backend_path\u0027), 1, 4, True)"},{"line_number":397,"context_line":"            if obj:"}],"source_content_type":"text/x-python","patch_set":11,"id":"bfdca580_8799c998","line":394,"updated":"2025-02-12 00:39:17.000000000","message":"I think you want something like `swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)` and then operate on *that* instead. That\u0027s what proxy-logging does.","commit_id":"c54dac02863c30183e4f8c587aa463b8943be55a"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"a7200a3c089396f82d55f0e1f53f15c94891e510","unresolved":false,"context_lines":[{"line_number":391,"context_line":""},{"line_number":392,"context_line":"        labels[\u0027status\u0027] \u003d resp.status_int"},{"line_number":393,"context_line":"        labels[\u0027method\u0027] \u003d env.get(\u0027REQUEST_METHOD\u0027)"},{"line_number":394,"context_line":"        if \u0027swift.backend_path\u0027 in env:"},{"line_number":395,"context_line":"            vers, acc, con, obj \u003d split_path("},{"line_number":396,"context_line":"                env.get(\u0027swift.backend_path\u0027), 1, 4, True)"},{"line_number":397,"context_line":"            if obj:"}],"source_content_type":"text/x-python","patch_set":11,"id":"54b6396c_6173ba5b","line":394,"in_reply_to":"bfdca580_8799c998","updated":"2025-11-19 16:04:00.000000000","message":"Acknowledged","commit_id":"c54dac02863c30183e4f8c587aa463b8943be55a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ea2569ca6e342b0d8a68ac26c252f4f61495c73a","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                             \u0027x-amz-checksum-crc64nvme\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"}],"source_content_type":"text/x-python","patch_set":16,"id":"d7402c0b_caac6940","line":378,"updated":"2025-03-25 17:09:45.000000000","message":"it turns out it would be really helpful to have the value here:\n\n\u0027X-Amz-Trailer\u0027: b\u0027x-amz-checksum-crc32\u0027\n\nit seems like it tells us what checksum we should expect - which will be useful if we\u0027re trying to understandad our risk on crc64nvme","commit_id":"aed3257c4ba4ccac55f9d7bb5bf9f428257f66a2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"45000a1dbe08b981be3eda479106d1db968e34e2","unresolved":false,"context_lines":[{"line_number":375,"context_line":"                             \u0027x-amz-checksum-crc64nvme\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"}],"source_content_type":"text/x-python","patch_set":16,"id":"465a9032_22c09046","line":378,"in_reply_to":"058facb5_e0d31401","updated":"2025-04-02 08:52:03.000000000","message":"Done","commit_id":"aed3257c4ba4ccac55f9d7bb5bf9f428257f66a2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c7505a71d0a33bf03226d06042957fb6f3b5d990","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                             \u0027x-amz-checksum-crc64nvme\u0027):"},{"line_number":376,"context_line":"                label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":377,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-trailer\u0027:"},{"line_number":378,"context_line":"                label_val \u003d True"},{"line_number":379,"context_line":"            elif hdr_key in (\u0027x-amz-checksum-algorithm\u0027,"},{"line_number":380,"context_line":"                             \u0027x-amz-sdk-checksum-algorithm\u0027):"},{"line_number":381,"context_line":"                if hdr_val.upper() in WELL_KNOWN_CHECKSUM_ALGORITHMS:"}],"source_content_type":"text/x-python","patch_set":16,"id":"058facb5_e0d31401","line":378,"in_reply_to":"d7402c0b_caac6940","updated":"2025-03-31 11:13:45.000000000","message":"see https://review.opendev.org/c/openstack/swift/+/945952/1?usp\u003drelated-change","commit_id":"aed3257c4ba4ccac55f9d7bb5bf9f428257f66a2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":true,"context_lines":[{"line_number":181,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html"},{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"3a0e6f6a_7fec194a","line":184,"updated":"2025-10-01 21:11:21.000000000","message":"Have we tried sending requests with the hyphenated form to AWS? I\u0027m fairly certain **I** haven\u0027t (yet)...\n\nWe already do some normalization (`hdr_val.upper()`) when we check for inclusion; should we maybe just do a `.replace(\u0027-\u0027, \u0027\u0027)` as well? Or (depending on how AWS handles the hyphenated form) just let it fall to `unknown`.\n\nMostly I just don\u0027t want to double the number of potential metric buckets.\n\n---\n\nSeparately, we might want to mention `x-amz-checksum-algorithm`/`x-amz-sdk-checksum-algorithm` somewhere around here.","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"a7200a3c089396f82d55f0e1f53f15c94891e510","unresolved":false,"context_lines":[{"line_number":181,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html"},{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"682e2b7e_76aaba20","line":184,"in_reply_to":"0cfa4df3_19a65b5f","updated":"2025-11-19 16:04:00.000000000","message":"Done","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"723e0b38a0d5579ca55c8893980edafa288ca362","unresolved":true,"context_lines":[{"line_number":181,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html"},{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"0cfa4df3_19a65b5f","line":184,"in_reply_to":"3a0e6f6a_7fec194a","updated":"2025-11-06 20:15:45.000000000","message":"Good idea on adding normalization. Even though on prod environment, the label values seems to be without \u0027-\u0027. @Shreeya probably could normalize \u0027-\u0027 here","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"b334d99b6da95993988a15cf0cf92944d9280374","unresolved":true,"context_lines":[{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"},{"line_number":188,"context_line":"    \u0027CRC-32C\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"cf674835_eff20bca","line":185,"updated":"2025-10-03 15:31:59.000000000","message":"it seems from this link, the checksum algorithms should be un-hyphenated in API:\n(un-)hyphenated","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"94d807eb323fd50b8d98595b2a7672f836169eb6","unresolved":true,"context_lines":[{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"},{"line_number":188,"context_line":"    \u0027CRC-32C\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"ecdb510f_45a0c496","line":185,"in_reply_to":"cf674835_eff20bca","updated":"2025-10-03 15:33:52.000000000","message":"https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"a7200a3c089396f82d55f0e1f53f15c94891e510","unresolved":false,"context_lines":[{"line_number":182,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_Object.html#AmazonS3-Type-Object-ChecksumAlgorithm"},{"line_number":183,"context_line":"# https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html"},{"line_number":184,"context_line":"# docs are unclear whether the header value is the (un-)hyphenated form"},{"line_number":185,"context_line":"WELL_KNOWN_CHECKSUM_ALGORITHMS \u003d ("},{"line_number":186,"context_line":"    \u0027CRC-64NVME\u0027,"},{"line_number":187,"context_line":"    \u0027CRC-32\u0027,"},{"line_number":188,"context_line":"    \u0027CRC-32C\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"e4e0f659_d69edd5c","line":185,"in_reply_to":"ecdb510f_45a0c496","updated":"2025-11-19 16:04:00.000000000","message":"Done","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":true,"context_lines":[{"line_number":194,"context_line":"    \u0027SHA1\u0027,"},{"line_number":195,"context_line":"    \u0027SHA256\u0027"},{"line_number":196,"context_line":")"},{"line_number":197,"context_line":"WELL_KNOWN_CHECKSUM_HEADERS \u003d ("},{"line_number":198,"context_line":"    \u0027x-amz-checksum-crc32\u0027,"},{"line_number":199,"context_line":"    \u0027x-amz-checksum-crc32c\u0027,"},{"line_number":200,"context_line":"    \u0027x-amz-checksum-sha1\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"492554fd_3e2341ac","line":197,"updated":"2025-10-01 21:11:21.000000000","message":"Can we just look at `s3request.CHECKSUMS_BY_HEADER.keys()`? I\u0027d like for there to be a single source of truth as much as possible... though maybe the idea is to be ready in case AWS added some more checksum options which we want to include as \"well-known\" here, without adding as \"supported\" there? Even in that case, I think I\u0027d want the well-known set to be clearly an extension of the supported set.","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"723e0b38a0d5579ca55c8893980edafa288ca362","unresolved":true,"context_lines":[{"line_number":194,"context_line":"    \u0027SHA1\u0027,"},{"line_number":195,"context_line":"    \u0027SHA256\u0027"},{"line_number":196,"context_line":")"},{"line_number":197,"context_line":"WELL_KNOWN_CHECKSUM_HEADERS \u003d ("},{"line_number":198,"context_line":"    \u0027x-amz-checksum-crc32\u0027,"},{"line_number":199,"context_line":"    \u0027x-amz-checksum-crc32c\u0027,"},{"line_number":200,"context_line":"    \u0027x-amz-checksum-sha1\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"aafedf6b_6ef9b40b","line":197,"in_reply_to":"492554fd_3e2341ac","updated":"2025-11-06 20:15:45.000000000","message":"Good point, already have as s3request.CHECKSUMS_BY_HEADER.keys()","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"a7200a3c089396f82d55f0e1f53f15c94891e510","unresolved":false,"context_lines":[{"line_number":194,"context_line":"    \u0027SHA1\u0027,"},{"line_number":195,"context_line":"    \u0027SHA256\u0027"},{"line_number":196,"context_line":")"},{"line_number":197,"context_line":"WELL_KNOWN_CHECKSUM_HEADERS \u003d ("},{"line_number":198,"context_line":"    \u0027x-amz-checksum-crc32\u0027,"},{"line_number":199,"context_line":"    \u0027x-amz-checksum-crc32c\u0027,"},{"line_number":200,"context_line":"    \u0027x-amz-checksum-sha1\u0027,"}],"source_content_type":"text/x-python","patch_set":46,"id":"27f10c95_fd7db55b","line":197,"in_reply_to":"aafedf6b_6ef9b40b","updated":"2025-11-19 16:04:00.000000000","message":"Done","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"9b7c4a5c530d100ee3ab305b0b36aade973f17c3","unresolved":true,"context_lines":[{"line_number":372,"context_line":"                label_val \u003d True"},{"line_number":373,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-content-sha256\u0027:"},{"line_number":374,"context_line":"                if hdr_val in WELL_KNOWN_SPECIFIC_SHA256_VALUES:"},{"line_number":375,"context_line":"                    label_val \u003d hdr_val"},{"line_number":376,"context_line":"                else:"},{"line_number":377,"context_line":"                    label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":378,"context_line":"            elif hdr_key \u003d\u003d \u0027content-md5\u0027:"}],"source_content_type":"text/x-python","patch_set":46,"id":"31b41429_0486144a","line":375,"updated":"2025-10-03 15:39:16.000000000","message":"the valid x-amz-content-sha256 values should really only be WELL_KNOWN_SPECIFIC_SHA256_VALUES","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"897e8335c836c1b6a38ec548ec4a7c67176ee2cf","unresolved":false,"context_lines":[{"line_number":372,"context_line":"                label_val \u003d True"},{"line_number":373,"context_line":"            elif hdr_key \u003d\u003d \u0027x-amz-content-sha256\u0027:"},{"line_number":374,"context_line":"                if hdr_val in WELL_KNOWN_SPECIFIC_SHA256_VALUES:"},{"line_number":375,"context_line":"                    label_val \u003d hdr_val"},{"line_number":376,"context_line":"                else:"},{"line_number":377,"context_line":"                    label_val \u003d classify_checksum_header_value(hdr_val)"},{"line_number":378,"context_line":"            elif hdr_key \u003d\u003d \u0027content-md5\u0027:"}],"source_content_type":"text/x-python","patch_set":46,"id":"0bb2665a_5d5a8d01","line":375,"in_reply_to":"31b41429_0486144a","updated":"2025-10-03 16:31:34.000000000","message":"actually was incorrect about this","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":true,"context_lines":[{"line_number":421,"context_line":"        else:"},{"line_number":422,"context_line":"            labels[\u0027type\u0027] \u003d \u0027UNKNOWN\u0027"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        self.statsd.increment(\"swift_s3_checksum_algo_request\", labels\u003dlabels)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def __call__(self, env, start_response):"},{"line_number":427,"context_line":"        # get metrics header labels before any mutation of the headers"}],"source_content_type":"text/x-python","patch_set":46,"id":"00c36a16_d65c117c","line":424,"updated":"2025-10-01 21:11:21.000000000","message":"So we just emit this once per request, but I\u0027m trying to figure out the cardinality of possible timeseries created, even setting aside things like account/container:\n\n- `header_content_encoding`: two possible states\n- `header_transfer_encoding`: two possible states\n- `header_x_amz_decoded_content_length`: two possible states\n- `header_x_amz_content_sha256`: nine possible states, assuming we only get back `hash_64` or `unknown` from `classify_checksum_header_value`\n- `header_content_md5`: three possible states, assuming we only get back `b64_24` or `unknown` from `classify_checksum_header_value`\n- `header_x_amz_trailer`: seven possible states\n- `header_x_amz_checksum_algorithm`: seven (or maybe twelve??) possible states\n- `header_x_amz_sdk_checksum_algorithm`: seven (or maybe twelve??) possible states\n\nAnd I haven\u0027t even touched on the actual checksum headers themselves!\n\nNow, we expect a lot of these combinations to never be used (things like `header_x_amz_checksum_algorithm` not matching `header_x_amz_sdk_checksum_algorithm`, arguably all of the `unknown` possibilities), but it still seems not-unlikely to me that this may create 1,000+ timeseries, especially in something like a public cloud deployment where you have a very rich, diverse client ecosystem.\n\nDo we at least have *some idea* of how many we\u0027ve created in our more homogeneous environments?","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"6a030ddcfba57eb0695e01734a7db85f7df3f83d","unresolved":true,"context_lines":[{"line_number":421,"context_line":"        else:"},{"line_number":422,"context_line":"            labels[\u0027type\u0027] \u003d \u0027UNKNOWN\u0027"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        self.statsd.increment(\"swift_s3_checksum_algo_request\", labels\u003dlabels)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def __call__(self, env, start_response):"},{"line_number":427,"context_line":"        # get metrics header labels before any mutation of the headers"}],"source_content_type":"text/x-python","patch_set":46,"id":"7346c66b_511991d9","line":424,"in_reply_to":"00c36a16_d65c117c","updated":"2025-10-03 21:23:35.000000000","message":"it seems that in prod environment, the large number of time series for the metric was probably not from account label or the checksum labels, but from hostname or instance label added by the SRE scripts","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"ef0d6c084154508b39fcbb4ff0719e06d1101621","unresolved":false,"context_lines":[{"line_number":421,"context_line":"        else:"},{"line_number":422,"context_line":"            labels[\u0027type\u0027] \u003d \u0027UNKNOWN\u0027"},{"line_number":423,"context_line":""},{"line_number":424,"context_line":"        self.statsd.increment(\"swift_s3_checksum_algo_request\", labels\u003dlabels)"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def __call__(self, env, start_response):"},{"line_number":427,"context_line":"        # get metrics header labels before any mutation of the headers"}],"source_content_type":"text/x-python","patch_set":46,"id":"86bde522_8f046566","line":424,"in_reply_to":"7346c66b_511991d9","updated":"2025-11-05 22:29:49.000000000","message":"resolving based on discussion that these labels seem to be no an issue in in prod environment","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"}],"swift/common/middleware/s3api/utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":70,"context_line":"def is_valid_sha256_hash(hash_string):"},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":"    Check if the given string is a valid SHA-256 hash."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    # Check if the string is the correct length for a SHA-256 hash"},{"line_number":75,"context_line":"    if len(hash_string) !\u003d 64:"},{"line_number":76,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":6,"id":"a5361def_6870de25","line":73,"updated":"2025-01-29 21:24:19.000000000","message":"this might be more specific than we want.\n\nA \"valid sha-256 hash\" is just a string of all hex characters that\u0027s 64 bytes long.\n\nA \"valid md5 hash\" is just a string of all hex characters that\u0027s 32 bytes long.\n\nA \"valid sha1 hash\" is just a string of all hex characters that\u0027s 40 bytes long.\n\nI *think* any one of those might be reasonable values for an aws s3 client to send - although possibly/probably not in the `x-amz-content-sha256` header.\n\nI think maybe a client could also perhaps send a `hash_8` as a value with the `x-amz-checksum-crc32` header - although technically I think it\u0027s supposed to be a `b64_8` value.\n\nbut who knows if clients are doing that right; to say nothing of endiness\n\n```\n\u003e\u003e\u003e base64.b64encode((zlib.crc32(b\u0027some ya\u0027)).to_bytes(4, byteorder\u003d\u0027big\u0027))\nb\u0027KBHJGw\u003d\u003d\u0027\n```\n\nRegardless since it\u0027s stand-alone in utils you should add some targeted unittests.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"e906023cd5df7a66c4e2fe7f5ab3c1d112b3716c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"def is_valid_sha256_hash(hash_string):"},{"line_number":71,"context_line":"    \"\"\""},{"line_number":72,"context_line":"    Check if the given string is a valid SHA-256 hash."},{"line_number":73,"context_line":"    \"\"\""},{"line_number":74,"context_line":"    # Check if the string is the correct length for a SHA-256 hash"},{"line_number":75,"context_line":"    if len(hash_string) !\u003d 64:"},{"line_number":76,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":6,"id":"f128a79a_f54f6a6e","line":73,"in_reply_to":"a5361def_6870de25","updated":"2025-01-30 23:36:42.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":82,"context_line":"            return False"},{"line_number":83,"context_line":"        return True"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    valid_lengths \u003d {8, 16, 20, 32, 64, 128, 256, 512}"},{"line_number":86,"context_line":"    if is_valid_hash(value):"},{"line_number":87,"context_line":"        if len(value) in valid_lengths:"},{"line_number":88,"context_line":"            return \u0027hash_%d\u0027 % len(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"93fdfe70_e6848046","line":85,"updated":"2025-01-31 15:43:12.000000000","message":"I\u0027m not sure exactly what values should be in the list - I don\u0027t think I\u0027ve seen a 512 byte long hash and sha256 is only 64; a b64_4 might be reasonable for a crc32 while a hash_20 might be surprising!","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"9dd30999a611e3be149a527ee45dc8a69693ce7c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            return False"},{"line_number":83,"context_line":"        return True"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    valid_lengths \u003d {8, 16, 20, 32, 64, 128, 256, 512}"},{"line_number":86,"context_line":"    if is_valid_hash(value):"},{"line_number":87,"context_line":"        if len(value) in valid_lengths:"},{"line_number":88,"context_line":"            return \u0027hash_%d\u0027 % len(value)"}],"source_content_type":"text/x-python","patch_set":7,"id":"8a969eb1_2bf69193","line":85,"in_reply_to":"93fdfe70_e6848046","updated":"2025-01-31 18:41:21.000000000","message":"Just adding 8, 24 and 28 for base64","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":88,"context_line":"            return \u0027hash_%d\u0027 % len(value)"},{"line_number":89,"context_line":"    elif is_valid_base64(value):"},{"line_number":90,"context_line":"        if len(value) in valid_lengths:"},{"line_number":91,"context_line":"            return \u0027b64_%d\u0027 % len(value)"},{"line_number":92,"context_line":"    return \u0027unknown\u0027"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"a7e76fa8_ac4c06e0","line":91,"updated":"2025-01-31 15:43:12.000000000","message":"I don\u0027t know exactly how b64 encoding works; it might be variable length - we might get a more consistent picture if we measure the length of the decoded value.","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            return \u0027hash_%d\u0027 % len(value)"},{"line_number":89,"context_line":"    elif is_valid_base64(value):"},{"line_number":90,"context_line":"        if len(value) in valid_lengths:"},{"line_number":91,"context_line":"            return \u0027b64_%d\u0027 % len(value)"},{"line_number":92,"context_line":"    return \u0027unknown\u0027"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"361dc456_d8c69ee8","line":91,"in_reply_to":"a7e76fa8_ac4c06e0","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":89,"context_line":"    elif is_valid_base64(value):"},{"line_number":90,"context_line":"        if len(value) in valid_lengths:"},{"line_number":91,"context_line":"            return \u0027b64_%d\u0027 % len(value)"},{"line_number":92,"context_line":"    return \u0027unknown\u0027"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def validate_bucket_name(name, dns_compliant_bucket_names):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1ad469d7_a8f841b1","line":92,"updated":"2025-01-31 16:22:41.000000000","message":"unknown or invalid? I feel like we know what it is (as opposed to looking for a specific header that isn\u0027t found), but the value is outside of our recognised valid types","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"92e6215eeefb685c5f5655c36baa1624b39c7cfa","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    elif is_valid_base64(value):"},{"line_number":90,"context_line":"        if len(value) in valid_lengths:"},{"line_number":91,"context_line":"            return \u0027b64_%d\u0027 % len(value)"},{"line_number":92,"context_line":"    return \u0027unknown\u0027"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def validate_bucket_name(name, dns_compliant_bucket_names):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7350e107_8b4ac215","line":92,"in_reply_to":"051720ca_c96ccd03","updated":"2025-02-02 14:55:48.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":true,"context_lines":[{"line_number":89,"context_line":"    elif is_valid_base64(value):"},{"line_number":90,"context_line":"        if len(value) in valid_lengths:"},{"line_number":91,"context_line":"            return \u0027b64_%d\u0027 % len(value)"},{"line_number":92,"context_line":"    return \u0027unknown\u0027"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def validate_bucket_name(name, dns_compliant_bucket_names):"}],"source_content_type":"text/x-python","patch_set":7,"id":"051720ca_c96ccd03","line":92,"in_reply_to":"1ad469d7_a8f841b1","updated":"2025-01-31 17:46:51.000000000","message":"Can it be an invalid hash but still a valid unknown header!?","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def kebab_to_snake(kebab):"},{"line_number":55,"context_line":"    return kebab.lower().replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def unique_id():"}],"source_content_type":"text/x-python","patch_set":8,"id":"c923b9d1_f1639e2a","line":55,"updated":"2025-01-31 17:07:42.000000000","message":"off-topic: we should get some of these utils into swift/common/utils","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"ea5bed0d8c8e3acaa653eb876b2c2bd4701b4db2","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def kebab_to_snake(kebab):"},{"line_number":55,"context_line":"    return kebab.lower().replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def unique_id():"}],"source_content_type":"text/x-python","patch_set":8,"id":"84619e47_49e3aa1d","line":55,"in_reply_to":"c923b9d1_f1639e2a","updated":"2025-12-08 18:21:29.000000000","message":"specific naming done","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":93,"context_line":"        if len(value) in (8, 16, 20, 32, 64, 128, 256, 512):"},{"line_number":94,"context_line":"            return \u0027hash_%d\u0027 % len(value)"},{"line_number":95,"context_line":"    elif is_valid_base64(value):"},{"line_number":96,"context_line":"        if len(value) in (8, 24, 28):"},{"line_number":97,"context_line":"            return \u0027b64_%d\u0027 % len(value)"},{"line_number":98,"context_line":"    return \u0027unknown\u0027"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"c948449e_54b35758","line":96,"updated":"2025-01-31 17:07:42.000000000","message":"these are the lengths I observed from the unit tests","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        if len(value) in (8, 16, 20, 32, 64, 128, 256, 512):"},{"line_number":94,"context_line":"            return \u0027hash_%d\u0027 % len(value)"},{"line_number":95,"context_line":"    elif is_valid_base64(value):"},{"line_number":96,"context_line":"        if len(value) in (8, 24, 28):"},{"line_number":97,"context_line":"            return \u0027b64_%d\u0027 % len(value)"},{"line_number":98,"context_line":"    return \u0027unknown\u0027"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7f021ca4_8af1964b","line":96,"in_reply_to":"c948449e_54b35758","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":true,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def is_valid_base64(s):"},{"line_number":76,"context_line":"    try:"},{"line_number":77,"context_line":"        base64.b64decode(s)"},{"line_number":78,"context_line":"        return True"},{"line_number":79,"context_line":"    except Exception:"},{"line_number":80,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":46,"id":"d81be9fa_e31edf40","line":77,"updated":"2025-10-01 21:11:21.000000000","message":"😕\n```\n\u003e\u003e\u003e utils.classify_checksum_header_value(\u0027########\u0027)\n\u0027b64_8\u0027\n\u003e\u003e\u003e base64.b64decode(\u0027########\u0027)\nb\u0027\u0027\n```","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def is_valid_hash(hash_string):"},{"line_number":84,"context_line":"    try:"},{"line_number":85,"context_line":"        int(hash_string, 16)"},{"line_number":86,"context_line":"    except ValueError:"},{"line_number":87,"context_line":"        return False"},{"line_number":88,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":46,"id":"58c89a20_13d53bab","line":85,"updated":"2025-10-01 21:11:21.000000000","message":"Hmm...\n```\n\u003e\u003e\u003e utils.classify_checksum_header_value(\u0027       A\u0027)\n\u0027hash_8\u0027\n```\nMaybe it\u0027d be better to use `binascii.unhexlify`?","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":true,"context_lines":[{"line_number":92,"context_line":"    if is_valid_hash(value):"},{"line_number":93,"context_line":"        if len(value) in (8, 16, 20, 32, 64, 128, 256, 512):"},{"line_number":94,"context_line":"            return \u0027hash_%d\u0027 % len(value)"},{"line_number":95,"context_line":"    elif is_valid_base64(value):"},{"line_number":96,"context_line":"        # crc32 -\u003e b64_8"},{"line_number":97,"context_line":"        # crc64 -\u003e b64_12"},{"line_number":98,"context_line":"        # md5 -\u003e b64_24"}],"source_content_type":"text/x-python","patch_set":46,"id":"1646536c_57072849","line":95,"updated":"2025-10-01 21:11:21.000000000","message":"I think you want this to just be an `if` (or, combine the nested `if`s above with an `and`):\n```\n\u003e\u003e\u003e utils.classify_checksum_header_value(\u0027A\u0027 * 8)\n\u0027hash_8\u0027\n\u003e\u003e\u003e utils.classify_checksum_header_value(\u0027A\u0027 * 24)\n\u0027unknown\u0027\n\u003e\u003e\u003e utils.classify_checksum_header_value(\u0027/\u0027 * 24)\n\u0027b64_24\u0027\n```\n\nMore broadly, though, I\u0027m a little worried about this trying to classify based purely on value, rather than looking at the broader context of what the header should be *expecting*. It further confuses things when most hexadecimal strings will be b64-decodable -- but I suppose with the length checks *too*, there\u0027s only the one case where things could get ambiguous and (at least on the happy path 🤞) if we can decode 8 hex digits, that\u0027s probably how we ought to classify it, \u0027cause any b64 str of length 8 we get should end with `\u003d\u003d`.\n\nMakes me wonder if we\u0027d prefer to have the length of the *decoded* value for the label; there\u0027s a decent difference between `AAAAAA\u003d\u003d` and `AAAAAAA\u003d` (and I\u0027d be fine with classifying the latter as \"unknown\").","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"}],"swift/common/utils/__init__.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"7b64de6ee87f212a6382f5d0a8e54ae2f5846b70","unresolved":true,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":189,"context_line":"SHA256_OF_EMPTY_STRING \u003d \\"},{"line_number":190,"context_line":"    \u0027e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\u0027"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":193,"context_line":"RESERVED_STR \u003d u\u0027\\x00\u0027"}],"source_content_type":"text/x-python","patch_set":46,"id":"3945a58c_8bd22c5d","line":190,"updated":"2025-10-01 21:11:21.000000000","message":"We only use this in `test/unit/common/middleware/s3api/test_s3api.py`, right? Should we just define it there?","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"723e0b38a0d5579ca55c8893980edafa288ca362","unresolved":true,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":189,"context_line":"SHA256_OF_EMPTY_STRING \u003d \\"},{"line_number":190,"context_line":"    \u0027e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\u0027"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":193,"context_line":"RESERVED_STR \u003d u\u0027\\x00\u0027"}],"source_content_type":"text/x-python","patch_set":46,"id":"788ee3c8_a9b46758","line":190,"in_reply_to":"3945a58c_8bd22c5d","updated":"2025-11-06 20:15:45.000000000","message":"Agree on defining in test_s3api.py","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"a7200a3c089396f82d55f0e1f53f15c94891e510","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":189,"context_line":"SHA256_OF_EMPTY_STRING \u003d \\"},{"line_number":190,"context_line":"    \u0027e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\u0027"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":193,"context_line":"RESERVED_STR \u003d u\u0027\\x00\u0027"}],"source_content_type":"text/x-python","patch_set":46,"id":"e77bce9d_90817718","line":190,"in_reply_to":"788ee3c8_a9b46758","updated":"2025-11-19 16:04:00.000000000","message":"Done","commit_id":"1cc9a1c552da04779c341e0d56c740f015f423a7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1eac5066fbe42de0930e678516c5e10e3d30cd77","unresolved":true,"context_lines":[{"line_number":187,"context_line":"O_TMPFILE \u003d getattr(os, \u0027O_TMPFILE\u0027, 0o20000000 | os.O_DIRECTORY)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"MD5_OF_EMPTY_STRING \u003d \u0027d41d8cd98f00b204e9800998ecf8427e\u0027"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"RESERVED_BYTE \u003d b\u0027\\x00\u0027"},{"line_number":192,"context_line":"RESERVED_STR \u003d u\u0027\\x00\u0027"},{"line_number":193,"context_line":"RESERVED \u003d \u0027\\x00\u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"b08ef6e4_4e4ae15b","line":190,"updated":"2025-12-17 16:20:49.000000000","message":"these sort of un-related drive by diffs are sort of annoying\n\nbetter for the author to go through the diff line-by-line ONCE and remove any un-needed diffs than for every reviewer to have to keep clicking on a file and be distracted by un-necessary churn.","commit_id":"01d7eef889c23e11a8befa2bd2fecbef9906c135"}],"test/unit/common/middleware/s3api/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":27,"context_line":"from swift.common.middleware.s3api.etree import fromstring"},{"line_number":28,"context_line":"from swift.common.middleware.s3api.subresource import Owner, encode_acl, \\"},{"line_number":29,"context_line":"    Grant, User, ACL, PERMISSIONS, AllUsers, AuthenticatedUsers"},{"line_number":30,"context_line":"from test.debug_logger import FakeLabeledStatsdClient"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"from test.unit.common.middleware.helpers import FakeSwift"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9f51fb30_ce328bc7","line":30,"updated":"2025-01-31 17:07:42.000000000","message":"nit: I\u0027d prefer it if my IDE had inserted this at line 33","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4cb88ec99c9ea26c7587c8539980472fb60237a2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from swift.common.middleware.s3api.etree import fromstring"},{"line_number":28,"context_line":"from swift.common.middleware.s3api.subresource import Owner, encode_acl, \\"},{"line_number":29,"context_line":"    Grant, User, ACL, PERMISSIONS, AllUsers, AuthenticatedUsers"},{"line_number":30,"context_line":"from test.debug_logger import FakeLabeledStatsdClient"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"from test.unit.common.middleware.helpers import FakeSwift"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"a17e9234_4d7c8baa","line":30,"in_reply_to":"9f51fb30_ce328bc7","updated":"2025-01-31 18:25:39.000000000","message":"Acknowledged","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"}],"test/unit/common/middleware/s3api/test_s3api.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1efbe40e682741b071357563f3ffdb5312a121a2","unresolved":true,"context_lines":[{"line_number":1177,"context_line":"                labels[header] \u003d value"},{"line_number":1178,"context_line":"            labels[\u0027method\u0027] \u003d \u0027PUT\u0027"},{"line_number":1179,"context_line":"            labels[\u0027path\u0027] \u003d \u0027foo/bar\u0027"},{"line_number":1180,"context_line":"            statsd.increment(\u0027s3_checksum_algo_request\u0027, labels\u003dlabels)"},{"line_number":1181,"context_line":"        self.assertEqual("},{"line_number":1182,"context_line":"            statsd.sendto_calls,"},{"line_number":1183,"context_line":"            [(b\"s3_checksum_algo_request:1|c|#Authorization:AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250126/us-east-1/s3/aws4_request, SignedHeaders\u003dhost;x-amz-date, Signature\u003dX,Content-MD5:b\u0027bx7QAqtVlYWQFOvwlRUi2Q\u003d\u003d\u0027,X-Amz-Checksum-Crc32:b\u0027something\u0027,X-Amz-Content-SHA256:b\u0027UNSIGNED-PAYLOAD\u0027,X-Amz-Date:20250126T004702Z,X-Amz-Trailer:b\u0027X-Amz-Content-SHA256\u0027,method:PUT,path:foo/bar,user_reqctx:subrequest,x-amz-sdk-checksum-algorithm:b\u0027crc1\u0027\")]"}],"source_content_type":"text/x-python","patch_set":4,"id":"80a7b6a7_e08dda25","line":1180,"updated":"2025-01-28 15:53:19.000000000","message":"this isn\u0027t calling s3api? so it\u0027s just testing the statsd client? which is why the expected value below is nothing like I was expecting!\n\ntests in this module should be calling the s3api","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a7aa8bfbc3044511781fca4c2db8b485be4ef42","unresolved":true,"context_lines":[{"line_number":1177,"context_line":"                labels[header] \u003d value"},{"line_number":1178,"context_line":"            labels[\u0027method\u0027] \u003d \u0027PUT\u0027"},{"line_number":1179,"context_line":"            labels[\u0027path\u0027] \u003d \u0027foo/bar\u0027"},{"line_number":1180,"context_line":"            statsd.increment(\u0027s3_checksum_algo_request\u0027, labels\u003dlabels)"},{"line_number":1181,"context_line":"        self.assertEqual("},{"line_number":1182,"context_line":"            statsd.sendto_calls,"},{"line_number":1183,"context_line":"            [(b\"s3_checksum_algo_request:1|c|#Authorization:AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250126/us-east-1/s3/aws4_request, SignedHeaders\u003dhost;x-amz-date, Signature\u003dX,Content-MD5:b\u0027bx7QAqtVlYWQFOvwlRUi2Q\u003d\u003d\u0027,X-Amz-Checksum-Crc32:b\u0027something\u0027,X-Amz-Content-SHA256:b\u0027UNSIGNED-PAYLOAD\u0027,X-Amz-Date:20250126T004702Z,X-Amz-Trailer:b\u0027X-Amz-Content-SHA256\u0027,method:PUT,path:foo/bar,user_reqctx:subrequest,x-amz-sdk-checksum-algorithm:b\u0027crc1\u0027\")]"}],"source_content_type":"text/x-python","patch_set":4,"id":"b64ff4ca_ab9e0e52","line":1180,"in_reply_to":"80a7b6a7_e08dda25","updated":"2025-01-29 17:26:35.000000000","message":"If I mock patch with s3api and call s3api \u003d S3ApiMiddleware(None, conf), doesn\u0027t it call s3api?","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                labels[header] \u003d value"},{"line_number":1178,"context_line":"            labels[\u0027method\u0027] \u003d \u0027PUT\u0027"},{"line_number":1179,"context_line":"            labels[\u0027path\u0027] \u003d \u0027foo/bar\u0027"},{"line_number":1180,"context_line":"            statsd.increment(\u0027s3_checksum_algo_request\u0027, labels\u003dlabels)"},{"line_number":1181,"context_line":"        self.assertEqual("},{"line_number":1182,"context_line":"            statsd.sendto_calls,"},{"line_number":1183,"context_line":"            [(b\"s3_checksum_algo_request:1|c|#Authorization:AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250126/us-east-1/s3/aws4_request, SignedHeaders\u003dhost;x-amz-date, Signature\u003dX,Content-MD5:b\u0027bx7QAqtVlYWQFOvwlRUi2Q\u003d\u003d\u0027,X-Amz-Checksum-Crc32:b\u0027something\u0027,X-Amz-Content-SHA256:b\u0027UNSIGNED-PAYLOAD\u0027,X-Amz-Date:20250126T004702Z,X-Amz-Trailer:b\u0027X-Amz-Content-SHA256\u0027,method:PUT,path:foo/bar,user_reqctx:subrequest,x-amz-sdk-checksum-algorithm:b\u0027crc1\u0027\")]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3e21e2a4_e1738e7a","line":1180,"in_reply_to":"b64ff4ca_ab9e0e52","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"ff21e40d58858c0dfde527d464ae10c561f36c04"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        self.assertEqual(body, body_data)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class TestS3ApiMiddleware(S3ApiTestCase):"},{"line_number":104,"context_line":"    def setUp(self):"},{"line_number":105,"context_line":"        super(TestS3ApiMiddleware, self).setUp()"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dffa6b27_6ecf189e","line":103,"updated":"2025-01-29 21:24:19.000000000","message":"You should probably just go into the base class and make sure we always have a FakeStatsdClient\n\nhttps://github.com/NVIDIA/swift/blob/master/test/unit/common/middleware/s3api/__init__.py#L120\n\nThen you could instrument existing tests with assertions on statsd they emit and see if they look reasonable.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertEqual(body, body_data)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"class TestS3ApiMiddleware(S3ApiTestCase):"},{"line_number":104,"context_line":"    def setUp(self):"},{"line_number":105,"context_line":"        super(TestS3ApiMiddleware, self).setUp()"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"80ef2161_ecfd45fe","line":103,"in_reply_to":"dffa6b27_6ecf189e","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":249,"context_line":"            \u0027log_statsd_port\u0027: \u00271234\u0027,"},{"line_number":250,"context_line":"            \u0027statsd_label_mode\u0027: \u0027dogstatsd\u0027,"},{"line_number":251,"context_line":"            \u0027statsd_emit_legacy\u0027: False,"},{"line_number":252,"context_line":"            \u0027statsd_user_label_reqctx\u0027: \u0027subrequest\u0027,"},{"line_number":253,"context_line":"        }"},{"line_number":254,"context_line":"        with mock.patch(\u0027swift.common.statsd_client.LabeledStatsdClient\u0027,"},{"line_number":255,"context_line":"                        FakeLabeledStatsdClient):"}],"source_content_type":"text/x-python","patch_set":6,"id":"599e79ba_31a91087","line":252,"updated":"2025-01-29 21:24:19.000000000","message":"oic \"user_label\" - \"subrequest\" is maybe a little confusing in this context because probably no one should configure the user_label `user_reqctx:subrequest` in s3api because it could get mixed up with user_reqctx:subrequest in proxy-logging\n\nmaybe `statsd_user_label_reqctx:s3api` ???\n\nI guess they\u0027re user-labels so users can do whatever they want... and this test shows that will work.  But as a reviewer *I* was confused FWIW.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"2a8e683a72d3abdbfb4be0c42033837df8dc7a2d","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            \u0027log_statsd_port\u0027: \u00271234\u0027,"},{"line_number":250,"context_line":"            \u0027statsd_label_mode\u0027: \u0027dogstatsd\u0027,"},{"line_number":251,"context_line":"            \u0027statsd_emit_legacy\u0027: False,"},{"line_number":252,"context_line":"            \u0027statsd_user_label_reqctx\u0027: \u0027subrequest\u0027,"},{"line_number":253,"context_line":"        }"},{"line_number":254,"context_line":"        with mock.patch(\u0027swift.common.statsd_client.LabeledStatsdClient\u0027,"},{"line_number":255,"context_line":"                        FakeLabeledStatsdClient):"}],"source_content_type":"text/x-python","patch_set":6,"id":"b5911f40_92c144de","line":252,"in_reply_to":"599e79ba_31a91087","updated":"2025-01-31 17:46:51.000000000","message":"Acknowledged","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        statsd \u003d s3api.statsd"},{"line_number":259,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"},{"line_number":260,"context_line":"        with mock.patch.object(statsd, \u0027random\u0027, return_value\u003d0):"},{"line_number":261,"context_line":"            statsd.increment(\u0027baz\u0027, labels\u003d{\u0027label_foo\u0027: \u0027foo\u0027})"},{"line_number":262,"context_line":"        self.assertEqual("},{"line_number":263,"context_line":"            [(b\u0027baz:1|c|#label_foo:foo,user_reqctx:subrequest\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"dce478df_c6a6ed42","line":260,"updated":"2025-01-29 21:24:19.000000000","message":"is this needed with the default FakeLabeledStatsdClient? - that\u0027s kind of nuts.","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        statsd \u003d s3api.statsd"},{"line_number":259,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"},{"line_number":260,"context_line":"        with mock.patch.object(statsd, \u0027random\u0027, return_value\u003d0):"},{"line_number":261,"context_line":"            statsd.increment(\u0027baz\u0027, labels\u003d{\u0027label_foo\u0027: \u0027foo\u0027})"},{"line_number":262,"context_line":"        self.assertEqual("},{"line_number":263,"context_line":"            [(b\u0027baz:1|c|#label_foo:foo,user_reqctx:subrequest\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"48dbd58f_355bfe1d","line":260,"in_reply_to":"d18a2878_1f18462b","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        statsd \u003d s3api.statsd"},{"line_number":259,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"},{"line_number":260,"context_line":"        with mock.patch.object(statsd, \u0027random\u0027, return_value\u003d0):"},{"line_number":261,"context_line":"            statsd.increment(\u0027baz\u0027, labels\u003d{\u0027label_foo\u0027: \u0027foo\u0027})"},{"line_number":262,"context_line":"        self.assertEqual("},{"line_number":263,"context_line":"            [(b\u0027baz:1|c|#label_foo:foo,user_reqctx:subrequest\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"d18a2878_1f18462b","line":260,"in_reply_to":"dce478df_c6a6ed42","updated":"2025-01-31 16:22:41.000000000","message":"should only be necessary of the StatsdClient has been configured with sample_rate \u003c 1","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":262,"context_line":"        self.assertEqual("},{"line_number":263,"context_line":"            [(b\u0027baz:1|c|#label_foo:foo,user_reqctx:subrequest\u0027,"},{"line_number":264,"context_line":"             (\u0027example.com\u0027, 1234))],"},{"line_number":265,"context_line":"            statsd.sendto_calls)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def test_non_s3_request_passthrough(self):"},{"line_number":268,"context_line":"        req \u003d Request.blank(\u0027/something\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"16c8fb27_e7a9da6d","line":265,"updated":"2025-01-29 21:24:19.000000000","message":"This is probably more than sufficient to demonstrate the statsd configuration and instantiation and it\u0027s right next to `test_init_logger` - not bad!","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        self.assertEqual("},{"line_number":263,"context_line":"            [(b\u0027baz:1|c|#label_foo:foo,user_reqctx:subrequest\u0027,"},{"line_number":264,"context_line":"             (\u0027example.com\u0027, 1234))],"},{"line_number":265,"context_line":"            statsd.sendto_calls)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    def test_non_s3_request_passthrough(self):"},{"line_number":268,"context_line":"        req \u003d Request.blank(\u0027/something\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"b26f7ecf_39abfa62","line":265,"in_reply_to":"16c8fb27_e7a9da6d","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":1179,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"},{"line_number":1180,"context_line":"        with mock.patch.object(statsd, \u0027random\u0027, return_value\u003d0):"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":"            for header, value in headers.items():"},{"line_number":1183,"context_line":"                label \u003d {}"},{"line_number":1184,"context_line":"                if header in headers2stats_bucket.keys():"},{"line_number":1185,"context_line":"                    label[headers2stats_bucket[header]] \u003d value"}],"source_content_type":"text/x-python","patch_set":6,"id":"c088d40c_798dc3f3","line":1182,"updated":"2025-01-29 21:24:19.000000000","message":"this test does not help demonstrate the code in s3api that creates the checksum response lables is correct because it doesn\u0027t create a request and call `call_s3api`","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":1179,"context_line":"        self.assertIsInstance(statsd, FakeLabeledStatsdClient)"},{"line_number":1180,"context_line":"        with mock.patch.object(statsd, \u0027random\u0027, return_value\u003d0):"},{"line_number":1181,"context_line":""},{"line_number":1182,"context_line":"            for header, value in headers.items():"},{"line_number":1183,"context_line":"                label \u003d {}"},{"line_number":1184,"context_line":"                if header in headers2stats_bucket.keys():"},{"line_number":1185,"context_line":"                    label[headers2stats_bucket[header]] \u003d value"}],"source_content_type":"text/x-python","patch_set":6,"id":"8b8b6d41_b800015c","line":1182,"in_reply_to":"c088d40c_798dc3f3","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":1212,"context_line":"            \u0027X-Amz-Content-SHA256\u0027: \u00270\u0027 * 64}"},{"line_number":1213,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027, environ\u003denviron, headers\u003dheaders)"},{"line_number":1214,"context_line":"        req.content_type \u003d \u0027text/plain\u0027"},{"line_number":1215,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":1216,"context_line":"        self.assertEqual(status.split()[0], \u0027200\u0027, body)"},{"line_number":1217,"context_line":"        self.assertIn(\u0027swift.backend_path\u0027, req.environ)"},{"line_number":1218,"context_line":"        self.assertEqual(\u0027/v1/AUTH_test/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"2923b090_3f49f860","line":1215,"updated":"2025-01-29 21:24:19.000000000","message":"here we create a reuqest and call s3api - if you add a FakeStatsdClient in the base test case - i would assume if the UUT is correct you should be able to assert some reaonable looking metrics were emited because this request had a `header_x_amz_content_sha256` with a `hash_64` value!","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":1212,"context_line":"            \u0027X-Amz-Content-SHA256\u0027: \u00270\u0027 * 64}"},{"line_number":1213,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027, environ\u003denviron, headers\u003dheaders)"},{"line_number":1214,"context_line":"        req.content_type \u003d \u0027text/plain\u0027"},{"line_number":1215,"context_line":"        status, headers, body \u003d self.call_s3api(req)"},{"line_number":1216,"context_line":"        self.assertEqual(status.split()[0], \u0027200\u0027, body)"},{"line_number":1217,"context_line":"        self.assertIn(\u0027swift.backend_path\u0027, req.environ)"},{"line_number":1218,"context_line":"        self.assertEqual(\u0027/v1/AUTH_test/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"e3210ea7_4b9060b8","line":1215,"in_reply_to":"2923b090_3f49f860","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"bd68cbd5dbbff17581aee4919d06e0d8b6ff5f49","unresolved":true,"context_lines":[{"line_number":1230,"context_line":"                \u0027Credential\u003dtest:tester/20130524/us-east-1/s3/aws4_request, \u0027"},{"line_number":1231,"context_line":"                \u0027SignedHeaders\u003dhost;range;x-amz-date,\u0027"},{"line_number":1232,"context_line":"                \u0027Signature\u003dX\u0027,"},{"line_number":1233,"context_line":"            \u0027X-Amz-Content-SHA256\u0027: \u00270123456789\u0027}"},{"line_number":1234,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027, environ\u003denviron, headers\u003dheaders)"},{"line_number":1235,"context_line":"        req.content_type \u003d \u0027text/plain\u0027"},{"line_number":1236,"context_line":"        status, headers, body \u003d self.call_s3api(req)"}],"source_content_type":"text/x-python","patch_set":6,"id":"2b1ed56e_8f8141d7","line":1233,"updated":"2025-01-29 21:24:19.000000000","message":"oh!  and this would probably be unknown!   Nice!","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3c0831321cacd9d89491ac0925920106c7005d6b","unresolved":false,"context_lines":[{"line_number":1230,"context_line":"                \u0027Credential\u003dtest:tester/20130524/us-east-1/s3/aws4_request, \u0027"},{"line_number":1231,"context_line":"                \u0027SignedHeaders\u003dhost;range;x-amz-date,\u0027"},{"line_number":1232,"context_line":"                \u0027Signature\u003dX\u0027,"},{"line_number":1233,"context_line":"            \u0027X-Amz-Content-SHA256\u0027: \u00270123456789\u0027}"},{"line_number":1234,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027, environ\u003denviron, headers\u003dheaders)"},{"line_number":1235,"context_line":"        req.content_type \u003d \u0027text/plain\u0027"},{"line_number":1236,"context_line":"        status, headers, body \u003d self.call_s3api(req)"}],"source_content_type":"text/x-python","patch_set":6,"id":"2282bc7d_15c65407","line":1233,"in_reply_to":"2b1ed56e_8f8141d7","updated":"2025-01-31 18:27:45.000000000","message":"Done","commit_id":"fd14f64997263df6316f3ad5f15fdca54e05395f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":285,"context_line":"                            {\u0027authorization\u0027: True,"},{"line_number":286,"context_line":"                             \u0027method\u0027: \u0027GET\u0027,"},{"line_number":287,"context_line":"                             \u0027status\u0027: 403}),"},{"line_number":288,"context_line":"                           {})], self.statsd.calls[\u0027increment\u0027])"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def test_bad_method(self):"},{"line_number":291,"context_line":"        req \u003d Request.blank(\u0027/\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"fea57ca1_1216fe14","line":288,"updated":"2025-01-31 17:07:42.000000000","message":"illustrative of how ``Authorization`` triggers less interesting stats","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4cb88ec99c9ea26c7587c8539980472fb60237a2","unresolved":false,"context_lines":[{"line_number":285,"context_line":"                            {\u0027authorization\u0027: True,"},{"line_number":286,"context_line":"                             \u0027method\u0027: \u0027GET\u0027,"},{"line_number":287,"context_line":"                             \u0027status\u0027: 403}),"},{"line_number":288,"context_line":"                           {})], self.statsd.calls[\u0027increment\u0027])"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def test_bad_method(self):"},{"line_number":291,"context_line":"        req \u003d Request.blank(\u0027/\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"07708560_a90be14c","line":288,"in_reply_to":"fea57ca1_1216fe14","updated":"2025-01-31 18:25:39.000000000","message":"Removing this as we aren\u0027t adding Auth as a label!","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":1806,"context_line":"        req.method \u003d \u0027PUT\u0027"},{"line_number":1807,"context_line":"        self.statsd.clear()"},{"line_number":1808,"context_line":"        _, _, body \u003d self.call_s3api(req)"},{"line_number":1809,"context_line":"        print(\u0027xxxxx\u0027, body)"},{"line_number":1810,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027, mock.ANY), {})],"},{"line_number":1811,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1812,"context_line":"        return self.statsd.calls[\u0027increment\u0027][0][0][1]"}],"source_content_type":"text/x-python","patch_set":8,"id":"de21699e_f574bae8","line":1809,"updated":"2025-01-31 16:22:41.000000000","message":"oops!","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4cb88ec99c9ea26c7587c8539980472fb60237a2","unresolved":false,"context_lines":[{"line_number":1806,"context_line":"        req.method \u003d \u0027PUT\u0027"},{"line_number":1807,"context_line":"        self.statsd.clear()"},{"line_number":1808,"context_line":"        _, _, body \u003d self.call_s3api(req)"},{"line_number":1809,"context_line":"        print(\u0027xxxxx\u0027, body)"},{"line_number":1810,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027, mock.ANY), {})],"},{"line_number":1811,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1812,"context_line":"        return self.statsd.calls[\u0027increment\u0027][0][0][1]"}],"source_content_type":"text/x-python","patch_set":8,"id":"9bacf83c_e5599831","line":1809,"in_reply_to":"de21699e_f574bae8","updated":"2025-01-31 18:25:39.000000000","message":"Done","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6fdaa9097bd0e0712d5bf084879c0982b052dc28","unresolved":true,"context_lines":[{"line_number":1809,"context_line":"        print(\u0027xxxxx\u0027, body)"},{"line_number":1810,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027, mock.ANY), {})],"},{"line_number":1811,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1812,"context_line":"        return self.statsd.calls[\u0027increment\u0027][0][0][1]"},{"line_number":1813,"context_line":""},{"line_number":1814,"context_line":"    def test_emit_stats_x_amx_content_sha256_real_hash(self):"},{"line_number":1815,"context_line":"        headers \u003d {\u0027X-Amz-Content-SHA256\u0027: SHA256_OF_EMPTY_STRING}"}],"source_content_type":"text/x-python","patch_set":8,"id":"7305c614_0af99f8a","line":1812,"updated":"2025-01-31 16:22:41.000000000","message":"make it more obvious that the labels are returned","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1bec90e3e09518c6d3749bc62be448c1ed95d1a1","unresolved":true,"context_lines":[{"line_number":1809,"context_line":"        print(\u0027xxxxx\u0027, body)"},{"line_number":1810,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027, mock.ANY), {})],"},{"line_number":1811,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1812,"context_line":"        return self.statsd.calls[\u0027increment\u0027][0][0][1]"},{"line_number":1813,"context_line":""},{"line_number":1814,"context_line":"    def test_emit_stats_x_amx_content_sha256_real_hash(self):"},{"line_number":1815,"context_line":"        headers \u003d {\u0027X-Amz-Content-SHA256\u0027: SHA256_OF_EMPTY_STRING}"}],"source_content_type":"text/x-python","patch_set":8,"id":"becc1673_b41eaf23","line":1812,"in_reply_to":"7305c614_0af99f8a","updated":"2025-01-31 17:07:42.000000000","message":"```\nlabels \u003d self.statsd.calls[\u0027increment\u0027][0][0][1]\nreturn labels\n```","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"4cb88ec99c9ea26c7587c8539980472fb60237a2","unresolved":false,"context_lines":[{"line_number":1809,"context_line":"        print(\u0027xxxxx\u0027, body)"},{"line_number":1810,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027, mock.ANY), {})],"},{"line_number":1811,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1812,"context_line":"        return self.statsd.calls[\u0027increment\u0027][0][0][1]"},{"line_number":1813,"context_line":""},{"line_number":1814,"context_line":"    def test_emit_stats_x_amx_content_sha256_real_hash(self):"},{"line_number":1815,"context_line":"        headers \u003d {\u0027X-Amz-Content-SHA256\u0027: SHA256_OF_EMPTY_STRING}"}],"source_content_type":"text/x-python","patch_set":8,"id":"6688161d_22894142","line":1812,"in_reply_to":"becc1673_b41eaf23","updated":"2025-01-31 18:25:39.000000000","message":"Done","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"42f67f4655b6825360f442633bd2c631b53e3d2a","unresolved":true,"context_lines":[{"line_number":1812,"context_line":"        return self.statsd.calls[\u0027increment\u0027][0][0][1]"},{"line_number":1813,"context_line":""},{"line_number":1814,"context_line":"    def test_emit_stats_x_amx_content_sha256_real_hash(self):"},{"line_number":1815,"context_line":"        headers \u003d {\u0027X-Amz-Content-SHA256\u0027: SHA256_OF_EMPTY_STRING}"},{"line_number":1816,"context_line":"        labels \u003d self._do_test_emit_header_stats(headers)"},{"line_number":1817,"context_line":"        self.assertEqual({\u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":1818,"context_line":"                          \u0027container\u0027: \u0027bucket\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"90678512_391e2ceb","line":1815,"range":{"start_line":1815,"start_character":20,"end_line":1815,"end_character":40},"updated":"2025-01-31 18:08:50.000000000","message":"looks like I missed test coverage for X-Amz-Checksum-SHA256","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"9dd30999a611e3be149a527ee45dc8a69693ce7c","unresolved":false,"context_lines":[{"line_number":1812,"context_line":"        return self.statsd.calls[\u0027increment\u0027][0][0][1]"},{"line_number":1813,"context_line":""},{"line_number":1814,"context_line":"    def test_emit_stats_x_amx_content_sha256_real_hash(self):"},{"line_number":1815,"context_line":"        headers \u003d {\u0027X-Amz-Content-SHA256\u0027: SHA256_OF_EMPTY_STRING}"},{"line_number":1816,"context_line":"        labels \u003d self._do_test_emit_header_stats(headers)"},{"line_number":1817,"context_line":"        self.assertEqual({\u0027account\u0027: \u0027AUTH_test\u0027,"},{"line_number":1818,"context_line":"                          \u0027container\u0027: \u0027bucket\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"79bfc491_dc9b4a01","line":1815,"range":{"start_line":1815,"start_character":20,"end_line":1815,"end_character":40},"in_reply_to":"90678512_391e2ceb","updated":"2025-01-31 18:41:21.000000000","message":"Added","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"42f67f4655b6825360f442633bd2c631b53e3d2a","unresolved":true,"context_lines":[{"line_number":1882,"context_line":"        self.assertEqual({\u0027authorization\u0027: True,"},{"line_number":1883,"context_line":"                          \u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1884,"context_line":"                          \u0027status\u0027: 400,"},{"line_number":1885,"context_line":"                          # TODO: might be better to have \u0027invalid\u0027 here..."},{"line_number":1886,"context_line":"                          \u0027content_md5\u0027: \u0027b64_8\u0027,"},{"line_number":1887,"context_line":"                          \u0027x_amz_content_sha256\u0027: \u0027hash_64\u0027},"},{"line_number":1888,"context_line":"                         labels)"}],"source_content_type":"text/x-python","patch_set":8,"id":"e73e8630_b07c6ce1","line":1885,"updated":"2025-01-31 18:08:50.000000000","message":"no. discussed and decided we\u0027d like visibility of what the client set (assuming it maps to one of the expected lengths)","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"9dd30999a611e3be149a527ee45dc8a69693ce7c","unresolved":false,"context_lines":[{"line_number":1882,"context_line":"        self.assertEqual({\u0027authorization\u0027: True,"},{"line_number":1883,"context_line":"                          \u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1884,"context_line":"                          \u0027status\u0027: 400,"},{"line_number":1885,"context_line":"                          # TODO: might be better to have \u0027invalid\u0027 here..."},{"line_number":1886,"context_line":"                          \u0027content_md5\u0027: \u0027b64_8\u0027,"},{"line_number":1887,"context_line":"                          \u0027x_amz_content_sha256\u0027: \u0027hash_64\u0027},"},{"line_number":1888,"context_line":"                         labels)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ead9a64e_f11a321c","line":1885,"in_reply_to":"e73e8630_b07c6ce1","updated":"2025-01-31 18:41:21.000000000","message":"Done","commit_id":"64278526b91ac05a4352f8c5cc57758576ace984"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9f3c4fa6b9133f1f4414caca8cdba6da5310bca","unresolved":true,"context_lines":[{"line_number":1817,"context_line":"                         labels)"},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"    def test_emit_stats_x_amx_checksum_sha256_real_hash(self):"},{"line_number":1820,"context_line":"        headers \u003d {\u0027X-Amz-Checksum-SHA256\u0027: SHA256_OF_EMPTY_STRING}"},{"line_number":1821,"context_line":"        labels \u003d self._do_test_emit_header_stats(headers)"},{"line_number":1822,"context_line":"        self.assertEqual({\u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1823,"context_line":"                          \u0027status\u0027: 400,"}],"source_content_type":"text/x-python","patch_set":10,"id":"cae759bf_dcae438d","line":1820,"updated":"2025-02-03 13:49:28.000000000","message":"x-amz-checksum-sha256 is base64 of the sha256 digest\nx-amx-content-sha256 is the sha256 hexdigest\n\ne.g.\n\n```\n2025-02-03 13:40:00,406 - MainThread - botocore.endpoint - DEBUG - Sending\n http request: \u003cAWSPreparedRequest stream_output\u003dFalse, method\u003dPUT,\n  url\u003dhttp://saio4:8080/test/test, \n  headers\u003d{\u0027x-amz-sdk-checksum-algorithm\u0027: b\u0027sha256\u0027,\n   \u0027User-Agent\u0027: b\u0027aws-cli/1.37.8 md/Botocore#1.36.11 md/awscrt#0.23.8 ua/2.0 os/linux#5.4.0-90-generic md/arch#aarch64 lang/python#3.8.10 md/pyimpl#CPython cfg/retry-mode#legacy botocore/1.36.11\u0027,\n   \u0027Expect\u0027: b\u0027100-continue\u0027,\n   \u0027x-amz-checksum-sha256\u0027: b\u0027MeAODkwjPIkFHNdIEi/eLJjbASHKCbqTo4IIF+oDe8U\u003d\u0027,\n   \u0027host\u0027: b\u0027saio4:8080\u0027, \u0027X-Amz-Date\u0027: b\u002720250203T134000Z\u0027,\n   \u0027x-amz-content-sha256\u0027: b\u002731e00e0e4c233c89051cd748122fde2c98db0121ca09ba93a3820817ea037bc5\u0027, \n...\n```","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3a471139924429504f08617c7404cdb14fa0e671","unresolved":false,"context_lines":[{"line_number":1817,"context_line":"                         labels)"},{"line_number":1818,"context_line":""},{"line_number":1819,"context_line":"    def test_emit_stats_x_amx_checksum_sha256_real_hash(self):"},{"line_number":1820,"context_line":"        headers \u003d {\u0027X-Amz-Checksum-SHA256\u0027: SHA256_OF_EMPTY_STRING}"},{"line_number":1821,"context_line":"        labels \u003d self._do_test_emit_header_stats(headers)"},{"line_number":1822,"context_line":"        self.assertEqual({\u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1823,"context_line":"                          \u0027status\u0027: 400,"}],"source_content_type":"text/x-python","patch_set":10,"id":"db5af634_fab9fd27","line":1820,"in_reply_to":"cae759bf_dcae438d","updated":"2025-02-03 17:38:39.000000000","message":"Acknowledged","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e9f3c4fa6b9133f1f4414caca8cdba6da5310bca","unresolved":true,"context_lines":[{"line_number":1881,"context_line":"        labels \u003d self._do_test_emit_header_stats(headers)"},{"line_number":1882,"context_line":"        self.assertEqual({\u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1883,"context_line":"                          \u0027status\u0027: 400,"},{"line_number":1884,"context_line":"                          # TODO: might be better to have \u0027invalid\u0027 here..."},{"line_number":1885,"context_line":"                          \u0027header_content_md5\u0027: \u0027b64_8\u0027,"},{"line_number":1886,"context_line":"                          \u0027header_x_amz_content_sha256\u0027: \u0027hash_64\u0027},"},{"line_number":1887,"context_line":"                         labels)"}],"source_content_type":"text/x-python","patch_set":10,"id":"2e456a81_90bee45b","line":1884,"range":{"start_line":1884,"start_character":26,"end_line":1884,"end_character":75},"updated":"2025-02-03 13:49:28.000000000","message":"this TODO need to be deleted - we\u0027re going to report the recognised type","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"3a471139924429504f08617c7404cdb14fa0e671","unresolved":false,"context_lines":[{"line_number":1881,"context_line":"        labels \u003d self._do_test_emit_header_stats(headers)"},{"line_number":1882,"context_line":"        self.assertEqual({\u0027method\u0027: \u0027PUT\u0027,"},{"line_number":1883,"context_line":"                          \u0027status\u0027: 400,"},{"line_number":1884,"context_line":"                          # TODO: might be better to have \u0027invalid\u0027 here..."},{"line_number":1885,"context_line":"                          \u0027header_content_md5\u0027: \u0027b64_8\u0027,"},{"line_number":1886,"context_line":"                          \u0027header_x_amz_content_sha256\u0027: \u0027hash_64\u0027},"},{"line_number":1887,"context_line":"                         labels)"}],"source_content_type":"text/x-python","patch_set":10,"id":"8386b919_59092927","line":1884,"range":{"start_line":1884,"start_character":26,"end_line":1884,"end_character":75},"in_reply_to":"2e456a81_90bee45b","updated":"2025-02-03 17:38:39.000000000","message":"Acknowledged","commit_id":"ce0954b1b8c5cc90310b1b4eddd6c53586a0c520"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"40c946bb0f540b305e6b68a6039c31d1fd21f419","unresolved":true,"context_lines":[{"line_number":1923,"context_line":"        with mock.patch(\u0027swift.common.middleware.s3api.s3request.S3Request.\u0027"},{"line_number":1924,"context_line":"                        \u0027get_response\u0027, mock_handler):"},{"line_number":1925,"context_line":"            _, _, body \u003d self.call_s3api(req)"},{"line_number":1926,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027, mock.ANY), {})],"},{"line_number":1927,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1928,"context_line":"        labels \u003d self.statsd.calls[\u0027increment\u0027][0][0][1]"},{"line_number":1929,"context_line":"        return labels"}],"source_content_type":"text/x-python","patch_set":21,"id":"f18be32f_e063535d","line":1926,"range":{"start_line":1926,"start_character":62,"end_line":1926,"end_character":70},"updated":"2025-04-09 17:25:47.000000000","message":"this *was* the positional ``labels`` arg","commit_id":"870de353c287765d9c8b263314fac87f80979151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a677f74b0ca4db229881607ad6113d73a4a6b984","unresolved":false,"context_lines":[{"line_number":1923,"context_line":"        with mock.patch(\u0027swift.common.middleware.s3api.s3request.S3Request.\u0027"},{"line_number":1924,"context_line":"                        \u0027get_response\u0027, mock_handler):"},{"line_number":1925,"context_line":"            _, _, body \u003d self.call_s3api(req)"},{"line_number":1926,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027, mock.ANY), {})],"},{"line_number":1927,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1928,"context_line":"        labels \u003d self.statsd.calls[\u0027increment\u0027][0][0][1]"},{"line_number":1929,"context_line":"        return labels"}],"source_content_type":"text/x-python","patch_set":21,"id":"8812bb32_33ec285c","line":1926,"range":{"start_line":1926,"start_character":62,"end_line":1926,"end_character":70},"in_reply_to":"f18be32f_e063535d","updated":"2025-04-10 15:45:20.000000000","message":"Acknowledged","commit_id":"870de353c287765d9c8b263314fac87f80979151"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"40c946bb0f540b305e6b68a6039c31d1fd21f419","unresolved":true,"context_lines":[{"line_number":1923,"context_line":"        with mock.patch(\u0027swift.common.middleware.s3api.s3request.S3Request.\u0027"},{"line_number":1924,"context_line":"                        \u0027get_response\u0027, mock_handler):"},{"line_number":1925,"context_line":"            _, _, body \u003d self.call_s3api(req)"},{"line_number":1926,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027,), mock.ANY)],"},{"line_number":1927,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1928,"context_line":"        kwargs \u003d self.statsd.calls[\u0027increment\u0027][0][1]"},{"line_number":1929,"context_line":"        self.assertIn(\u0027labels\u0027, kwargs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"d7e28ff7_a8a15f16","line":1926,"range":{"start_line":1926,"start_character":64,"end_line":1926,"end_character":72},"updated":"2025-04-09 17:25:47.000000000","message":"this mock.ANY is the kwargs - we want to extract the ``labels`` kwarg and return it","commit_id":"0a3dbdc65e0f259b6f84bcf2cfc6e06e0da0402e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a677f74b0ca4db229881607ad6113d73a4a6b984","unresolved":false,"context_lines":[{"line_number":1923,"context_line":"        with mock.patch(\u0027swift.common.middleware.s3api.s3request.S3Request.\u0027"},{"line_number":1924,"context_line":"                        \u0027get_response\u0027, mock_handler):"},{"line_number":1925,"context_line":"            _, _, body \u003d self.call_s3api(req)"},{"line_number":1926,"context_line":"        self.assertEqual([((\u0027swift_s3_checksum_algo_request\u0027,), mock.ANY)],"},{"line_number":1927,"context_line":"                         self.statsd.calls[\u0027increment\u0027])"},{"line_number":1928,"context_line":"        kwargs \u003d self.statsd.calls[\u0027increment\u0027][0][1]"},{"line_number":1929,"context_line":"        self.assertIn(\u0027labels\u0027, kwargs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"ef2934f3_328bdcda","line":1926,"range":{"start_line":1926,"start_character":64,"end_line":1926,"end_character":72},"in_reply_to":"d7e28ff7_a8a15f16","updated":"2025-04-10 15:45:20.000000000","message":"Acknowledged","commit_id":"0a3dbdc65e0f259b6f84bcf2cfc6e06e0da0402e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8078fcb296476929996eae01682e4e3f682e59c3","unresolved":true,"context_lines":[{"line_number":2253,"context_line":"            self.assertEqual({\u0027method\u0027: \u0027PUT\u0027,"},{"line_number":2254,"context_line":"                              \u0027type\u0027: \u0027UNKNOWN\u0027,"},{"line_number":2255,"context_line":"                              \u0027status\u0027: 400,"},{"line_number":2256,"context_line":"                              \u0027header_x_amz_checksum_algorithm\u0027: algo},"},{"line_number":2257,"context_line":"                             labels)"},{"line_number":2258,"context_line":"        do_test(\u0027CRC32\u0027)"},{"line_number":2259,"context_line":"        do_test(\u0027CRC32C\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"3c5051fa_ef4d35da","line":2256,"updated":"2025-08-18 18:13:31.000000000","message":"I believe most clients actually send sdk-checksum-algo, since the code handles both we should test both\n\n```\ndiff --git a/test/unit/common/middleware/s3api/test_s3api.py b/test/unit/common/middleware/s3api/test_s3api.py\nindex 590e581a2..f980b1272 100644\n--- a/test/unit/common/middleware/s3api/test_s3api.py\n+++ b/test/unit/common/middleware/s3api/test_s3api.py\n@@ -2266,6 +2266,28 @@ class TestS3ApiMiddleware(S3ApiTestCase):\n         do_test(\u0027SHA-1\u0027)\n         do_test(\u0027SHA-256\u0027)\n \n+    def test_emit_stats_x_amz_sdk_checksum_algorithm(self):\n+        def do_test(algo):\n+            headers \u003d {\n+                \u0027x-amz-sdk-checksum-algorithm\u0027: algo,\n+            }\n+            labels \u003d self._do_test_emit_header_stats(headers)\n+            self.assertEqual({\u0027method\u0027: \u0027PUT\u0027,\n+                              \u0027type\u0027: \u0027UNKNOWN\u0027,\n+                              \u0027status\u0027: 400,\n+                              \u0027header_x_amz_sdk_checksum_algorithm\u0027: algo},\n+                             labels)\n+        do_test(\u0027CRC32\u0027)\n+        do_test(\u0027CRC32C\u0027)\n+        do_test(\u0027CRC64NVME\u0027)\n+        do_test(\u0027SHA1\u0027)\n+        do_test(\u0027SHA256\u0027)\n+        do_test(\u0027CRC-32\u0027)\n+        do_test(\u0027CRC-32C\u0027)\n+        do_test(\u0027CRC-64NVME\u0027)\n+        do_test(\u0027SHA-1\u0027)\n+        do_test(\u0027SHA-256\u0027)\n+\n     def test_emit_stats_x_amz_checksum_algorithm_unknown(self):\n         headers \u003d {\n             \u0027X-Amz-Checksum-Algorithm\u0027: \u0027CRC128\u0027,\n```","commit_id":"d3997395844e2d3be0bc6be7521e7412177ed55d"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"a7200a3c089396f82d55f0e1f53f15c94891e510","unresolved":false,"context_lines":[{"line_number":2253,"context_line":"            self.assertEqual({\u0027method\u0027: \u0027PUT\u0027,"},{"line_number":2254,"context_line":"                              \u0027type\u0027: \u0027UNKNOWN\u0027,"},{"line_number":2255,"context_line":"                              \u0027status\u0027: 400,"},{"line_number":2256,"context_line":"                              \u0027header_x_amz_checksum_algorithm\u0027: algo},"},{"line_number":2257,"context_line":"                             labels)"},{"line_number":2258,"context_line":"        do_test(\u0027CRC32\u0027)"},{"line_number":2259,"context_line":"        do_test(\u0027CRC32C\u0027)"}],"source_content_type":"text/x-python","patch_set":43,"id":"6853dc36_759349d5","line":2256,"in_reply_to":"3c5051fa_ef4d35da","updated":"2025-11-19 16:04:00.000000000","message":"Done","commit_id":"d3997395844e2d3be0bc6be7521e7412177ed55d"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4bad9749c42bb183ad881830e33caec7856a60e2","unresolved":false,"context_lines":[{"line_number":2333,"context_line":""},{"line_number":2334,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":2335,"context_line":"    unittest.main()"},{"line_number":2336,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":45,"id":"75d41eb0_95d0448e","line":2336,"updated":"2025-08-26 18:42:24.000000000","message":"my damn editor","commit_id":"64e18caab0b7118bb59814a6158bdbc294ac2b8d"}],"test/unit/common/middleware/s3api/test_utils.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d41d5487bb426f8a358e3a10956b8f5b1fc89832","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        self.assertEqual("},{"line_number":46,"context_line":"            utils.classify_checksum_header_value(\u0027abcdef\u00261\u0027), \u0027unknown\u0027)"},{"line_number":47,"context_line":"        self.assertEqual("},{"line_number":48,"context_line":"            utils.classify_checksum_header_value(\u0027z\u0027), \u0027unknown\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_validate_bucket_name(self):"},{"line_number":51,"context_line":"        # good cases"}],"source_content_type":"text/x-python","patch_set":7,"id":"10fea76f_5cc69d7e","line":48,"updated":"2025-01-31 15:43:12.000000000","message":"these tests are pretty good - kudos!","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"},{"author":{"_account_id":35790,"name":"Shreeya Deshpande","email":"shreeyad@nvidia.com","username":"shreeyad"},"change_message_id":"9dd30999a611e3be149a527ee45dc8a69693ce7c","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.assertEqual("},{"line_number":46,"context_line":"            utils.classify_checksum_header_value(\u0027abcdef\u00261\u0027), \u0027unknown\u0027)"},{"line_number":47,"context_line":"        self.assertEqual("},{"line_number":48,"context_line":"            utils.classify_checksum_header_value(\u0027z\u0027), \u0027unknown\u0027)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def test_validate_bucket_name(self):"},{"line_number":51,"context_line":"        # good cases"}],"source_content_type":"text/x-python","patch_set":7,"id":"94e9c0ee_f258c66d","line":48,"in_reply_to":"10fea76f_5cc69d7e","updated":"2025-01-31 18:41:21.000000000","message":"Done","commit_id":"426012bdce0b93e3c085e9959c4e5ddb87deb123"}]}
