)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77185d0ec425971d5d9518c741c5ae724dd6eef2","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-04-19 15:35:24 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"failing test: slo download raises SwiftError"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I5b2d79f89d1b6016de69d6b58879e5c2ef31e107"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"26a8aacb_b807a4da","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":12},"updated":"2024-04-23 18:52:30.000000000","message":"Looks to be passing to me ;-)\n\nMight want to add a\n\n\u003e Related-Change: Ice9cc9fe68684563f18ee527996e5a4292230a96\n\nLooks like we didn\u0027t write up a bug for it.","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdef15d35da538a5d84eb665239c6dc372f261e8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-04-19 15:35:24 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"failing test: slo download raises SwiftError"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I5b2d79f89d1b6016de69d6b58879e5c2ef31e107"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"42b2a6b2_c5ac983f","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":12},"in_reply_to":"26a8aacb_b807a4da","updated":"2024-04-26 15:26:40.000000000","message":"Updating the message; the command_helpers change because of duplicated ETag in object stat command output noticed by Clay","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-04-26 09:59:09 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"failing test: slo download raises SwiftError"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"40eb4f8c_9c57a99e","line":7,"updated":"2024-04-29 17:32:53.000000000","message":"I think we can drop this line now","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Yan Xiao \u003cyanxiao@nvidia.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-04-26 09:59:09 -0400"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"failing test: slo download raises SwiftError"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3792f2e1_a9595e1b","line":7,"in_reply_to":"40eb4f8c_9c57a99e","updated":"2024-04-30 22:30:54.000000000","message":"Done","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"failing test: slo download raises SwiftError"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"},{"line_number":11,"context_line":"    SwiftReader about SLO object ETag header not matching MD5 checksum"},{"line_number":12,"context_line":"  - output for object stat: fix duplicated ETag"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"f6dc7f07_4fcb5c91","line":9,"updated":"2024-04-29 17:32:53.000000000","message":"this would be a good title - just bring it to the top and add a newline before your bullets.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"failing test: slo download raises SwiftError"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"},{"line_number":11,"context_line":"    SwiftReader about SLO object ETag header not matching MD5 checksum"},{"line_number":12,"context_line":"  - output for object stat: fix duplicated ETag"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3dfa5baa_68a012f4","line":9,"in_reply_to":"f6dc7f07_4fcb5c91","updated":"2024-04-30 22:30:54.000000000","message":"Done","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"},{"line_number":11,"context_line":"    SwiftReader about SLO object ETag header not matching MD5 checksum"},{"line_number":12,"context_line":"  - output for object stat: fix duplicated ETag"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Related-Change: Ice9cc9fe68684563f18ee527996e5a4292230a96"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"e0d79cff_583645fd","line":11,"updated":"2024-04-29 17:32:53.000000000","message":"FWIW I think it was an error/exit-1, not just a warning.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"},{"line_number":11,"context_line":"    SwiftReader about SLO object ETag header not matching MD5 checksum"},{"line_number":12,"context_line":"  - output for object stat: fix duplicated ETag"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Related-Change: Ice9cc9fe68684563f18ee527996e5a4292230a96"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"a25cc947_758933f0","line":11,"in_reply_to":"e0d79cff_583645fd","updated":"2024-05-01 16:31:39.000000000","message":"Acknowledged","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6d1cf8c6ebd30b3f1a5400c9a0bddcf0ffdabeb2","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"},{"line_number":11,"context_line":"    SwiftReader about SLO object ETag header not matching MD5 checksum"},{"line_number":12,"context_line":"  - output for object stat: fix duplicated ETag"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Related-Change: Ice9cc9fe68684563f18ee527996e5a4292230a96"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7ed754d8_5fd21507","line":12,"updated":"2024-04-29 20:37:03.000000000","message":"It\u0027s more than just object stat -- today on master I see\n```\nvagrant@saio:~$ swift stat\n                       Account: AUTH_test\n                    Containers: 3\n                       Objects: 13\n                         Bytes: 104857600\nContainers in policy \"Default\": 3\n   Objects in policy \"Default\": 13\n     Bytes in policy \"Default\": 104857600\n                  Content-Type: text/plain; charset\u003dutf-8\n     X-Account-Container-Count: 3\n        X-Account-Object-Count: 13\n          X-Account-Bytes-Used: 104857600\n                   X-Timestamp: 1713996465.88953\n                 Accept-Ranges: bytes\n                          Vary: Accept\n                Content-Length: 0\n                    X-Trans-Id: tx3ea634c6f3d64e7294436-0066300429\n        X-Openstack-Request-Id: tx3ea634c6f3d64e7294436-0066300429\n                          Date: Mon, 29 Apr 2024 20:33:45 GMT\nvagrant@saio:~$ swift stat bucket\n                 Account: AUTH_test\n               Container: bucket\n                 Objects: 0\n                   Bytes: 0\n                Read ACL:\n               Write ACL:\n                 Sync To:\n                Sync Key:\n            Content-Type: text/plain; charset\u003dutf-8\nX-Container-Object-Count: 0\n  X-Container-Bytes-Used: 0\n             X-Timestamp: 1713998531.89074\n           Last-Modified: Wed, 24 Apr 2024 22:42:12 GMT\n           Accept-Ranges: bytes\n        X-Storage-Policy: default\n                    Vary: Accept\n          Content-Length: 0\n              X-Trans-Id: tx6e480c205eec43f68dd60-006630042b\n  X-Openstack-Request-Id: tx6e480c205eec43f68dd60-006630042b\n                    Date: Mon, 29 Apr 2024 20:33:47 GMT\n```\n(Note the `Objects`/`X-*-Object-Count` lines, for example.)","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Fix swiftclient output regression introduced by the related change:"},{"line_number":10,"context_line":"  - output for SLO object download: fix incorrect warning from"},{"line_number":11,"context_line":"    SwiftReader about SLO object ETag header not matching MD5 checksum"},{"line_number":12,"context_line":"  - output for object stat: fix duplicated ETag"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Related-Change: Ice9cc9fe68684563f18ee527996e5a4292230a96"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"63d61fa1_2eec89c0","line":12,"in_reply_to":"7ed754d8_5fd21507","updated":"2024-05-01 16:31:39.000000000","message":"Thanks for pointing that out, Tim. Fixed the output","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77185d0ec425971d5d9518c741c5ae724dd6eef2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"63ee59e3_5688a789","updated":"2024-04-23 18:52:30.000000000","message":"Commit message needs updating, especially since we\u0027re fixing problems outside of just SLO downloads.\n\nWas the command_helpers change because of some user-reported problem we saw? Or was it more of a drive-by? Looks like it was a little incomplete: it fixed some overall account stat duplication (and pretty-printing of object meta), but now there\u0027s per-policy stats that get duplicated, like\n\n```\n$ swift stat\n                                         Account: AUTH_test\n                                      Containers: 1\n                                         Objects: 1\n                                           Bytes: 5951\n                  Containers in policy \"Default\": 1\n                     Objects in policy \"Default\": 1\n                       Bytes in policy \"Default\": 5951\n                                    Content-Type: text/plain; charset\u003dutf-8\n                                     X-Timestamp: 1711055839.79847\nX-Account-Storage-Policy-Default-Container-Count: 1\n   X-Account-Storage-Policy-Default-Object-Count: 1\n     X-Account-Storage-Policy-Default-Bytes-Used: 5951\n                                   Accept-Ranges: bytes\n                                            Vary: Accept\n                                      X-Trans-Id: txed899ee1e2c24e5c8ae1d-006627feb0\n                          X-Openstack-Request-Id: txed899ee1e2c24e5c8ae1d-006627feb0\n```\n\nI\u0027ve got mixed feelings about how the storage policy casing changed, but I\u0027m not sure it matters much.","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6d1cf8c6ebd30b3f1a5400c9a0bddcf0ffdabeb2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8ca8f7cf_2aa5866b","updated":"2024-04-29 20:37:03.000000000","message":"I can\u0027t decide whether these comments are more for Yan or Clay :P","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"80725ae5_bd668eb9","updated":"2024-04-29 17:32:53.000000000","message":"I think the tests are both good!\n\nThe fix in service.py makes sense.\n\nI think the fix in command_helpers is out of form with the rest of the module, but is well covered by the new test.\n\nI don\u0027t think the change in client is helpful/needed.\n\nPleaes fix the commit message.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d60876f90441a3896563c166a1acc759fce4945","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1a5723db_2af6936e","updated":"2024-04-29 21:13:27.000000000","message":"Yan let me know if it\u0027s not clear what you should do to get this change ready to merge - it would be nice not to leave this linger.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"e2d5386f_3046535b","updated":"2024-04-30 22:30:54.000000000","message":"I don\u0027t like that our new tests are using CaseInsenstiveDict to stub the return time of the connection in the same change we\u0027re introducing a new class in order to guranatee backwards compatibility with regular-plain-lower-case-key-dicts\n\nI think we could simplfy the diff and get most of the benifit:\n\n917795: sq? less code, more tests | https://review.opendev.org/c/openstack/python-swiftclient/+/917795\n\n... but maybe I\u0027m missing some goal/requirement; happy to consider any responses to my questions/comments.","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7dfffb0124f47cb0dbc992de1ce6d8be64aeaed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"da9d7ab9_5cb58d9f","updated":"2024-05-01 22:11:48.000000000","message":"AFAIK aside from the pep8 error for the un-used import this is probably fine - Tim is the one that cares about \"clients assume headers always iter lower case\" - I was mostly fine just fixing command_helpers and service, but totally support doing both!\n\nI had some other tests in https://review.opendev.org/c/openstack/python-swiftclient/+/917795/1/test/unit/test_swiftclient.py#1140 that weren\u0027t obviously all bad - specifically I think it\u0027s relevant/useful to demonstrate how overiding __iter__ fixes ALL of `iter(headers)`, `iter(headers.keys())` and `{k for k, v in headers.items()}` - but now that *I* know that\u0027s true I\u0027m not willing to say \"we must have this behavior asserted\" so much as imagining it might be helpful to the next guy trying to grok what\u0027s going on and why the impleentation is the way it is.","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7079473623f7a8e9588c0e04784948566e8d3911","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0ad9fb22_81efcbb1","updated":"2024-05-02 21:37:33.000000000","message":"WFM!","commit_id":"d322aad51fbcb6a0a756ee13660c7d37f86237f1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"59c5812248cb4549f6f4352c93e26afb0c914cc8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"068c221b_b84eff6f","updated":"2024-05-03 18:13:32.000000000","message":"nice catch tim!  MockHttpTest lazy reload bites again:\n\nhttps://github.com/openstack/python-swiftclient/blob/master/test/unit/utils.py#L407-L411","commit_id":"ed6fd60915fed7fd2a319fbbf1daec5f04169ebf"}],"swiftclient/client.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":740,"context_line":"def resp_header_dict(resp):"},{"line_number":741,"context_line":"    resp_headers \u003d CaseInsensitiveDict()"},{"line_number":742,"context_line":"    for header, value in resp.getheaders():"},{"line_number":743,"context_line":"        header \u003d parse_header_string(header).lower()"},{"line_number":744,"context_line":"        resp_headers[header] \u003d parse_header_string(value)"},{"line_number":745,"context_line":"    return resp_headers"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3bc801f3_15ae5f5a","line":743,"updated":"2024-04-29 17:32:53.000000000","message":"non-obvious why the case of the key we put into a CaseInsensitiveDict would matter\n\nno tests in `python-swiftclient/test/unit/` fail when i revert this change","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d60876f90441a3896563c166a1acc759fce4945","unresolved":true,"context_lines":[{"line_number":740,"context_line":"def resp_header_dict(resp):"},{"line_number":741,"context_line":"    resp_headers \u003d CaseInsensitiveDict()"},{"line_number":742,"context_line":"    for header, value in resp.getheaders():"},{"line_number":743,"context_line":"        header \u003d parse_header_string(header).lower()"},{"line_number":744,"context_line":"        resp_headers[header] \u003d parse_header_string(value)"},{"line_number":745,"context_line":"    return resp_headers"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"f51f2bad_809f76ea","line":743,"in_reply_to":"2a9c41e2_8146166b","updated":"2024-04-29 21:13:27.000000000","message":"that seems like more of what answer than a why answer - and doesn\u0027t offer any solution to the problem of an untested behavior (assuming it\u0027s needed, which I\u0027m not sure it should be - strictly speaking)","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6d1cf8c6ebd30b3f1a5400c9a0bddcf0ffdabeb2","unresolved":true,"context_lines":[{"line_number":740,"context_line":"def resp_header_dict(resp):"},{"line_number":741,"context_line":"    resp_headers \u003d CaseInsensitiveDict()"},{"line_number":742,"context_line":"    for header, value in resp.getheaders():"},{"line_number":743,"context_line":"        header \u003d parse_header_string(header).lower()"},{"line_number":744,"context_line":"        resp_headers[header] \u003d parse_header_string(value)"},{"line_number":745,"context_line":"    return resp_headers"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2a9c41e2_8146166b","line":743,"in_reply_to":"3bc801f3_15ae5f5a","updated":"2024-04-29 20:37:03.000000000","message":"`CaseInsensitiveDict` preserves the casing that was passed to it, affecting the case of keys in `.items()` and `.keys()` (as well as `__iter__`).","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":false,"context_lines":[{"line_number":740,"context_line":"def resp_header_dict(resp):"},{"line_number":741,"context_line":"    resp_headers \u003d CaseInsensitiveDict()"},{"line_number":742,"context_line":"    for header, value in resp.getheaders():"},{"line_number":743,"context_line":"        header \u003d parse_header_string(header).lower()"},{"line_number":744,"context_line":"        resp_headers[header] \u003d parse_header_string(value)"},{"line_number":745,"context_line":"    return resp_headers"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3bcf2840_dee450f3","line":743,"in_reply_to":"667533b1_b03b5058","updated":"2024-05-01 16:31:39.000000000","message":"Acknowledged","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":true,"context_lines":[{"line_number":740,"context_line":"def resp_header_dict(resp):"},{"line_number":741,"context_line":"    resp_headers \u003d CaseInsensitiveDict()"},{"line_number":742,"context_line":"    for header, value in resp.getheaders():"},{"line_number":743,"context_line":"        header \u003d parse_header_string(header).lower()"},{"line_number":744,"context_line":"        resp_headers[header] \u003d parse_header_string(value)"},{"line_number":745,"context_line":"    return resp_headers"},{"line_number":746,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"667533b1_b03b5058","line":743,"in_reply_to":"f51f2bad_809f76ea","updated":"2024-04-30 22:30:54.000000000","message":"I think the addition of the class makes this call to lower look even *weirder*\n\nat this point it doesn\u0027t matter what keys we put in, the returned structure is going to behave as if they\u0027re lower-case:\n\n```\n\u003e\u003e\u003e d \u003d LowerKeyCaseInsensitiveDict()\n\u003e\u003e\u003e d[\u0027Foo\u0027] \u003d \u0027Bar\u0027\n\u003e\u003e\u003e dict(d)\n{\u0027foo\u0027: \u0027Bar\u0027}\n```\n\ntests *still* pass w/o this normalization...\n\n```\n@@ -752,7 +752,7 @@ def get_auth(auth_url, user, key, **kwargs):\n def resp_header_dict(resp):\n     resp_headers \u003d LowerKeyCaseInsensitiveDict()\n     for header, value in resp.getheaders():\n-        header \u003d parse_header_string(header).lower()\n+        header \u003d parse_header_string(header)\n         resp_headers[header] \u003d parse_header_string(value)\n     return resp_headers\n \n```\n\nIf this behavior is important we need a test.  If it\u0027s not important - we shouldn\u0027t do it \"just in case\"; that\u0027ll only cause us to be surprised when an undertested behavior is relied on.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":true,"context_lines":[{"line_number":221,"context_line":"        super(LowerKeyCaseInsensitiveDict, self).__init__(data, **kwargs)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def __iter__(self):"},{"line_number":224,"context_line":"        return (k.lower() for k, v in self._store.values())"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"class _ObjectBody:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3da1393e_9e9f10bf","line":224,"updated":"2024-04-30 22:30:54.000000000","message":"so this is actually kind of different from how swob.HeaderKeyDict works I think\n\n```\n\u003e\u003e\u003e d._store\nOrderedDict([(\u0027foo\u0027, (\u0027Foo\u0027, \u0027bar\u0027)), (\u0027baz\u0027, (\u0027Baz\u0027, \u0027Boo\u0027)), (\u0027key\u0027, (\u0027Key\u0027, \u0027Value\u0027))])\n```\n\noverriding `__iter__` seems to be quite effective at making iteration, `.keys()` and `.items()` all do what we want - KUDOS!\n\nFWIW it seems like it\u0027s a design choice of CaseInsensitiveDict for the keys in `_store` to be lower-case; we can probably depend on that:\n\nhttps://github.com/psf/requests/blob/main/src/requests/structures.py#L46-L49\n\nIn fact, given that we\u0027re coupling with the structure of `_store`, I might argue we might as well just say:\n\n```\n(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one/python-swiftclient$ git diff\ndiff --git a/swiftclient/client.py b/swiftclient/client.py\nindex b680b6e..8011150 100644\n--- a/swiftclient/client.py\n+++ b/swiftclient/client.py\n@@ -221,7 +221,7 @@ class LowerKeyCaseInsensitiveDict(CaseInsensitiveDict):\n         super(LowerKeyCaseInsensitiveDict, self).__init__(data, **kwargs)\n \n     def __iter__(self):\n-        return (k.lower() for k, v in self._store.values())\n+        return iter(self._store.keys())\n \n \n class _ObjectBody:\n```","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        super(LowerKeyCaseInsensitiveDict, self).__init__(data, **kwargs)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def __iter__(self):"},{"line_number":224,"context_line":"        return (k.lower() for k, v in self._store.values())"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"class _ObjectBody:"}],"source_content_type":"text/x-python","patch_set":4,"id":"42b538c0_8b6e11a4","line":224,"in_reply_to":"3da1393e_9e9f10bf","updated":"2024-05-01 16:31:39.000000000","message":"Ack. Good point","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ed851573a3bf9d790359daff6b56c7f4fee9a576","unresolved":true,"context_lines":[{"line_number":218,"context_line":"    \"\"\""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def __init__(self, data\u003dNone, **kwargs):"},{"line_number":221,"context_line":"        super(LowerKeyCaseInsensitiveDict, self).__init__(data, **kwargs)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def __iter__(self):"},{"line_number":224,"context_line":"        return iter(self._store.keys())"}],"source_content_type":"text/x-python","patch_set":6,"id":"dc8329c7_ffc53f99","line":221,"updated":"2024-05-02 23:00:04.000000000","message":"Well that\u0027s the darnedest thing -- the gate (or using `stestr` locally) says:\n```\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    Traceback (most recent call last):\n      File \"/usr/lib/python3.9/unittest/mock.py\", line 1769, in _inner\n        return f(*args, **kw)\n      File \"/usr/lib/python3.9/unittest/mock.py\", line 1337, in patched\n        return func(*newargs, **newkeywargs)\n      File \"/home/zuul/src/opendev.org/openstack/python-swiftclient/test/unit/test_shell.py\", line 248, in test_stat_container_not_found\n        http_response_headers\u003dLowerKeyCaseInsensitiveDict({\n      File \"/home/zuul/src/opendev.org/openstack/python-swiftclient/swiftclient/client.py\", line 221, in __init__\n        super(LowerKeyCaseInsensitiveDict, self).__init__(data, **kwargs)\n    TypeError: super(type, obj): obj must be an instance or subtype of type\n```\nBut if I use `pytest` instead it passes...\n\nIs there any reason for us to override `__init__`, though? If I just remove the whole thing, tests pass with *either* runner.","commit_id":"d322aad51fbcb6a0a756ee13660c7d37f86237f1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"47b664e9463e44fcf979d676d7b4ebf543b3dace","unresolved":true,"context_lines":[{"line_number":218,"context_line":"    \"\"\""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def __init__(self, data\u003dNone, **kwargs):"},{"line_number":221,"context_line":"        super(LowerKeyCaseInsensitiveDict, self).__init__(data, **kwargs)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"    def __iter__(self):"},{"line_number":224,"context_line":"        return iter(self._store.keys())"}],"source_content_type":"text/x-python","patch_set":6,"id":"b1812e8a_97792122","line":221,"in_reply_to":"dc8329c7_ffc53f99","updated":"2024-05-03 13:56:46.000000000","message":"Wonder if because of importing or anything? No particular reason, was just following examples in existing code","commit_id":"d322aad51fbcb6a0a756ee13660c7d37f86237f1"}],"swiftclient/command_helpers.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77185d0ec425971d5d9518c741c5ae724dd6eef2","unresolved":true,"context_lines":[{"line_number":49,"context_line":"    policies \u003d set()"},{"line_number":50,"context_line":"    for header_key, header_value in headers.items():"},{"line_number":51,"context_line":"        if header_key.lower().startswith(POLICY_HEADER_PREFIX):"},{"line_number":52,"context_line":"            policy_name \u003d header_key.rsplit(\u0027-\u0027, 2)[0].split(\u0027-\u0027, 4)[-1]"},{"line_number":53,"context_line":"            policies.add(policy_name)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    for policy in policies:"}],"source_content_type":"text/x-python","patch_set":2,"id":"f4643d70_1b24c8ff","line":52,"range":{"start_line":52,"start_character":26,"end_line":52,"end_character":36},"updated":"2024-04-23 18:52:30.000000000","message":"So the casing may have changed here, too...","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdef15d35da538a5d84eb665239c6dc372f261e8","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    policies \u003d set()"},{"line_number":50,"context_line":"    for header_key, header_value in headers.items():"},{"line_number":51,"context_line":"        if header_key.lower().startswith(POLICY_HEADER_PREFIX):"},{"line_number":52,"context_line":"            policy_name \u003d header_key.rsplit(\u0027-\u0027, 2)[0].split(\u0027-\u0027, 4)[-1]"},{"line_number":53,"context_line":"            policies.add(policy_name)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    for policy in policies:"}],"source_content_type":"text/x-python","patch_set":2,"id":"f02ec6ab_abce2a2b","line":52,"range":{"start_line":52,"start_character":26,"end_line":52,"end_character":36},"in_reply_to":"f4643d70_1b24c8ff","updated":"2024-04-26 15:26:40.000000000","message":"Acknowledged","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77185d0ec425971d5d9518c741c5ae724dd6eef2","unresolved":true,"context_lines":[{"line_number":90,"context_line":"                POLICY_HEADER_PREFIX,"},{"line_number":91,"context_line":"                PER_POLICY_QUOTA_HEADER_PREFIX,"},{"line_number":92,"context_line":"        )):"},{"line_number":93,"context_line":"            exclude_policy_headers.append(header_key)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    items.extend(headers_to_items("},{"line_number":96,"context_line":"        headers, meta_prefix\u003d\u0027x-account-meta-\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5155d8fa_a116d97d","line":93,"range":{"start_line":93,"start_character":42,"end_line":93,"end_character":52},"updated":"2024-04-23 18:52:30.000000000","message":"So these are still mixed case, but all the hard-coded ones below are lower-case...","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdef15d35da538a5d84eb665239c6dc372f261e8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                POLICY_HEADER_PREFIX,"},{"line_number":91,"context_line":"                PER_POLICY_QUOTA_HEADER_PREFIX,"},{"line_number":92,"context_line":"        )):"},{"line_number":93,"context_line":"            exclude_policy_headers.append(header_key)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    items.extend(headers_to_items("},{"line_number":96,"context_line":"        headers, meta_prefix\u003d\u0027x-account-meta-\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"4ed129b3_0a3e1471","line":93,"range":{"start_line":93,"start_character":42,"end_line":93,"end_character":52},"in_reply_to":"5155d8fa_a116d97d","updated":"2024-04-26 15:26:40.000000000","message":"Acknowledged","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    policies \u003d set()"},{"line_number":50,"context_line":"    for header_key, header_value in headers.items():"},{"line_number":51,"context_line":"        if header_key.lower().startswith(POLICY_HEADER_PREFIX):"},{"line_number":52,"context_line":"            policy_name \u003d header_key.rsplit(\u0027-\u0027, 2)[0].split(\u0027-\u0027, 4)[-1]"},{"line_number":53,"context_line":"            policies.add(policy_name)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c4a63a25_4fa3ef6c","line":51,"updated":"2024-04-29 17:32:53.000000000","message":"it seems like other code in this module already assumes the `headers` passed into these functions should have their keys normalized to lower before comparing them to matching prefixes; maybe `headers_to_items` was the odd-man-out","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    policies \u003d set()"},{"line_number":50,"context_line":"    for header_key, header_value in headers.items():"},{"line_number":51,"context_line":"        if header_key.lower().startswith(POLICY_HEADER_PREFIX):"},{"line_number":52,"context_line":"            policy_name \u003d header_key.rsplit(\u0027-\u0027, 2)[0].split(\u0027-\u0027, 4)[-1]"},{"line_number":53,"context_line":"            policies.add(policy_name)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c328fcce_9767bfbf","line":51,"in_reply_to":"c4a63a25_4fa3ef6c","updated":"2024-04-30 22:30:54.000000000","message":"Acknowledged","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9d60876f90441a3896563c166a1acc759fce4945","unresolved":true,"context_lines":[{"line_number":99,"context_line":"            \u0027x-account-container-count\u0027,"},{"line_number":100,"context_line":"            \u0027x-account-object-count\u0027,"},{"line_number":101,"context_line":"            \u0027x-account-bytes-used\u0027,"},{"line_number":102,"context_line":"            \u0027x-account-meta-quota-bytes\u0027] + exclude_policy_headers)))"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    # line up the items nicely"},{"line_number":105,"context_line":"    offset \u003d max(len(item) for item, value in items)"}],"source_content_type":"text/x-python","patch_set":3,"id":"4bf2d916_feca23f0","line":102,"updated":"2024-04-29 21:13:27.000000000","message":"I understand that it wasn\u0027t just etag that was getting duplicated (the tests helped!) but AFAIK the same reasoning applies for all callers of headers_to_items:\n\n\"since our exclude_headers param is lower-case strings, we should key \u003d key.lower() before we compare\"\n\nTo elaborate, I\u0027m suggesting it\u0027s probably easier/more-reliable to have headers_to_items normalize the headers it\u0027s recieved when comparing them to exclude_headers as opposed to trying to ensure we only pass it lower key headers in case-insenstive dicts.\n\nIf that doesn\u0027t actually address all the problems [1] I\u0027d be happy to walk back on that thinking, but given the tests we have it seemed to WOMM.\n\n1. Maybe some UpgradeImpact concern with out-of-tree consumers?   If we HAVE to maintain \"returned headers are lower-case dicts\" let\u0027s just do that and get rid of the CaseInsenstive facade?","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            \u0027x-account-container-count\u0027,"},{"line_number":100,"context_line":"            \u0027x-account-object-count\u0027,"},{"line_number":101,"context_line":"            \u0027x-account-bytes-used\u0027,"},{"line_number":102,"context_line":"            \u0027x-account-meta-quota-bytes\u0027] + exclude_policy_headers)))"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    # line up the items nicely"},{"line_number":105,"context_line":"    offset \u003d max(len(item) for item, value in items)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6999f251_95c83cf4","line":102,"in_reply_to":"4bf2d916_feca23f0","updated":"2024-04-30 22:30:54.000000000","message":"Done","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":191,"context_line":"        meta_prefix\u003d\u0027x-object-meta-\u0027,"},{"line_number":192,"context_line":"        exclude_headers\u003d("},{"line_number":193,"context_line":"            \u0027content-type\u0027, \u0027content-length\u0027,"},{"line_number":194,"context_line":"            \u0027last-modified\u0027, \u0027etag\u0027, \u0027date\u0027,"},{"line_number":195,"context_line":"            \u0027x-object-manifest\u0027)"},{"line_number":196,"context_line":"    ))"},{"line_number":197,"context_line":"    # line up the items nicely"}],"source_content_type":"text/x-python","patch_set":3,"id":"c15b0724_d78e6ac1","line":194,"updated":"2024-04-29 17:32:53.000000000","message":"the crux of the issue with etag is that it *seems* like the interface for exclude_headers is to always send lower-case keys\n\nSo the question is if we can reliably expect headers to be case-insenstive or if we should normalize the keys in the passed in value to lower to match our exclude_headers case.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        meta_prefix\u003d\u0027x-object-meta-\u0027,"},{"line_number":192,"context_line":"        exclude_headers\u003d("},{"line_number":193,"context_line":"            \u0027content-type\u0027, \u0027content-length\u0027,"},{"line_number":194,"context_line":"            \u0027last-modified\u0027, \u0027etag\u0027, \u0027date\u0027,"},{"line_number":195,"context_line":"            \u0027x-object-manifest\u0027)"},{"line_number":196,"context_line":"    ))"},{"line_number":197,"context_line":"    # line up the items nicely"}],"source_content_type":"text/x-python","patch_set":3,"id":"36f7c378_667026db","line":194,"in_reply_to":"c15b0724_d78e6ac1","updated":"2024-04-30 22:30:54.000000000","message":"Acknowledged","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":204,"context_line":"    other_items \u003d []"},{"line_number":205,"context_line":"    meta_items \u003d []"},{"line_number":206,"context_line":"    if isinstance(headers, dict):"},{"line_number":207,"context_line":"        headers \u003d CaseInsensitiveDict(headers)"},{"line_number":208,"context_line":"    for key, value in headers.lower_items():"},{"line_number":209,"context_line":"        if key not in exclude_headers:"},{"line_number":210,"context_line":"            if key.startswith(meta_prefix):"}],"source_content_type":"text/x-python","patch_set":3,"id":"d1e731d3_9ee26215","line":207,"updated":"2024-04-29 17:32:53.000000000","message":"this presumably could be just from tests... maybe we should fix the tests?","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    other_items \u003d []"},{"line_number":205,"context_line":"    meta_items \u003d []"},{"line_number":206,"context_line":"    if isinstance(headers, dict):"},{"line_number":207,"context_line":"        headers \u003d CaseInsensitiveDict(headers)"},{"line_number":208,"context_line":"    for key, value in headers.lower_items():"},{"line_number":209,"context_line":"        if key not in exclude_headers:"},{"line_number":210,"context_line":"            if key.startswith(meta_prefix):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6b8f42a3_5ea9ded2","line":207,"in_reply_to":"96f002d4_a53307f8","updated":"2024-05-01 16:31:39.000000000","message":"Ack. It\u0027s only for tests","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":true,"context_lines":[{"line_number":204,"context_line":"    other_items \u003d []"},{"line_number":205,"context_line":"    meta_items \u003d []"},{"line_number":206,"context_line":"    if isinstance(headers, dict):"},{"line_number":207,"context_line":"        headers \u003d CaseInsensitiveDict(headers)"},{"line_number":208,"context_line":"    for key, value in headers.lower_items():"},{"line_number":209,"context_line":"        if key not in exclude_headers:"},{"line_number":210,"context_line":"            if key.startswith(meta_prefix):"}],"source_content_type":"text/x-python","patch_set":3,"id":"96f002d4_a53307f8","line":207,"in_reply_to":"d1e731d3_9ee26215","updated":"2024-04-30 22:30:54.000000000","message":"in scripting languages it\u0027s not free to \"cast\" like this - you\u0027re actually allocating a whole new hashmap and buffers for these keys and iterating and copying everything across - it\u0027s worth avoiding when it\u0027s safe and definately worth avoiding needless copying \"just to be safe\"","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":205,"context_line":"    meta_items \u003d []"},{"line_number":206,"context_line":"    if isinstance(headers, dict):"},{"line_number":207,"context_line":"        headers \u003d CaseInsensitiveDict(headers)"},{"line_number":208,"context_line":"    for key, value in headers.lower_items():"},{"line_number":209,"context_line":"        if key not in exclude_headers:"},{"line_number":210,"context_line":"            if key.startswith(meta_prefix):"},{"line_number":211,"context_line":"                meta_key \u003d \u0027Meta %s\u0027 % key[len(meta_prefix):].title()"}],"source_content_type":"text/x-python","patch_set":3,"id":"73f6c144_fe4941ea","line":208,"updated":"2024-04-29 17:32:53.000000000","message":"ok, that seems like it\u0027s going to work better with `startswith(meta_prefix)` maybe curious this wasn\u0027t getting tested anywhere with the type that actually gets passed in from the Service/Connection?\n\nPlease consider this alternative, which might be slightly more permissive with the existing tests:\n\n\tdiff --git a/swiftclient/command_helpers.py b/swiftclient/command_helpers.py\n\tindex fb0efb4..0fbf541 100644\n\t--- a/swiftclient/command_helpers.py\n\t+++ b/swiftclient/command_helpers.py\n\t@@ -203,9 +203,8 @@ def headers_to_items(headers, meta_prefix\u003d\u0027\u0027, exclude_headers\u003dNone):\n\t     exclude_headers \u003d exclude_headers or []\n\t     other_items \u003d []\n\t     meta_items \u003d []\n\t-    if isinstance(headers, dict):\n\t-        headers \u003d CaseInsensitiveDict(headers)\n\t-    for key, value in headers.lower_items():\n\t+    for key, value in headers.items():\n\t+        key \u003d key.lower()\n\t\t if key not in exclude_headers:\n\t\t     if key.startswith(meta_prefix):\n\t\t\t meta_key \u003d \u0027Meta %s\u0027 % key[len(meta_prefix):].title()","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":true,"context_lines":[{"line_number":205,"context_line":"    meta_items \u003d []"},{"line_number":206,"context_line":"    if isinstance(headers, dict):"},{"line_number":207,"context_line":"        headers \u003d CaseInsensitiveDict(headers)"},{"line_number":208,"context_line":"    for key, value in headers.lower_items():"},{"line_number":209,"context_line":"        if key not in exclude_headers:"},{"line_number":210,"context_line":"            if key.startswith(meta_prefix):"},{"line_number":211,"context_line":"                meta_key \u003d \u0027Meta %s\u0027 % key[len(meta_prefix):].title()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ed7b2187_dd8f009e","line":208,"in_reply_to":"73f6c144_fe4941ea","updated":"2024-04-30 22:30:54.000000000","message":"I think we\u0027ve already decided we\u0027re going to support the interface where resp headers is a LowerKeyCaseInsensitiveDict - so there\u0027s no real need to call `lower_items` - we can *just* use `items`","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":false,"context_lines":[{"line_number":205,"context_line":"    meta_items \u003d []"},{"line_number":206,"context_line":"    if isinstance(headers, dict):"},{"line_number":207,"context_line":"        headers \u003d CaseInsensitiveDict(headers)"},{"line_number":208,"context_line":"    for key, value in headers.lower_items():"},{"line_number":209,"context_line":"        if key not in exclude_headers:"},{"line_number":210,"context_line":"            if key.startswith(meta_prefix):"},{"line_number":211,"context_line":"                meta_key \u003d \u0027Meta %s\u0027 % key[len(meta_prefix):].title()"}],"source_content_type":"text/x-python","patch_set":3,"id":"d8220505_c1d958f6","line":208,"in_reply_to":"ed7b2187_dd8f009e","updated":"2024-05-01 16:31:39.000000000","message":"Acknowledged","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"}],"swiftclient/service.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77185d0ec425971d5d9518c741c5ae724dd6eef2","unresolved":true,"context_lines":[{"line_number":458,"context_line":"        ])"},{"line_number":459,"context_line":"        if isinstance(headers, dict):"},{"line_number":460,"context_line":"            headers \u003d CaseInsensitiveDict(headers)"},{"line_number":461,"context_line":"        if bad_md5_headers.intersection(dict(headers.lower_items())):"},{"line_number":462,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":463,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":464,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"245b54d6_101fe5da","line":461,"updated":"2024-04-23 18:52:30.000000000","message":"Or maybe\n```\nif any(h in headers for h in bad_md5_headers):\n```\n?","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdef15d35da538a5d84eb665239c6dc372f261e8","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        ])"},{"line_number":459,"context_line":"        if isinstance(headers, dict):"},{"line_number":460,"context_line":"            headers \u003d CaseInsensitiveDict(headers)"},{"line_number":461,"context_line":"        if bad_md5_headers.intersection(dict(headers.lower_items())):"},{"line_number":462,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":463,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":464,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"55cec25c_dbcb1b2c","line":461,"in_reply_to":"245b54d6_101fe5da","updated":"2024-04-26 15:26:40.000000000","message":"Acknowledged","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77185d0ec425971d5d9518c741c5ae724dd6eef2","unresolved":true,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"            headers_receipt \u003d time()"},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"            obj_body \u003d _SwiftReader(path, body, headers,"},{"line_number":1283,"context_line":"                                    options.get(\u0027checksum\u0027, True))"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"            no_file \u003d options[\u0027no_download\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fd1e52f9_59009824","line":1282,"range":{"start_line":1282,"start_character":48,"end_line":1282,"end_character":55},"updated":"2024-04-23 18:52:30.000000000","message":"OK, so `headers` is always coming out of one of our `Connection`s... what type does _that_ return?\n\nThe [change to `resp_header_dict`](https://github.com/openstack/python-swiftclient/commit/ac2a60dc0d2932583e70406b6d456e6ae094c3dd#diff-4560a2922ced3123f02b6f3fc057a42d7c105f0de987db28d1a614b059c41167R741) that set this off makes me think it should already be a `CaseInsensitiveDict`. Is this just for tests? Is there any path by which it could be something _other_ than `dict` or `CaseInsensitiveDict`?\n\nI wonder whether there might be a simplification if we go back to including a `.lower()` in `resp_header_dict` but continue to use `CaseInsensitiveDict`...","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"            headers_receipt \u003d time()"},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"            obj_body \u003d _SwiftReader(path, body, headers,"},{"line_number":1283,"context_line":"                                    options.get(\u0027checksum\u0027, True))"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"            no_file \u003d options[\u0027no_download\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"c2e68185_7aa40cdf","line":1282,"range":{"start_line":1282,"start_character":48,"end_line":1282,"end_character":55},"in_reply_to":"1162b1dd_6a77eb13","updated":"2024-04-29 17:32:53.000000000","message":"so `resp_header_dict` used to normalize to \"dict-with-lower-keys\" - then it started to normalize as CaseInsensitiveDict.\n\nThe only place I saw where that normalization broke was L458 because of the surprising behavior of set.intersection(CaseInsenstiveDict())\n\n```\n\u003e\u003e\u003e {\u0027foo\u0027}.intersection(CaseInsensitiveDict({\u0027Foo\u0027: \u0027Bar\u0027}))\nset()\n```\n\nIf we fix that what else do we need to change?","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"            headers_receipt \u003d time()"},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"            obj_body \u003d _SwiftReader(path, body, headers,"},{"line_number":1283,"context_line":"                                    options.get(\u0027checksum\u0027, True))"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"            no_file \u003d options[\u0027no_download\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"23263a25_9114b98a","line":1282,"range":{"start_line":1282,"start_character":48,"end_line":1282,"end_character":55},"in_reply_to":"c2e68185_7aa40cdf","updated":"2024-04-30 22:30:54.000000000","message":"Done","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdef15d35da538a5d84eb665239c6dc372f261e8","unresolved":true,"context_lines":[{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"            headers_receipt \u003d time()"},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"            obj_body \u003d _SwiftReader(path, body, headers,"},{"line_number":1283,"context_line":"                                    options.get(\u0027checksum\u0027, True))"},{"line_number":1284,"context_line":""},{"line_number":1285,"context_line":"            no_file \u003d options[\u0027no_download\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"1162b1dd_6a77eb13","line":1282,"range":{"start_line":1282,"start_character":48,"end_line":1282,"end_character":55},"in_reply_to":"fd1e52f9_59009824","updated":"2024-04-26 15:26:40.000000000","message":"You are right, the headers coming out of Connections should already be a CaseInsensitiveDict. It is just for tests, which could be dict. There shouldn\u0027t be any path by which it could be something else, but not too sure\nIncluding a .lower() in resp_header_dict but continue to use CaseInsensitiveDict sounds a good idea, particularly if there are too many places we use items() etc.","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":455,"context_line":"            \u0027x-object-manifest\u0027,"},{"line_number":456,"context_line":"            \u0027x-static-large-object\u0027,"},{"line_number":457,"context_line":"        ])"},{"line_number":458,"context_line":"        if any(h in headers for h in bad_md5_headers):"},{"line_number":459,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":460,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"757e0899_e462989a","line":458,"updated":"2024-04-29 17:32:53.000000000","message":"this seems fine, if we revert it TestSwiftReader::test_swift_reader_knows_slo_etag_is_not_md5 in test/unit/test_service.py will fail.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            \u0027x-object-manifest\u0027,"},{"line_number":456,"context_line":"            \u0027x-static-large-object\u0027,"},{"line_number":457,"context_line":"        ])"},{"line_number":458,"context_line":"        if any(h in headers for h in bad_md5_headers):"},{"line_number":459,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":460,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2366994d_64792a62","line":458,"in_reply_to":"757e0899_e462989a","updated":"2024-04-30 22:30:54.000000000","message":"Acknowledged","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7dfffb0124f47cb0dbc992de1ce6d8be64aeaed","unresolved":true,"context_lines":[{"line_number":455,"context_line":"            \u0027x-object-manifest\u0027,"},{"line_number":456,"context_line":"            \u0027x-static-large-object\u0027,"},{"line_number":457,"context_line":"        ])"},{"line_number":458,"context_line":"        if any(h in headers for h in bad_md5_headers):"},{"line_number":459,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":460,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"966f7ba7_83e5f407","line":458,"updated":"2024-05-01 22:11:48.000000000","message":"LOL this looks great - we go to all this trouble to \"fix\u0027 intersection and then this works even with CaseInsenstiveDict","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"8291ba8366ae95741a0538bd7bcba7809afaf0ec","unresolved":true,"context_lines":[{"line_number":455,"context_line":"            \u0027x-object-manifest\u0027,"},{"line_number":456,"context_line":"            \u0027x-static-large-object\u0027,"},{"line_number":457,"context_line":"        ])"},{"line_number":458,"context_line":"        if any(h in headers for h in bad_md5_headers):"},{"line_number":459,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":460,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c2e04bcc_4c8ceb96","line":458,"in_reply_to":"966f7ba7_83e5f407","updated":"2024-05-02 21:26:22.000000000","message":"Ack. Good suggestion from Tim","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"eadb5eef3390e8264f315c5479cd7d5466896aa1","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            \u0027x-object-manifest\u0027,"},{"line_number":456,"context_line":"            \u0027x-static-large-object\u0027,"},{"line_number":457,"context_line":"        ])"},{"line_number":458,"context_line":"        if any(h in headers for h in bad_md5_headers):"},{"line_number":459,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":460,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"b411f899_7aeffc28","line":458,"in_reply_to":"c2e04bcc_4c8ceb96","updated":"2024-05-02 21:26:42.000000000","message":"Acknowledged","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ed851573a3bf9d790359daff6b56c7f4fee9a576","unresolved":true,"context_lines":[{"line_number":455,"context_line":"            \u0027x-object-manifest\u0027,"},{"line_number":456,"context_line":"            \u0027x-static-large-object\u0027,"},{"line_number":457,"context_line":"        ])"},{"line_number":458,"context_line":"        if any(h in headers for h in bad_md5_headers):"},{"line_number":459,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":460,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"8e3c1e18_dd07dcdf","line":458,"updated":"2024-05-02 23:00:04.000000000","message":"nit: This change looks a little funny now that we\u0027ve got the headers we\u0027re iterating over in the right case again.","commit_id":"d322aad51fbcb6a0a756ee13660c7d37f86237f1"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"47b664e9463e44fcf979d676d7b4ebf543b3dace","unresolved":false,"context_lines":[{"line_number":455,"context_line":"            \u0027x-object-manifest\u0027,"},{"line_number":456,"context_line":"            \u0027x-static-large-object\u0027,"},{"line_number":457,"context_line":"        ])"},{"line_number":458,"context_line":"        if any(h in headers for h in bad_md5_headers):"},{"line_number":459,"context_line":"            # This isn\u0027t a useful checksum"},{"line_number":460,"context_line":"            self._expected_md5 \u003d \u0027\u0027"},{"line_number":461,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"5b16b664_063a18c1","line":458,"in_reply_to":"8e3c1e18_dd07dcdf","updated":"2024-05-03 13:56:46.000000000","message":"Acknowledged","commit_id":"d322aad51fbcb6a0a756ee13660c7d37f86237f1"}],"test/unit/test_command_helpers.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f1ee0c6e1d3124b04374de33a3a2a690e8569932","unresolved":true,"context_lines":[{"line_number":273,"context_line":"  Content Length: 1048576"},{"line_number":274,"context_line":"            ETag: 68b329da9893e34099c7d8ad5cb9c940"},{"line_number":275,"context_line":"      Meta Color: blue"},{"line_number":276,"context_line":"Content-Encoding: gzip"},{"line_number":277,"context_line":"\"\"\""},{"line_number":278,"context_line":"        self.assertOut(expected)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff684197_5cf52566","line":276,"updated":"2024-04-29 17:32:53.000000000","message":"ok, with out the change in command_helpers this test fails:\n\n\tE   AssertionError: \u0027Content-Encoding: gzip\u0027 !\u003d \u0027Etag: 68b329da9893e34099c7d8ad5cb9c940\u0027\n\tE   - Content-Encoding: gzip\n\tE   + Etag: 68b329da9893e34099c7d8ad5cb9c940\n\nWhat seems to be going on is the ETag is showing up twice:\n\n        \u003e /home/vagrant/python-swiftclient/test/unit/test_command_helpers.py(53)assertOut()\n        -\u003e self.assertEqual(expected, real)\n        (Pdb) l\n         48  \t            expected_lines \u003d [line.lstrip() for line in\n         49  \t                              expected.splitlines() if line.strip()]\n         50  \t            real_lines \u003d [line.lstrip() for line in\n         51  \t                          real.splitlines() if line.strip()]\n         52  \t            for expected, real in zip(expected_lines, real_lines):\n         53  -\u003e\t                self.assertEqual(expected, real)\n         54  \t            # not a typo, might be an indent thing, hopefully you can spot it\n         55  \t            raise\n         56  \t\n         57  \t    def test_stat_account_human(self):\n         58  \t        self.options[\u0027human\u0027] \u003d True\n        (Pdb) !expected_lines\n        [\u0027URL: http://storage/v1/a/c/o\u0027, \u0027Auth Token: tk12345\u0027, \u0027Account: a\u0027, \u0027Container: c\u0027, \u0027Object: o\u0027, \u0027Content Length: 1048576\u0027, \u0027ETag: 68b329da9893e34099c7d8ad5cb9c940\u0027, \u0027Meta Color: blue\u0027, \u0027Content-Encoding: gzip\u0027]\n        (Pdb) !real_lines\n        [\u0027URL: http://storage/v1/a/c/o\u0027, \u0027Auth Token: tk12345\u0027, \u0027Account: a\u0027, \u0027Container: c\u0027, \u0027Object: o\u0027, \u0027Content Length: 1048576\u0027, \u0027ETag: 68b329da9893e34099c7d8ad5cb9c940\u0027, \u0027Meta Color: blue\u0027, \u0027Etag: 68b329da9893e34099c7d8ad5cb9c940\u0027, \u0027Content-Encoding: gzip\u0027]\n\nSo I do recognize it\u0027s not *just* the `set.intersection(CaseInsinstiveDict())` that needs to change.","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":false,"context_lines":[{"line_number":273,"context_line":"  Content Length: 1048576"},{"line_number":274,"context_line":"            ETag: 68b329da9893e34099c7d8ad5cb9c940"},{"line_number":275,"context_line":"      Meta Color: blue"},{"line_number":276,"context_line":"Content-Encoding: gzip"},{"line_number":277,"context_line":"\"\"\""},{"line_number":278,"context_line":"        self.assertOut(expected)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ed2db244_0495a5c3","line":276,"in_reply_to":"ff684197_5cf52566","updated":"2024-04-30 22:30:54.000000000","message":"Acknowledged","commit_id":"e9fd8df3f075aba8136a92bb3511dd81e4009f9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7dfffb0124f47cb0dbc992de1ce6d8be64aeaed","unresolved":true,"context_lines":[{"line_number":257,"context_line":"            \u0027x-object-meta-color\u0027: \u0027blue\u0027,"},{"line_number":258,"context_line":"            \u0027ETag\u0027: \u002768b329da9893e34099c7d8ad5cb9c940\u0027,"},{"line_number":259,"context_line":"            \u0027content-encoding\u0027: \u0027gzip\u0027,"},{"line_number":260,"context_line":"        })"},{"line_number":261,"context_line":"        self.conn.head_object.return_value \u003d stub_headers"},{"line_number":262,"context_line":"        args \u003d (\u0027c\u0027, \u0027o\u0027)"},{"line_number":263,"context_line":"        with self.output_manager as output_manager:"}],"source_content_type":"text/x-python","patch_set":5,"id":"93f06a0c_6828b84f","line":260,"updated":"2024-05-01 22:11:48.000000000","message":"so I\u0027m realizing we\u0027re adding a test for code that didn\u0027t change\n\nso, THIS test would actually have passed on master (if it had the ability to pass in our new LowerKeyCaseInsensitiveDict), but if it passed in a CaseInsensitiveDict from literal TitleCase keys (like master was doing) it would have failed.\n\nPerhaps better than adding a new test, we could just update the OTHER tests in this module to stub the correct type and title-case some keys.  But this is probably sufficient and was helpful during the review of this change to understand all the requirements.","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7079473623f7a8e9588c0e04784948566e8d3911","unresolved":false,"context_lines":[{"line_number":257,"context_line":"            \u0027x-object-meta-color\u0027: \u0027blue\u0027,"},{"line_number":258,"context_line":"            \u0027ETag\u0027: \u002768b329da9893e34099c7d8ad5cb9c940\u0027,"},{"line_number":259,"context_line":"            \u0027content-encoding\u0027: \u0027gzip\u0027,"},{"line_number":260,"context_line":"        })"},{"line_number":261,"context_line":"        self.conn.head_object.return_value \u003d stub_headers"},{"line_number":262,"context_line":"        args \u003d (\u0027c\u0027, \u0027o\u0027)"},{"line_number":263,"context_line":"        with self.output_manager as output_manager:"}],"source_content_type":"text/x-python","patch_set":5,"id":"58471897_184805bb","line":260,"in_reply_to":"8023ac94_e4f55e2a","updated":"2024-05-02 21:37:33.000000000","message":"Acknowledged","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"8291ba8366ae95741a0538bd7bcba7809afaf0ec","unresolved":true,"context_lines":[{"line_number":257,"context_line":"            \u0027x-object-meta-color\u0027: \u0027blue\u0027,"},{"line_number":258,"context_line":"            \u0027ETag\u0027: \u002768b329da9893e34099c7d8ad5cb9c940\u0027,"},{"line_number":259,"context_line":"            \u0027content-encoding\u0027: \u0027gzip\u0027,"},{"line_number":260,"context_line":"        })"},{"line_number":261,"context_line":"        self.conn.head_object.return_value \u003d stub_headers"},{"line_number":262,"context_line":"        args \u003d (\u0027c\u0027, \u0027o\u0027)"},{"line_number":263,"context_line":"        with self.output_manager as output_manager:"}],"source_content_type":"text/x-python","patch_set":5,"id":"8023ac94_e4f55e2a","line":260,"in_reply_to":"93f06a0c_6828b84f","updated":"2024-05-02 21:26:22.000000000","message":"Agreed","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"}],"test/unit/test_service.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"77185d0ec425971d5d9518c741c5ae724dd6eef2","unresolved":true,"context_lines":[{"line_number":252,"context_line":"        headers \u003d CaseInsensitiveDict({"},{"line_number":253,"context_line":"            \u0027Content-Length\u0027: len(b\u0027\u0027.join(segment_bodies)),"},{"line_number":254,"context_line":"            # XXX \u0027x-static-large-object\u0027: \u0027true\u0027 \"works\" for this test, but"},{"line_number":255,"context_line":"            # it\u0027s not like requests actually sends us"},{"line_number":256,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":257,"context_line":"            \u0027ETag\u0027: \u0027\"%s\"\u0027 % slo_etag"},{"line_number":258,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":2,"id":"ae59b9ce_6f0074cc","line":255,"range":{"start_line":255,"start_character":23,"end_line":255,"end_character":54},"updated":"2024-04-23 18:52:30.000000000","message":"I\u0027d maybe point at (our) `resp_header_dict` instead of `requests` here. If we change that implementation, then see this test fail, it\u0027d be nice to have that cluse that the test may need updating.","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"cdef15d35da538a5d84eb665239c6dc372f261e8","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        headers \u003d CaseInsensitiveDict({"},{"line_number":253,"context_line":"            \u0027Content-Length\u0027: len(b\u0027\u0027.join(segment_bodies)),"},{"line_number":254,"context_line":"            # XXX \u0027x-static-large-object\u0027: \u0027true\u0027 \"works\" for this test, but"},{"line_number":255,"context_line":"            # it\u0027s not like requests actually sends us"},{"line_number":256,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":257,"context_line":"            \u0027ETag\u0027: \u0027\"%s\"\u0027 % slo_etag"},{"line_number":258,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":2,"id":"b8f11d25_413b6d43","line":255,"range":{"start_line":255,"start_character":23,"end_line":255,"end_character":54},"in_reply_to":"ae59b9ce_6f0074cc","updated":"2024-04-26 15:26:40.000000000","message":"Acknowledged","commit_id":"3035d16657f83568e97b152c167139dd39c3888e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7dfffb0124f47cb0dbc992de1ce6d8be64aeaed","unresolved":true,"context_lines":[{"line_number":249,"context_line":"            md5(b).hexdigest().encode()"},{"line_number":250,"context_line":"            for b in segment_bodies"},{"line_number":251,"context_line":"        )).hexdigest()"},{"line_number":252,"context_line":"        headers \u003d CaseInsensitiveDict({"},{"line_number":253,"context_line":"            \u0027Content-Length\u0027: len(b\u0027\u0027.join(segment_bodies)),"},{"line_number":254,"context_line":"            # XXX \u0027x-static-large-object\u0027: \u0027true\u0027 \"works\" for this test, but"},{"line_number":255,"context_line":"            # it\u0027s not like requests or resp_header_dict returns"}],"source_content_type":"text/x-python","patch_set":5,"id":"d1487190_b02dab02","line":252,"updated":"2024-05-01 22:11:48.000000000","message":"would this test be more useful if it used a more realistic stub?\n\nthis *kind* of makes it look like master would have been fine with CaseInsensitiveDict; but *we* know it was really the replacement of the akward set.intersection that makes this work.  If some future test copies this stub I wonder what type it should use for the headers returned from swiftclient?","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"8291ba8366ae95741a0538bd7bcba7809afaf0ec","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            md5(b).hexdigest().encode()"},{"line_number":250,"context_line":"            for b in segment_bodies"},{"line_number":251,"context_line":"        )).hexdigest()"},{"line_number":252,"context_line":"        headers \u003d CaseInsensitiveDict({"},{"line_number":253,"context_line":"            \u0027Content-Length\u0027: len(b\u0027\u0027.join(segment_bodies)),"},{"line_number":254,"context_line":"            # XXX \u0027x-static-large-object\u0027: \u0027true\u0027 \"works\" for this test, but"},{"line_number":255,"context_line":"            # it\u0027s not like requests or resp_header_dict returns"}],"source_content_type":"text/x-python","patch_set":5,"id":"ebc9493f_de808002","line":252,"in_reply_to":"d1487190_b02dab02","updated":"2024-05-02 21:26:22.000000000","message":"Updated the test","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7dfffb0124f47cb0dbc992de1ce6d8be64aeaed","unresolved":true,"context_lines":[{"line_number":251,"context_line":"        )).hexdigest()"},{"line_number":252,"context_line":"        headers \u003d CaseInsensitiveDict({"},{"line_number":253,"context_line":"            \u0027Content-Length\u0027: len(b\u0027\u0027.join(segment_bodies)),"},{"line_number":254,"context_line":"            # XXX \u0027x-static-large-object\u0027: \u0027true\u0027 \"works\" for this test, but"},{"line_number":255,"context_line":"            # it\u0027s not like requests or resp_header_dict returns"},{"line_number":256,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":257,"context_line":"            \u0027ETag\u0027: \u0027\"%s\"\u0027 % slo_etag"}],"source_content_type":"text/x-python","patch_set":5,"id":"bba07ee7_628d9802","line":254,"updated":"2024-05-01 22:11:48.000000000","message":"probably need to dump this XXX, it\u0027s not really relevant in this version of this patch","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"8291ba8366ae95741a0538bd7bcba7809afaf0ec","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        )).hexdigest()"},{"line_number":252,"context_line":"        headers \u003d CaseInsensitiveDict({"},{"line_number":253,"context_line":"            \u0027Content-Length\u0027: len(b\u0027\u0027.join(segment_bodies)),"},{"line_number":254,"context_line":"            # XXX \u0027x-static-large-object\u0027: \u0027true\u0027 \"works\" for this test, but"},{"line_number":255,"context_line":"            # it\u0027s not like requests or resp_header_dict returns"},{"line_number":256,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":257,"context_line":"            \u0027ETag\u0027: \u0027\"%s\"\u0027 % slo_etag"}],"source_content_type":"text/x-python","patch_set":5,"id":"b86b1527_5285ecba","line":254,"in_reply_to":"bba07ee7_628d9802","updated":"2024-05-02 21:26:22.000000000","message":"Acknowledged","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"}],"test/unit/test_shell.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7079473623f7a8e9588c0e04784948566e8d3911","unresolved":true,"context_lines":[{"line_number":22,"context_line":"import json"},{"line_number":23,"context_line":"import logging"},{"line_number":24,"context_line":"import os"},{"line_number":25,"context_line":"from requests.structures import CaseInsensitiveDict"},{"line_number":26,"context_line":"import tempfile"},{"line_number":27,"context_line":"import unittest"},{"line_number":28,"context_line":"from unittest import mock"}],"source_content_type":"text/x-python","patch_set":6,"id":"619d60e2_c914ca54","side":"PARENT","line":25,"updated":"2024-05-02 21:37:33.000000000","message":"good riddance!  thanks for cleaning this up.","commit_id":"ce4fb27b5377199c392ec176cd044a803092cc7d"}],"test/unit/test_swiftclient.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":true,"context_lines":[{"line_number":1117,"context_line":"        self.assertEqual(\u0027t\\xe9st\u0027, headers.get(\u0027x-utf-8-header\u0027, \u0027\u0027))"},{"line_number":1118,"context_line":"        self.assertEqual(\u0027%ff\u0027, headers.get(\u0027x-non-utf-8-header\u0027, \u0027\u0027))"},{"line_number":1119,"context_line":"        self.assertEqual(\u0027%FF\u0027, headers.get(\u0027x-binary-header\u0027, \u0027\u0027))"},{"line_number":1120,"context_line":"        self.assertTrue((\u0027x-utf-8-header\u0027, \u0027t\\xe9st\u0027) in headers.items())"},{"line_number":1121,"context_line":"        self.assertTrue(set(["},{"line_number":1122,"context_line":"            \u0027x-utf-8-header\u0027,"},{"line_number":1123,"context_line":"            \u0027x-non-utf-8-header\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"0063bec0_62a303f9","line":1120,"updated":"2024-04-30 22:30:54.000000000","message":"I guess this kind of indirectly is testing:\n\n```\nfor k, v in headers.items():\n    # N.B. k is always lower case!\n    ...\n```","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":false,"context_lines":[{"line_number":1117,"context_line":"        self.assertEqual(\u0027t\\xe9st\u0027, headers.get(\u0027x-utf-8-header\u0027, \u0027\u0027))"},{"line_number":1118,"context_line":"        self.assertEqual(\u0027%ff\u0027, headers.get(\u0027x-non-utf-8-header\u0027, \u0027\u0027))"},{"line_number":1119,"context_line":"        self.assertEqual(\u0027%FF\u0027, headers.get(\u0027x-binary-header\u0027, \u0027\u0027))"},{"line_number":1120,"context_line":"        self.assertTrue((\u0027x-utf-8-header\u0027, \u0027t\\xe9st\u0027) in headers.items())"},{"line_number":1121,"context_line":"        self.assertTrue(set(["},{"line_number":1122,"context_line":"            \u0027x-utf-8-header\u0027,"},{"line_number":1123,"context_line":"            \u0027x-non-utf-8-header\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3683335f_c6cbe949","line":1120,"in_reply_to":"0063bec0_62a303f9","updated":"2024-05-01 16:31:39.000000000","message":"Ack. Updated the tests","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1a2260c2b2332d2edce66eee7c86066633129d97","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"            \u0027X-Utf-8-Header\u0027,"},{"line_number":1132,"context_line":"            \u0027X-Non-Utf-8-Header\u0027,"},{"line_number":1133,"context_line":"            \u0027X-Binary-Header\u0027,"},{"line_number":1134,"context_line":"        ]).intersection(headers))"},{"line_number":1135,"context_line":""},{"line_number":1136,"context_line":"        self.assertEqual(\u0027t\\xe9st\u0027, headers.get(\u0027X-UTF-8-HEADER\u0027, \u0027\u0027))"},{"line_number":1137,"context_line":"        self.assertEqual(\u0027%ff\u0027, headers.get(\u0027X-NON-UTF-8-HEADER\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"859619df_a3c9dcb8","line":1134,"updated":"2024-04-30 22:30:54.000000000","message":"this seems surprising/bad?","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7dfffb0124f47cb0dbc992de1ce6d8be64aeaed","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"            \u0027X-Utf-8-Header\u0027,"},{"line_number":1132,"context_line":"            \u0027X-Non-Utf-8-Header\u0027,"},{"line_number":1133,"context_line":"            \u0027X-Binary-Header\u0027,"},{"line_number":1134,"context_line":"        ]).intersection(headers))"},{"line_number":1135,"context_line":""},{"line_number":1136,"context_line":"        self.assertEqual(\u0027t\\xe9st\u0027, headers.get(\u0027X-UTF-8-HEADER\u0027, \u0027\u0027))"},{"line_number":1137,"context_line":"        self.assertEqual(\u0027%ff\u0027, headers.get(\u0027X-NON-UTF-8-HEADER\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"75686e7c_2dbeb2d0","line":1134,"in_reply_to":"257b410e_6571d67b","updated":"2024-05-01 22:11:48.000000000","message":"right, and luckily we don\u0027t have any code that does this!\n\nso a comment to the effect of \"this is unfortunate but unavoidable\" or \"this is for demonstration\" would make the assertion read less like \"this is a desirable behavior we want to maintain\"\n\nOr just don\u0027t assert on behaviors we don\u0027t care about?","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"8291ba8366ae95741a0538bd7bcba7809afaf0ec","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"            \u0027X-Utf-8-Header\u0027,"},{"line_number":1132,"context_line":"            \u0027X-Non-Utf-8-Header\u0027,"},{"line_number":1133,"context_line":"            \u0027X-Binary-Header\u0027,"},{"line_number":1134,"context_line":"        ]).intersection(headers))"},{"line_number":1135,"context_line":""},{"line_number":1136,"context_line":"        self.assertEqual(\u0027t\\xe9st\u0027, headers.get(\u0027X-UTF-8-HEADER\u0027, \u0027\u0027))"},{"line_number":1137,"context_line":"        self.assertEqual(\u0027%ff\u0027, headers.get(\u0027X-NON-UTF-8-HEADER\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"afab6671_b0a5205f","line":1134,"in_reply_to":"75686e7c_2dbeb2d0","updated":"2024-05-02 21:26:22.000000000","message":"Acknowledged","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"7719097827370638b5ad7f37f1b900aaf5a1bc73","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"            \u0027X-Utf-8-Header\u0027,"},{"line_number":1132,"context_line":"            \u0027X-Non-Utf-8-Header\u0027,"},{"line_number":1133,"context_line":"            \u0027X-Binary-Header\u0027,"},{"line_number":1134,"context_line":"        ]).intersection(headers))"},{"line_number":1135,"context_line":""},{"line_number":1136,"context_line":"        self.assertEqual(\u0027t\\xe9st\u0027, headers.get(\u0027X-UTF-8-HEADER\u0027, \u0027\u0027))"},{"line_number":1137,"context_line":"        self.assertEqual(\u0027%ff\u0027, headers.get(\u0027X-NON-UTF-8-HEADER\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":4,"id":"257b410e_6571d67b","line":1134,"in_reply_to":"859619df_a3c9dcb8","updated":"2024-05-01 16:31:39.000000000","message":"Indeed. Although seems understandable?","commit_id":"6d5cc7dd51b3c7b5362fffc0a91032a944b0069a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b7dfffb0124f47cb0dbc992de1ce6d8be64aeaed","unresolved":true,"context_lines":[{"line_number":1119,"context_line":"        self.assertEqual(\u0027%FF\u0027, headers.get(\u0027x-binary-header\u0027, \u0027\u0027))"},{"line_number":1120,"context_line":"        for k, v in headers.items():"},{"line_number":1121,"context_line":"            # N.B. k is always lower case!"},{"line_number":1122,"context_line":"            self.assertTrue(k.islower())"},{"line_number":1123,"context_line":"        self.assertTrue(set(["},{"line_number":1124,"context_line":"            \u0027x-utf-8-header\u0027,"},{"line_number":1125,"context_line":"            \u0027x-non-utf-8-header\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"e2872eef_4e259e8b","line":1122,"updated":"2024-05-01 22:11:48.000000000","message":"this is a nice way to show this!\n\nI think you could do the same thing on `for k in headers` and `for k in headers.keys()` just to cover all the bases.","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":36606,"name":"Yan Xiao","display_name":"Yan","email":"yanxiao@nvidia.com","username":"yanxiao"},"change_message_id":"8291ba8366ae95741a0538bd7bcba7809afaf0ec","unresolved":false,"context_lines":[{"line_number":1119,"context_line":"        self.assertEqual(\u0027%FF\u0027, headers.get(\u0027x-binary-header\u0027, \u0027\u0027))"},{"line_number":1120,"context_line":"        for k, v in headers.items():"},{"line_number":1121,"context_line":"            # N.B. k is always lower case!"},{"line_number":1122,"context_line":"            self.assertTrue(k.islower())"},{"line_number":1123,"context_line":"        self.assertTrue(set(["},{"line_number":1124,"context_line":"            \u0027x-utf-8-header\u0027,"},{"line_number":1125,"context_line":"            \u0027x-non-utf-8-header\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"123a881a_142e2463","line":1122,"in_reply_to":"e2872eef_4e259e8b","updated":"2024-05-02 21:26:22.000000000","message":"Acknowledged","commit_id":"5d1a278f4eda79b57dc349fefe60bba0a4dcb6bc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7079473623f7a8e9588c0e04784948566e8d3911","unresolved":true,"context_lines":[{"line_number":1127,"context_line":"            \u0027x-utf-8-header\u0027,"},{"line_number":1128,"context_line":"            \u0027x-non-utf-8-header\u0027,"},{"line_number":1129,"context_line":"            \u0027x-binary-header\u0027,"},{"line_number":1130,"context_line":"        ]).intersection(headers))"},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"        self.assertEqual(\u0027t\\xe9st\u0027, headers.get(\u0027X-Utf-8-Header\u0027, \u0027\u0027))"},{"line_number":1133,"context_line":"        self.assertEqual(\u0027%ff\u0027, headers.get(\u0027X-Non-Utf-8-Header\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":6,"id":"55ed0c8b_1630a1af","line":1130,"updated":"2024-05-02 21:37:33.000000000","message":"this last test indirectly covers `for k in headers`","commit_id":"d322aad51fbcb6a0a756ee13660c7d37f86237f1"}]}
