)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a0dfeb1aada36ea5128d8733eedede238aa27c95","unresolved":true,"context_lines":[{"line_number":1,"context_line":"Parent:     64d047d4 (s3api: Additional checksums for MPUs)"},{"line_number":2,"context_line":"Author:     Thibault Person \u003cthibault.person@ovhcloud.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2022-04-05 22:55:56 +0200"},{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-08-22 15:20:35 -0700"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"52b59d22_5b6897b8","line":2,"updated":"2025-02-07 16:51:17.000000000","message":"Oh, hey! Around PS27 I lost the appropriate authorship! Sorry about that -- #willfix","commit_id":"58a3e83a3bb6a03ad2b035f551a53fb274bf7e2e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e83b55837a69866b08ef2cb94b70a0c02016f38","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     64d047d4 (s3api: Additional checksums for MPUs)"},{"line_number":2,"context_line":"Author:     Thibault Person \u003cthibault.person@ovhcloud.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2022-04-05 22:55:56 +0200"},{"line_number":4,"context_line":"Commit:     Tim Burke \u003ctim.burke@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2024-08-22 15:20:35 -0700"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"964fc071_b45786eb","line":2,"in_reply_to":"52b59d22_5b6897b8","updated":"2025-02-07 18:32:40.000000000","message":"Done","commit_id":"58a3e83a3bb6a03ad2b035f551a53fb274bf7e2e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"734994b11460ee23093bc2479a9b825a3775f160","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1e64a426_fd809691","updated":"2024-02-09 00:23:56.000000000","message":"Just a rebase for now; I\u0027ll try to find some time to fix this up more so it\u0027s usable with more of the clients that have been identified.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"35c09a47007dd27efc973a8afbcbb609273928f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"227d0889_30d8d8c3","updated":"2024-02-15 05:49:13.000000000","message":"Still loading this in my head. so this is just an initial first parse.\n\nGot some questions/comments inline.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"955fc55240de5d576b1930192f979ae480217ea4","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":12,"id":"c227c9ba_2d5ed675","updated":"2024-03-01 17:20:47.000000000","message":"@tim apologies i tried to rebase this patch on top of https://review.opendev.org/c/openstack/swift/+/908953, mentioning that here so you don\u0027t accidentally fetch the wrong patchset","commit_id":"3ebf7cf1d7c76bcfe0eaf05bfec74593c4c4adf7"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c0bde0ad89c24d3e85c097b1c35931eb61798aab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"bfc9650c_d004f202","in_reply_to":"c227c9ba_2d5ed675","updated":"2024-10-21 16:08:01.000000000","message":"old comment","commit_id":"3ebf7cf1d7c76bcfe0eaf05bfec74593c4c4adf7"},{"author":{"_account_id":21482,"name":"kirubakaran kaliannan","email":"kirubak@zadarastorage.com","username":"kirubak"},"change_message_id":"29c691f303c34a96dc2292b175cdc724b60a818f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"195e68f6_b1f91b81","updated":"2024-08-08 12:09:31.000000000","message":"Hi Zuul, may i know when this patch can get delivered ?","commit_id":"300a083363e6a101f169072cb654673090e9c022"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6289d88c4d9614fb499f84cf3366d5b89e80667b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"5ec50b60_132cb5d4","updated":"2024-10-16 23:35:26.000000000","message":"I only addressed some Zuul errors, this patch still needs testing","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"23fa1d9fa1af40bbbb9e83abeb4374d6494fd864","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"e759db9c_bc19c607","updated":"2024-10-24 20:58:58.000000000","message":"working on addressing the functest failures","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6186cf03900ad3729782f95596428d016a2378ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"763a542b_0782efb9","in_reply_to":"1f2939a1_345cc886","updated":"2024-10-30 16:12:56.000000000","message":"Done with https://review.opendev.org/c/openstack/swift/+/933468/4","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"cbff6f8c9c7aa3ebde17bbbb82dd2a1794173c08","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":38,"id":"1f2939a1_345cc886","in_reply_to":"e759db9c_bc19c607","updated":"2024-10-25 21:31:15.000000000","message":"It was unit tests that were failing, thanks for the amazing coverage, i only changed how our s3api middleware responds if we have `x-amz-decoded-content-length` set to 0, maybe the default value can be 0 instead of `None` for the `decoded_content` var in `s3request.py` or maybe even an overflow value for a 64-bit int, that being said, it might be worth writing a cross-compat test to verify that that\u0027s what AWS does as well","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"a9cf234a1f9236b003aed8027ba7bde06a28f69d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"fee53e51_de3d8fb7","updated":"2025-01-21 23:31:59.000000000","message":"On master (with HTTPS) I get an error with latest awscli:\n\n```\n2025-01-21 23:27:34,280 - ThreadPoolExecutor-0_0 - s3transfer.tasks - DEBUG - Exception raised.\nTraceback (most recent call last):\n  File \"/home/vagrant/.local/lib/python3.10/site-packages/s3transfer/tasks.py\", line 135, in __call__\n    return self._execute_main(kwargs)\n  File \"/home/vagrant/.local/lib/python3.10/site-packages/s3transfer/tasks.py\", line 158, in _execute_main\n    return_value \u003d self._main(**kwargs)\n  File \"/home/vagrant/.local/lib/python3.10/site-packages/s3transfer/upload.py\", line 796, in _main\n    client.put_object(Bucket\u003dbucket, Key\u003dkey, Body\u003dbody, **extra_args)\n  File \"/home/vagrant/.local/lib/python3.10/site-packages/botocore/client.py\", line 569, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n  File \"/home/vagrant/.local/lib/python3.10/site-packages/botocore/client.py\", line 1023, in _make_api_call\n    raise error_class(parsed_response, operation_name)\nbotocore.exceptions.ClientError: An error occurred (InvalidArgument) when calling the PutObject operation: x-amz-content-sha256 must be UNSIGNED-PAYLOAD, or a valid sha256 value.\n```\n\nWith this patch (same config, on https) - upload works; even with aws-chunked-transfer trailer headers in the client options:\n\n```\n2025-01-21 23:27:34,233 - ThreadPoolExecutor-0_0 - botocore.endpoint - DEBUG - Making request for OperationModel(name\u003dPutObject) with params: {\u0027url_path\u0027: \u0027/obj6\u0027, \u0027query_string\u0027: {}, \u0027method\u0027: \u0027PUT\u0027, \u0027headers\u0027: {\u0027x-amz-sdk-checksum-algorithm\u0027: \u0027CRC32\u0027, \u0027User-Agent\u0027: \u0027aws-cli/1.37.3 md/Botocore#1.36.3 ua/2.0 os/linux#5.15.0-130-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy botocore/1.36.3\u0027, \u0027Expect\u0027: \u0027100-continue\u0027, \u0027Transfer-Encoding\u0027: \u0027chunked\u0027, \u0027Content-Encoding\u0027: \u0027aws-chunked\u0027, \u0027X-Amz-Trailer\u0027: \u0027x-amz-checksum-crc32\u0027, \u0027X-Amz-Decoded-Content-Length\u0027: \u00275\u0027}, \u0027body\u0027: \u003cbotocore.httpchecksum.AwsChunkedWrapper object at 0x7f81b18616c0\u003e, \u0027auth_path\u0027: \u0027/s3test/obj6\u0027, \u0027url\u0027: \u0027https://saio/s3test/obj6\u0027, \u0027context\u0027: {\u0027client_region\u0027: \u0027us-east-1\u0027, \u0027client_config\u0027: \u003cbotocore.config.Config object at 0x7f81b1990f10\u003e, \u0027has_streaming_input\u0027: True, \u0027auth_type\u0027: \u0027v4\u0027, \u0027unsigned_payload\u0027: None, \u0027s3_redirect\u0027: {\u0027redirected\u0027: False, \u0027bucket\u0027: \u0027s3test\u0027, \u0027params\u0027: {\u0027Bucket\u0027: \u0027s3test\u0027, \u0027Key\u0027: \u0027obj6\u0027, \u0027Body\u0027: \u003cs3transfer.utils.ReadFileChunk object at 0x7f81b1860af0\u003e, \u0027ChecksumAlgorithm\u0027: \u0027CRC32\u0027}}, \u0027input_params\u0027: {\u0027Bucket\u0027: \u0027s3test\u0027, \u0027Key\u0027: \u0027obj6\u0027}, \u0027signing\u0027: {\u0027region\u0027: \u0027us-east-1\u0027, \u0027signing_name\u0027: \u0027s3\u0027, \u0027disableDoubleEncoding\u0027: True}, \u0027endpoint_properties\u0027: {\u0027authSchemes\u0027: [{\u0027disableDoubleEncoding\u0027: True, \u0027name\u0027: \u0027sigv4\u0027, \u0027signingName\u0027: \u0027s3\u0027, \u0027signingRegion\u0027: \u0027us-east-1\u0027}]}, \u0027checksum\u0027: {\u0027request_algorithm\u0027: {\u0027algorithm\u0027: \u0027crc32\u0027, \u0027in\u0027: \u0027trailer\u0027, \u0027name\u0027: \u0027x-amz-checksum-crc32\u0027}}}}\n\n2025-01-21 23:27:34,234 - ThreadPoolExecutor-0_0 - botocore.auth - DEBUG - CanonicalRequest:\nPUT\n/s3test/obj6\n\ncontent-encoding:aws-chunked\nhost:saio\ntransfer-encoding:chunked\nx-amz-content-sha256:STREAMING-UNSIGNED-PAYLOAD-TRAILER\nx-amz-date:20250121T232734Z\nx-amz-decoded-content-length:5\nx-amz-sdk-checksum-algorithm:CRC32\nx-amz-trailer:x-amz-checksum-crc32\n\ncontent-encoding;host;transfer-encoding;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer\nSTREAMING-UNSIGNED-PAYLOAD-TRAILER\n2025-01-21 23:27:34,235 - ThreadPoolExecutor-0_0 - botocore.auth - DEBUG - StringToSign:\nAWS4-HMAC-SHA256\n20250121T232734Z\n20250121/us-east-1/s3/aws4_request\n885b55383d57282c6318394befd7996ccc38aa1daa08e502db8c8da829260c34\n\n2025-01-21 23:27:34,236 - ThreadPoolExecutor-0_0 - botocore.endpoint - DEBUG - Sending http request: \u003cAWSPreparedRequest stream_output\u003dFalse, method\u003dPUT, url\u003dhttps://saio/s3test/obj6, headers\u003d{\u0027x-amz-sdk-checksum-algorithm\u0027: b\u0027CRC32\u0027, \u0027User-Agent\u0027: b\u0027aws-cli/1.37.3 md/Botocore#1.36.3 ua/2.0 os/linux#5.15.0-130-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython cfg/retry-mode#legacy botocore/1.36.3\u0027, \u0027Expect\u0027: b\u0027100-continue\u0027, \u0027Transfer-Encoding\u0027: b\u0027chunked\u0027, \u0027Content-Encoding\u0027: b\u0027aws-chunked\u0027, \u0027X-Amz-Trailer\u0027: b\u0027x-amz-checksum-crc32\u0027, \u0027X-Amz-Decoded-Content-Length\u0027: b\u00275\u0027, \u0027X-Amz-Date\u0027: b\u002720250121T232734Z\u0027, \u0027X-Amz-Content-SHA256\u0027: b\u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027, \u0027Authorization\u0027: b\u0027AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250121/us-east-1/s3/aws4_request, SignedHeaders\u003dcontent-encoding;host;transfer-encoding;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer, Signature\u003dae0e9792cd4152ed62bcd86cafd42dc42cf0d61f90525ecda7ee2afd501dcb54\u0027, \u0027amz-sdk-invocation-id\u0027: b\u002706a1c563-94b2-41d1-be55-b5351df1d42f\u0027, \u0027amz-sdk-request\u0027: b\u0027attempt\u003d1\u0027}\u003e\n```","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2ebc49912be3a0eb74c5d379e6e0a0bb92c59df8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"20ff337c_73999297","updated":"2025-01-28 16:22:50.000000000","message":"AFAICT this fixes aws-chunked upload\n\n```\nvagrant@saio:~$ aws s3 cp test s3://s3test/obj2\nupload: ./test to s3://s3test/obj2\n```\n\nTest ratio isn\u0027t bad; why is it WIP?","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"41aa1110_086bf368","updated":"2025-01-30 20:00:09.000000000","message":"OK, a","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"59bde3779f6c5b0b950f49b538aa0b3e8380df59","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":43,"id":"fe8f4b90_2c7b0874","in_reply_to":"20ff337c_73999297","updated":"2025-01-28 20:15:41.000000000","message":"I think it was when i was attempting to resolve merge conflicts which @alistairncoles@gmail.com already did for me!","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"b4baa74f4520868352d47f731eeb31ca364e219f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":45,"id":"f627f60e_311c9c16","updated":"2025-01-31 21:09:24.000000000","message":"Tim tells me this has a memory/buffer issue - that should be addressed before we allow clients to start using this.","commit_id":"b69846df27887f311c8030bbebdb332816945062"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"43bda1845c17bcfdb0cbc9ff7631c6c9d89f1628","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"00805b3f_154a3dcc","updated":"2025-02-07 06:07:48.000000000","message":"Ok, spent a bunch time time learning s3\u0027s sig4 streaming and looking at our implementation and I agree Tim\u0027s implemented it to my understanding.\n\nI then went a pulled down the code in the SAIO and updated boto-core and boto3 and tested master and this patch with our known boto_break.py script. \nNOTE: you have to run vsaio with https.\n\n```\nvagrant@saio9:~$ python boto_break.py obj\nFailed to upload test to s3test/obj: An error occurred (InvalidArgument) when calling the PutObject operation: x-amz-content-sha256 must be UNSIGNED-PAYLOAD, or a valid sha256 value.\nvagrant@saio9:~$ cd swift\nvagrant@saio9:~/swift$ git checkout review/thibault_person/aws-chunked\nSwitched to branch \u0027review/thibault_person/aws-chunked\u0027\nYour branch is ahead of \u0027gerrit/master\u0027 by 3 commits.\n  (use \"git push\" to publish your local commits)\nvagrant@saio9:~/swift$ swift-init restart main\nSignal object-server  pid: 20046  signal: Signals.SIGTERM\nSignal object-server  pid: 20047  signal: Signals.SIGTERM\nSignal object-server  pid: 20048  signal: Signals.SIGTERM\nSignal object-server  pid: 20049  signal: Signals.SIGTERM\nSignal account-server  pid: 20040  signal: Signals.SIGTERM\nSignal account-server  pid: 20041  signal: Signals.SIGTERM\nSignal account-server  pid: 20042  signal: Signals.SIGTERM\nSignal account-server  pid: 20043  signal: Signals.SIGTERM\nSignal proxy-server  pid: 20044  signal: Signals.SIGTERM\nSignal proxy-server  pid: 20045  signal: Signals.SIGTERM\nSignal container-server  pid: 20050  signal: Signals.SIGTERM\nSignal container-server  pid: 20051  signal: Signals.SIGTERM\nSignal container-server  pid: 20052  signal: Signals.SIGTERM\nSignal container-server  pid: 20053  signal: Signals.SIGTERM\naccount-server (20040) appears to have stopped\nproxy-server (20045) appears to have stopped\ncontainer-server (20052) appears to have stopped\nobject-server (20049) appears to have stopped\ncontainer-server (20051) appears to have stopped\nobject-server (20048) appears to have stopped\ncontainer-server (20053) appears to have stopped\nobject-server (20046) appears to have stopped\nobject-server (20047) appears to have stopped\naccount-server (20041) appears to have stopped\naccount-server (20042) appears to have stopped\nproxy-server (20044) appears to have stopped\ncontainer-server (20050) appears to have stopped\naccount-server (20043) appears to have stopped\nStarting object-server...(/etc/swift/object-server/1.conf.d)\nStarting object-server...(/etc/swift/object-server/2.conf.d)\nStarting object-server...(/etc/swift/object-server/3.conf.d)\nStarting object-server...(/etc/swift/object-server/4.conf.d)\nStarting account-server...(/etc/swift/account-server/1.conf.d)\nStarting account-server...(/etc/swift/account-server/2.conf.d)\nStarting account-server...(/etc/swift/account-server/3.conf.d)\nStarting account-server...(/etc/swift/account-server/4.conf.d)\nStarting proxy-server...(/etc/swift/proxy-server/proxy-noauth.conf.d)\nStarting proxy-server...(/etc/swift/proxy-server/proxy-server.conf.d)\nStarting container-server...(/etc/swift/container-server/1.conf.d)\nStarting container-server...(/etc/swift/container-server/2.conf.d)\nStarting container-server...(/etc/swift/container-server/3.conf.d)\nStarting container-server...(/etc/swift/container-server/4.conf.d)\n\nvagrant@saio9:~/swift$ cd ..\nvagrant@saio9:~$ python boto_break.py obj\nvagrant@saio9:~$\n``` \n\nAnd the file is up there:\n```\nvagrant@saio9:~$ $(swift auth)\nvagrant@saio9:~$ curl -i -H \"X-Auth-Token: $OS_AUTH_TOKEN\" $OS_STORAGE_URL/s3test\nHTTP/1.1 200 OK\nContent-Type: text/plain; charset\u003dutf-8\nContent-Length: 4\nX-Container-Object-Count: 1\nX-Container-Bytes-Used: 10\nX-Timestamp: 1738907786.14899\nLast-Modified: Fri, 07 Feb 2025 05:56:27 GMT\nAccept-Ranges: bytes\nX-Storage-Policy: default\nVary: Accept\nX-Trans-Id: txd699866c6aa34f5691b50-0067a5a2e8\nX-Openstack-Request-Id: txd699866c6aa34f5691b50-0067a5a2e8\nDate: Fri, 07 Feb 2025 06:06:32 GMT\n\nobj\nvagrant@saio9:~$ curl -i -H \"X-Auth-Token: $OS_AUTH_TOKEN\" $OS_STORAGE_URL/s3test/obj\nHTTP/1.1 200 OK\nContent-Type: binary/octet-stream\nEtag: \"6265b22b66502d70d5f004f08238ac3c\"\nLast-Modified: Fri, 07 Feb 2025 06:02:16 GMT\nX-Timestamp: 1738908135.58853\nAccept-Ranges: bytes\nContent-Length: 10\nX-Trans-Id: tx7f01f4a399c34e5cb1f95-0067a5a2f1\nX-Openstack-Request-Id: tx7f01f4a399c34e5cb1f95-0067a5a2f1\nDate: Fri, 07 Feb 2025 06:06:41 GMT\n\nsomething\n```\n\nGreat work!\n\nIs this something we want to get in so we can fix the boto bug?","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f62f54216d84c2543e744a573b8921addd67968c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"c6238842_6c12fa18","updated":"2025-02-06 09:54:28.000000000","message":"phew, I\u0027ve loaded the s3docs for this and matched my understanding of it to changes in s3request for chunked transfers. So getting closer.\n\nNow with that understanding I think I can finally take a closer look at the rest of the patch..  with get on that in the morning.","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":50,"id":"90f6db6f_2d875343","updated":"2025-02-12 18:58:38.000000000","message":"It\u0027s taken me a while but I think I grok the behaviour and it seems to be consistent with the AWS docs here https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html\n\nMain reasons for -1:\n\n- there\u0027s some unused code\n- there\u0027s some unit test coverage missing\n- I have query about the removal of content-encoding\u003daws-chunked validation, and content-length validation\n\nI also have some concerns about the maintainability:\n\n- there\u0027s some naming that I found unhelpful\n- there\u0027s some new v4 specific code that I think might be better located in the v4 mixin\n- conversely there is some duplicated logic that maybe could be shared (header validation)\n\nThis is somewhat due to the existing pattern in s3request.py, and not a criticism of the authors - it\u0027s just really hard to maintain this module, and this patch shines a light on that. The combination of new code in the v4 mixin changes, explicit v4 conditional logic in S3Request, and implicit v4 conditional logic in S3Request, I think reflects how hard it is to maintain.\n\nI have been working on some refactoring ideas while I have been reviewing so I\u0027ll try to get some suggestions up for review.\n\nFirst suggestion is https://review.opendev.org/c/openstack/swift/+/941475 - although I don\u0027t claim that is *great*. There\u0027s some cleanup in there too.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4beab02dc86c409a4074d44ee817ba47e3c74f46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":50,"id":"df20d13f_fc510847","in_reply_to":"90f6db6f_2d875343","updated":"2025-02-13 01:42:43.000000000","message":"\u003e [I]t\u0027s just really hard to maintain this module, and this patch shines a light on that.\n\nI mean, when a patch bumps up the LoC 25%, yeah, hardly surprising... you\u0027re absolutely right that we need to find a way to make this more maintainable; I\u0027ve tried periodically:\n\n- https://review.opendev.org/c/openstack/swift/+/613452\n- https://review.opendev.org/c/openstack/swift/+/751555/9 (though I\u0027ve lost the thread in later patchsets)\n\nOh yeah, and on v2 vs v4: maybe there\u0027s some hope we could eventually [get rid of v2 signatures](https://aws.amazon.com/blogs/aws/amazon-s3-update-sigv2-deprecation-period-extended-modified/)? Though, given [the pace of updates](https://aws.amazon.com/blogs/aws/category/deprecation/), I\u0027m not overly optimistic.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d277b63b1bfc20737e3d26c661d1b784bf9173af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":51,"id":"fd822f4f_0a8c958c","updated":"2025-02-13 03:22:19.000000000","message":"Oh yeah, I should probably rebase this on top of https://review.opendev.org/c/openstack/swift/+/940059 (and maybe actually merge that one...)","commit_id":"053f9ba7a2562a71430563ff66b6c0b91bbb339f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":56,"id":"f6606be8_2e31c1d1","updated":"2025-02-14 17:04:50.000000000","message":"I don\u0027t think this should merge without the s3token change having some test coverage - I threw together something in a follow on\n\nI have a chain of suggested changes in patches to follow, will post soon","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3fe02cde53d3dc36e4dcf9854c6972718f8a1468","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":63,"id":"57151577_febad665","updated":"2025-04-02 04:16:58.000000000","message":"OK I think I understand all this. And makes sense from my limited understanding of what s3api expects.\n\nLove the refactoring of the checkers, makes things much clearer.","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"01c155094918e746cd14bc223442a277ba692088","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":79,"id":"9f7082eb_22ef4fdf","updated":"2025-05-13 09:06:37.000000000","message":"Throwing this on my saio and running the client seems to be working for me. And we\u0027re running in downstream prod.. so I think we should land this and anything else can be a follow up.\n\nGreat work everyone. I\u0027ll add a +A in the morning incase anyone has good reason not too 😊","commit_id":"865f12fc7280f147db786c57ee9517ccd7287c8a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"384257cb3f1660c189ea5aac23665978d5a996c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":79,"id":"a0e83d77_dbe04eae","updated":"2025-05-13 12:53:03.000000000","message":"just +1 because I co-authored but LGTM","commit_id":"865f12fc7280f147db786c57ee9517ccd7287c8a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"22106fb2094ee08dc2ffeeb168a8035a535d921b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":80,"id":"deb39b14_221cf6a5","updated":"2025-05-14 04:13:55.000000000","message":"Retested this this morning, still looking great. Got a +1 from Al (he\u0027s co-author) which is good enough for me!","commit_id":"f9ac22971f6b08878b8b038855cd0ee7d93f7fd5"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9aca47854cd36abbbe5717fedf4587d8de61b61","unresolved":true,"context_lines":[{"line_number":215,"context_line":"            if h.lower().startswith(\u0027x-amz-checksum-\u0027)]"},{"line_number":216,"context_line":"        req_checksums.extend("},{"line_number":217,"context_line":"            h.lower()[len(\u0027x-amz-checksum-\u0027):]"},{"line_number":218,"context_line":"            for h in list_from_csv(req.headers.get(\u0027x-amz-trailer\u0027, \u0027\u0027))"},{"line_number":219,"context_line":"            if h.lower().startswith(\u0027x-amz-checksum-\u0027))"},{"line_number":220,"context_line":"        if req_checksums and not algo:"},{"line_number":221,"context_line":"            req.environ[\u0027wsgi.input\u0027].read(1)"}],"source_content_type":"text/x-python","patch_set":40,"id":"6c648ac1_8b74444d","line":218,"updated":"2025-01-22 14:45:52.000000000","message":"``list_from_csv(req.headers.get(\u0027x-amz-trailer\u0027, \u0027\u0027)`` is same as ``req.trailers``","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":215,"context_line":"            if h.lower().startswith(\u0027x-amz-checksum-\u0027)]"},{"line_number":216,"context_line":"        req_checksums.extend("},{"line_number":217,"context_line":"            h.lower()[len(\u0027x-amz-checksum-\u0027):]"},{"line_number":218,"context_line":"            for h in list_from_csv(req.headers.get(\u0027x-amz-trailer\u0027, \u0027\u0027))"},{"line_number":219,"context_line":"            if h.lower().startswith(\u0027x-amz-checksum-\u0027))"},{"line_number":220,"context_line":"        if req_checksums and not algo:"},{"line_number":221,"context_line":"            req.environ[\u0027wsgi.input\u0027].read(1)"}],"source_content_type":"text/x-python","patch_set":40,"id":"26ee4efe_d03a4f13","line":218,"in_reply_to":"6c648ac1_8b74444d","updated":"2025-02-13 01:04:12.000000000","message":"Acknowledged","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"}],"swift/common/middleware/s3api/exception.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class S3InputError(BaseException):"},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    There was an error with the client input detected on read()"},{"line_number":38,"context_line":"    Inherit from BaseException (rather than Exception) so it cuts from the"},{"line_number":39,"context_line":"    proxy-server app (which will presumably be the one reading the input)"},{"line_number":40,"context_line":"    through all the layers of the pipeline back to us. It should never escape"}],"source_content_type":"text/x-python","patch_set":50,"id":"604a743a_509df7cd","line":37,"updated":"2025-02-12 18:58:38.000000000","message":"nit: missing period at end of sentence","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class S3InputError(BaseException):"},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    There was an error with the client input detected on read()"},{"line_number":38,"context_line":"    Inherit from BaseException (rather than Exception) so it cuts from the"},{"line_number":39,"context_line":"    proxy-server app (which will presumably be the one reading the input)"},{"line_number":40,"context_line":"    through all the layers of the pipeline back to us. It should never escape"}],"source_content_type":"text/x-python","patch_set":50,"id":"265391d3_141dbad8","line":37,"in_reply_to":"604a743a_509df7cd","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":37,"context_line":"    There was an error with the client input detected on read()"},{"line_number":38,"context_line":"    Inherit from BaseException (rather than Exception) so it cuts from the"},{"line_number":39,"context_line":"    proxy-server app (which will presumably be the one reading the input)"},{"line_number":40,"context_line":"    through all the layers of the pipeline back to us. It should never escape"},{"line_number":41,"context_line":"    the s3api middleware."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"afef32bf_fe722716","line":40,"range":{"start_line":40,"start_character":51,"end_line":40,"end_character":53},"updated":"2025-02-12 18:58:38.000000000","message":"what is \u0027us\u0027?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    There was an error with the client input detected on read()"},{"line_number":38,"context_line":"    Inherit from BaseException (rather than Exception) so it cuts from the"},{"line_number":39,"context_line":"    proxy-server app (which will presumably be the one reading the input)"},{"line_number":40,"context_line":"    through all the layers of the pipeline back to us. It should never escape"},{"line_number":41,"context_line":"    the s3api middleware."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"721804f4_463558d8","line":40,"range":{"start_line":40,"start_character":51,"end_line":40,"end_character":53},"in_reply_to":"afef32bf_fe722716","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    Client provided a chunk-signature, but it doesn\u0027t match the data."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    This should result in a 403 going back to the client."},{"line_number":66,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":50,"id":"5de02878_12b78738","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":57},"updated":"2025-02-12 18:58:38.000000000","message":"this doesn\u0027t seem appropriate for the exception docstring - whether it is true of not depends on other code","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    Client provided a chunk-signature, but it doesn\u0027t match the data."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    This should result in a 403 going back to the client."},{"line_number":66,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":50,"id":"71e9f736_6379dc26","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":57},"in_reply_to":"5de02878_12b78738","updated":"2025-02-13 01:04:12.000000000","message":"It\u0027s a pretty tight coupling -- I\u0027d be hard-pressed to imagine *any* situation where a signature mismatch shouldn\u0027t result in a 403.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    \"\"\""},{"line_number":63,"context_line":"    Client provided a chunk-signature, but it doesn\u0027t match the data."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    This should result in a 403 going back to the client."},{"line_number":66,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":50,"id":"668dac27_3e00dd1c","line":65,"range":{"start_line":65,"start_character":4,"end_line":65,"end_character":57},"in_reply_to":"71e9f736_6379dc26","updated":"2025-02-14 17:04:50.000000000","message":"Acknowledged","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"647ea81d48a62dbec3c949c4717fa6edc290fc11","unresolved":true,"context_lines":[{"line_number":274,"context_line":"    def check_signature(self, secret):"},{"line_number":275,"context_line":"        secret \u003d utf8encode(secret)"},{"line_number":276,"context_line":"        # Save secret for further signature computation"},{"line_number":277,"context_line":"        self._secret \u003d secret"},{"line_number":278,"context_line":"        user_signature \u003d self.signature"},{"line_number":279,"context_line":"        derived_secret \u003d b\u0027AWS4\u0027 + secret"},{"line_number":280,"context_line":"        for scope_piece in self.scope.values():"}],"source_content_type":"text/x-python","patch_set":5,"id":"e2f86693_695dda77","line":277,"updated":"2022-11-04 16:34:43.000000000","message":"What happens if check_signature() is never called? Do we need to update s3token to ensure it gets called when the secret isn\u0027t coming out of memcache?\n\nYears ago (prior to https://opendev.org/x/swift3/commit/c2f1d012d5b059203286ec5f91c23d5227f9b217) auth middlewares had to implement signature-checking themselves. If someone\u0027s running an auth middleware from that time, do we gracefully degrade, or throw a NameError?","commit_id":"8aeb6ec4b347755cca139e58e72668b0a83c4dd3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":274,"context_line":"    def check_signature(self, secret):"},{"line_number":275,"context_line":"        secret \u003d utf8encode(secret)"},{"line_number":276,"context_line":"        # Save secret for further signature computation"},{"line_number":277,"context_line":"        self._secret \u003d secret"},{"line_number":278,"context_line":"        user_signature \u003d self.signature"},{"line_number":279,"context_line":"        derived_secret \u003d b\u0027AWS4\u0027 + secret"},{"line_number":280,"context_line":"        for scope_piece in self.scope.values():"}],"source_content_type":"text/x-python","patch_set":5,"id":"bb56d206_6bbf74bc","line":277,"in_reply_to":"917a0f83_49e18812","updated":"2025-02-26 18:24:09.000000000","message":"We\u0027ll 501 now; look around for `S3InputMissingSecret`","commit_id":"8aeb6ec4b347755cca139e58e72668b0a83c4dd3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9419ec8f32942c96e37a54554233cc97b0c6ebe7","unresolved":true,"context_lines":[{"line_number":274,"context_line":"    def check_signature(self, secret):"},{"line_number":275,"context_line":"        secret \u003d utf8encode(secret)"},{"line_number":276,"context_line":"        # Save secret for further signature computation"},{"line_number":277,"context_line":"        self._secret \u003d secret"},{"line_number":278,"context_line":"        user_signature \u003d self.signature"},{"line_number":279,"context_line":"        derived_secret \u003d b\u0027AWS4\u0027 + secret"},{"line_number":280,"context_line":"        for scope_piece in self.scope.values():"}],"source_content_type":"text/x-python","patch_set":5,"id":"917a0f83_49e18812","line":277,"in_reply_to":"b3b42c54_1cf41671","updated":"2024-02-17 07:05:34.000000000","message":"The appropriate place will have to be the first time we try to validate a signature but have no secret, down in `read`. I think it\u0027d be better to get the client a 501 (and log something to the operator about needing to update their auth middleware) than a 500, though -- I\u0027d hope that most clients wouldn\u0027t retry a 501.","commit_id":"8aeb6ec4b347755cca139e58e72668b0a83c4dd3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"ecd49a0efee5013758c3d93555e73922cf8248dc","unresolved":true,"context_lines":[{"line_number":274,"context_line":"    def check_signature(self, secret):"},{"line_number":275,"context_line":"        secret \u003d utf8encode(secret)"},{"line_number":276,"context_line":"        # Save secret for further signature computation"},{"line_number":277,"context_line":"        self._secret \u003d secret"},{"line_number":278,"context_line":"        user_signature \u003d self.signature"},{"line_number":279,"context_line":"        derived_secret \u003d b\u0027AWS4\u0027 + secret"},{"line_number":280,"context_line":"        for scope_piece in self.scope.values():"}],"source_content_type":"text/x-python","patch_set":5,"id":"b3b42c54_1cf41671","line":277,"in_reply_to":"e2f86693_695dda77","updated":"2022-11-10 20:42:20.000000000","message":"I think gracefully degrading might be the right option but could take longer to implement. Could we just do a NameError for now ? Also where do you think will be the right place to throw such an error ?","commit_id":"8aeb6ec4b347755cca139e58e72668b0a83c4dd3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"1753bc556300d18f94bacb62e29ba9bca0e728b4","unresolved":true,"context_lines":[{"line_number":997,"context_line":"        if \u0027aws-chunked\u0027 in self.headers.get(\u0027content-encoding\u0027, \u0027\u0027):"},{"line_number":998,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":999,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1000,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1001,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1002,"context_line":"            try:"},{"line_number":1003,"context_line":"                if int(decoded_content) \u003c 0:"}],"source_content_type":"text/x-python","patch_set":7,"id":"14c1d355_97893c52","line":1000,"updated":"2023-08-17 16:15:45.000000000","message":"the following minio-go client program breaks your patch:\n\n```\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/minio/minio-go/v7\"\n\t\"github.com/minio/minio-go/v7/pkg/credentials\"\n)\n\nfunc main() {\n\tctx :\u003d context.Background()\n\tendpoint :\u003d \"saio:8080\"\n\taccessKeyID :\u003d \"test:tester\"\n\tsecretAccessKey :\u003d \"testing\"\n\tuseSSL :\u003d false\n\n\t// Initialize minio client object.\n\tminioClient, err :\u003d minio.New(endpoint, \u0026minio.Options{\n\t\tCreds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, \"\"),\n\t\tSecure: useSSL,\n\t})\n\tif err !\u003d nil {\n\t\tlog.Fatalln(err)\n\t}\n\n\t// Make a new bucket called mymusic.\n\tbucketName :\u003d \"myashwimusic\"\n\tlocation :\u003d \"us-east-1\"\n\n\terr \u003d minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{Region: location})\n\tif err !\u003d nil {\n\t\t// Check to see if we already own this bucket (which happens if you run this twice)\n\t\texists, errBucketExists :\u003d minioClient.BucketExists(ctx, bucketName)\n\t\tif errBucketExists \u003d\u003d nil \u0026\u0026 exists {\n\t\t\tlog.Printf(\"We already own %s\\n\", bucketName)\n\t\t} else {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t} else {\n\t\tlog.Printf(\"Successfully created %s\\n\", bucketName)\n\t}\n\n\tfile, err :\u003d os.Open(\"my-testfile\")\n\tif err !\u003d nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tdefer file.Close()\n\n\tfileStat, err :\u003d file.Stat()\n\tif err !\u003d nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"size of the object: \", fileStat.Size())\n\n\tuploadInfo, err :\u003d minioClient.PutObject(context.Background(), bucketName, \"myobject\", file, fileStat.Size(), minio.PutObjectOptions{ContentType: \"application/octet-stream\", ContentEncoding: \"aws-chunked\"})\n\tif err !\u003d nil {\n\t\tfmt.Println(err)\n\t\treturn\n\t}\n\tfmt.Println(\"Successfully uploaded bytes: \", uploadInfo)\n}\n\n```\n\nwhich results in an Invalid Argument error emitted by the proxy-server for a sha256 mismatch, maybe something more needs to be done in this edge-case","commit_id":"dfaaaf671097ab09f3c2b00cd1ca8da466c486cc"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c0bde0ad89c24d3e85c097b1c35931eb61798aab","unresolved":true,"context_lines":[{"line_number":997,"context_line":"        if \u0027aws-chunked\u0027 in self.headers.get(\u0027content-encoding\u0027, \u0027\u0027):"},{"line_number":998,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":999,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1000,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1001,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1002,"context_line":"            try:"},{"line_number":1003,"context_line":"                if int(decoded_content) \u003c 0:"}],"source_content_type":"text/x-python","patch_set":7,"id":"6eef8ab2_49dc3dba","line":1000,"in_reply_to":"14c1d355_97893c52","updated":"2024-10-21 16:08:01.000000000","message":"This will be worth testing again","commit_id":"dfaaaf671097ab09f3c2b00cd1ca8da466c486cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01b77abda3199fe2354a2d2c06fa3bfd493acdd7","unresolved":true,"context_lines":[{"line_number":997,"context_line":"        if \u0027aws-chunked\u0027 in self.headers.get(\u0027content-encoding\u0027, \u0027\u0027):"},{"line_number":998,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":999,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1000,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1001,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1002,"context_line":"            try:"},{"line_number":1003,"context_line":"                if int(decoded_content) \u003c 0:"}],"source_content_type":"text/x-python","patch_set":7,"id":"92249d41_388e8be7","line":1000,"in_reply_to":"6eef8ab2_49dc3dba","updated":"2025-04-28 19:52:48.000000000","message":"Seems to work now (at least for me). Was uploading a 100M file, could sniff with `tcpdump` and see it sending `X-Amz-Content-Sha256: STREAMING-AWS4-HMAC-SHA256-PAYLOAD`. Let me know if you get a chance to re-test.","commit_id":"dfaaaf671097ab09f3c2b00cd1ca8da466c486cc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"734994b11460ee23093bc2479a9b825a3775f160","unresolved":true,"context_lines":[{"line_number":996,"context_line":""},{"line_number":997,"context_line":"        if \u0027aws-chunked\u0027 in self.headers.get(\u0027content-encoding\u0027, \u0027\u0027):"},{"line_number":998,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":999,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1000,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1001,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1002,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5062db78_d981f177","line":999,"updated":"2024-02-09 00:23:56.000000000","message":"This feels off -- if the client *does* know the complete SHA256, why wouldn\u0027t we want them to send it? We\u0027ve also seen some clients that send `UNSIGNED-PAYLOAD` here, despite otherwise following the `aws-chunked` protocol. At the very least, I think we\u0027ll also want to support\n\n- `STREAMING-UNSIGNED-PAYLOAD-TRAILER`\n- `STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER`\n\nThe former is used by https://github.com/awslabs/mountpoint-s3/ which would be a nice new client to support.","commit_id":"a272f57105d6eec7eee356e56daeaa18183f97ec"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":996,"context_line":""},{"line_number":997,"context_line":"        if \u0027aws-chunked\u0027 in self.headers.get(\u0027content-encoding\u0027, \u0027\u0027):"},{"line_number":998,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":999,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1000,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1001,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1002,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"4da5b000_669d9535","line":999,"in_reply_to":"5062db78_d981f177","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"a272f57105d6eec7eee356e56daeaa18183f97ec"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"35c09a47007dd27efc973a8afbcbb609273928f7","unresolved":true,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def read(self, size\u003dNone):"},{"line_number":172,"context_line":"        def process_chunk(signature, chunk):"},{"line_number":173,"context_line":"            chunk_valid \u003d self._validator(chunk, signature)"},{"line_number":174,"context_line":"            if not chunk_valid:"},{"line_number":175,"context_line":"                self.close()"},{"line_number":176,"context_line":"                raise swob.HTTPForbidden(body\u003d\u0027%s\\n%s\u0027 % ("}],"source_content_type":"text/x-python","patch_set":9,"id":"536d4996_567743b7","line":173,"range":{"start_line":173,"start_character":42,"end_line":173,"end_character":58},"updated":"2024-02-15 05:49:13.000000000","message":"Seems weird that these params change order then in `process_chunk`. If we have a defined api for the validator maybe make process_chunk the same or visa_versa?","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def read(self, size\u003dNone):"},{"line_number":172,"context_line":"        def process_chunk(signature, chunk):"},{"line_number":173,"context_line":"            chunk_valid \u003d self._validator(chunk, signature)"},{"line_number":174,"context_line":"            if not chunk_valid:"},{"line_number":175,"context_line":"                self.close()"},{"line_number":176,"context_line":"                raise swob.HTTPForbidden(body\u003d\u0027%s\\n%s\u0027 % ("}],"source_content_type":"text/x-python","patch_set":9,"id":"8375c08e_7afa6fc7","line":173,"range":{"start_line":173,"start_character":42,"end_line":173,"end_character":58},"in_reply_to":"536d4996_567743b7","updated":"2025-02-13 01:04:12.000000000","message":"Acknowledged","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"35c09a47007dd27efc973a8afbcbb609273928f7","unresolved":true,"context_lines":[{"line_number":190,"context_line":"                self.close()"},{"line_number":191,"context_line":"                raise swob.HTTPForbidden(body\u003d\u0027%s\\n%s\\n%s\u0027 % ("},{"line_number":192,"context_line":"                    SIGV4_ERROR_INVALID_CHUNK_SIZE, self._chunk, chunk_size))"},{"line_number":193,"context_line":"            self._last_chunk_size \u003d chunk_size"},{"line_number":194,"context_line":"            if not header_parts[1].startswith(\u0027chunk-signature\u003d\u0027):"},{"line_number":195,"context_line":"                self.close()"},{"line_number":196,"context_line":"                raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"}],"source_content_type":"text/x-python","patch_set":9,"id":"55381c33_1d8cf079","line":193,"range":{"start_line":193,"start_character":12,"end_line":193,"end_character":46},"updated":"2024-02-15 05:49:13.000000000","message":"Isn\u0027t this the same as as 187? so why do we need to set self._last_chunk_size back on 187? I mean I know it\u0027s the first chunk check which could be an object \u003c then min_size. But we could either change the 187 to a pass or rewoek the elif to be the if:\n\n\n    if (self.last_chunk_size is not None and chunk_size !\u003d 0 and self._last_chunk_size \u003c SIGV4_CHUNK_MIN_SIZE):\n        \u003cclose and HTTPforbidden etc\u003e\n\nAlthough maybe a pass makes it easier to read and understand:\n\n    if self._last_chunk_size is None:\n        # first chunk so skip check\n        pass\n    elif (chunk_size !\u003d 0 and self._last_chunk_size \u003c SIGV4_CHUNK_MIN_SIZE):\n        \u003cclose and HTTPforbidden etc\u003e","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                self.close()"},{"line_number":191,"context_line":"                raise swob.HTTPForbidden(body\u003d\u0027%s\\n%s\\n%s\u0027 % ("},{"line_number":192,"context_line":"                    SIGV4_ERROR_INVALID_CHUNK_SIZE, self._chunk, chunk_size))"},{"line_number":193,"context_line":"            self._last_chunk_size \u003d chunk_size"},{"line_number":194,"context_line":"            if not header_parts[1].startswith(\u0027chunk-signature\u003d\u0027):"},{"line_number":195,"context_line":"                self.close()"},{"line_number":196,"context_line":"                raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"}],"source_content_type":"text/x-python","patch_set":9,"id":"0a02340e_11674edd","line":193,"range":{"start_line":193,"start_character":12,"end_line":193,"end_character":46},"in_reply_to":"55381c33_1d8cf079","updated":"2025-04-02 14:19:50.000000000","message":"Done","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":190,"context_line":"                self.close()"},{"line_number":191,"context_line":"                raise swob.HTTPForbidden(body\u003d\u0027%s\\n%s\\n%s\u0027 % ("},{"line_number":192,"context_line":"                    SIGV4_ERROR_INVALID_CHUNK_SIZE, self._chunk, chunk_size))"},{"line_number":193,"context_line":"            self._last_chunk_size \u003d chunk_size"},{"line_number":194,"context_line":"            if not header_parts[1].startswith(\u0027chunk-signature\u003d\u0027):"},{"line_number":195,"context_line":"                self.close()"},{"line_number":196,"context_line":"                raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1e34cdd1_6f12c7c7","line":193,"range":{"start_line":193,"start_character":12,"end_line":193,"end_character":46},"in_reply_to":"55381c33_1d8cf079","updated":"2025-04-02 14:19:50.000000000","message":"Done","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"35c09a47007dd27efc973a8afbcbb609273928f7","unresolved":true,"context_lines":[{"line_number":194,"context_line":"            if not header_parts[1].startswith(\u0027chunk-signature\u003d\u0027):"},{"line_number":195,"context_line":"                self.close()"},{"line_number":196,"context_line":"                raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":197,"context_line":"            chunk_signature \u003d header_parts[1][16:]"},{"line_number":198,"context_line":"            return (chunk_size, chunk_signature)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Content"}],"source_content_type":"text/x-python","patch_set":9,"id":"0cebca89_bb634d01","line":197,"updated":"2024-02-15 05:49:13.000000000","message":"I wonder if for readability if:\n\n    chunk_signature \u003d header_parts[1][len(\u0027chunk-signature\u003d\u0027):]\n\nWould be easer to maintain? Maybe it\u0027s just me and I\u0027m using more cpu cycles.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":194,"context_line":"            if not header_parts[1].startswith(\u0027chunk-signature\u003d\u0027):"},{"line_number":195,"context_line":"                self.close()"},{"line_number":196,"context_line":"                raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":197,"context_line":"            chunk_signature \u003d header_parts[1][16:]"},{"line_number":198,"context_line":"            return (chunk_size, chunk_signature)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        # Content"}],"source_content_type":"text/x-python","patch_set":9,"id":"f616ae76_357c3d79","line":197,"in_reply_to":"0cebca89_bb634d01","updated":"2025-02-13 01:04:12.000000000","message":"All the chunk-header parsing got reworked as I explored it more; see `test_no_md5_streaming_signed_spaced_out_param`, `test_no_md5_streaming_signed_spaced_out_param_value`, `test_no_md5_streaming_signed_extra_param_before`, `test_no_md5_streaming_signed_extra_param_after`","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9419ec8f32942c96e37a54554233cc97b0c6ebe7","unresolved":true,"context_lines":[{"line_number":217,"context_line":"                            body\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":218,"context_line":"                break"},{"line_number":219,"context_line":"            # Add data to buffer to process"},{"line_number":220,"context_line":"            data \u003d self._input.read(size).decode(\u0027utf8\u0027)"},{"line_number":221,"context_line":"            self._raw_to_read -\u003d len(data)"},{"line_number":222,"context_line":"            self._raw_buffer +\u003d data"},{"line_number":223,"context_line":"            # Check if counters are consistent"}],"source_content_type":"text/x-python","patch_set":9,"id":"4ebeba59_8b0ed677","line":220,"range":{"start_line":220,"start_character":42,"end_line":220,"end_character":56},"updated":"2024-02-17 07:05:34.000000000","message":"Why are we decoding? These are arbitrary bytes; we can\u0027t assume any particular encoding, and assuming utf8 will likely throw off any length calculations.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"35c09a47007dd27efc973a8afbcbb609273928f7","unresolved":true,"context_lines":[{"line_number":217,"context_line":"                            body\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":218,"context_line":"                break"},{"line_number":219,"context_line":"            # Add data to buffer to process"},{"line_number":220,"context_line":"            data \u003d self._input.read(size).decode(\u0027utf8\u0027)"},{"line_number":221,"context_line":"            self._raw_to_read -\u003d len(data)"},{"line_number":222,"context_line":"            self._raw_buffer +\u003d data"},{"line_number":223,"context_line":"            # Check if counters are consistent"}],"source_content_type":"text/x-python","patch_set":9,"id":"6ba15bf5_da15341f","line":220,"range":{"start_line":220,"start_character":36,"end_line":220,"end_character":40},"updated":"2024-02-15 05:49:13.000000000","message":"size here (which could be None?) or _size?","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                            body\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":218,"context_line":"                break"},{"line_number":219,"context_line":"            # Add data to buffer to process"},{"line_number":220,"context_line":"            data \u003d self._input.read(size).decode(\u0027utf8\u0027)"},{"line_number":221,"context_line":"            self._raw_to_read -\u003d len(data)"},{"line_number":222,"context_line":"            self._raw_buffer +\u003d data"},{"line_number":223,"context_line":"            # Check if counters are consistent"}],"source_content_type":"text/x-python","patch_set":9,"id":"f2916345_82be8f47","line":220,"range":{"start_line":220,"start_character":42,"end_line":220,"end_character":56},"in_reply_to":"4ebeba59_8b0ed677","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                            body\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":218,"context_line":"                break"},{"line_number":219,"context_line":"            # Add data to buffer to process"},{"line_number":220,"context_line":"            data \u003d self._input.read(size).decode(\u0027utf8\u0027)"},{"line_number":221,"context_line":"            self._raw_to_read -\u003d len(data)"},{"line_number":222,"context_line":"            self._raw_buffer +\u003d data"},{"line_number":223,"context_line":"            # Check if counters are consistent"}],"source_content_type":"text/x-python","patch_set":9,"id":"27913f52_ee6d7427","line":220,"range":{"start_line":220,"start_character":36,"end_line":220,"end_character":40},"in_reply_to":"6ba15bf5_da15341f","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"35c09a47007dd27efc973a8afbcbb609273928f7","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                    # Consume the first part"},{"line_number":238,"context_line":"                    self._raw_buffer \u003d split_buffer[1]"},{"line_number":239,"context_line":"                    self._chunk +\u003d 1"},{"line_number":240,"context_line":"                    continue"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"                # Ensure buffer contains chunk data and extra \u0027\\r\\n\u0027"},{"line_number":243,"context_line":"                chunk_size, chunk_signature \u003d self._chunk_header"}],"source_content_type":"text/x-python","patch_set":9,"id":"90847243_b87cf364","line":240,"updated":"2024-02-15 05:49:13.000000000","message":"Do we need to continue here, that\u0027ll just continue the inner while True, which would be the same as just keep going outside the `chunk_header is None` if block?","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9419ec8f32942c96e37a54554233cc97b0c6ebe7","unresolved":true,"context_lines":[{"line_number":237,"context_line":"                    # Consume the first part"},{"line_number":238,"context_line":"                    self._raw_buffer \u003d split_buffer[1]"},{"line_number":239,"context_line":"                    self._chunk +\u003d 1"},{"line_number":240,"context_line":"                    continue"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"                # Ensure buffer contains chunk data and extra \u0027\\r\\n\u0027"},{"line_number":243,"context_line":"                chunk_size, chunk_signature \u003d self._chunk_header"}],"source_content_type":"text/x-python","patch_set":9,"id":"92593e4b_1adc9433","line":240,"in_reply_to":"90847243_b87cf364","updated":"2024-02-17 07:05:34.000000000","message":"Yeah, there\u0027s a bunch of stuff I found confusing in this `read` function -- nested `while True`s, jumping back and forth between the loops and the closures, the double-buffering between `_raw_buffer` and `_processed_content`. I re-wrote most of it in https://review.opendev.org/c/openstack/swift/+/908953 -- maybe I should go ahead and squash it in.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":237,"context_line":"                    # Consume the first part"},{"line_number":238,"context_line":"                    self._raw_buffer \u003d split_buffer[1]"},{"line_number":239,"context_line":"                    self._chunk +\u003d 1"},{"line_number":240,"context_line":"                    continue"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"                # Ensure buffer contains chunk data and extra \u0027\\r\\n\u0027"},{"line_number":243,"context_line":"                chunk_size, chunk_signature \u003d self._chunk_header"}],"source_content_type":"text/x-python","patch_set":9,"id":"5de1bac3_c99ab0ea","line":240,"in_reply_to":"92593e4b_1adc9433","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9419ec8f32942c96e37a54554233cc97b0c6ebe7","unresolved":true,"context_lines":[{"line_number":591,"context_line":"                content_length \u003d self.content_length"},{"line_number":592,"context_line":"                self.content_length \u003d self.headers.get("},{"line_number":593,"context_line":"                    \u0027X-Amz-Decoded-Content-Length\u0027)"},{"line_number":594,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d StreamingInput("},{"line_number":595,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"},{"line_number":596,"context_line":"                    content_length,"},{"line_number":597,"context_line":"                    self.content_length,"}],"source_content_type":"text/x-python","patch_set":9,"id":"afeca2f6_f00b46a9","line":594,"updated":"2024-02-17 07:05:34.000000000","message":"I\u0027m nervous about us applying a transformation like this in `_canonical_request` -- there\u0027s an expectation that we should be able to call this whenever. In retrospect, we probably shouldn\u0027t be swapping out for a `HashingInput` below, either, but at least that should just be validating -- there\u0027s some inefficiency if `wsgi.input` gets wrapped twice, but no real problem. If we accidentally double-wrap with `StreamingInput`, though, the request will likely go off the rails. I suspect it could go particularly badly if we accept `Transfer-Encoding: chunked` uploads (which we want to do; I think it\u0027s [the only way](https://github.com/boto/botocore/blob/develop/botocore/httpchecksum.py#L345-L351) we\u0027re likely to get a functional test for this, even if it\u0027ll [require https](https://github.com/boto/botocore/blob/develop/botocore/httpchecksum.py#L270-L276)).","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":591,"context_line":"                content_length \u003d self.content_length"},{"line_number":592,"context_line":"                self.content_length \u003d self.headers.get("},{"line_number":593,"context_line":"                    \u0027X-Amz-Decoded-Content-Length\u0027)"},{"line_number":594,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d StreamingInput("},{"line_number":595,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"},{"line_number":596,"context_line":"                    content_length,"},{"line_number":597,"context_line":"                    self.content_length,"}],"source_content_type":"text/x-python","patch_set":9,"id":"b5435f00_9c015621","line":594,"in_reply_to":"afeca2f6_f00b46a9","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9419ec8f32942c96e37a54554233cc97b0c6ebe7","unresolved":true,"context_lines":[{"line_number":1005,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":1006,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1007,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1008,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1009,"context_line":"            try:"},{"line_number":1010,"context_line":"                if int(decoded_content) \u003c 0:"},{"line_number":1011,"context_line":"                    raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"ed1effc0_52133e9d","line":1008,"updated":"2024-02-17 07:05:34.000000000","message":"We want to tolerate this being `None`.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"d4c0bef01cbbd0f5a587a3734ede5f82b86aefbc","unresolved":true,"context_lines":[{"line_number":1005,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":1006,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1007,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1008,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1009,"context_line":"            try:"},{"line_number":1010,"context_line":"                if int(decoded_content) \u003c 0:"},{"line_number":1011,"context_line":"                    raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"bd188f6f_b003fe4f","line":1008,"in_reply_to":"8e10c696_4ba00e27","updated":"2024-10-30 16:15:18.000000000","message":"You are right about needing the right error, working on tests for it as of writing this comment","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01b77abda3199fe2354a2d2c06fa3bfd493acdd7","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":1006,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1007,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1008,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1009,"context_line":"            try:"},{"line_number":1010,"context_line":"                if int(decoded_content) \u003c 0:"},{"line_number":1011,"context_line":"                    raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"2ab1ca66_6cbb373e","line":1008,"in_reply_to":"bd188f6f_b003fe4f","updated":"2025-04-28 19:52:48.000000000","message":"I don\u0027t remember exactly what I was trying to say here, but I added some more tests:\n\n- yes aws-chunked, transfer-encoding chunked, with decoded content-length\n- yes aws-chunked, transfer-encoding chunked, without decoded content-length\n\nI think we\u0027ve got our bases covered.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1568cc3c184b8db8bafab1acf0b2606bbcb2fbc7","unresolved":true,"context_lines":[{"line_number":1005,"context_line":"            aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":1006,"context_line":"            if aws_sha256 !\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027:"},{"line_number":1007,"context_line":"                raise InvalidArgument(\u0027x-amz-content-sha256\u0027, aws_sha256)"},{"line_number":1008,"context_line":"            decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1009,"context_line":"            try:"},{"line_number":1010,"context_line":"                if int(decoded_content) \u003c 0:"},{"line_number":1011,"context_line":"                    raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"8e10c696_4ba00e27","line":1008,"in_reply_to":"ed1effc0_52133e9d","updated":"2024-05-02 15:18:21.000000000","message":"Scratch that! Apparently boto3 can send `aws-chunked` payloads with `transfer-encoding: chunked`, but AWS responds `MissingContentLength`.\n\nStill, we should get the right error out for that case.","commit_id":"2236731d7bc66fde44a63684a6a977fb08a9609a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":91,"context_line":"SIGV4_CHUNK_MIN_SIZE \u003d 8192"},{"line_number":92,"context_line":"SIGV4_ERROR_INCOMPLETE_BODY \u003d \u0027incomplete_body_error\u0027"},{"line_number":93,"context_line":"SIGV4_ERROR_INVALID_CHUNK_SIZE \u003d \u0027invalid_chunk_size_error\u0027"},{"line_number":94,"context_line":"SIGV4_ERROR_SIGNATURE_DOES_NOT_MATCH \u003d \u0027signature_does_not_match\u0027"},{"line_number":95,"context_line":"SERVICE \u003d \u0027s3\u0027  # useful for mocking out in tests"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"532d4ca4_44a7f979","line":94,"updated":"2025-01-30 20:00:09.000000000","message":"I feel like these error strings could probably go... there *must* be a better way of message-passing.","commit_id":"a683db748e917a631d1f0d4d7273a70341c572b2"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3d69d6254c2408da05e59820c0b7487724f9fe45","unresolved":true,"context_lines":[{"line_number":91,"context_line":"SIGV4_CHUNK_MIN_SIZE \u003d 8192"},{"line_number":92,"context_line":"SIGV4_ERROR_INCOMPLETE_BODY \u003d \u0027incomplete_body_error\u0027"},{"line_number":93,"context_line":"SIGV4_ERROR_INVALID_CHUNK_SIZE \u003d \u0027invalid_chunk_size_error\u0027"},{"line_number":94,"context_line":"SIGV4_ERROR_SIGNATURE_DOES_NOT_MATCH \u003d \u0027signature_does_not_match\u0027"},{"line_number":95,"context_line":"SERVICE \u003d \u0027s3\u0027  # useful for mocking out in tests"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"b09eab77_7f6bf8e9","line":94,"in_reply_to":"532d4ca4_44a7f979","updated":"2025-02-03 14:44:18.000000000","message":"Ack.","commit_id":"a683db748e917a631d1f0d4d7273a70341c572b2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":91,"context_line":"SIGV4_CHUNK_MIN_SIZE \u003d 8192"},{"line_number":92,"context_line":"SIGV4_ERROR_INCOMPLETE_BODY \u003d \u0027incomplete_body_error\u0027"},{"line_number":93,"context_line":"SIGV4_ERROR_INVALID_CHUNK_SIZE \u003d \u0027invalid_chunk_size_error\u0027"},{"line_number":94,"context_line":"SIGV4_ERROR_SIGNATURE_DOES_NOT_MATCH \u003d \u0027signature_does_not_match\u0027"},{"line_number":95,"context_line":"SERVICE \u003d \u0027s3\u0027  # useful for mocking out in tests"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"396ed6fd_f2f753d9","line":94,"in_reply_to":"b09eab77_7f6bf8e9","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"a683db748e917a631d1f0d4d7273a70341c572b2"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"fd249845d6b9e0465b6d3d233ff2f8d7fad9ba2c","unresolved":true,"context_lines":[{"line_number":621,"context_line":"        signed_headers \u003d auth_str.partition("},{"line_number":622,"context_line":"            \"SignedHeaders\u003d\")[2].split(\u0027,\u0027, 1)[0]"},{"line_number":623,"context_line":"        if not signed_headers:"},{"line_number":624,"context_line":"            # TODO: make sure if is it Malformed?"},{"line_number":625,"context_line":"            raise AuthorizationHeaderMalformed()"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        invalid_messages \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"18ff2539_2f23ffc7","line":624,"updated":"2024-10-30 20:04:37.000000000","message":"We have a `TODO` section here, nice","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":621,"context_line":"        signed_headers \u003d auth_str.partition("},{"line_number":622,"context_line":"            \"SignedHeaders\u003d\")[2].split(\u0027,\u0027, 1)[0]"},{"line_number":623,"context_line":"        if not signed_headers:"},{"line_number":624,"context_line":"            # TODO: make sure if is it Malformed?"},{"line_number":625,"context_line":"            raise AuthorizationHeaderMalformed()"},{"line_number":626,"context_line":""},{"line_number":627,"context_line":"        invalid_messages \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"1236986d_9d466d77","line":624,"in_reply_to":"18ff2539_2f23ffc7","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"1f91dcc34018cbeb50978a6639710e188a2fe949","unresolved":true,"context_lines":[{"line_number":984,"context_line":"        return \u0027AWSAccessKeyId\u0027 in self.params"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    @property"},{"line_number":987,"context_line":"    def _is_chunked_upload(self):"},{"line_number":988,"context_line":"        return self.method \u003d\u003d \u0027PUT\u0027 and ("},{"line_number":989,"context_line":"            self.headers.get(\u0027content-encoding\u0027) \u003d\u003d \u0027aws-chunked\u0027 or"},{"line_number":990,"context_line":"            self.headers.get(\u0027X-Amz-Content-SHA256\u0027) in ("}],"source_content_type":"text/x-python","patch_set":38,"id":"63d8fca4_9bfd2409","line":987,"updated":"2024-10-31 16:05:43.000000000","message":"we may want to refactor this to `_is_sigv4_upload` since we do not want any confusion between the fact that when/if a user sets `Transfer-Encoding: chunked` against AWS S3 (you mentioned we get a 501 which is confusing which could be confusing to a new swift user). When i set `content-encoding: aws-chunked`(or which warp or the `aws s3cp` command defaults to, its still sigv4 streaming on an upload)  although it is still `\u0027Transfer-Encoding\u0027: \u0027chunked\u0027`\n\nnote to self: write a cross-compat test for that 501 case in the follow-on https://review.opendev.org/c/openstack/swift/+/933468","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":984,"context_line":"        return \u0027AWSAccessKeyId\u0027 in self.params"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    @property"},{"line_number":987,"context_line":"    def _is_chunked_upload(self):"},{"line_number":988,"context_line":"        return self.method \u003d\u003d \u0027PUT\u0027 and ("},{"line_number":989,"context_line":"            self.headers.get(\u0027content-encoding\u0027) \u003d\u003d \u0027aws-chunked\u0027 or"},{"line_number":990,"context_line":"            self.headers.get(\u0027X-Amz-Content-SHA256\u0027) in ("}],"source_content_type":"text/x-python","patch_set":38,"id":"820a7f4f_a8486ac5","line":987,"in_reply_to":"63d8fca4_9bfd2409","updated":"2025-02-12 18:58:38.000000000","message":"this doesn\u0027t appear to be used","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":984,"context_line":"        return \u0027AWSAccessKeyId\u0027 in self.params"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"    @property"},{"line_number":987,"context_line":"    def _is_chunked_upload(self):"},{"line_number":988,"context_line":"        return self.method \u003d\u003d \u0027PUT\u0027 and ("},{"line_number":989,"context_line":"            self.headers.get(\u0027content-encoding\u0027) \u003d\u003d \u0027aws-chunked\u0027 or"},{"line_number":990,"context_line":"            self.headers.get(\u0027X-Amz-Content-SHA256\u0027) in ("}],"source_content_type":"text/x-python","patch_set":38,"id":"f3265097_681e69a5","line":987,"in_reply_to":"820a7f4f_a8486ac5","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"eb21b01e1f48ae8453a33332dbbda4cc7712c166","unresolved":true,"context_lines":[{"line_number":1132,"context_line":"        if delta \u003e self.conf.allowable_clock_skew:"},{"line_number":1133,"context_line":"            raise RequestTimeTooSkewed()"},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"    def _validate_sha256(self):"},{"line_number":1136,"context_line":"        aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":1137,"context_line":"        if aws_sha256 in ("},{"line_number":1138,"context_line":"                \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"aa3ecf85_5473f638","line":1135,"updated":"2024-10-29 23:28:07.000000000","message":"Maybe we can refactor this helper method to a different name, so we explicitly know that this is for v2 requests even updating the docs for this method will be helpful to distinguish from the one in L486 which is for sigv4","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":1132,"context_line":"        if delta \u003e self.conf.allowable_clock_skew:"},{"line_number":1133,"context_line":"            raise RequestTimeTooSkewed()"},{"line_number":1134,"context_line":""},{"line_number":1135,"context_line":"    def _validate_sha256(self):"},{"line_number":1136,"context_line":"        aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":1137,"context_line":"        if aws_sha256 in ("},{"line_number":1138,"context_line":"                \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":38,"id":"c5bd2eea_733139da","line":1135,"in_reply_to":"aa3ecf85_5473f638","updated":"2025-02-14 17:04:50.000000000","message":"This comment seems stale. There is only one declaration of _validate_sha256","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"eb21b01e1f48ae8453a33332dbbda4cc7712c166","unresolved":true,"context_lines":[{"line_number":1219,"context_line":"        if \u0027x-amz-website-redirect-location\u0027 in self.headers:"},{"line_number":1220,"context_line":"            raise S3NotImplemented(\u0027Website redirection is not supported.\u0027)"},{"line_number":1221,"context_line":""},{"line_number":1222,"context_line":"        aws_sha256, decoded_content \u003d self._validate_sha256()"},{"line_number":1223,"context_line":"        if aws_sha256:"},{"line_number":1224,"context_line":"            if aws_sha256 \u003d\u003d \u0027UNSIGNED-PAYLOAD\u0027:"},{"line_number":1225,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":38,"id":"a9525c72_7833e8b6","line":1222,"updated":"2024-10-29 23:28:07.000000000","message":"We have `decoded_content` as always `None` here since this helper is from L1135 unless i am missing something","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3d69d6254c2408da05e59820c0b7487724f9fe45","unresolved":false,"context_lines":[{"line_number":1219,"context_line":"        if \u0027x-amz-website-redirect-location\u0027 in self.headers:"},{"line_number":1220,"context_line":"            raise S3NotImplemented(\u0027Website redirection is not supported.\u0027)"},{"line_number":1221,"context_line":""},{"line_number":1222,"context_line":"        aws_sha256, decoded_content \u003d self._validate_sha256()"},{"line_number":1223,"context_line":"        if aws_sha256:"},{"line_number":1224,"context_line":"            if aws_sha256 \u003d\u003d \u0027UNSIGNED-PAYLOAD\u0027:"},{"line_number":1225,"context_line":"                pass"}],"source_content_type":"text/x-python","patch_set":38,"id":"5d3abc73_0d4c1772","line":1222,"in_reply_to":"a9525c72_7833e8b6","updated":"2025-02-03 14:44:18.000000000","message":"Done","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"92056ae4af8181498f2ae6291d4fe7903132b6ed","unresolved":true,"context_lines":[{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"        env \u003d self.environ.copy()"},{"line_number":1662,"context_line":"        env[\u0027swift.infocache\u0027] \u003d self.environ.setdefault(\u0027swift.infocache\u0027, {})"},{"line_number":1663,"context_line":"        if \u0027aws-chunked\u0027 in env.get(\u0027HTTP_CONTENT_ENCODING\u0027, \u0027\u0027):"},{"line_number":1664,"context_line":"            env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d \u0027, \u0027.join("},{"line_number":1665,"context_line":"                enc for enc in list_from_csv(env[\u0027HTTP_CONTENT_ENCODING\u0027])"},{"line_number":1666,"context_line":"                # TODO: test what\u0027s stored w/ \u0027aws-chunked, aws-chunked\u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"55d75ef3_4c29088d","line":1663,"updated":"2024-11-04 21:44:40.000000000","message":"This could be split like this:\n```\ncontent_encoding \u003d env.get(\u0027HTTP_CONTENT_ENCODING\u0027, \u0027\u0027)\n\nif \u0027aws-chunked\u0027 in content_encoding:\n    encodings \u003d list_from_csv(content_encoding)\n    filtered_encodings \u003d [enc for enc in encodings if enc !\u003d \u0027aws-chunked\u0027]\n    env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d \u0027, \u0027.join(filtered_encodings)\nelse:\n    # Handle the case where content-encoding is not \u0027aws-chunked\u0027\n    env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d content_encoding\n```","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"        env \u003d self.environ.copy()"},{"line_number":1662,"context_line":"        env[\u0027swift.infocache\u0027] \u003d self.environ.setdefault(\u0027swift.infocache\u0027, {})"},{"line_number":1663,"context_line":"        if \u0027aws-chunked\u0027 in env.get(\u0027HTTP_CONTENT_ENCODING\u0027, \u0027\u0027):"},{"line_number":1664,"context_line":"            env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d \u0027, \u0027.join("},{"line_number":1665,"context_line":"                enc for enc in list_from_csv(env[\u0027HTTP_CONTENT_ENCODING\u0027])"},{"line_number":1666,"context_line":"                # TODO: test what\u0027s stored w/ \u0027aws-chunked, aws-chunked\u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"5cfc7214_ed879365","line":1663,"in_reply_to":"55d75ef3_4c29088d","updated":"2025-04-02 14:19:50.000000000","message":"Acknowledged","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1660,"context_line":""},{"line_number":1661,"context_line":"        env \u003d self.environ.copy()"},{"line_number":1662,"context_line":"        env[\u0027swift.infocache\u0027] \u003d self.environ.setdefault(\u0027swift.infocache\u0027, {})"},{"line_number":1663,"context_line":"        if \u0027aws-chunked\u0027 in env.get(\u0027HTTP_CONTENT_ENCODING\u0027, \u0027\u0027):"},{"line_number":1664,"context_line":"            env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d \u0027, \u0027.join("},{"line_number":1665,"context_line":"                enc for enc in list_from_csv(env[\u0027HTTP_CONTENT_ENCODING\u0027])"},{"line_number":1666,"context_line":"                # TODO: test what\u0027s stored w/ \u0027aws-chunked, aws-chunked\u0027"}],"source_content_type":"text/x-python","patch_set":39,"id":"b97add27_1b04a647","line":1663,"in_reply_to":"55d75ef3_4c29088d","updated":"2025-04-02 14:19:50.000000000","message":"Acknowledged","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"92056ae4af8181498f2ae6291d4fe7903132b6ed","unresolved":true,"context_lines":[{"line_number":1732,"context_line":"                    if key.startswith(\u0027HTTP_X_OBJECT_META_\u0027):"},{"line_number":1733,"context_line":"                        del env[key]"},{"line_number":1734,"context_line":""},{"line_number":1735,"context_line":"        decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1736,"context_line":"        if decoded_content is not None and decoded_content.isdigit():"},{"line_number":1737,"context_line":"            env[\u0027CONTENT_LENGTH\u0027] \u003d decoded_content"},{"line_number":1738,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"17298f51_a4cd57a9","line":1735,"updated":"2024-11-04 21:44:40.000000000","message":"Could this be changed to?\n```\n        decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)\n        if decoded_content and decoded_content.isdigit():\n            env[\u0027CONTENT_LENGTH\u0027] \u003d decoded_content\n```","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1732,"context_line":"                    if key.startswith(\u0027HTTP_X_OBJECT_META_\u0027):"},{"line_number":1733,"context_line":"                        del env[key]"},{"line_number":1734,"context_line":""},{"line_number":1735,"context_line":"        decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1736,"context_line":"        if decoded_content is not None and decoded_content.isdigit():"},{"line_number":1737,"context_line":"            env[\u0027CONTENT_LENGTH\u0027] \u003d decoded_content"},{"line_number":1738,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"0af4c667_d32fcf6c","line":1735,"in_reply_to":"17298f51_a4cd57a9","updated":"2025-02-13 01:04:12.000000000","message":"Either way works; I opted to be explicit for what I was checking.","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"92056ae4af8181498f2ae6291d4fe7903132b6ed","unresolved":true,"context_lines":[{"line_number":1751,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d path"},{"line_number":1752,"context_line":""},{"line_number":1753,"context_line":"        params \u003d []"},{"line_number":1754,"context_line":"        if query is not None:"},{"line_number":1755,"context_line":"            for key, value in sorted(query.items()):"},{"line_number":1756,"context_line":"                if value is not None:"},{"line_number":1757,"context_line":"                    params.append(\u0027%s\u003d%s\u0027 % (key, quote(str(value))))"}],"source_content_type":"text/x-python","patch_set":39,"id":"3ac94b77_6aaef2e7","line":1754,"updated":"2024-11-04 21:44:40.000000000","message":"This block of code has also not been easy to look at, maybe:\n```\n        if query:\n            for key, value in sorted(query.items()):\n                params.append(f\u0027{key}\u003d{quote(str(value))}\u0027 if value else key)\n        if copy_from_version_id and not (query and query.get(\u0027version-id\u0027)):\n            params.append(f\u0027version-id\u003d{copy_from_version_id}\u0027)\n        env[\u0027QUERY_STRING\u0027] \u003d \u0027\u0026\u0027.join(params)\n```\n\nHopefully it doesn\u0027t break any tests, i will have to check ?","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1751,"context_line":"        env[\u0027PATH_INFO\u0027] \u003d path"},{"line_number":1752,"context_line":""},{"line_number":1753,"context_line":"        params \u003d []"},{"line_number":1754,"context_line":"        if query is not None:"},{"line_number":1755,"context_line":"            for key, value in sorted(query.items()):"},{"line_number":1756,"context_line":"                if value is not None:"},{"line_number":1757,"context_line":"                    params.append(\u0027%s\u003d%s\u0027 % (key, quote(str(value))))"}],"source_content_type":"text/x-python","patch_set":39,"id":"fdfb5774_9aaf17f1","line":1754,"in_reply_to":"3ac94b77_6aaef2e7","updated":"2025-04-02 14:19:50.000000000","message":"off-topic","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"92056ae4af8181498f2ae6291d4fe7903132b6ed","unresolved":true,"context_lines":[{"line_number":1926,"context_line":"        split_err \u003d err_msg.split(\u0027\\n\u0027, 1)"},{"line_number":1927,"context_line":"        error_type, args \u003d split_err[0], split_err[1:]"},{"line_number":1928,"context_line":"        kwargs \u003d {}"},{"line_number":1929,"context_line":"        if error_type \u003d\u003d SIGV4_ERROR_INVALID_CHUNK_SIZE:"},{"line_number":1930,"context_line":"            id, size \u003d args[0].split(\u0027\\n\u0027)"},{"line_number":1931,"context_line":"            kwargs.update({\u0027chunk\u0027: id,"},{"line_number":1932,"context_line":"                           \u0027bad_chunk_size\u0027: size})"}],"source_content_type":"text/x-python","patch_set":39,"id":"0ac2f25c_2a56e442","line":1929,"updated":"2024-11-04 21:44:40.000000000","message":"For class of `403` errors\n\nmaybe we will need to add more exceptions so that we can also handle class of `400` errors that have been introduced in https://review.opendev.org/c/openstack/swift/+/934087","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"92056ae4af8181498f2ae6291d4fe7903132b6ed","unresolved":true,"context_lines":[{"line_number":1968,"context_line":"                client_computed_content_s_h_a256\u003derr.expected,"},{"line_number":1969,"context_line":"                s3_computed_content_s_h_a256\u003derr.computed,"},{"line_number":1970,"context_line":"            )"},{"line_number":1971,"context_line":"        except S3InputChunkSignatureMismatch:"},{"line_number":1972,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1973,"context_line":"            # XXX: this seems unlikely to be right"},{"line_number":1974,"context_line":"            raise swob.HTTPForbidden("}],"source_content_type":"text/x-python","patch_set":39,"id":"f60c0a89_3cf356fd","line":1971,"updated":"2024-11-04 21:44:40.000000000","message":"Typically i would have liked to see `S3InputChunkSignatureMismatch` stacked above `S3InputSHA256Mismatch` since e should be emitting any bad cred errors before we even think of computing sha256 signatures and then reporting that they are a mismatch\n\nDoes `S3InputChunkSignatureMismatch` involve verifying/validating all the query params inlcuding? All of these parms are mentioned in\n https://review.opendev.org/c/openstack/swift/+/934087/2/swift/common/middleware/s3api/s3response.py#586","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"9e20c078d7bdb4234fe6aac7c4f16847bb765681","unresolved":true,"context_lines":[{"line_number":2054,"context_line":"                        err_msg.decode(\u0027utf8\u0027)))"},{"line_number":2055,"context_line":"            raise BadDigest()"},{"line_number":2056,"context_line":"        if status \u003d\u003d HTTP_FORBIDDEN:"},{"line_number":2057,"context_line":"            if self._is_chunked_upload:"},{"line_number":2058,"context_line":"                raise self._handle_chunk_upload_error(err_msg.decode(\u0027utf8\u0027))"},{"line_number":2059,"context_line":"            else:"},{"line_number":2060,"context_line":"                raise AccessDenied(reason\u003d\u0027forbidden\u0027)"}],"source_content_type":"text/x-python","patch_set":39,"id":"bfe00ba3_568d47ae","line":2057,"updated":"2024-11-08 17:17:47.000000000","message":"ah, we gotta make this error handling better ?","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":2054,"context_line":"                        err_msg.decode(\u0027utf8\u0027)))"},{"line_number":2055,"context_line":"            raise BadDigest()"},{"line_number":2056,"context_line":"        if status \u003d\u003d HTTP_FORBIDDEN:"},{"line_number":2057,"context_line":"            if self._is_chunked_upload:"},{"line_number":2058,"context_line":"                raise self._handle_chunk_upload_error(err_msg.decode(\u0027utf8\u0027))"},{"line_number":2059,"context_line":"            else:"},{"line_number":2060,"context_line":"                raise AccessDenied(reason\u003d\u0027forbidden\u0027)"}],"source_content_type":"text/x-python","patch_set":39,"id":"270a9dcd_b3f567f3","line":2057,"in_reply_to":"bfe00ba3_568d47ae","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9aca47854cd36abbbe5717fedf4587d8de61b61","unresolved":true,"context_lines":[{"line_number":1151,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":1152,"context_line":"                                      decoded_content)"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"            if decoded_content \u003c self.content_length:"},{"line_number":1155,"context_line":"                raise IncompleteBody("},{"line_number":1156,"context_line":"                    number_bytes_expected\u003ddecoded_content,"},{"line_number":1157,"context_line":"                    number_bytes_provided\u003dself.content_length,"}],"source_content_type":"text/x-python","patch_set":40,"id":"a2d75c46_e0d116f5","line":1154,"updated":"2025-01-22 14:45:52.000000000","message":"I don\u0027t understand this.\n\n1. there\u0027s a test failing because content_length is None\n\n2. the docs suggest that x-amz-decoded-content-length SHOULD be less that Content-Length https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":1152,"context_line":"                                      decoded_content)"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"            if decoded_content \u003c self.content_length:"},{"line_number":1155,"context_line":"                raise IncompleteBody("},{"line_number":1156,"context_line":"                    number_bytes_expected\u003ddecoded_content,"},{"line_number":1157,"context_line":"                    number_bytes_provided\u003dself.content_length,"}],"source_content_type":"text/x-python","patch_set":40,"id":"b0de29c8_d1f60b2f","line":1154,"in_reply_to":"a2d75c46_e0d116f5","updated":"2025-02-13 01:04:12.000000000","message":"Acknowledged","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9aca47854cd36abbbe5717fedf4587d8de61b61","unresolved":true,"context_lines":[{"line_number":1160,"context_line":"                client_computed_content_s_h_a256\u003daws_sha256,"},{"line_number":1161,"context_line":"                s3_computed_content_s_h_a256\u003dsha256("},{"line_number":1162,"context_line":"                    self.body_file.read()).hexdigest(),"},{"line_number":1163,"context_line":"            )"},{"line_number":1164,"context_line":""},{"line_number":1165,"context_line":"        return aws_sha256, None"},{"line_number":1166,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"d927f261_d88e442d","line":1163,"updated":"2025-01-22 14:45:52.000000000","message":"this seems wrong i.e. raising this exception unconditionally","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":false,"context_lines":[{"line_number":1160,"context_line":"                client_computed_content_s_h_a256\u003daws_sha256,"},{"line_number":1161,"context_line":"                s3_computed_content_s_h_a256\u003dsha256("},{"line_number":1162,"context_line":"                    self.body_file.read()).hexdigest(),"},{"line_number":1163,"context_line":"            )"},{"line_number":1164,"context_line":""},{"line_number":1165,"context_line":"        return aws_sha256, None"},{"line_number":1166,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"b87c5411_a74cd329","line":1163,"in_reply_to":"d927f261_d88e442d","updated":"2025-02-12 18:58:38.000000000","message":"OIC, aws_sha256 is just always wrong if it takes one of the STREAMING_* values, we\u0027re just figuring which version of wrong to indicate in the response","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9aca47854cd36abbbe5717fedf4587d8de61b61","unresolved":true,"context_lines":[{"line_number":1231,"context_line":"                if aws_sha256 \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"},{"line_number":1232,"context_line":"                    chunk_validator \u003d None"},{"line_number":1233,"context_line":"                else:"},{"line_number":1234,"context_line":"                    chunk_validator \u003d self.check_chunk_signature"},{"line_number":1235,"context_line":"                decoded_content \u003d self.headers.get("},{"line_number":1236,"context_line":"                    \u0027x-amz-decoded-content-length\u0027)"},{"line_number":1237,"context_line":"                if decoded_content is None:"}],"source_content_type":"text/x-python","patch_set":40,"id":"db7687e5_90ec7680","line":1234,"range":{"start_line":1234,"start_character":38,"end_line":1234,"end_character":64},"updated":"2025-01-22 14:45:52.000000000","message":"this is only defined in SigV4Mixin","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"                if aws_sha256 \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"},{"line_number":1232,"context_line":"                    chunk_validator \u003d None"},{"line_number":1233,"context_line":"                else:"},{"line_number":1234,"context_line":"                    chunk_validator \u003d self.check_chunk_signature"},{"line_number":1235,"context_line":"                decoded_content \u003d self.headers.get("},{"line_number":1236,"context_line":"                    \u0027x-amz-decoded-content-length\u0027)"},{"line_number":1237,"context_line":"                if decoded_content is None:"}],"source_content_type":"text/x-python","patch_set":40,"id":"9fcd1cb4_e12ac349","line":1234,"range":{"start_line":1234,"start_character":38,"end_line":1234,"end_character":64},"in_reply_to":"db7687e5_90ec7680","updated":"2025-02-13 01:04:12.000000000","message":"Streaming support is only available for v4-signed requests.","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9aca47854cd36abbbe5717fedf4587d8de61b61","unresolved":true,"context_lines":[{"line_number":1284,"context_line":"                h.lower(): v"},{"line_number":1285,"context_line":"                for h, v in self.headers.items()"},{"line_number":1286,"context_line":"                if h.lower().startswith(\u0027x-amz-checksum-\u0027)"},{"line_number":1287,"context_line":"                and h.lower() !\u003d \u0027x-amz-checksum-algorithm\u0027}"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"            if not checksum_headers:"},{"line_number":1290,"context_line":"                checksum_headers \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"9fa74619_0831967a","line":1287,"range":{"start_line":1287,"start_character":33,"end_line":1287,"end_character":59},"updated":"2025-01-22 14:45:52.000000000","message":"is this an expected header? has it been confused with ``x-amz-sdk-checksum-algorithm``?","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"                h.lower(): v"},{"line_number":1285,"context_line":"                for h, v in self.headers.items()"},{"line_number":1286,"context_line":"                if h.lower().startswith(\u0027x-amz-checksum-\u0027)"},{"line_number":1287,"context_line":"                and h.lower() !\u003d \u0027x-amz-checksum-algorithm\u0027}"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"            if not checksum_headers:"},{"line_number":1290,"context_line":"                checksum_headers \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"a0bf04bd_982d4a33","line":1287,"range":{"start_line":1287,"start_character":33,"end_line":1287,"end_character":59},"in_reply_to":"4f03a20f_9932cdd4","updated":"2025-02-13 01:04:12.000000000","message":"Moot since we rearranged the patch order.","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3d69d6254c2408da05e59820c0b7487724f9fe45","unresolved":true,"context_lines":[{"line_number":1284,"context_line":"                h.lower(): v"},{"line_number":1285,"context_line":"                for h, v in self.headers.items()"},{"line_number":1286,"context_line":"                if h.lower().startswith(\u0027x-amz-checksum-\u0027)"},{"line_number":1287,"context_line":"                and h.lower() !\u003d \u0027x-amz-checksum-algorithm\u0027}"},{"line_number":1288,"context_line":""},{"line_number":1289,"context_line":"            if not checksum_headers:"},{"line_number":1290,"context_line":"                checksum_headers \u003d {"}],"source_content_type":"text/x-python","patch_set":40,"id":"4f03a20f_9932cdd4","line":1287,"range":{"start_line":1287,"start_character":33,"end_line":1287,"end_character":59},"in_reply_to":"9fa74619_0831967a","updated":"2025-02-03 14:44:18.000000000","message":"I think `x-amz-sdk-checksum-algorithm` is a valid header and is used in S3 to specify the checksum algorithm which is to verify data integrity during uploads/copy. This means CRC32, CRC32C, SHA-1 and SHA-256 and now CRC64NVME","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c9aca47854cd36abbbe5717fedf4587d8de61b61","unresolved":true,"context_lines":[{"line_number":1327,"context_line":"                    \u0027swift.callback.update_footers\u0027)"},{"line_number":1328,"context_line":"                override_hdr \u003d (\u0027x-object-sysmeta-container-update-\u0027"},{"line_number":1329,"context_line":"                                \u0027override-etag\u0027)"},{"line_number":1330,"context_line":"                storage_hdr \u003d sysmeta_header(\u0027object\u0027, \u0027checksum-\u0027 + algo)"},{"line_number":1331,"context_line":"                if \u0027etag\u0027 not in self.headers and \\"},{"line_number":1332,"context_line":"                        override_hdr not in self.headers:"},{"line_number":1333,"context_line":"                    # We need to track MD5 ourself, in case no one else will"}],"source_content_type":"text/x-python","patch_set":40,"id":"5307959b_f2eaf96f","line":1330,"updated":"2025-01-22 14:45:52.000000000","message":"this should be defined once before line 1319 where it is also used","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":1327,"context_line":"                    \u0027swift.callback.update_footers\u0027)"},{"line_number":1328,"context_line":"                override_hdr \u003d (\u0027x-object-sysmeta-container-update-\u0027"},{"line_number":1329,"context_line":"                                \u0027override-etag\u0027)"},{"line_number":1330,"context_line":"                storage_hdr \u003d sysmeta_header(\u0027object\u0027, \u0027checksum-\u0027 + algo)"},{"line_number":1331,"context_line":"                if \u0027etag\u0027 not in self.headers and \\"},{"line_number":1332,"context_line":"                        override_hdr not in self.headers:"},{"line_number":1333,"context_line":"                    # We need to track MD5 ourself, in case no one else will"}],"source_content_type":"text/x-python","patch_set":40,"id":"69a42112_bbf048c4","line":1330,"in_reply_to":"5307959b_f2eaf96f","updated":"2025-02-14 17:04:50.000000000","message":"Acknowledged","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"95c38e9075c7e49d32ef719d60149dbaf9496dcf","unresolved":true,"context_lines":[{"line_number":1665,"context_line":"                enc for enc in list_from_csv(env.pop(\u0027HTTP_CONTENT_ENCODING\u0027))"},{"line_number":1666,"context_line":"                # TODO: test what\u0027s stored w/ \u0027aws-chunked, aws-chunked\u0027"},{"line_number":1667,"context_line":"                if enc !\u003d \u0027aws-chunked\u0027)"},{"line_number":1668,"context_line":"            if new_enc:"},{"line_number":1669,"context_line":"                # used to be, AWS would store \u0027\u0027, but not any more"},{"line_number":1670,"context_line":"                env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d new_enc"},{"line_number":1671,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"5fa318bf_1d7cb172","line":1668,"updated":"2024-12-02 22:57:27.000000000","message":"This change has broken a number s3 compatible tests:\n```\ntest/s3api/test_input_errors.py:1555 (TestV4AuthHeaders.test_no_md5_streaming_unsigned)\nself \u003d \u003ctest.s3api.test_input_errors.TestV4AuthHeaders testMethod\u003dtest_no_md5_streaming_unsigned\u003e\n\n    def test_no_md5_streaming_unsigned(self):\n        chunked_body \u003d b\u0027\u0027.join(\n            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)\n            for chunk in [TEST_BODY, b\u0027\u0027])\n        resp \u003d self.conn.make_request(\n            self.bucket_name,\n            \u0027test-obj\u0027,\n            method\u003d\u0027PUT\u0027,\n            body\u003dchunked_body,\n            headers\u003d{\n                \u0027x-amz-content-sha256\u0027: \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,\n                \u0027content-encoding\u0027: \u0027aws-chunked\u0027,\n                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY))})\n        self.assertOK(resp)\n    \n        resp \u003d self.conn.make_request(\n            self.bucket_name,\n            \u0027test-obj\u0027,\n            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})\n        self.assertOK(resp, TEST_BODY)\n\u003e       self.assertNotIn(\u0027Content-Encoding\u0027, resp.headers)\nE       AssertionError: \u0027Content-Encoding\u0027 unexpectedly found in {\u0027Content-Type\u0027: \u0027binary/octet-stream\u0027, \u0027Content-Encoding\u0027: \u0027\u0027, \u0027ETag\u0027: \u0027\"d8c44912ef78ea60b3f6224c80335840\"\u0027, \u0027Last-Modified\u0027: \u0027Mon, 25 Nov 2024 21:57:45 GMT\u0027, \u0027Accept-Ranges\u0027: \u0027bytes\u0027, \u0027Content-Length\u0027: \u002732\u0027, \u0027x-amz-id-2\u0027: \u0027tx89859f5e78384ef6b731c-006744f2d8\u0027, \u0027x-amz-request-id\u0027: \u0027tx89859f5e78384ef6b731c-006744f2d8\u0027, \u0027X-Trans-Id\u0027: \u0027tx89859f5e78384ef6b731c-006744f2d8\u0027, \u0027X-Openstack-Request-Id\u0027: \u0027tx89859f5e78384ef6b731c-006744f2d8\u0027, \u0027Date\u0027: \u0027Mon, 25 Nov 2024 21:57:44 GMT\u0027, \u0027Connection\u0027: \u0027keep-alive\u0027}\n\ntest_input_errors.py:1576: AssertionError\n```\n\nother tests around the same changes are `test_get_object_x_amz_copy_src_header` and `test_no_md5_streaming_unsigned_no_trailing_crlf`\n\nThis is unconfirmed","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3d12638d1815d137225ef3120158edcbba6f697a","unresolved":false,"context_lines":[{"line_number":1665,"context_line":"                enc for enc in list_from_csv(env.pop(\u0027HTTP_CONTENT_ENCODING\u0027))"},{"line_number":1666,"context_line":"                # TODO: test what\u0027s stored w/ \u0027aws-chunked, aws-chunked\u0027"},{"line_number":1667,"context_line":"                if enc !\u003d \u0027aws-chunked\u0027)"},{"line_number":1668,"context_line":"            if new_enc:"},{"line_number":1669,"context_line":"                # used to be, AWS would store \u0027\u0027, but not any more"},{"line_number":1670,"context_line":"                env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d new_enc"},{"line_number":1671,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"34698b0b_98884948","line":1668,"in_reply_to":"5fa318bf_1d7cb172","updated":"2025-02-10 22:41:42.000000000","message":"Should be fixed up now; AWS changed the expectations on us.","commit_id":"cb97e987a523ab7fb6ff09566f940f4f2e3f6be3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":164,"context_line":"        self._to_read -\u003d len(chunk)"},{"line_number":165,"context_line":"        short_read \u003d bool(chunk) if size is None else (len(chunk) \u003c size)"},{"line_number":166,"context_line":"        if self._to_read \u003c 0 or (short_read and self._to_read) or ("},{"line_number":167,"context_line":"                self._to_read \u003d\u003d 0 and self._expected and"},{"line_number":168,"context_line":"                self._hasher.hexdigest() !\u003d self._expected.lower()):"},{"line_number":169,"context_line":"            self.close()"},{"line_number":170,"context_line":"            # Since we don\u0027t return the last chunk, the PUT never completes"}],"source_content_type":"text/x-python","patch_set":43,"id":"7e02348c_c759f6a7","line":167,"range":{"start_line":167,"start_character":35,"end_line":167,"end_character":53},"updated":"2025-01-30 20:00:09.000000000","message":"This smells weird -- I don\u0027t entirely remember why I did it. Maybe it was that we may have read *exactly* the last bytes of the payload, but not the trailer yet? Or the trailer didn\u0027t actually contain the headers it said it would?","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        self._to_read -\u003d len(chunk)"},{"line_number":165,"context_line":"        short_read \u003d bool(chunk) if size is None else (len(chunk) \u003c size)"},{"line_number":166,"context_line":"        if self._to_read \u003c 0 or (short_read and self._to_read) or ("},{"line_number":167,"context_line":"                self._to_read \u003d\u003d 0 and self._expected and"},{"line_number":168,"context_line":"                self._hasher.hexdigest() !\u003d self._expected.lower()):"},{"line_number":169,"context_line":"            self.close()"},{"line_number":170,"context_line":"            # Since we don\u0027t return the last chunk, the PUT never completes"}],"source_content_type":"text/x-python","patch_set":43,"id":"34db72e8_4a7ec526","line":167,"range":{"start_line":167,"start_character":35,"end_line":167,"end_character":53},"in_reply_to":"7e02348c_c759f6a7","updated":"2025-02-13 01:04:12.000000000","message":"I think I was worried at one point that you might need to be able to handle `x-amz-content-sha256` being sent as a trailer (in which case we\u0027d need to wrap the `StreamingInput` with a `HashingInput`), but that\u0027s not actually supported by AWS:\n```\nThe value specified in the x-amz-trailer header is not supported\n```","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":221,"context_line":"            if chunk_size \u003c 0:"},{"line_number":222,"context_line":"                raise ValueError"},{"line_number":223,"context_line":"            if chunk_size \u003e 16 * 1024 * 1024:"},{"line_number":224,"context_line":"                # TODO: find out what AWS\u0027s limit is -- surely there is"},{"line_number":225,"context_line":"                # one, and it\u0027s probably lower than the 5GiB limit per"},{"line_number":226,"context_line":"                # single object/part upload"},{"line_number":227,"context_line":"                raise ValueError"}],"source_content_type":"text/x-python","patch_set":43,"id":"59d1928b_3e9ecf7f","line":224,"range":{"start_line":224,"start_character":18,"end_line":224,"end_character":52},"updated":"2025-01-30 20:00:09.000000000","message":"It\u0027s higher than this, maybe even unlimited? I\u0027ve seen it upload with chunks like [5GiB, 0] -- but SSL failures make it difficult to find out what the error message might be if I try to go higher.","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":221,"context_line":"            if chunk_size \u003c 0:"},{"line_number":222,"context_line":"                raise ValueError"},{"line_number":223,"context_line":"            if chunk_size \u003e 16 * 1024 * 1024:"},{"line_number":224,"context_line":"                # TODO: find out what AWS\u0027s limit is -- surely there is"},{"line_number":225,"context_line":"                # one, and it\u0027s probably lower than the 5GiB limit per"},{"line_number":226,"context_line":"                # single object/part upload"},{"line_number":227,"context_line":"                raise ValueError"}],"source_content_type":"text/x-python","patch_set":43,"id":"2561f2c5_b78b4b54","line":224,"range":{"start_line":224,"start_character":18,"end_line":224,"end_character":52},"in_reply_to":"59d1928b_3e9ecf7f","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":222,"context_line":"                raise ValueError"},{"line_number":223,"context_line":"            if chunk_size \u003e 16 * 1024 * 1024:"},{"line_number":224,"context_line":"                # TODO: find out what AWS\u0027s limit is -- surely there is"},{"line_number":225,"context_line":"                # one, and it\u0027s probably lower than the 5GiB limit per"},{"line_number":226,"context_line":"                # single object/part upload"},{"line_number":227,"context_line":"                raise ValueError"},{"line_number":228,"context_line":"            # TODO: Validate every chunk is at least 8k except"}],"source_content_type":"text/x-python","patch_set":43,"id":"c2b70b05_652ad073","line":225,"range":{"start_line":225,"start_character":41,"end_line":225,"end_character":66},"updated":"2025-01-30 20:00:09.000000000","message":"lolz -- trying to send 5GiB I often see\n```\nrequests.exceptions.SSLError: HTTPSConnectionPool(host\u003d\u0027s3.amazonaws.com\u0027, port\u003d443): Max retries exceeded with url: /s3api-test-test-bucket-9d2e2d9c3a9b4ac2947a98bce13a067e/test-obj (Caused by SSLError(SSLEOFError(8, \u0027EOF occurred in violation of protocol (_ssl.c:2406)\u0027)))\n```","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                raise ValueError"},{"line_number":223,"context_line":"            if chunk_size \u003e 16 * 1024 * 1024:"},{"line_number":224,"context_line":"                # TODO: find out what AWS\u0027s limit is -- surely there is"},{"line_number":225,"context_line":"                # one, and it\u0027s probably lower than the 5GiB limit per"},{"line_number":226,"context_line":"                # single object/part upload"},{"line_number":227,"context_line":"                raise ValueError"},{"line_number":228,"context_line":"            # TODO: Validate every chunk is at least 8k except"}],"source_content_type":"text/x-python","patch_set":43,"id":"194f387b_f6a97687","line":225,"range":{"start_line":225,"start_character":41,"end_line":225,"end_character":66},"in_reply_to":"c2b70b05_652ad073","updated":"2025-02-05 20:26:54.000000000","message":"Acknowledged","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":250,"context_line":"            and not self._complete_payload"},{"line_number":251,"context_line":"        ):"},{"line_number":252,"context_line":"            chunk_size, chunk_params \u003d self.read_chunk_header()"},{"line_number":253,"context_line":"            chunk \u003d self._input.read(chunk_size)"},{"line_number":254,"context_line":"            self._raw_to_read -\u003d len(chunk)"},{"line_number":255,"context_line":"            if len(chunk) !\u003d chunk_size:"},{"line_number":256,"context_line":"                self.close()"}],"source_content_type":"text/x-python","patch_set":43,"id":"d43ebbaf_1003788b","line":253,"range":{"start_line":253,"start_character":31,"end_line":253,"end_character":48},"updated":"2025-01-30 20:00:09.000000000","message":"While 5GiB won\u0027t work against AWS, I\u0027ve seen 3GiB chunks work -- which means\n\n1. we can\u0027t buffer a whole chunk all the time and therefor\n2. we have to be willing to send unverified bytes down to the backend and trust that the verification *will* happen later (with things blowing up when it fails in such a way that nothing persists).","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":250,"context_line":"            and not self._complete_payload"},{"line_number":251,"context_line":"        ):"},{"line_number":252,"context_line":"            chunk_size, chunk_params \u003d self.read_chunk_header()"},{"line_number":253,"context_line":"            chunk \u003d self._input.read(chunk_size)"},{"line_number":254,"context_line":"            self._raw_to_read -\u003d len(chunk)"},{"line_number":255,"context_line":"            if len(chunk) !\u003d chunk_size:"},{"line_number":256,"context_line":"                self.close()"}],"source_content_type":"text/x-python","patch_set":43,"id":"75c4053e_b66bc8cb","line":253,"range":{"start_line":253,"start_character":31,"end_line":253,"end_character":48},"in_reply_to":"d43ebbaf_1003788b","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":1755,"context_line":""},{"line_number":1756,"context_line":"        return code_map[method]"},{"line_number":1757,"context_line":""},{"line_number":1758,"context_line":"    def _handle_chunk_upload_error(self, err_msg):"},{"line_number":1759,"context_line":"        split_err \u003d err_msg.split(\u0027\\n\u0027, 1)"},{"line_number":1760,"context_line":"        error_type, args \u003d split_err[0], split_err[1:]"},{"line_number":1761,"context_line":"        kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":43,"id":"8c82b66b_6879e66c","line":1758,"updated":"2025-01-30 20:00:09.000000000","message":"Yeah, I don\u0027t much care for *any* of this.","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3d69d6254c2408da05e59820c0b7487724f9fe45","unresolved":false,"context_lines":[{"line_number":1755,"context_line":""},{"line_number":1756,"context_line":"        return code_map[method]"},{"line_number":1757,"context_line":""},{"line_number":1758,"context_line":"    def _handle_chunk_upload_error(self, err_msg):"},{"line_number":1759,"context_line":"        split_err \u003d err_msg.split(\u0027\\n\u0027, 1)"},{"line_number":1760,"context_line":"        error_type, args \u003d split_err[0], split_err[1:]"},{"line_number":1761,"context_line":"        kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":43,"id":"5177924b_c47f71ac","line":1758,"in_reply_to":"8c82b66b_6879e66c","updated":"2025-02-03 14:44:18.000000000","message":"Acknowledged","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":1803,"context_line":"            )"},{"line_number":1804,"context_line":"        except S3InputChunkSignatureMismatch:"},{"line_number":1805,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1806,"context_line":"            # XXX: this seems unlikely to be right"},{"line_number":1807,"context_line":"            raise swob.HTTPForbidden("},{"line_number":1808,"context_line":"                body\u003dSIGV4_ERROR_SIGNATURE_DOES_NOT_MATCH)"},{"line_number":1809,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"}],"source_content_type":"text/x-python","patch_set":43,"id":"da28eb67_653ad432","line":1806,"updated":"2025-01-30 20:00:09.000000000","message":"It\u0027s not; doing this will 500.","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":1803,"context_line":"            )"},{"line_number":1804,"context_line":"        except S3InputChunkSignatureMismatch:"},{"line_number":1805,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1806,"context_line":"            # XXX: this seems unlikely to be right"},{"line_number":1807,"context_line":"            raise swob.HTTPForbidden("},{"line_number":1808,"context_line":"                body\u003dSIGV4_ERROR_SIGNATURE_DOES_NOT_MATCH)"},{"line_number":1809,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"}],"source_content_type":"text/x-python","patch_set":43,"id":"bf46ccba_c84b7f51","line":1806,"in_reply_to":"da28eb67_653ad432","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"609e0a2864d76254e7e2b2190b664a04cc8d85fa","unresolved":true,"context_lines":[{"line_number":1814,"context_line":"                number_bytes_provided\u003de.args[2],"},{"line_number":1815,"context_line":"            )"},{"line_number":1816,"context_line":"        except S3InputError:"},{"line_number":1817,"context_line":"            # XXX: this seems unlikely to be right"},{"line_number":1818,"context_line":"            raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":1819,"context_line":"        else:"},{"line_number":1820,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":43,"id":"fa1ca34a_be138bb9","line":1817,"updated":"2025-01-30 20:00:09.000000000","message":"... so presumably this would, too.","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1814,"context_line":"                number_bytes_provided\u003de.args[2],"},{"line_number":1815,"context_line":"            )"},{"line_number":1816,"context_line":"        except S3InputError:"},{"line_number":1817,"context_line":"            # XXX: this seems unlikely to be right"},{"line_number":1818,"context_line":"            raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":1819,"context_line":"        else:"},{"line_number":1820,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":43,"id":"42055770_26ccd533","line":1817,"in_reply_to":"471d0f1a_9c161881","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3d69d6254c2408da05e59820c0b7487724f9fe45","unresolved":true,"context_lines":[{"line_number":1814,"context_line":"                number_bytes_provided\u003de.args[2],"},{"line_number":1815,"context_line":"            )"},{"line_number":1816,"context_line":"        except S3InputError:"},{"line_number":1817,"context_line":"            # XXX: this seems unlikely to be right"},{"line_number":1818,"context_line":"            raise swob.HTTPForbidden(msg\u003dSIGV4_ERROR_INCOMPLETE_BODY)"},{"line_number":1819,"context_line":"        else:"},{"line_number":1820,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":43,"id":"471d0f1a_9c161881","line":1817,"in_reply_to":"fa1ca34a_be138bb9","updated":"2025-02-03 14:44:18.000000000","message":"Yes!","commit_id":"f696c6a6988d4534b23c331b5bbabadde717d2bb"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"43bda1845c17bcfdb0cbc9ff7631c6c9d89f1628","unresolved":true,"context_lines":[{"line_number":317,"context_line":"            buf.append(self._chunk_reader.read(size))"},{"line_number":318,"context_line":"            if self._chunk_reader.complete:"},{"line_number":319,"context_line":"                if self._chunk_reader.final_chunk:"},{"line_number":320,"context_line":"                    self._complete_payload \u003d True"},{"line_number":321,"context_line":"                else:"},{"line_number":322,"context_line":"                    self._raw_to_read -\u003d 2"},{"line_number":323,"context_line":"                self._chunk_reader \u003d None"}],"source_content_type":"text/x-python","patch_set":49,"id":"9ebf2563_72296934","line":320,"updated":"2025-02-07 06:07:48.000000000","message":"OK so we don\u0027t have to read off the `\\r\\n` here because in this case it happens, if i needs too, down in the trailer reading code below. phew, I think I get it.\nDoes take some understanding of the expected chunked output... not sure I can think of anything cleaner tho.\n\nOh but with the final being the chunked size of 0, this either means it would send:\n\n```\n0;chunk-signature\u003d\" + signature + \\r\\n + \u0027\u0027 + \\r\\n\n```\nor\n```\n0;chunk-signature\u003d\" + signature + \\r\\n\n```\n\nIn the example it seems to be the latter. But I guess that\u0027s why down on line 351 you have\n\n```\nelif self._input.read(2) not in (b\u0027\u0027, b\u0027\\r\\n\u0027):\n```\n\nThis does make this code a little more annoying to write. So yeah I think you did a good job.","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":317,"context_line":"            buf.append(self._chunk_reader.read(size))"},{"line_number":318,"context_line":"            if self._chunk_reader.complete:"},{"line_number":319,"context_line":"                if self._chunk_reader.final_chunk:"},{"line_number":320,"context_line":"                    self._complete_payload \u003d True"},{"line_number":321,"context_line":"                else:"},{"line_number":322,"context_line":"                    self._raw_to_read -\u003d 2"},{"line_number":323,"context_line":"                self._chunk_reader \u003d None"}],"source_content_type":"text/x-python","patch_set":49,"id":"2fd0c108_ad839de1","line":320,"in_reply_to":"0928035a_cba3d086","updated":"2025-02-26 18:24:09.000000000","message":"Acknowledged","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a0dfeb1aada36ea5128d8733eedede238aa27c95","unresolved":true,"context_lines":[{"line_number":317,"context_line":"            buf.append(self._chunk_reader.read(size))"},{"line_number":318,"context_line":"            if self._chunk_reader.complete:"},{"line_number":319,"context_line":"                if self._chunk_reader.final_chunk:"},{"line_number":320,"context_line":"                    self._complete_payload \u003d True"},{"line_number":321,"context_line":"                else:"},{"line_number":322,"context_line":"                    self._raw_to_read -\u003d 2"},{"line_number":323,"context_line":"                self._chunk_reader \u003d None"}],"source_content_type":"text/x-python","patch_set":49,"id":"0928035a_cba3d086","line":320,"in_reply_to":"9ebf2563_72296934","updated":"2025-02-07 16:51:17.000000000","message":"Those cross-compat tests really helped me check the corners of the protocol -- going from `test_no_md5_streaming_unsigned` to `test_no_md5_streaming_unsigned_no_trailing_lf` to `test_no_md5_streaming_unsigned_no_trailing_crlf` was a wild ride.","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"f62f54216d84c2543e744a573b8921addd67968c","unresolved":true,"context_lines":[{"line_number":319,"context_line":"                if self._chunk_reader.final_chunk:"},{"line_number":320,"context_line":"                    self._complete_payload \u003d True"},{"line_number":321,"context_line":"                else:"},{"line_number":322,"context_line":"                    self._raw_to_read -\u003d 2"},{"line_number":323,"context_line":"                self._chunk_reader \u003d None"},{"line_number":324,"context_line":"            self._raw_to_read -\u003d len(buf[-1])"},{"line_number":325,"context_line":"            self._to_read -\u003d len(buf[-1])"}],"source_content_type":"text/x-python","patch_set":49,"id":"8338bca3_dad1a821","line":322,"range":{"start_line":322,"start_character":41,"end_line":322,"end_character":42},"updated":"2025-02-06 09:54:28.000000000","message":"So what is this, the \\r\\n at the end of the chunked payload?","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a0dfeb1aada36ea5128d8733eedede238aa27c95","unresolved":true,"context_lines":[{"line_number":319,"context_line":"                if self._chunk_reader.final_chunk:"},{"line_number":320,"context_line":"                    self._complete_payload \u003d True"},{"line_number":321,"context_line":"                else:"},{"line_number":322,"context_line":"                    self._raw_to_read -\u003d 2"},{"line_number":323,"context_line":"                self._chunk_reader \u003d None"},{"line_number":324,"context_line":"            self._raw_to_read -\u003d len(buf[-1])"},{"line_number":325,"context_line":"            self._to_read -\u003d len(buf[-1])"}],"source_content_type":"text/x-python","patch_set":49,"id":"cb8df62e_8e84c1f0","line":322,"range":{"start_line":322,"start_character":41,"end_line":322,"end_character":42},"in_reply_to":"8338bca3_dad1a821","updated":"2025-02-07 16:51:17.000000000","message":"Yup; it\u0027s accounting for L206.\n\nThough come to think of it, I\u0027m not sure I need to track `self._raw_to_read` any more -- which is good, because somewhere along the line I stopped setting it to `raw_content_length` (which is now unused).","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6e83b55837a69866b08ef2cb94b70a0c02016f38","unresolved":false,"context_lines":[{"line_number":319,"context_line":"                if self._chunk_reader.final_chunk:"},{"line_number":320,"context_line":"                    self._complete_payload \u003d True"},{"line_number":321,"context_line":"                else:"},{"line_number":322,"context_line":"                    self._raw_to_read -\u003d 2"},{"line_number":323,"context_line":"                self._chunk_reader \u003d None"},{"line_number":324,"context_line":"            self._raw_to_read -\u003d len(buf[-1])"},{"line_number":325,"context_line":"            self._to_read -\u003d len(buf[-1])"}],"source_content_type":"text/x-python","patch_set":49,"id":"060bc872_5152326a","line":322,"range":{"start_line":322,"start_character":41,"end_line":322,"end_character":42},"in_reply_to":"cb8df62e_8e84c1f0","updated":"2025-02-07 18:32:40.000000000","message":"Done","commit_id":"cf278059909f3bc56712eaf662d793cbe6650965"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":911,"context_line":""},{"line_number":912,"context_line":"        # https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html"},{"line_number":913,"context_line":"        # describes some of what would be required to support this"},{"line_number":914,"context_line":"        if any([\u0027aws-chunked\u0027 in self.headers.get(\u0027content-encoding\u0027, \u0027\u0027),"},{"line_number":915,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027 \u003d\u003d self.headers.get("},{"line_number":916,"context_line":"                    \u0027x-amz-content-sha256\u0027, \u0027\u0027),"},{"line_number":917,"context_line":"                \u0027x-amz-decoded-content-length\u0027 in self.headers]):"}],"source_content_type":"text/x-python","patch_set":50,"id":"cf8caa0a_832ed956","side":"PARENT","line":914,"range":{"start_line":914,"start_character":16,"end_line":914,"end_character":73},"updated":"2025-02-12 18:58:38.000000000","message":"so are we now going to just ignore this if it is sent with a v2 request, or a non-streaming v4 request? in fact, we don\u0027t seem to check either way any more","commit_id":"0dfa38d025bcb254849e8061af05e6214b5fdacf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":911,"context_line":""},{"line_number":912,"context_line":"        # https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html"},{"line_number":913,"context_line":"        # describes some of what would be required to support this"},{"line_number":914,"context_line":"        if any([\u0027aws-chunked\u0027 in self.headers.get(\u0027content-encoding\u0027, \u0027\u0027),"},{"line_number":915,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027 \u003d\u003d self.headers.get("},{"line_number":916,"context_line":"                    \u0027x-amz-content-sha256\u0027, \u0027\u0027),"},{"line_number":917,"context_line":"                \u0027x-amz-decoded-content-length\u0027 in self.headers]):"}],"source_content_type":"text/x-python","patch_set":50,"id":"92108862_fe1ac0bb","side":"PARENT","line":914,"range":{"start_line":914,"start_character":16,"end_line":914,"end_character":73},"in_reply_to":"cf8caa0a_832ed956","updated":"2025-02-26 18:24:09.000000000","message":"We\u0027re going to *store it* -- see `test_no_md5_good_sha_chunk_encoding_declared_ok`","commit_id":"0dfa38d025bcb254849e8061af05e6214b5fdacf"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":176,"context_line":"        close_if_possible(self._input)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"class ChunkReader:"},{"line_number":180,"context_line":"    def __init__(self, reader, chunk_length, validator, chunk_signature):"},{"line_number":181,"context_line":"        self._input \u003d reader"},{"line_number":182,"context_line":"        self._to_read \u003d chunk_length"}],"source_content_type":"text/x-python","patch_set":50,"id":"c565765a_04965a6d","line":179,"updated":"2025-02-12 18:58:38.000000000","message":"class should inherit from object","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        close_if_possible(self._input)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"class ChunkReader:"},{"line_number":180,"context_line":"    def __init__(self, reader, chunk_length, validator, chunk_signature):"},{"line_number":181,"context_line":"        self._input \u003d reader"},{"line_number":182,"context_line":"        self._to_read \u003d chunk_length"}],"source_content_type":"text/x-python","patch_set":50,"id":"de29d66b_9230beaf","line":179,"in_reply_to":"987ad917_d2b07490","updated":"2025-02-14 17:04:50.000000000","message":"TIL !","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":176,"context_line":"        close_if_possible(self._input)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"class ChunkReader:"},{"line_number":180,"context_line":"    def __init__(self, reader, chunk_length, validator, chunk_signature):"},{"line_number":181,"context_line":"        self._input \u003d reader"},{"line_number":182,"context_line":"        self._to_read \u003d chunk_length"}],"source_content_type":"text/x-python","patch_set":50,"id":"987ad917_d2b07490","line":179,"in_reply_to":"c565765a_04965a6d","updated":"2025-02-13 01:04:12.000000000","message":"Not needed any more!\n```\n\u003e\u003e\u003e class A:\n...     pass\n... \n\u003e\u003e\u003e A.__mro__\n(\u003cclass \u0027__main__.A\u0027\u003e, \u003cclass \u0027object\u0027\u003e)\n\u003e\u003e\u003e isinstance(A(), object)\nTrue\n```\nSomewhere in the long-tail of \"clean up scars from py2\", there\u0027s \"remove unnecessary inheritance from `object`\", but I don\u0027t have any feel for how to prioritize that vs \"simplify `super()` calls\", \"use sub-tests\", \"get rid of `mock`\", etc.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":183,"context_line":"        self._validator \u003d validator"},{"line_number":184,"context_line":"        self._signature \u003d chunk_signature"},{"line_number":185,"context_line":"        self._sha256 \u003d sha256()"},{"line_number":186,"context_line":"        self.final_chunk \u003d self.complete"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    @property"},{"line_number":189,"context_line":"    def complete(self):"}],"source_content_type":"text/x-python","patch_set":50,"id":"def15f51_b0bec390","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":40},"updated":"2025-02-12 18:58:38.000000000","message":"IIUC this is a round-about way of determining that chunk_length \u003d\u003d 0 - took me a moment to spot that complete is a property! Could we just store chunk_length and then compare to zero at line 205?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        self._validator \u003d validator"},{"line_number":184,"context_line":"        self._signature \u003d chunk_signature"},{"line_number":185,"context_line":"        self._sha256 \u003d sha256()"},{"line_number":186,"context_line":"        self.final_chunk \u003d self.complete"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    @property"},{"line_number":189,"context_line":"    def complete(self):"}],"source_content_type":"text/x-python","patch_set":50,"id":"818d805a_b9aeace8","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":40},"in_reply_to":"def15f51_b0bec390","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":251,"context_line":"        if chunk_header[-2:] !\u003d \u0027\\r\\n\u0027:"},{"line_number":252,"context_line":"            self.close()"},{"line_number":253,"context_line":"            raise S3InputIncomplete(\u0027invalid chunk header: %s\u0027 % chunk_header)"},{"line_number":254,"context_line":"        chunk_size, _, chunk_params \u003d chunk_header[:-2].partition(\u0027;\u0027)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        try:"},{"line_number":257,"context_line":"            chunk_size \u003d int(chunk_size, 16)"}],"source_content_type":"text/x-python","patch_set":50,"id":"030be23c_55252b4c","line":254,"updated":"2025-02-12 18:58:38.000000000","message":"I found myself wondering where the boundary was between the responsibilities of ChunkReader vs StreamingInput e.g. should ChunkReader take care of parsing the chunk header.\n\nMaybe scope for some more refactoring.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":251,"context_line":"        if chunk_header[-2:] !\u003d \u0027\\r\\n\u0027:"},{"line_number":252,"context_line":"            self.close()"},{"line_number":253,"context_line":"            raise S3InputIncomplete(\u0027invalid chunk header: %s\u0027 % chunk_header)"},{"line_number":254,"context_line":"        chunk_size, _, chunk_params \u003d chunk_header[:-2].partition(\u0027;\u0027)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        try:"},{"line_number":257,"context_line":"            chunk_size \u003d int(chunk_size, 16)"}],"source_content_type":"text/x-python","patch_set":50,"id":"754316bb_65ad790b","line":254,"in_reply_to":"030be23c_55252b4c","updated":"2025-02-13 01:04:12.000000000","message":"FWIW, it all used to be in `read` -- with a couple `while True:`s, no less! There\u0027s probably a case for more refactoring, but it\u0027s better than it was. We can always make it better on master.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        if chunk_header[-2:] !\u003d \u0027\\r\\n\u0027:"},{"line_number":252,"context_line":"            self.close()"},{"line_number":253,"context_line":"            raise S3InputIncomplete(\u0027invalid chunk header: %s\u0027 % chunk_header)"},{"line_number":254,"context_line":"        chunk_size, _, chunk_params \u003d chunk_header[:-2].partition(\u0027;\u0027)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        try:"},{"line_number":257,"context_line":"            chunk_size \u003d int(chunk_size, 16)"}],"source_content_type":"text/x-python","patch_set":50,"id":"e34d5918_aca9da70","line":254,"in_reply_to":"754316bb_65ad790b","updated":"2025-02-26 18:24:09.000000000","message":"Acknowledged","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":303,"context_line":"                    if start.strip() !\u003d \u0027chunk-signature\u0027:"},{"line_number":304,"context_line":"                        # Call the validator to update the string to sign"},{"line_number":305,"context_line":"                        self._validator(\u0027\u0027, \u0027\u0027)"},{"line_number":306,"context_line":"                        raise S3InputChunkSignatureMismatch"},{"line_number":307,"context_line":"                    if \u0027;\u0027 in chunk_sig:"},{"line_number":308,"context_line":"                        raise S3InputIncomplete"},{"line_number":309,"context_line":"                    chunk_sig \u003d chunk_sig.strip()"}],"source_content_type":"text/x-python","patch_set":50,"id":"1d7c4f54_43471163","line":306,"updated":"2025-02-12 18:58:38.000000000","message":"it\u0027s a little frustrating that there\u0027s some validation happening here and some in ChunkReader - would be nice if there was one place that interacted with the validator","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3baf06d82ea8891fb4d5cc61f646bb4c5ea3e91b","unresolved":true,"context_lines":[{"line_number":303,"context_line":"                    if start.strip() !\u003d \u0027chunk-signature\u0027:"},{"line_number":304,"context_line":"                        # Call the validator to update the string to sign"},{"line_number":305,"context_line":"                        self._validator(\u0027\u0027, \u0027\u0027)"},{"line_number":306,"context_line":"                        raise S3InputChunkSignatureMismatch"},{"line_number":307,"context_line":"                    if \u0027;\u0027 in chunk_sig:"},{"line_number":308,"context_line":"                        raise S3InputIncomplete"},{"line_number":309,"context_line":"                    chunk_sig \u003d chunk_sig.strip()"}],"source_content_type":"text/x-python","patch_set":50,"id":"45bc20ad_cb62f0e8","line":306,"in_reply_to":"1d7c4f54_43471163","updated":"2025-05-12 15:30:59.000000000","message":"see 949517: S3Request: move more chunk validation into ChunkReader | https://review.opendev.org/c/openstack/swift/+/949517","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f5609d33378e0af16eb2ad741eff6ea848931dc","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                    if start.strip() !\u003d \u0027chunk-signature\u0027:"},{"line_number":304,"context_line":"                        # Call the validator to update the string to sign"},{"line_number":305,"context_line":"                        self._validator(\u0027\u0027, \u0027\u0027)"},{"line_number":306,"context_line":"                        raise S3InputChunkSignatureMismatch"},{"line_number":307,"context_line":"                    if \u0027;\u0027 in chunk_sig:"},{"line_number":308,"context_line":"                        raise S3InputIncomplete"},{"line_number":309,"context_line":"                    chunk_sig \u003d chunk_sig.strip()"}],"source_content_type":"text/x-python","patch_set":50,"id":"bd29f097_d51209b7","line":306,"in_reply_to":"45bc20ad_cb62f0e8","updated":"2025-05-13 19:44:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3d12638d1815d137225ef3120158edcbba6f697a","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                    \u0027unexpected terminating zero-byte chunk\u0027,"},{"line_number":326,"context_line":"                    self._original_to_read,"},{"line_number":327,"context_line":"                    self._original_to_read - self._to_read)"},{"line_number":328,"context_line":"            # read trailers, if present"},{"line_number":329,"context_line":"            if not self._read_trailers:"},{"line_number":330,"context_line":"                if self._expected_trailers:"},{"line_number":331,"context_line":"                    for line in iter(self._input.readline, b\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":50,"id":"79b47cb1_3c2bf0b5","line":328,"updated":"2025-02-10 22:41:42.000000000","message":"FWIW, I\u0027m vaguely tempted to try moving this into `ChunkReader`","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                    \u0027unexpected terminating zero-byte chunk\u0027,"},{"line_number":326,"context_line":"                    self._original_to_read,"},{"line_number":327,"context_line":"                    self._original_to_read - self._to_read)"},{"line_number":328,"context_line":"            # read trailers, if present"},{"line_number":329,"context_line":"            if not self._read_trailers:"},{"line_number":330,"context_line":"                if self._expected_trailers:"},{"line_number":331,"context_line":"                    for line in iter(self._input.readline, b\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":50,"id":"dfe491a8_679628dc","line":328,"in_reply_to":"14eef52d_0d5d9626","updated":"2025-02-26 18:24:09.000000000","message":"Acknowledged","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                    \u0027unexpected terminating zero-byte chunk\u0027,"},{"line_number":326,"context_line":"                    self._original_to_read,"},{"line_number":327,"context_line":"                    self._original_to_read - self._to_read)"},{"line_number":328,"context_line":"            # read trailers, if present"},{"line_number":329,"context_line":"            if not self._read_trailers:"},{"line_number":330,"context_line":"                if self._expected_trailers:"},{"line_number":331,"context_line":"                    for line in iter(self._input.readline, b\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":50,"id":"9bfb71f6_99c2f77a","line":328,"in_reply_to":"79b47cb1_3c2bf0b5","updated":"2025-02-12 18:58:38.000000000","message":"IDK, I feel that would be confusing the role of ChunkReader. There are some pieces above that might be better in ChunkReader (like reading the chunk header), but I quite like that there\u0027s a ChunkReader instance whose responsibility is one chunk, and trailers aren\u0027t like another chunk.\n\nAnother function to handle trailers might be good however, to break some code out.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                    \u0027unexpected terminating zero-byte chunk\u0027,"},{"line_number":326,"context_line":"                    self._original_to_read,"},{"line_number":327,"context_line":"                    self._original_to_read - self._to_read)"},{"line_number":328,"context_line":"            # read trailers, if present"},{"line_number":329,"context_line":"            if not self._read_trailers:"},{"line_number":330,"context_line":"                if self._expected_trailers:"},{"line_number":331,"context_line":"                    for line in iter(self._input.readline, b\u0027\u0027):"}],"source_content_type":"text/x-python","patch_set":50,"id":"14eef52d_0d5d9626","line":328,"in_reply_to":"9bfb71f6_99c2f77a","updated":"2025-02-13 01:04:12.000000000","message":"So the case looks like this: that\n```\n            # If it\u0027s the final chunk, we\u0027re in (possibly empty) trailers\n            # Otherwise, there\u0027s a CRLF chunk-separator\n```\nis weird as hell, especially in light of the `elif self._input.read(2) not in (b\u0027\u0027, b\u0027\\r\\n\u0027):` *after* we read trailers. If we move trailer-parsing into `ChunkReader` *maybe* it starts to make more sense; we could have something like\n```\n            if self.original_chunk_length !\u003d 0:\n                self.parse_trailers()\n\n            if self._input.read(2) not in (b\u0027\u0027, b\u0027\\r\\n\u0027):\n                self.close()\n                raise S3InputIncomplete\n```","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":359,"context_line":""},{"line_number":360,"context_line":"    @property"},{"line_number":361,"context_line":"    def _signature_version(self):"},{"line_number":362,"context_line":"        return \u00274\u0027"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def check_signature(self, secret):"},{"line_number":365,"context_line":"        secret \u003d utf8encode(secret)"}],"source_content_type":"text/x-python","patch_set":50,"id":"17b95911_6c952617","line":362,"updated":"2025-02-12 18:58:38.000000000","message":"this is a big hint that the mixin isn\u0027t working out - and elsewhere we have code that is v2/v4 conditional rather than overrides.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":359,"context_line":""},{"line_number":360,"context_line":"    @property"},{"line_number":361,"context_line":"    def _signature_version(self):"},{"line_number":362,"context_line":"        return \u00274\u0027"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def check_signature(self, secret):"},{"line_number":365,"context_line":"        secret \u003d utf8encode(secret)"}],"source_content_type":"text/x-python","patch_set":50,"id":"60304d7a_a24304e4","line":362,"in_reply_to":"17b95911_6c952617","updated":"2025-02-13 01:04:12.000000000","message":"Acknowledged","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":380,"context_line":"        self.string_to_sign \u003d self._chunk_string_to_sign(chunk_sha256)"},{"line_number":381,"context_line":"        self.signature \u003d signature"},{"line_number":382,"context_line":"        self._chunk_signature_valid \u003d \\"},{"line_number":383,"context_line":"            self._chunk_signature_valid and self.check_signature(self._secret)"},{"line_number":384,"context_line":"        return self._chunk_signature_valid"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":50,"id":"7612e3de_fc18f548","line":383,"range":{"start_line":383,"start_character":65,"end_line":383,"end_character":77},"updated":"2025-02-12 18:58:38.000000000","message":"self._secret is set by the initial call back to check_signature - should we allow for the possibility that hasn\u0027t happened?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":380,"context_line":"        self.string_to_sign \u003d self._chunk_string_to_sign(chunk_sha256)"},{"line_number":381,"context_line":"        self.signature \u003d signature"},{"line_number":382,"context_line":"        self._chunk_signature_valid \u003d \\"},{"line_number":383,"context_line":"            self._chunk_signature_valid and self.check_signature(self._secret)"},{"line_number":384,"context_line":"        return self._chunk_signature_valid"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":50,"id":"c27930f4_eda80dcd","line":383,"range":{"start_line":383,"start_character":65,"end_line":383,"end_character":77},"in_reply_to":"7612e3de_fc18f548","updated":"2025-02-13 01:04:12.000000000","message":"Yes we should -- `s3token` only calls `check_signature` if the user\u0027s secret was found in memcache; the first request relies on keystone doing the verification.\n\nMaybe that\u0027s more a sign that there should be some changes in `s3token`, too, though, to ensure `check_signature` is always called -- IDK that we can get away from needing to have some signature-verification function we can call here in s3api.\n\nSide note: we should probably do some caching of the `derived_secret`...","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":380,"context_line":"        self.string_to_sign \u003d self._chunk_string_to_sign(chunk_sha256)"},{"line_number":381,"context_line":"        self.signature \u003d signature"},{"line_number":382,"context_line":"        self._chunk_signature_valid \u003d \\"},{"line_number":383,"context_line":"            self._chunk_signature_valid and self.check_signature(self._secret)"},{"line_number":384,"context_line":"        return self._chunk_signature_valid"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":50,"id":"47eebc84_76de6245","line":383,"range":{"start_line":383,"start_character":65,"end_line":383,"end_character":77},"in_reply_to":"c27930f4_eda80dcd","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def _validate_sha256(self):"},{"line_number":459,"context_line":"        aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":460,"context_line":"        decoded_content \u003d None"},{"line_number":461,"context_line":"        looks_like_sha256 \u003d ("},{"line_number":462,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":463,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"}],"source_content_type":"text/x-python","patch_set":50,"id":"1d4a8645_d497fe26","line":460,"updated":"2025-02-12 18:58:38.000000000","message":"nit: I\u0027d find it helpful to call this ``decoded_content_length``","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":457,"context_line":""},{"line_number":458,"context_line":"    def _validate_sha256(self):"},{"line_number":459,"context_line":"        aws_sha256 \u003d self.headers.get(\u0027x-amz-content-sha256\u0027)"},{"line_number":460,"context_line":"        decoded_content \u003d None"},{"line_number":461,"context_line":"        looks_like_sha256 \u003d ("},{"line_number":462,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":463,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"}],"source_content_type":"text/x-python","patch_set":50,"id":"1cf8e20e_a2392167","line":460,"in_reply_to":"1d4a8645_d497fe26","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":462,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":463,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":464,"context_line":"        if not aws_sha256:"},{"line_number":465,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":466,"context_line":"                pass  # pre-signed URL; not required"},{"line_number":467,"context_line":"            else:"},{"line_number":468,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"}],"source_content_type":"text/x-python","patch_set":50,"id":"4e7c41f8_d852ad1f","line":465,"range":{"start_line":465,"start_character":12,"end_line":465,"end_character":49},"updated":"2025-02-12 18:58:38.000000000","message":"this is the critical difference w.r.t. v2 in terms of validating header values. It could be abstracted as a class/mixin ``is_streaming_supported()`` method","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":462,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":463,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":464,"context_line":"        if not aws_sha256:"},{"line_number":465,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":466,"context_line":"                pass  # pre-signed URL; not required"},{"line_number":467,"context_line":"            else:"},{"line_number":468,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"}],"source_content_type":"text/x-python","patch_set":50,"id":"1998d80d_fad0d52d","line":465,"range":{"start_line":465,"start_character":12,"end_line":465,"end_character":49},"in_reply_to":"05013c6c_4286d2e8","updated":"2025-04-02 14:19:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":462,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":463,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":464,"context_line":"        if not aws_sha256:"},{"line_number":465,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":466,"context_line":"                pass  # pre-signed URL; not required"},{"line_number":467,"context_line":"            else:"},{"line_number":468,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"}],"source_content_type":"text/x-python","patch_set":50,"id":"546ecbfc_ebdb8fe1","line":465,"range":{"start_line":465,"start_character":12,"end_line":465,"end_character":49},"in_reply_to":"4e7c41f8_d852ad1f","updated":"2025-02-13 01:04:12.000000000","message":":-/ I don\u0027t really like how that shook out:\n```\n       if not aws_sha256:\n            if self._is_streaming_supported:\n                msg \u003d \u0027Missing required header for this request: \u0027 \\\n                      \u0027x-amz-content-sha256\u0027\n                raise InvalidRequest(msg)\n            else:\n                return\n```\nBut it\u0027s required regardless of whether the client wants to do streaming or not!","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":462,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":463,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":464,"context_line":"        if not aws_sha256:"},{"line_number":465,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":466,"context_line":"                pass  # pre-signed URL; not required"},{"line_number":467,"context_line":"            else:"},{"line_number":468,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"}],"source_content_type":"text/x-python","patch_set":50,"id":"ebb253aa_3d9516a7","line":465,"range":{"start_line":465,"start_character":12,"end_line":465,"end_character":49},"in_reply_to":"546ecbfc_ebdb8fe1","updated":"2025-02-14 17:04:50.000000000","message":"yeah, maybe there is a better name for the flag, although it IS making a statement about the request\u0027s property rather than the client\u0027s intent i.e. \"this request type supports streaming and therefore sha256 IS required\".\n\nMaybe we\u0027re just trying to avoid calling it ``_is_v4_header_auth_request`` !","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":true,"context_lines":[{"line_number":462,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":463,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":464,"context_line":"        if not aws_sha256:"},{"line_number":465,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":466,"context_line":"                pass  # pre-signed URL; not required"},{"line_number":467,"context_line":"            else:"},{"line_number":468,"context_line":"                msg \u003d \u0027Missing required header for this request: \u0027 \\"}],"source_content_type":"text/x-python","patch_set":50,"id":"05013c6c_4286d2e8","line":465,"range":{"start_line":465,"start_character":12,"end_line":465,"end_character":49},"in_reply_to":"ebb253aa_3d9516a7","updated":"2025-02-26 18:24:09.000000000","message":"Hmm... so I like `_is_streaming_supported` further down in this function... maybe it\u0027d be worth adding another `_is_sha256_required` property that just happens to duplicate `_is_streaming_supported`? We\u0027ve nearly got that kind of duplication already with `_is_query_auth`...","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":485,"context_line":"                raise MissingContentLength"},{"line_number":486,"context_line":"            if decoded_content \u003c 0:"},{"line_number":487,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"}],"source_content_type":"text/x-python","patch_set":50,"id":"31450baa_56b33a0b","line":488,"updated":"2025-02-12 18:58:38.000000000","message":"I think ``Content-Encoding : aws-chunked`` MUST also be present https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":485,"context_line":"                raise MissingContentLength"},{"line_number":486,"context_line":"            if decoded_content \u003c 0:"},{"line_number":487,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"}],"source_content_type":"text/x-python","patch_set":50,"id":"9cae8e1a_8ab8ef2e","line":488,"in_reply_to":"31450baa_56b33a0b","updated":"2025-02-13 01:04:12.000000000","message":"Nope; works fine without. Will add a cross-compat test.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"d86316e467cbb08b9327136d0f6c1daeebca0bd0","unresolved":true,"context_lines":[{"line_number":485,"context_line":"                raise MissingContentLength"},{"line_number":486,"context_line":"            if decoded_content \u003c 0:"},{"line_number":487,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"}],"source_content_type":"text/x-python","patch_set":50,"id":"e49eb25a_d9835863","line":488,"in_reply_to":"9cae8e1a_8ab8ef2e","updated":"2025-02-13 17:32:15.000000000","message":"Yes, i have validated this!","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":485,"context_line":"                raise MissingContentLength"},{"line_number":486,"context_line":"            if decoded_content \u003c 0:"},{"line_number":487,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"}],"source_content_type":"text/x-python","patch_set":50,"id":"2a68643e_9fb02669","line":488,"in_reply_to":"9cae8e1a_8ab8ef2e","updated":"2025-02-14 17:04:50.000000000","message":"ok so long as cross-compat tells  us we don\u0027t need to enforce it then that\u0027s one less complexity 😊","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"},{"line_number":492,"context_line":"                    raise IncompleteBody("},{"line_number":493,"context_line":"                        number_bytes_expected\u003ddecoded_content,"},{"line_number":494,"context_line":"                        number_bytes_provided\u003dself.content_length,"}],"source_content_type":"text/x-python","patch_set":50,"id":"185eb3d9_5a40031f","line":491,"range":{"start_line":491,"start_character":37,"end_line":491,"end_character":56},"updated":"2025-02-12 18:58:38.000000000","message":"where do we ensure that self.content_length is not None?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"d86316e467cbb08b9327136d0f6c1daeebca0bd0","unresolved":true,"context_lines":[{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"},{"line_number":492,"context_line":"                    raise IncompleteBody("},{"line_number":493,"context_line":"                        number_bytes_expected\u003ddecoded_content,"},{"line_number":494,"context_line":"                        number_bytes_provided\u003dself.content_length,"}],"source_content_type":"text/x-python","patch_set":50,"id":"f39e42be_3ed5765d","line":491,"range":{"start_line":491,"start_character":37,"end_line":491,"end_character":56},"in_reply_to":"185eb3d9_5a40031f","updated":"2025-02-13 17:32:15.000000000","message":"nice catch, i had suggested that here, ref: https://review.opendev.org/c/openstack/swift/+/933468/9/swift/common/middleware/s3api/s3request.py#1182","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"},{"line_number":492,"context_line":"                    raise IncompleteBody("},{"line_number":493,"context_line":"                        number_bytes_expected\u003ddecoded_content,"},{"line_number":494,"context_line":"                        number_bytes_provided\u003dself.content_length,"}],"source_content_type":"text/x-python","patch_set":50,"id":"676f9e1b_6436e6e2","line":491,"range":{"start_line":491,"start_character":37,"end_line":491,"end_character":56},"in_reply_to":"f39e42be_3ed5765d","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":488,"context_line":"                                      decoded_content)"},{"line_number":489,"context_line":""},{"line_number":490,"context_line":"            if \u0027X-Amz-Credential\u0027 in self.params:"},{"line_number":491,"context_line":"                if decoded_content \u003c self.content_length:"},{"line_number":492,"context_line":"                    raise IncompleteBody("},{"line_number":493,"context_line":"                        number_bytes_expected\u003ddecoded_content,"},{"line_number":494,"context_line":"                        number_bytes_provided\u003dself.content_length,"}],"source_content_type":"text/x-python","patch_set":50,"id":"a688aef4_6290f3ba","line":491,"range":{"start_line":491,"start_character":37,"end_line":491,"end_character":56},"in_reply_to":"f39e42be_3ed5765d","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":822,"context_line":"        self.location \u003d self.conf.location"},{"line_number":823,"context_line":"        self._timestamp \u003d None"},{"line_number":824,"context_line":"        self._secret \u003d None"},{"line_number":825,"context_line":"        self._chunk_signature_valid \u003d True"},{"line_number":826,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":827,"context_line":"        self.bucket_in_host \u003d self._parse_host()"},{"line_number":828,"context_line":"        self.container_name, self.object_name \u003d self._parse_uri()"}],"source_content_type":"text/x-python","patch_set":50,"id":"89cec1ba_a7858311","line":825,"updated":"2025-02-12 18:58:38.000000000","message":"these are v4 specific I think","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":822,"context_line":"        self.location \u003d self.conf.location"},{"line_number":823,"context_line":"        self._timestamp \u003d None"},{"line_number":824,"context_line":"        self._secret \u003d None"},{"line_number":825,"context_line":"        self._chunk_signature_valid \u003d True"},{"line_number":826,"context_line":"        self.access_key, self.signature \u003d self._parse_auth_info()"},{"line_number":827,"context_line":"        self.bucket_in_host \u003d self._parse_host()"},{"line_number":828,"context_line":"        self.container_name, self.object_name \u003d self._parse_uri()"}],"source_content_type":"text/x-python","patch_set":50,"id":"32454e8e_31925a1c","line":825,"in_reply_to":"89cec1ba_a7858311","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":903,"context_line":"        return streq_const_time(user_signature, valid_signature)"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    @property"},{"line_number":906,"context_line":"    def trailers(self):"},{"line_number":907,"context_line":"        return list_from_csv(self.headers.get(\u0027x-amz-trailer\u0027))"},{"line_number":908,"context_line":""},{"line_number":909,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":50,"id":"e4c97348_bd4751c9","line":906,"updated":"2025-02-12 18:58:38.000000000","message":"would this be better named ``expected_trailers``?? it\u0027s not returning the trailers sent after the request body","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":903,"context_line":"        return streq_const_time(user_signature, valid_signature)"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    @property"},{"line_number":906,"context_line":"    def trailers(self):"},{"line_number":907,"context_line":"        return list_from_csv(self.headers.get(\u0027x-amz-trailer\u0027))"},{"line_number":908,"context_line":""},{"line_number":909,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":50,"id":"700f7ad9_c8fb76a7","line":906,"in_reply_to":"b72de6e3_c9ff2eb1","updated":"2025-02-14 17:04:50.000000000","message":"hehe","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":903,"context_line":"        return streq_const_time(user_signature, valid_signature)"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    @property"},{"line_number":906,"context_line":"    def trailers(self):"},{"line_number":907,"context_line":"        return list_from_csv(self.headers.get(\u0027x-amz-trailer\u0027))"},{"line_number":908,"context_line":""},{"line_number":909,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":50,"id":"b72de6e3_c9ff2eb1","line":906,"in_reply_to":"e4c97348_bd4751c9","updated":"2025-02-13 01:04:12.000000000","message":"Moot; it\u0027s unused.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1200,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027,"},{"line_number":1201,"context_line":"            ):"},{"line_number":1202,"context_line":"                if aws_sha256 \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"},{"line_number":1203,"context_line":"                    chunk_validator \u003d None"},{"line_number":1204,"context_line":"                else:"},{"line_number":1205,"context_line":"                    chunk_validator \u003d self.check_chunk_signature"},{"line_number":1206,"context_line":"                decoded_content \u003d self.headers.get("}],"source_content_type":"text/x-python","patch_set":50,"id":"36ce6f83_fb6a2aa6","line":1203,"updated":"2025-02-12 18:58:38.000000000","message":"this clause is not covered by s3api unit tests (it is covered by a compat test test/s3api/test_input_errors.py::TestV4AuthHeaders::test_no_md5_streaming_unsigned and possibly others)","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":1200,"context_line":"                \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027,"},{"line_number":1201,"context_line":"            ):"},{"line_number":1202,"context_line":"                if aws_sha256 \u003d\u003d \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027:"},{"line_number":1203,"context_line":"                    chunk_validator \u003d None"},{"line_number":1204,"context_line":"                else:"},{"line_number":1205,"context_line":"                    chunk_validator \u003d self.check_chunk_signature"},{"line_number":1206,"context_line":"                decoded_content \u003d self.headers.get("}],"source_content_type":"text/x-python","patch_set":50,"id":"ba04b895_5390b962","line":1203,"in_reply_to":"36ce6f83_fb6a2aa6","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1205,"context_line":"                    chunk_validator \u003d self.check_chunk_signature"},{"line_number":1206,"context_line":"                decoded_content \u003d self.headers.get("},{"line_number":1207,"context_line":"                    \u0027x-amz-decoded-content-length\u0027)"},{"line_number":1208,"context_line":"                if decoded_content is None:"},{"line_number":1209,"context_line":"                    raise MissingContentLength"},{"line_number":1210,"context_line":"                try:"},{"line_number":1211,"context_line":"                    if int(decoded_content) \u003c 0:"},{"line_number":1212,"context_line":"                        raise ValueError"},{"line_number":1213,"context_line":"                except (ValueError, TypeError):"},{"line_number":1214,"context_line":"                    raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":1215,"context_line":"                                          decoded_content)"},{"line_number":1216,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d StreamingInput("},{"line_number":1217,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"},{"line_number":1218,"context_line":"                    int(decoded_content),"}],"source_content_type":"text/x-python","patch_set":50,"id":"443fd39b_ca677521","line":1215,"range":{"start_line":1208,"start_character":16,"end_line":1215,"end_character":58},"updated":"2025-02-12 18:58:38.000000000","message":"these conditions have been checked already in _validate_sha256","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":1205,"context_line":"                    chunk_validator \u003d self.check_chunk_signature"},{"line_number":1206,"context_line":"                decoded_content \u003d self.headers.get("},{"line_number":1207,"context_line":"                    \u0027x-amz-decoded-content-length\u0027)"},{"line_number":1208,"context_line":"                if decoded_content is None:"},{"line_number":1209,"context_line":"                    raise MissingContentLength"},{"line_number":1210,"context_line":"                try:"},{"line_number":1211,"context_line":"                    if int(decoded_content) \u003c 0:"},{"line_number":1212,"context_line":"                        raise ValueError"},{"line_number":1213,"context_line":"                except (ValueError, TypeError):"},{"line_number":1214,"context_line":"                    raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":1215,"context_line":"                                          decoded_content)"},{"line_number":1216,"context_line":"                self.environ[\u0027wsgi.input\u0027] \u003d StreamingInput("},{"line_number":1217,"context_line":"                    self.environ[\u0027wsgi.input\u0027],"},{"line_number":1218,"context_line":"                    int(decoded_content),"}],"source_content_type":"text/x-python","patch_set":50,"id":"8ce88db6_dbb928d3","line":1215,"range":{"start_line":1208,"start_character":16,"end_line":1215,"end_character":58},"in_reply_to":"443fd39b_ca677521","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1252,"context_line":"            if len(self.headers[\u0027ETag\u0027]) !\u003d 32:"},{"line_number":1253,"context_line":"                raise InvalidDigest(content_md5\u003dvalue)"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"        value \u003d _header_strip(self.headers.get(\u0027Content-MD5\u0027))"},{"line_number":1256,"context_line":"        if value is not None:"},{"line_number":1257,"context_line":"            if not re.match(\u0027^[A-Za-z0-9+/]+\u003d{0,2}$\u0027, value):"},{"line_number":1258,"context_line":"                # Non-base64-alphabet characters in value."},{"line_number":1259,"context_line":"                raise InvalidDigest(content_md5\u003dvalue)"},{"line_number":1260,"context_line":"            try:"},{"line_number":1261,"context_line":"                self.headers[\u0027ETag\u0027] \u003d binascii.b2a_hex("},{"line_number":1262,"context_line":"                    binascii.a2b_base64(value))"},{"line_number":1263,"context_line":"            except binascii.Error:"},{"line_number":1264,"context_line":"                # incorrect padding, most likely"},{"line_number":1265,"context_line":"                raise InvalidDigest(content_md5\u003dvalue)"},{"line_number":1266,"context_line":""},{"line_number":1267,"context_line":"        if \u0027x-amz-tagging\u0027 in self.headers:"},{"line_number":1268,"context_line":"            raise S3NotImplemented(\u0027Object tagging is not supported.\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"07e987e5_161be04f","line":1265,"range":{"start_line":1255,"start_character":8,"end_line":1265,"end_character":54},"updated":"2025-02-12 18:58:38.000000000","message":"this is repeating the lines immediately above","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1252,"context_line":"            if len(self.headers[\u0027ETag\u0027]) !\u003d 32:"},{"line_number":1253,"context_line":"                raise InvalidDigest(content_md5\u003dvalue)"},{"line_number":1254,"context_line":""},{"line_number":1255,"context_line":"        value \u003d _header_strip(self.headers.get(\u0027Content-MD5\u0027))"},{"line_number":1256,"context_line":"        if value is not None:"},{"line_number":1257,"context_line":"            if not re.match(\u0027^[A-Za-z0-9+/]+\u003d{0,2}$\u0027, value):"},{"line_number":1258,"context_line":"                # Non-base64-alphabet characters in value."},{"line_number":1259,"context_line":"                raise InvalidDigest(content_md5\u003dvalue)"},{"line_number":1260,"context_line":"            try:"},{"line_number":1261,"context_line":"                self.headers[\u0027ETag\u0027] \u003d binascii.b2a_hex("},{"line_number":1262,"context_line":"                    binascii.a2b_base64(value))"},{"line_number":1263,"context_line":"            except binascii.Error:"},{"line_number":1264,"context_line":"                # incorrect padding, most likely"},{"line_number":1265,"context_line":"                raise InvalidDigest(content_md5\u003dvalue)"},{"line_number":1266,"context_line":""},{"line_number":1267,"context_line":"        if \u0027x-amz-tagging\u0027 in self.headers:"},{"line_number":1268,"context_line":"            raise S3NotImplemented(\u0027Object tagging is not supported.\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"33811429_32b4f4e4","line":1265,"range":{"start_line":1255,"start_character":8,"end_line":1265,"end_character":54},"in_reply_to":"07e987e5_161be04f","updated":"2025-02-13 01:04:12.000000000","message":"I blame some rebase/merge conflict.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1537,"context_line":"                if enc !\u003d \u0027aws-chunked\u0027)"},{"line_number":1538,"context_line":"            if new_enc:"},{"line_number":1539,"context_line":"                # used to be, AWS would store \u0027\u0027, but not any more"},{"line_number":1540,"context_line":"                env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d new_enc"},{"line_number":1541,"context_line":""},{"line_number":1542,"context_line":"        def sanitize(value):"},{"line_number":1543,"context_line":"            if set(value).issubset(string.printable):"}],"source_content_type":"text/x-python","patch_set":50,"id":"e5920088_824f61fb","line":1540,"updated":"2025-02-12 18:58:38.000000000","message":"I\u0027m surprised that the swift request env seems to just inherit everything in the s3 request env - I\u0027d assumed there would already be some scrubbing of s3 specific headers\n\nOIC there is some ``del`` below.\n\nPerhaps there could be a translate_headers helper method to deal with all the s3 to swift header manipulation?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":1537,"context_line":"                if enc !\u003d \u0027aws-chunked\u0027)"},{"line_number":1538,"context_line":"            if new_enc:"},{"line_number":1539,"context_line":"                # used to be, AWS would store \u0027\u0027, but not any more"},{"line_number":1540,"context_line":"                env[\u0027HTTP_CONTENT_ENCODING\u0027] \u003d new_enc"},{"line_number":1541,"context_line":""},{"line_number":1542,"context_line":"        def sanitize(value):"},{"line_number":1543,"context_line":"            if set(value).issubset(string.printable):"}],"source_content_type":"text/x-python","patch_set":50,"id":"f3ffdd9d_7294e0a8","line":1540,"in_reply_to":"e5920088_824f61fb","updated":"2025-02-14 17:04:50.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1607,"context_line":""},{"line_number":1608,"context_line":"        decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1609,"context_line":"        if decoded_content is not None and decoded_content.isdigit():"},{"line_number":1610,"context_line":"            env[\u0027CONTENT_LENGTH\u0027] \u003d decoded_content"},{"line_number":1611,"context_line":""},{"line_number":1612,"context_line":"        if self.conf.force_swift_request_proxy_log:"},{"line_number":1613,"context_line":"            env[\u0027swift.proxy_access_log_made\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":50,"id":"9e672995_7da46a2b","line":1610,"updated":"2025-02-12 18:58:38.000000000","message":"this is very disjointed from where we wrap the input with a StreamingInput. Shouldn\u0027t we change the Content-Length at the the same time that we wrap the input?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1607,"context_line":""},{"line_number":1608,"context_line":"        decoded_content \u003d self.headers.get(\u0027x-amz-decoded-content-length\u0027)"},{"line_number":1609,"context_line":"        if decoded_content is not None and decoded_content.isdigit():"},{"line_number":1610,"context_line":"            env[\u0027CONTENT_LENGTH\u0027] \u003d decoded_content"},{"line_number":1611,"context_line":""},{"line_number":1612,"context_line":"        if self.conf.force_swift_request_proxy_log:"},{"line_number":1613,"context_line":"            env[\u0027swift.proxy_access_log_made\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":50,"id":"0af03c50_67bc954c","line":1610,"in_reply_to":"9e672995_7da46a2b","updated":"2025-02-13 01:04:12.000000000","message":"Holdover from when it *was* getting wrapped here.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1846,"context_line":"                                   body\u003dbody, query\u003dquery)"},{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"        try:"},{"line_number":1849,"context_line":"            with self._streaming_input_read():"},{"line_number":1850,"context_line":"                sw_resp \u003d sw_req.get_response(app)"},{"line_number":1851,"context_line":"        finally:"},{"line_number":1852,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":50,"id":"0b1e0686_233e9f35","line":1849,"range":{"start_line":1849,"start_character":22,"end_line":1849,"end_character":43},"updated":"2025-02-12 18:58:38.000000000","message":"I\u0027m struggling with the name of this - it is used for all requests, not just streaming, and it doesn\u0027t read anything!\n\nhow about ``catch_read_errors`` or ``translate_read_errors``?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1846,"context_line":"                                   body\u003dbody, query\u003dquery)"},{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"        try:"},{"line_number":1849,"context_line":"            with self._streaming_input_read():"},{"line_number":1850,"context_line":"                sw_resp \u003d sw_req.get_response(app)"},{"line_number":1851,"context_line":"        finally:"},{"line_number":1852,"context_line":"            # reuse account"}],"source_content_type":"text/x-python","patch_set":50,"id":"c13b7262_7a94c8a7","line":1849,"range":{"start_line":1849,"start_character":22,"end_line":1849,"end_character":43},"in_reply_to":"0b1e0686_233e9f35","updated":"2025-02-13 01:04:12.000000000","message":"I like `translate_read_errors` -- good idea!","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3d12638d1815d137225ef3120158edcbba6f697a","unresolved":true,"context_lines":[{"line_number":1846,"context_line":"                                   body\u003dbody, query\u003dquery)"},{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"        try:"},{"line_number":1849,"context_line":"            with self._streaming_input_read():"},{"line_number":1850,"context_line":"                sw_resp \u003d sw_req.get_response(app)"},{"line_number":1851,"context_line":"        finally:"},{"line_number":1852,"context_line":"            # reuse account"},{"line_number":1853,"context_line":"            _, self.account, _ \u003d split_path(sw_req.environ[\u0027PATH_INFO\u0027],"}],"source_content_type":"text/x-python","patch_set":50,"id":"1beaf357_44f022fc","line":1850,"range":{"start_line":1849,"start_character":12,"end_line":1850,"end_character":50},"updated":"2025-02-10 22:41:42.000000000","message":"I should rename the function; this covers more than just `StreamingInput` errors (`S3InputSHA256Mismatch` in particular can be raised when we\u0027ve wrapped with a `HashingInput` with or without a `StreamingInput`)","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1846,"context_line":"                                   body\u003dbody, query\u003dquery)"},{"line_number":1847,"context_line":""},{"line_number":1848,"context_line":"        try:"},{"line_number":1849,"context_line":"            with self._streaming_input_read():"},{"line_number":1850,"context_line":"                sw_resp \u003d sw_req.get_response(app)"},{"line_number":1851,"context_line":"        finally:"},{"line_number":1852,"context_line":"            # reuse account"},{"line_number":1853,"context_line":"            _, self.account, _ \u003d split_path(sw_req.environ[\u0027PATH_INFO\u0027],"}],"source_content_type":"text/x-python","patch_set":50,"id":"25c7988d_1b8665f3","line":1850,"range":{"start_line":1849,"start_character":12,"end_line":1850,"end_character":50},"in_reply_to":"1beaf357_44f022fc","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1852,"context_line":"            # reuse account"},{"line_number":1853,"context_line":"            _, self.account, _ \u003d split_path(sw_req.environ[\u0027PATH_INFO\u0027],"},{"line_number":1854,"context_line":"                                            2, 3, True)"},{"line_number":1855,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"        # keep a record of the backend policy index so that the s3api can add"},{"line_number":1858,"context_line":"        # it to the headers of whatever response it returns, which may not"}],"source_content_type":"text/x-python","patch_set":50,"id":"ae0b7645_f3858093","line":1855,"range":{"start_line":1855,"start_character":12,"end_line":1855,"end_character":76},"updated":"2025-02-12 18:58:38.000000000","message":"this feels like a drive-by change and it\u0027s likely fine, but do we have to even think about this at the same time as all the other churn in this patch - would the try/except/else not still be just fine?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1852,"context_line":"            # reuse account"},{"line_number":1853,"context_line":"            _, self.account, _ \u003d split_path(sw_req.environ[\u0027PATH_INFO\u0027],"},{"line_number":1854,"context_line":"                                            2, 3, True)"},{"line_number":1855,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"        # keep a record of the backend policy index so that the s3api can add"},{"line_number":1858,"context_line":"        # it to the headers of whatever response it returns, which may not"}],"source_content_type":"text/x-python","patch_set":50,"id":"b384b35b_563ec691","line":1855,"range":{"start_line":1855,"start_character":12,"end_line":1855,"end_character":76},"in_reply_to":"975faabb_ed50624b","updated":"2025-04-02 14:19:50.000000000","message":"Acknowledged","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":true,"context_lines":[{"line_number":1852,"context_line":"            # reuse account"},{"line_number":1853,"context_line":"            _, self.account, _ \u003d split_path(sw_req.environ[\u0027PATH_INFO\u0027],"},{"line_number":1854,"context_line":"                                            2, 3, True)"},{"line_number":1855,"context_line":"            self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]"},{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"        # keep a record of the backend policy index so that the s3api can add"},{"line_number":1858,"context_line":"        # it to the headers of whatever response it returns, which may not"}],"source_content_type":"text/x-python","patch_set":50,"id":"975faabb_ed50624b","line":1855,"range":{"start_line":1855,"start_character":12,"end_line":1855,"end_character":76},"in_reply_to":"ae0b7645_f3858093","updated":"2025-02-13 01:04:12.000000000","message":"What, something like\n```\ntry:\n    with self.translate_read_errors():\n        sw_resp \u003d sw_req.get_response(app)\nexcept Exception:\n    self.environ[\u0027s3api.backend_path\u0027] \u003d sw_req.environ[\u0027PATH_INFO\u0027]\n    raise\nelse:\n    _, self.account, _ \u003d split_path(sw_resp.environ[\u0027PATH_INFO\u0027],\n                                    2, 3, True)\n    self.environ[\u0027s3api.backend_path\u0027] \u003d sw_resp.environ[\u0027PATH_INFO\u0027]\n```\n? Seems needlessly repetitive and error-prone, especially when [`get_response` ensures the request gets plumbed through](https://github.com/openstack/swift/blob/2.34.0/swift/common/swob.py#L1158-L1167).","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3d12638d1815d137225ef3120158edcbba6f697a","unresolved":true,"context_lines":[{"line_number":1906,"context_line":"            raise SignatureDoesNotMatch("},{"line_number":1907,"context_line":"                **self.signature_does_not_match_kwargs())"},{"line_number":1908,"context_line":"        if status \u003d\u003d HTTP_UNPROCESSABLE_ENTITY:"},{"line_number":1909,"context_line":"            if self._signature_version \u003d\u003d \u00274\u0027:"},{"line_number":1910,"context_line":"                raise XAmzContentSHA256Mismatch("},{"line_number":1911,"context_line":"                    **self.content_sha256_does_not_match_kwargs("},{"line_number":1912,"context_line":"                        err_msg.decode(\u0027utf8\u0027)))"},{"line_number":1913,"context_line":"            raise BadDigest()"},{"line_number":1914,"context_line":"        if status \u003d\u003d HTTP_FORBIDDEN:"},{"line_number":1915,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"72f60a16_1c8a632c","line":1912,"range":{"start_line":1909,"start_character":12,"end_line":1912,"end_character":48},"updated":"2025-02-10 22:41:42.000000000","message":"This confuses me.\n\nFirst, I\u0027d prefer doing an `isinstance` check to adding an extra property.\n\nBut the bigger issue is that I\u0027m not clear on how we could get a 422 on SHA mismatch. The mismatch should be throwing a `S3InputSHA256Mismatch` that we\u0027ll want to handle in our context manager back about 60 lines.\n\nMaybe this was from a time where we thought we could get away with raising a swob response mid-stream?","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":1906,"context_line":"            raise SignatureDoesNotMatch("},{"line_number":1907,"context_line":"                **self.signature_does_not_match_kwargs())"},{"line_number":1908,"context_line":"        if status \u003d\u003d HTTP_UNPROCESSABLE_ENTITY:"},{"line_number":1909,"context_line":"            if self._signature_version \u003d\u003d \u00274\u0027:"},{"line_number":1910,"context_line":"                raise XAmzContentSHA256Mismatch("},{"line_number":1911,"context_line":"                    **self.content_sha256_does_not_match_kwargs("},{"line_number":1912,"context_line":"                        err_msg.decode(\u0027utf8\u0027)))"},{"line_number":1913,"context_line":"            raise BadDigest()"},{"line_number":1914,"context_line":"        if status \u003d\u003d HTTP_FORBIDDEN:"},{"line_number":1915,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"d2583682_ab649779","line":1912,"range":{"start_line":1909,"start_character":12,"end_line":1912,"end_character":48},"in_reply_to":"72f60a16_1c8a632c","updated":"2025-02-12 18:58:38.000000000","message":"if this special case IS needed, the mixin way would be to call something like ``self._handle_other_response_status`` at line 1931 which the mixin implements differently to the S3Request","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":1906,"context_line":"            raise SignatureDoesNotMatch("},{"line_number":1907,"context_line":"                **self.signature_does_not_match_kwargs())"},{"line_number":1908,"context_line":"        if status \u003d\u003d HTTP_UNPROCESSABLE_ENTITY:"},{"line_number":1909,"context_line":"            if self._signature_version \u003d\u003d \u00274\u0027:"},{"line_number":1910,"context_line":"                raise XAmzContentSHA256Mismatch("},{"line_number":1911,"context_line":"                    **self.content_sha256_does_not_match_kwargs("},{"line_number":1912,"context_line":"                        err_msg.decode(\u0027utf8\u0027)))"},{"line_number":1913,"context_line":"            raise BadDigest()"},{"line_number":1914,"context_line":"        if status \u003d\u003d HTTP_FORBIDDEN:"},{"line_number":1915,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"9a1e1480_4ecd3437","line":1912,"range":{"start_line":1909,"start_character":12,"end_line":1912,"end_character":48},"in_reply_to":"d2583682_ab649779","updated":"2025-02-13 01:04:12.000000000","message":"Axed.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":197,"context_line":"                raise S3InputChunkSignatureMismatch"},{"line_number":198,"context_line":"            # If it\u0027s the final chunk, we\u0027re in (possibly empty) trailers"},{"line_number":199,"context_line":"            # Otherwise, there\u0027s a CRLF chunk-separator"},{"line_number":200,"context_line":"            if self.original_chunk_length !\u003d 0:"},{"line_number":201,"context_line":"                if self._input.read(2) !\u003d b\u0027\\r\\n\u0027:"},{"line_number":202,"context_line":"                    self.close()"},{"line_number":203,"context_line":"                    raise S3InputIncomplete"}],"source_content_type":"text/x-python","patch_set":51,"id":"dd32fc65_af324a88","line":200,"updated":"2025-02-14 17:04:50.000000000","message":"+1 that\u0027s a lot simpler to grok","commit_id":"053f9ba7a2562a71430563ff66b6c0b91bbb339f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                raise S3InputChunkSignatureMismatch"},{"line_number":198,"context_line":"            # If it\u0027s the final chunk, we\u0027re in (possibly empty) trailers"},{"line_number":199,"context_line":"            # Otherwise, there\u0027s a CRLF chunk-separator"},{"line_number":200,"context_line":"            if self.original_chunk_length !\u003d 0:"},{"line_number":201,"context_line":"                if self._input.read(2) !\u003d b\u0027\\r\\n\u0027:"},{"line_number":202,"context_line":"                    self.close()"},{"line_number":203,"context_line":"                    raise S3InputIncomplete"}],"source_content_type":"text/x-python","patch_set":51,"id":"0ed8aeee_965fc404","line":200,"in_reply_to":"dd32fc65_af324a88","updated":"2025-02-18 17:01:31.000000000","message":"Acknowledged","commit_id":"053f9ba7a2562a71430563ff66b6c0b91bbb339f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                raise S3InputChunkSignatureMismatch"},{"line_number":198,"context_line":"            # If it\u0027s the final chunk, we\u0027re in (possibly empty) trailers"},{"line_number":199,"context_line":"            # Otherwise, there\u0027s a CRLF chunk-separator"},{"line_number":200,"context_line":"            if self.original_chunk_length !\u003d 0:"},{"line_number":201,"context_line":"                if self._input.read(2) !\u003d b\u0027\\r\\n\u0027:"},{"line_number":202,"context_line":"                    self.close()"},{"line_number":203,"context_line":"                    raise S3InputIncomplete"}],"source_content_type":"text/x-python","patch_set":51,"id":"40f657a5_79c8ca91","line":200,"in_reply_to":"dd32fc65_af324a88","updated":"2025-02-18 17:01:31.000000000","message":"Acknowledged","commit_id":"053f9ba7a2562a71430563ff66b6c0b91bbb339f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a2209ec4f95c072aaf821aef1dce87cb897a02e","unresolved":false,"context_lines":[{"line_number":197,"context_line":"                raise S3InputChunkSignatureMismatch"},{"line_number":198,"context_line":"            # If it\u0027s the final chunk, we\u0027re in (possibly empty) trailers"},{"line_number":199,"context_line":"            # Otherwise, there\u0027s a CRLF chunk-separator"},{"line_number":200,"context_line":"            if self.original_chunk_length !\u003d 0:"},{"line_number":201,"context_line":"                if self._input.read(2) !\u003d b\u0027\\r\\n\u0027:"},{"line_number":202,"context_line":"                    self.close()"},{"line_number":203,"context_line":"                    raise S3InputIncomplete"}],"source_content_type":"text/x-python","patch_set":51,"id":"c2d5bdbd_77a2f296","line":200,"in_reply_to":"dd32fc65_af324a88","updated":"2025-02-18 16:56:25.000000000","message":"Acknowledged","commit_id":"053f9ba7a2562a71430563ff66b6c0b91bbb339f"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c4a1851e4861306a2e0a168d3dc920abc6ac54ff","unresolved":true,"context_lines":[{"line_number":580,"context_line":"                    # used to be, AWS would store \u0027\u0027, but not any more"},{"line_number":581,"context_line":"                    self.headers[\u0027Content-Encoding\u0027] \u003d new_enc"},{"line_number":582,"context_line":"        elif (aws_sha256 not in (None, \u0027UNSIGNED-PAYLOAD\u0027) and"},{"line_number":583,"context_line":"              self.content_length is not None):"},{"line_number":584,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":585,"context_line":"                self.environ[\u0027wsgi.input\u0027],"},{"line_number":586,"context_line":"                self.content_length,"}],"source_content_type":"text/x-python","patch_set":53,"id":"78ced844_02e15e25","line":583,"updated":"2025-02-13 23:29:58.000000000","message":"I tested https://review.opendev.org/c/openstack/swift/+/933468/12/test/unit/common/middleware/s3api/test_s3api.py#984 against this edge-case and i got:\n```\n\n```","commit_id":"1b38348be4bb37c9e335d794b7e52eaff1e9edfb"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"57230a488bf582e08774a3e4430ea192309742f3","unresolved":false,"context_lines":[{"line_number":580,"context_line":"                    # used to be, AWS would store \u0027\u0027, but not any more"},{"line_number":581,"context_line":"                    self.headers[\u0027Content-Encoding\u0027] \u003d new_enc"},{"line_number":582,"context_line":"        elif (aws_sha256 not in (None, \u0027UNSIGNED-PAYLOAD\u0027) and"},{"line_number":583,"context_line":"              self.content_length is not None):"},{"line_number":584,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d HashingInput("},{"line_number":585,"context_line":"                self.environ[\u0027wsgi.input\u0027],"},{"line_number":586,"context_line":"                self.content_length,"}],"source_content_type":"text/x-python","patch_set":53,"id":"bc6533eb_52deb5b7","line":583,"in_reply_to":"78ced844_02e15e25","updated":"2025-03-11 15:48:17.000000000","message":"Done","commit_id":"1b38348be4bb37c9e335d794b7e52eaff1e9edfb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":481,"context_line":"            signature (str): The signature to be verified."},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        Returns:"},{"line_number":484,"context_line":"            bool: True if all chunk signatures are valid, False otherwise."},{"line_number":485,"context_line":"        \"\"\""},{"line_number":486,"context_line":"        if not self._all_chunk_signatures_valid:"},{"line_number":487,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":56,"id":"86eed070_f4db66cb","line":484,"updated":"2025-02-14 17:04:50.000000000","message":"we use sphinx doctsring format https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a2209ec4f95c072aaf821aef1dce87cb897a02e","unresolved":false,"context_lines":[{"line_number":481,"context_line":"            signature (str): The signature to be verified."},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        Returns:"},{"line_number":484,"context_line":"            bool: True if all chunk signatures are valid, False otherwise."},{"line_number":485,"context_line":"        \"\"\""},{"line_number":486,"context_line":"        if not self._all_chunk_signatures_valid:"},{"line_number":487,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":56,"id":"5718ca01_0132048c","line":484,"in_reply_to":"86eed070_f4db66cb","updated":"2025-02-18 16:56:25.000000000","message":"Done","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":false,"context_lines":[{"line_number":481,"context_line":"            signature (str): The signature to be verified."},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        Returns:"},{"line_number":484,"context_line":"            bool: True if all chunk signatures are valid, False otherwise."},{"line_number":485,"context_line":"        \"\"\""},{"line_number":486,"context_line":"        if not self._all_chunk_signatures_valid:"},{"line_number":487,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":56,"id":"3ecc91d0_7ee1dac2","line":484,"in_reply_to":"86eed070_f4db66cb","updated":"2025-02-18 17:01:31.000000000","message":"Done (cc @nairashwin952013@gmail.com)","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    Raises:"},{"line_number":514,"context_line":"        AccessDenied: If the credential string is invalid or does not follow"},{"line_number":515,"context_line":"        the required format."},{"line_number":516,"context_line":"    \"\"\""},{"line_number":517,"context_line":"    parts \u003d credential_string.split(\"/\")"},{"line_number":518,"context_line":"    # credential must be in following format:"}],"source_content_type":"text/x-python","patch_set":56,"id":"0b8922a4_aecbd9a1","line":515,"updated":"2025-02-14 17:04:50.000000000","message":"ditto: pls use sphinx doctsring format https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a2209ec4f95c072aaf821aef1dce87cb897a02e","unresolved":false,"context_lines":[{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    Raises:"},{"line_number":514,"context_line":"        AccessDenied: If the credential string is invalid or does not follow"},{"line_number":515,"context_line":"        the required format."},{"line_number":516,"context_line":"    \"\"\""},{"line_number":517,"context_line":"    parts \u003d credential_string.split(\"/\")"},{"line_number":518,"context_line":"    # credential must be in following format:"}],"source_content_type":"text/x-python","patch_set":56,"id":"159ff68e_72058a73","line":515,"in_reply_to":"0b8922a4_aecbd9a1","updated":"2025-02-18 16:56:25.000000000","message":"Done","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":false,"context_lines":[{"line_number":512,"context_line":""},{"line_number":513,"context_line":"    Raises:"},{"line_number":514,"context_line":"        AccessDenied: If the credential string is invalid or does not follow"},{"line_number":515,"context_line":"        the required format."},{"line_number":516,"context_line":"    \"\"\""},{"line_number":517,"context_line":"    parts \u003d credential_string.split(\"/\")"},{"line_number":518,"context_line":"    # credential must be in following format:"}],"source_content_type":"text/x-python","patch_set":56,"id":"78c6cac1_77e6b304","line":515,"in_reply_to":"0b8922a4_aecbd9a1","updated":"2025-02-18 17:01:31.000000000","message":"Done","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3a9898f680777895b320cc807fc8daf97778f9a9","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                self._original_to_read - self._to_read + chunk_size)"},{"line_number":280,"context_line":"        return chunk_size, chunk_params"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def read(self, size\u003dNone):"},{"line_number":283,"context_line":"        if size is None or size \u003c 0 or size \u003e self._to_read:"},{"line_number":284,"context_line":"            size \u003d self._to_read"},{"line_number":285,"context_line":"        buf \u003d []"}],"source_content_type":"text/x-python","patch_set":57,"id":"00a94f1c_847a0ba9","line":282,"updated":"2025-02-20 20:16:51.000000000","message":"Ugh, thinking about https://review.opendev.org/c/openstack/swift/+/940059 made me realize *this* should probably implement `readline` -- and since this is transformative, IDK that it\u0027ll work to try to simplify things by having it subclass `InputProxy`...","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                self._original_to_read - self._to_read + chunk_size)"},{"line_number":280,"context_line":"        return chunk_size, chunk_params"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def read(self, size\u003dNone):"},{"line_number":283,"context_line":"        if size is None or size \u003c 0 or size \u003e self._to_read:"},{"line_number":284,"context_line":"            size \u003d self._to_read"},{"line_number":285,"context_line":"        buf \u003d []"}],"source_content_type":"text/x-python","patch_set":57,"id":"29a288c5_21c8290b","line":282,"in_reply_to":"00a94f1c_847a0ba9","updated":"2025-02-26 18:24:09.000000000","message":"@alistairncoles@gmail.com how do you feel about this? Should I be sure to implement a `readline`, or do we wait for it to actually be required that we do that? I worry that a `readline` here (because it\u0027s transformative) may get hairy... or maybe I can just wrap the `StreamingInput` in an `InputProxy`...","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                self._original_to_read - self._to_read + chunk_size)"},{"line_number":280,"context_line":"        return chunk_size, chunk_params"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def read(self, size\u003dNone):"},{"line_number":283,"context_line":"        if size is None or size \u003c 0 or size \u003e self._to_read:"},{"line_number":284,"context_line":"            size \u003d self._to_read"},{"line_number":285,"context_line":"        buf \u003d []"}],"source_content_type":"text/x-python","patch_set":57,"id":"b87e47bb_065d32ec","line":282,"in_reply_to":"29a288c5_21c8290b","updated":"2025-04-22 10:17:52.000000000","message":"Still considering this but not sure we ever call readline on *this* input","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f53c3c4434014378ed5617884735b1629db430bf","unresolved":true,"context_lines":[{"line_number":279,"context_line":"                self._original_to_read - self._to_read + chunk_size)"},{"line_number":280,"context_line":"        return chunk_size, chunk_params"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def read(self, size\u003dNone):"},{"line_number":283,"context_line":"        if size is None or size \u003c 0 or size \u003e self._to_read:"},{"line_number":284,"context_line":"            size \u003d self._to_read"},{"line_number":285,"context_line":"        buf \u003d []"}],"source_content_type":"text/x-python","patch_set":57,"id":"bb4e9ce6_3ceef648","line":282,"in_reply_to":"b87e47bb_065d32ec","updated":"2025-04-22 16:08:19.000000000","message":"See https://review.opendev.org/c/openstack/swift/+/947838","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1f5609d33378e0af16eb2ad741eff6ea848931dc","unresolved":false,"context_lines":[{"line_number":279,"context_line":"                self._original_to_read - self._to_read + chunk_size)"},{"line_number":280,"context_line":"        return chunk_size, chunk_params"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def read(self, size\u003dNone):"},{"line_number":283,"context_line":"        if size is None or size \u003c 0 or size \u003e self._to_read:"},{"line_number":284,"context_line":"            size \u003d self._to_read"},{"line_number":285,"context_line":"        buf \u003d []"}],"source_content_type":"text/x-python","patch_set":57,"id":"fe85e2a6_865f432c","line":282,"in_reply_to":"bb4e9ce6_3ceef648","updated":"2025-05-13 19:44:12.000000000","message":"Done","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a2209ec4f95c072aaf821aef1dce87cb897a02e","unresolved":true,"context_lines":[{"line_number":635,"context_line":"                chunk_validator \u003d trailer_validator \u003d None"},{"line_number":636,"context_line":"            else:"},{"line_number":637,"context_line":"                chunk_validator \u003d self.sig_checker.check_chunk_signature"},{"line_number":638,"context_line":"                trailer_validator \u003d self.sig_checker.check_trailer_signature"},{"line_number":639,"context_line":"            decoded_content_length \u003d int(self.headers.get("},{"line_number":640,"context_line":"                \u0027x-amz-decoded-content-length\u0027))"},{"line_number":641,"context_line":"            expected_trailers \u003d set()"}],"source_content_type":"text/x-python","patch_set":57,"id":"7e885b0c_53e9bbc7","line":638,"updated":"2025-02-18 16:56:25.000000000","message":"apart from some test churn, it might make sense to pass ``self.sig_checker`` to the StreamingInput and have it just call the chunk/trailer methods.","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a78c6dcc524a8f7b8c3c4993b973002f508cbfc","unresolved":false,"context_lines":[{"line_number":635,"context_line":"                chunk_validator \u003d trailer_validator \u003d None"},{"line_number":636,"context_line":"            else:"},{"line_number":637,"context_line":"                chunk_validator \u003d self.sig_checker.check_chunk_signature"},{"line_number":638,"context_line":"                trailer_validator \u003d self.sig_checker.check_trailer_signature"},{"line_number":639,"context_line":"            decoded_content_length \u003d int(self.headers.get("},{"line_number":640,"context_line":"                \u0027x-amz-decoded-content-length\u0027))"},{"line_number":641,"context_line":"            expected_trailers \u003d set()"}],"source_content_type":"text/x-python","patch_set":57,"id":"e61e464f_28cf449b","line":638,"in_reply_to":"7e885b0c_53e9bbc7","updated":"2025-04-21 22:36:30.000000000","message":"Done","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a2209ec4f95c072aaf821aef1dce87cb897a02e","unresolved":true,"context_lines":[{"line_number":656,"context_line":"                    expected_trailers.add(trailer)"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"                if aws_sha256 \u003d\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027:"},{"line_number":659,"context_line":"                    expected_trailers.add(\u0027x-amz-trailer-signature\u0027)"},{"line_number":660,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d StreamingInput("},{"line_number":661,"context_line":"                self.environ[\u0027wsgi.input\u0027],"},{"line_number":662,"context_line":"                decoded_content_length,"}],"source_content_type":"text/x-python","patch_set":57,"id":"15c7dca4_3771a59b","line":659,"updated":"2025-02-18 16:56:25.000000000","message":"should this not already be covered in _validate_headers or validate_sha256 i.e. if ``\u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027`` then ``x-amz-trailer`` must include ``x-amz-trailer-signature`` which would in turn mandate it being found in trailers?","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7c05f160c9d300ff45e2267aea8f3488ef0268e","unresolved":true,"context_lines":[{"line_number":656,"context_line":"                    expected_trailers.add(trailer)"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"                if aws_sha256 \u003d\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027:"},{"line_number":659,"context_line":"                    expected_trailers.add(\u0027x-amz-trailer-signature\u0027)"},{"line_number":660,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d StreamingInput("},{"line_number":661,"context_line":"                self.environ[\u0027wsgi.input\u0027],"},{"line_number":662,"context_line":"                decoded_content_length,"}],"source_content_type":"text/x-python","patch_set":57,"id":"6ef9a752_4acb47cf","line":659,"in_reply_to":"15c7dca4_3771a59b","updated":"2025-02-18 21:14:19.000000000","message":"It\u0027s not necessarily included! [And AWS\u0027s examples don\u0027t include it, either](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming-trailers.html).\n\nCome to think of it, I should try a cross-compat test that *does* include it; so far none do.","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":656,"context_line":"                    expected_trailers.add(trailer)"},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"                if aws_sha256 \u003d\u003d \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\u0027:"},{"line_number":659,"context_line":"                    expected_trailers.add(\u0027x-amz-trailer-signature\u0027)"},{"line_number":660,"context_line":"            self.environ[\u0027wsgi.input\u0027] \u003d StreamingInput("},{"line_number":661,"context_line":"                self.environ[\u0027wsgi.input\u0027],"},{"line_number":662,"context_line":"                decoded_content_length,"}],"source_content_type":"text/x-python","patch_set":57,"id":"8534ca00_1a649f97","line":659,"in_reply_to":"6ef9a752_4acb47cf","updated":"2025-02-26 18:24:09.000000000","message":"Turns out, trying to send it results in `The value specified in the x-amz-trailer header is not supported`\n\nAdded a test for it -- and it already passes!","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"293cb45ded0910e41a842ed8fb5a23a20aabf424","unresolved":true,"context_lines":[{"line_number":190,"context_line":"            size \u003d self.to_read"},{"line_number":191,"context_line":"        chunk \u003d self._input.read(size)"},{"line_number":192,"context_line":"        self.to_read -\u003d len(chunk)"},{"line_number":193,"context_line":"        self._sha256.update(chunk)"},{"line_number":194,"context_line":"        if self.to_read \u003d\u003d 0:"},{"line_number":195,"context_line":"            if self._validator and not self._validator("},{"line_number":196,"context_line":"                    self._sha256.hexdigest(), self._signature):"}],"source_content_type":"text/x-python","patch_set":58,"id":"aef2054b_f7f602cf","line":193,"range":{"start_line":193,"start_character":8,"end_line":193,"end_character":34},"updated":"2025-02-26 16:32:07.000000000","message":"IIUC we only use the sha256 is there is self._validator, which is not set for \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027\n\nso we could skip the updates when not necessary","commit_id":"baa4a10091c5d6f841b88344db0d8adaa47721b9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            size \u003d self.to_read"},{"line_number":191,"context_line":"        chunk \u003d self._input.read(size)"},{"line_number":192,"context_line":"        self.to_read -\u003d len(chunk)"},{"line_number":193,"context_line":"        self._sha256.update(chunk)"},{"line_number":194,"context_line":"        if self.to_read \u003d\u003d 0:"},{"line_number":195,"context_line":"            if self._validator and not self._validator("},{"line_number":196,"context_line":"                    self._sha256.hexdigest(), self._signature):"}],"source_content_type":"text/x-python","patch_set":58,"id":"2d82f4ee_75cf0166","line":193,"range":{"start_line":193,"start_character":8,"end_line":193,"end_character":34},"in_reply_to":"aef2054b_f7f602cf","updated":"2025-02-26 18:24:09.000000000","message":"Done","commit_id":"baa4a10091c5d6f841b88344db0d8adaa47721b9"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3fe02cde53d3dc36e4dcf9854c6972718f8a1468","unresolved":true,"context_lines":[{"line_number":568,"context_line":"    if not parts[0] or len(parts) !\u003d 5:"},{"line_number":569,"context_line":"        raise AccessDenied(reason\u003d\u0027invalid_credential\u0027)"},{"line_number":570,"context_line":"    return dict(zip([\u0027access\u0027, \u0027date\u0027, \u0027region\u0027, \u0027service\u0027, \u0027terminal\u0027],"},{"line_number":571,"context_line":"                    parts))"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"class SigV4Mixin(object):"}],"source_content_type":"text/x-python","patch_set":63,"id":"0548cdd1_225dca0a","line":571,"updated":"2025-04-02 04:16:58.000000000","message":"Cool, there is always another way to create a dict :P","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":568,"context_line":"    if not parts[0] or len(parts) !\u003d 5:"},{"line_number":569,"context_line":"        raise AccessDenied(reason\u003d\u0027invalid_credential\u0027)"},{"line_number":570,"context_line":"    return dict(zip([\u0027access\u0027, \u0027date\u0027, \u0027region\u0027, \u0027service\u0027, \u0027terminal\u0027],"},{"line_number":571,"context_line":"                    parts))"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"class SigV4Mixin(object):"}],"source_content_type":"text/x-python","patch_set":63,"id":"bfb7361a_bcfec0a2","line":571,"in_reply_to":"0548cdd1_225dca0a","updated":"2025-04-02 14:19:50.000000000","message":"Acknowledged","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3fe02cde53d3dc36e4dcf9854c6972718f8a1468","unresolved":true,"context_lines":[{"line_number":1263,"context_line":""},{"line_number":1264,"context_line":"        looks_like_sha256 \u003d ("},{"line_number":1265,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":1266,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":1267,"context_line":"        if aws_sha256 \u003d\u003d \u0027UNSIGNED-PAYLOAD\u0027:"},{"line_number":1268,"context_line":"            pass"},{"line_number":1269,"context_line":"        elif aws_sha256 in ("}],"source_content_type":"text/x-python","patch_set":63,"id":"41a8cdf7_1a762dd7","line":1266,"updated":"2025-04-02 04:16:58.000000000","message":"OK so `\u0027x-amz-content-sha256` can have the hash, but IS NOT base64 encoded BUT when you supply the hash in `x-amz-checksum-sha256` it is to be base64 encoded.\n\n```\nx-amz-checksum-sha256\nThis header can be used as a data integrity check to verify that the data received is the same data that was originally sent. This header specifies the Base64 encoded, 256-bit SHA256 digest of the object. For more information, see Checking object integrity in the Amazon S3 User Guide.\n```\nMake up your bloddy mind aws!\n\nSo I guess this will always be 64 and never have the padding \u0027\u003d\u0027 char in it.","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1263,"context_line":""},{"line_number":1264,"context_line":"        looks_like_sha256 \u003d ("},{"line_number":1265,"context_line":"            aws_sha256 and len(aws_sha256) \u003d\u003d 64 and"},{"line_number":1266,"context_line":"            all(c in \u00270123456789abcdef\u0027 for c in aws_sha256.lower()))"},{"line_number":1267,"context_line":"        if aws_sha256 \u003d\u003d \u0027UNSIGNED-PAYLOAD\u0027:"},{"line_number":1268,"context_line":"            pass"},{"line_number":1269,"context_line":"        elif aws_sha256 in ("}],"source_content_type":"text/x-python","patch_set":63,"id":"0d554d4e_fc36fe91","line":1266,"in_reply_to":"41a8cdf7_1a762dd7","updated":"2025-04-02 14:19:50.000000000","message":"yes it can get confusing!","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3fe02cde53d3dc36e4dcf9854c6972718f8a1468","unresolved":true,"context_lines":[{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"        try:"},{"line_number":1922,"context_line":"            with self.translate_read_errors():"},{"line_number":1923,"context_line":"                sw_resp \u003d sw_req.get_response(app)"},{"line_number":1924,"context_line":"        finally:"},{"line_number":1925,"context_line":"            # reuse account"},{"line_number":1926,"context_line":"            _, self.account, _ \u003d split_path(sw_req.environ[\u0027PATH_INFO\u0027],"}],"source_content_type":"text/x-python","patch_set":63,"id":"4b673609_e357e30c","line":1923,"updated":"2025-04-02 04:16:58.000000000","message":"Lol, kinda a clever use of a context manager!","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"        try:"},{"line_number":1922,"context_line":"            with self.translate_read_errors():"},{"line_number":1923,"context_line":"                sw_resp \u003d sw_req.get_response(app)"},{"line_number":1924,"context_line":"        finally:"},{"line_number":1925,"context_line":"            # reuse account"},{"line_number":1926,"context_line":"            _, self.account, _ \u003d split_path(sw_req.environ[\u0027PATH_INFO\u0027],"}],"source_content_type":"text/x-python","patch_set":63,"id":"cc167f71_7dc5d57e","line":1923,"in_reply_to":"4b673609_e357e30c","updated":"2025-04-02 14:19:50.000000000","message":"Acknowledged","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9280a5aba89f56fba97fa6bc378a8e570ba9a8c4","unresolved":true,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class ChunkReader:"},{"line_number":191,"context_line":"    def __init__(self, reader, chunk_length, validator, chunk_signature):"},{"line_number":192,"context_line":"        self._input \u003d reader"},{"line_number":193,"context_line":"        self.original_chunk_length \u003d self.to_read \u003d chunk_length"},{"line_number":194,"context_line":"        self._validator \u003d validator"}],"source_content_type":"text/x-python","patch_set":73,"id":"a9972ba3_d3571ff0","line":191,"updated":"2025-04-17 15:37:01.000000000","message":"nit: the caller uses ``chunk_size``","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class ChunkReader:"},{"line_number":191,"context_line":"    def __init__(self, reader, chunk_length, validator, chunk_signature):"},{"line_number":192,"context_line":"        self._input \u003d reader"},{"line_number":193,"context_line":"        self.original_chunk_length \u003d self.to_read \u003d chunk_length"},{"line_number":194,"context_line":"        self._validator \u003d validator"}],"source_content_type":"text/x-python","patch_set":73,"id":"9d63f20a_d9837913","line":191,"in_reply_to":"a9972ba3_d3571ff0","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":211,"context_line":"            if self.original_chunk_length !\u003d 0:"},{"line_number":212,"context_line":"                if self._input.read(2) !\u003d b\u0027\\r\\n\u0027:"},{"line_number":213,"context_line":"                    self.close()"},{"line_number":214,"context_line":"                    raise S3InputIncomplete"},{"line_number":215,"context_line":"        return chunk"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def close(self):"}],"source_content_type":"text/x-python","patch_set":73,"id":"b159fe79_d1bd3d81","line":214,"updated":"2025-04-16 18:09:08.000000000","message":"seems slightly inconsistent that the StreamingInput reads the chunk header but the ChunkReader reads the chunk separator","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            if self.original_chunk_length !\u003d 0:"},{"line_number":212,"context_line":"                if self._input.read(2) !\u003d b\u0027\\r\\n\u0027:"},{"line_number":213,"context_line":"                    self.close()"},{"line_number":214,"context_line":"                    raise S3InputIncomplete"},{"line_number":215,"context_line":"        return chunk"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def close(self):"}],"source_content_type":"text/x-python","patch_set":73,"id":"10fea64e_7a40d8d9","line":214,"in_reply_to":"749dc022_51546c0a","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9280a5aba89f56fba97fa6bc378a8e570ba9a8c4","unresolved":true,"context_lines":[{"line_number":211,"context_line":"            if self.original_chunk_length !\u003d 0:"},{"line_number":212,"context_line":"                if self._input.read(2) !\u003d b\u0027\\r\\n\u0027:"},{"line_number":213,"context_line":"                    self.close()"},{"line_number":214,"context_line":"                    raise S3InputIncomplete"},{"line_number":215,"context_line":"        return chunk"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def close(self):"}],"source_content_type":"text/x-python","patch_set":73,"id":"749dc022_51546c0a","line":214,"in_reply_to":"b159fe79_d1bd3d81","updated":"2025-04-17 15:37:01.000000000","message":"Also, we have the complementary condition at lines 325-326\n\n```\nif self._chunk_reader.to_read \u003d\u003d 0:\n                if self._chunk_reader.original_chunk_length \u003d\u003d 0:\n                    self._complete_payload \u003d True\n```\n\nso this separator check could be done in an ``else`` clause at line 327","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9280a5aba89f56fba97fa6bc378a8e570ba9a8c4","unresolved":true,"context_lines":[{"line_number":222,"context_line":"    \"\"\""},{"line_number":223,"context_line":"    wsgi.input wrapper to verify the chunk of the input as it\u0027s read."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    def __init__(self, reader, decoded_content_length,"},{"line_number":226,"context_line":"                 expected_trailers, sig_checker):"},{"line_number":227,"context_line":"        self._input \u003d reader"},{"line_number":228,"context_line":"        self._sig_checker \u003d sig_checker"}],"source_content_type":"text/x-python","patch_set":73,"id":"eb5be703_426330e7","line":225,"range":{"start_line":225,"start_character":23,"end_line":225,"end_character":29},"updated":"2025-04-17 15:37:01.000000000","message":"nit: this is the only place the term \u0027reader\u0027 is used as opposed to \u0027input\u0027","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6e04eaf69adac7a4b88f0cdb8f2cb5b6f515614f","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    \"\"\""},{"line_number":223,"context_line":"    wsgi.input wrapper to verify the chunk of the input as it\u0027s read."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    def __init__(self, reader, decoded_content_length,"},{"line_number":226,"context_line":"                 expected_trailers, sig_checker):"},{"line_number":227,"context_line":"        self._input \u003d reader"},{"line_number":228,"context_line":"        self._sig_checker \u003d sig_checker"}],"source_content_type":"text/x-python","patch_set":73,"id":"1f607903_a0f21a14","line":225,"range":{"start_line":225,"start_character":23,"end_line":225,"end_character":29},"in_reply_to":"1b4d2276_19e32e1c","updated":"2025-04-23 08:57:19.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":true,"context_lines":[{"line_number":222,"context_line":"    \"\"\""},{"line_number":223,"context_line":"    wsgi.input wrapper to verify the chunk of the input as it\u0027s read."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    def __init__(self, reader, decoded_content_length,"},{"line_number":226,"context_line":"                 expected_trailers, sig_checker):"},{"line_number":227,"context_line":"        self._input \u003d reader"},{"line_number":228,"context_line":"        self._sig_checker \u003d sig_checker"}],"source_content_type":"text/x-python","patch_set":73,"id":"1b4d2276_19e32e1c","line":225,"range":{"start_line":225,"start_character":23,"end_line":225,"end_character":29},"in_reply_to":"6d8302a9_39bc54e7","updated":"2025-04-22 10:17:52.000000000","message":"oh, wait, nor would I want to shadow ``input`` 😞  ``wsgi_input`` would be better","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a78c6dcc524a8f7b8c3c4993b973002f508cbfc","unresolved":true,"context_lines":[{"line_number":222,"context_line":"    \"\"\""},{"line_number":223,"context_line":"    wsgi.input wrapper to verify the chunk of the input as it\u0027s read."},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    def __init__(self, reader, decoded_content_length,"},{"line_number":226,"context_line":"                 expected_trailers, sig_checker):"},{"line_number":227,"context_line":"        self._input \u003d reader"},{"line_number":228,"context_line":"        self._sig_checker \u003d sig_checker"}],"source_content_type":"text/x-python","patch_set":73,"id":"6d8302a9_39bc54e7","line":225,"range":{"start_line":225,"start_character":23,"end_line":225,"end_character":29},"in_reply_to":"eb5be703_426330e7","updated":"2025-04-21 22:36:30.000000000","message":"I suppose a decent part of it was that I didn\u0027t want to shadow the built-in `input`, but w/e","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9280a5aba89f56fba97fa6bc378a8e570ba9a8c4","unresolved":true,"context_lines":[{"line_number":231,"context_line":"        # exactly at the trailers (if present)"},{"line_number":232,"context_line":"        self._to_read \u003d decoded_content_length"},{"line_number":233,"context_line":"        # Original payload length, used for error messages"},{"line_number":234,"context_line":"        self._original_to_read \u003d self._to_read"},{"line_number":235,"context_line":"        # Reader for the current chunk that\u0027s in progress"},{"line_number":236,"context_line":"        self._chunk_reader \u003d None"},{"line_number":237,"context_line":"        # Track the chunk number, for error messages"}],"source_content_type":"text/x-python","patch_set":73,"id":"42259490_ea493157","line":234,"range":{"start_line":234,"start_character":13,"end_line":234,"end_character":30},"updated":"2025-04-17 15:37:01.000000000","message":"nit: for clarity we could just continue to call this decoded_content_length?","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        # exactly at the trailers (if present)"},{"line_number":232,"context_line":"        self._to_read \u003d decoded_content_length"},{"line_number":233,"context_line":"        # Original payload length, used for error messages"},{"line_number":234,"context_line":"        self._original_to_read \u003d self._to_read"},{"line_number":235,"context_line":"        # Reader for the current chunk that\u0027s in progress"},{"line_number":236,"context_line":"        self._chunk_reader \u003d None"},{"line_number":237,"context_line":"        # Track the chunk number, for error messages"}],"source_content_type":"text/x-python","patch_set":73,"id":"200c27c6_07c570b5","line":234,"range":{"start_line":234,"start_character":13,"end_line":234,"end_character":30},"in_reply_to":"42259490_ea493157","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9280a5aba89f56fba97fa6bc378a8e570ba9a8c4","unresolved":true,"context_lines":[{"line_number":237,"context_line":"        # Track the chunk number, for error messages"},{"line_number":238,"context_line":"        self._chunk_number \u003d 0"},{"line_number":239,"context_line":"        # AWS enforces an 8k min chunk size (except the last)"},{"line_number":240,"context_line":"        self._last_chunk_size \u003d None"},{"line_number":241,"context_line":"        # When True, we\u0027ve read the payload, but not necessarily the headers"},{"line_number":242,"context_line":"        self._complete_payload \u003d False"},{"line_number":243,"context_line":"        # Any trailers present after the payload (not available until after"}],"source_content_type":"text/x-python","patch_set":73,"id":"2202faeb_67a0ad1a","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":29},"updated":"2025-04-17 15:37:01.000000000","message":"oh! so this is not the size of the final chunk, it\u0027s the size of the most recently read chunk. That had me confused for a moment. Maybe the comment could say \"(except for final chunk)\".","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        # Track the chunk number, for error messages"},{"line_number":238,"context_line":"        self._chunk_number \u003d 0"},{"line_number":239,"context_line":"        # AWS enforces an 8k min chunk size (except the last)"},{"line_number":240,"context_line":"        self._last_chunk_size \u003d None"},{"line_number":241,"context_line":"        # When True, we\u0027ve read the payload, but not necessarily the headers"},{"line_number":242,"context_line":"        self._complete_payload \u003d False"},{"line_number":243,"context_line":"        # Any trailers present after the payload (not available until after"}],"source_content_type":"text/x-python","patch_set":73,"id":"1d9b381c_119e6954","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":29},"in_reply_to":"2202faeb_67a0ad1a","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9280a5aba89f56fba97fa6bc378a8e570ba9a8c4","unresolved":true,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        if self._complete_payload:"},{"line_number":332,"context_line":"            # read trailers, if present"},{"line_number":333,"context_line":"            if not self._read_trailers:"},{"line_number":334,"context_line":"                if self._expected_trailers:"},{"line_number":335,"context_line":"                    for line in iter(self._input.readline, b\u0027\u0027):"},{"line_number":336,"context_line":"                        if not line.endswith(b\u0027\\r\\n\u0027):"}],"source_content_type":"text/x-python","patch_set":73,"id":"8ad2d2e1_287797ad","line":333,"range":{"start_line":333,"start_character":19,"end_line":333,"end_character":38},"updated":"2025-04-17 15:37:01.000000000","message":"nit: ``_read_trailers`` and ``complete_payload`` are both boolean flags that indicate a stage has been completed...maybe they could have a common naming theme.\n\nAlso, I\u0027d like to suggest breaking out the payload and trailer reading into smaller methods, and ``_read_trailers`` would be a great method name. So perhaps ``_complete_trailers``","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        if self._complete_payload:"},{"line_number":332,"context_line":"            # read trailers, if present"},{"line_number":333,"context_line":"            if not self._read_trailers:"},{"line_number":334,"context_line":"                if self._expected_trailers:"},{"line_number":335,"context_line":"                    for line in iter(self._input.readline, b\u0027\u0027):"},{"line_number":336,"context_line":"                        if not line.endswith(b\u0027\\r\\n\u0027):"}],"source_content_type":"text/x-python","patch_set":73,"id":"a685d486_93b1a6ff","line":333,"range":{"start_line":333,"start_character":19,"end_line":333,"end_character":38},"in_reply_to":"8ad2d2e1_287797ad","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9280a5aba89f56fba97fa6bc378a8e570ba9a8c4","unresolved":true,"context_lines":[{"line_number":343,"context_line":"                        self.trailers[key.strip()] \u003d value.strip()"},{"line_number":344,"context_line":"                    if \u0027x-amz-trailer-signature\u0027 in self._expected_trailers \\"},{"line_number":345,"context_line":"                            and \u0027x-amz-trailer-signature\u0027 not in self.trailers:"},{"line_number":346,"context_line":"                        raise S3InputIncomplete"},{"line_number":347,"context_line":"                    if set(self.trailers.keys()) !\u003d self._expected_trailers:"},{"line_number":348,"context_line":"                        raise S3InputMalformedTrailer"},{"line_number":349,"context_line":"                    if \u0027x-amz-trailer-signature\u0027 in self._expected_trailers \\"}],"source_content_type":"text/x-python","patch_set":73,"id":"3837844b_a0d47ad2","line":346,"updated":"2025-04-17 15:37:01.000000000","message":"we\u0027re not calling close() in these error cases - maybe we should have an outer try/except and call close in one place?","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":343,"context_line":"                        self.trailers[key.strip()] \u003d value.strip()"},{"line_number":344,"context_line":"                    if \u0027x-amz-trailer-signature\u0027 in self._expected_trailers \\"},{"line_number":345,"context_line":"                            and \u0027x-amz-trailer-signature\u0027 not in self.trailers:"},{"line_number":346,"context_line":"                        raise S3InputIncomplete"},{"line_number":347,"context_line":"                    if set(self.trailers.keys()) !\u003d self._expected_trailers:"},{"line_number":348,"context_line":"                        raise S3InputMalformedTrailer"},{"line_number":349,"context_line":"                    if \u0027x-amz-trailer-signature\u0027 in self._expected_trailers \\"}],"source_content_type":"text/x-python","patch_set":73,"id":"505786fe_7dff147f","line":346,"in_reply_to":"3837844b_a0d47ad2","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    @property"},{"line_number":599,"context_line":"    def _is_x_amz_content_sha256_required(self):"},{"line_number":600,"context_line":"        return not self._is_query_auth"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"    @property"},{"line_number":603,"context_line":"    def timestamp(self):"}],"source_content_type":"text/x-python","patch_set":73,"id":"850edc34_edbbd057","line":600,"updated":"2025-04-16 18:09:08.000000000","message":"TIL we also have ``_is_header_auth`` so we can avoid the ``not``...unless the two are not mutually exclusive?\n\nUpdate: ugh, I\u0027ve not found anything yet that guarantees ``_is_header_auth !\u003d _is_query_auth`` i.e. no validation that a request doesn\u0027t have auth in query and headers.\n\nAnd _is_query_auth trumps _is_header_auth, so I guess we should stick with that for testing the authoritative type of auth.","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":597,"context_line":""},{"line_number":598,"context_line":"    @property"},{"line_number":599,"context_line":"    def _is_x_amz_content_sha256_required(self):"},{"line_number":600,"context_line":"        return not self._is_query_auth"},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"    @property"},{"line_number":603,"context_line":"    def timestamp(self):"}],"source_content_type":"text/x-python","patch_set":73,"id":"79549224_e59b47cf","line":600,"in_reply_to":"850edc34_edbbd057","updated":"2025-04-22 10:17:52.000000000","message":"Acknowledged","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    @property"},{"line_number":1077,"context_line":"    def _is_streaming_supported(self):"},{"line_number":1078,"context_line":"        return self._is_x_amz_content_sha256_required"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    def _parse_host(self):"},{"line_number":1081,"context_line":"        if not self.conf.storage_domains:"}],"source_content_type":"text/x-python","patch_set":73,"id":"867050ea_d7a22870","line":1078,"updated":"2025-04-16 18:09:08.000000000","message":"I\u0027m having second thoughts about this, because it\u0027s obscuring the requirement to be a sigv4 request. I wonder whether it would be more helpful to be more explicit in the ONE place this property is used in _validate_sha256 by writing something like\n\n```\nif not isinstance(self, SigV4Mixin) or self._is_query_auth:\n   \n```","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01b77abda3199fe2354a2d2c06fa3bfd493acdd7","unresolved":false,"context_lines":[{"line_number":1075,"context_line":""},{"line_number":1076,"context_line":"    @property"},{"line_number":1077,"context_line":"    def _is_streaming_supported(self):"},{"line_number":1078,"context_line":"        return self._is_x_amz_content_sha256_required"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    def _parse_host(self):"},{"line_number":1081,"context_line":"        if not self.conf.storage_domains:"}],"source_content_type":"text/x-python","patch_set":73,"id":"4d72447f_627aa871","line":1078,"in_reply_to":"867050ea_d7a22870","updated":"2025-04-28 19:52:48.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":1239,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":1240,"context_line":"                                      decoded_content_length)"},{"line_number":1241,"context_line":""},{"line_number":1242,"context_line":"            if not self._is_streaming_supported:"},{"line_number":1243,"context_line":"                if decoded_content_length \u003c (self.content_length or 0):"},{"line_number":1244,"context_line":"                    raise IncompleteBody("},{"line_number":1245,"context_line":"                        number_bytes_expected\u003ddecoded_content_length,"}],"source_content_type":"text/x-python","patch_set":73,"id":"816a9207_359a4d2a","line":1242,"updated":"2025-04-16 18:09:08.000000000","message":"see earlier comment, I\u0027m starting to think I\u0027d rather be explicit:\n\n```\nif not isinstance(self, SigV4Mixin) or self._is_query_auth:\n```","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01b77abda3199fe2354a2d2c06fa3bfd493acdd7","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"                raise InvalidArgument(\u0027x-amz-decoded-content-length\u0027,"},{"line_number":1240,"context_line":"                                      decoded_content_length)"},{"line_number":1241,"context_line":""},{"line_number":1242,"context_line":"            if not self._is_streaming_supported:"},{"line_number":1243,"context_line":"                if decoded_content_length \u003c (self.content_length or 0):"},{"line_number":1244,"context_line":"                    raise IncompleteBody("},{"line_number":1245,"context_line":"                        number_bytes_expected\u003ddecoded_content_length,"}],"source_content_type":"text/x-python","patch_set":73,"id":"95161e68_acd1fecc","line":1242,"in_reply_to":"816a9207_359a4d2a","updated":"2025-04-28 19:52:48.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":1973,"context_line":"        if status \u003d\u003d HTTP_UNPROCESSABLE_ENTITY:"},{"line_number":1974,"context_line":"            # We rely on the object server (or, for EC, the proxy-server app)"},{"line_number":1975,"context_line":"            # to validate the MD5 of uploaded data"},{"line_number":1976,"context_line":"            raise BadDigest()"},{"line_number":1977,"context_line":"        if status \u003d\u003d HTTP_FORBIDDEN:"},{"line_number":1978,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"},{"line_number":1979,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"}],"source_content_type":"text/x-python","patch_set":73,"id":"47b35017_18239a0d","line":1976,"updated":"2025-04-16 18:09:08.000000000","message":"I\u0027m not sure why this addition was needed - it looks like we\u0027re handling HTTP_UNPROCESSABLE_ENTITY (at least for object PUT) in _swift_error_codes since https://review.opendev.org/c/openstack/swift/+/920206 so would we ever get here?","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":1973,"context_line":"        if status \u003d\u003d HTTP_UNPROCESSABLE_ENTITY:"},{"line_number":1974,"context_line":"            # We rely on the object server (or, for EC, the proxy-server app)"},{"line_number":1975,"context_line":"            # to validate the MD5 of uploaded data"},{"line_number":1976,"context_line":"            raise BadDigest()"},{"line_number":1977,"context_line":"        if status \u003d\u003d HTTP_FORBIDDEN:"},{"line_number":1978,"context_line":"            raise AccessDenied(reason\u003d\u0027forbidden\u0027)"},{"line_number":1979,"context_line":"        if status \u003d\u003d HTTP_REQUESTED_RANGE_NOT_SATISFIABLE:"}],"source_content_type":"text/x-python","patch_set":73,"id":"a90c6b3a_32d67c1e","line":1976,"in_reply_to":"47b35017_18239a0d","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":true,"context_lines":[{"line_number":192,"context_line":"    wsgi.input wrapper to read a single chunk from a chunked input and validate"},{"line_number":193,"context_line":"    it\u0027s signature."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    :param input: a wsgi input."},{"line_number":196,"context_line":"    :param chunk_size: number of bytes to read."},{"line_number":197,"context_line":"    :param validator: function to call to validate the chunk\u0027s content."},{"line_number":198,"context_line":"    :param chunk_signature: signature to validate the chunk."}],"source_content_type":"text/x-python","patch_set":75,"id":"a66a5321_94acdd44","line":195,"range":{"start_line":195,"start_character":11,"end_line":195,"end_character":16},"updated":"2025-04-22 10:17:52.000000000","message":"my bad - should be ``wsgi_input`` to not shadow builtin and be consistent with the parent class","commit_id":"30afd0b7a01169f4aa605a1a982bf6e0e8387406"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6e04eaf69adac7a4b88f0cdb8f2cb5b6f515614f","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    wsgi.input wrapper to read a single chunk from a chunked input and validate"},{"line_number":193,"context_line":"    it\u0027s signature."},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    :param input: a wsgi input."},{"line_number":196,"context_line":"    :param chunk_size: number of bytes to read."},{"line_number":197,"context_line":"    :param validator: function to call to validate the chunk\u0027s content."},{"line_number":198,"context_line":"    :param chunk_signature: signature to validate the chunk."}],"source_content_type":"text/x-python","patch_set":75,"id":"a09faa59_d1619b37","line":195,"range":{"start_line":195,"start_character":11,"end_line":195,"end_character":16},"in_reply_to":"a66a5321_94acdd44","updated":"2025-04-23 08:57:19.000000000","message":"Done","commit_id":"30afd0b7a01169f4aa605a1a982bf6e0e8387406"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"01c155094918e746cd14bc223442a277ba692088","unresolved":true,"context_lines":[{"line_number":514,"context_line":"            self.req.timestamp.amz_date_format.encode(\u0027ascii\u0027),"},{"line_number":515,"context_line":"            \u0027/\u0027.join(self.req.scope.values()).encode(\u0027utf8\u0027),"},{"line_number":516,"context_line":"            self.signature.encode(\u0027utf8\u0027),"},{"line_number":517,"context_line":"            sha256(b\u0027\u0027).hexdigest().encode(\u0027utf8\u0027),"},{"line_number":518,"context_line":"            data_sha256.encode(\u0027utf8\u0027)"},{"line_number":519,"context_line":"        ])"},{"line_number":520,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"b670d687_5bb85a4b","line":517,"range":{"start_line":517,"start_character":12,"end_line":517,"end_character":51},"updated":"2025-05-13 09:06:37.000000000","message":"i\u0027m like WTF, sha256 of an empty string.. but sure enough it is... still WTF but its correct!!","commit_id":"b236cd5fe95e49a52e5b169994f1c7898e2475af"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d20f988a5b404f3e380825d5691ab94858df8193","unresolved":true,"context_lines":[{"line_number":514,"context_line":"            self.req.timestamp.amz_date_format.encode(\u0027ascii\u0027),"},{"line_number":515,"context_line":"            \u0027/\u0027.join(self.req.scope.values()).encode(\u0027utf8\u0027),"},{"line_number":516,"context_line":"            self.signature.encode(\u0027utf8\u0027),"},{"line_number":517,"context_line":"            sha256(b\u0027\u0027).hexdigest().encode(\u0027utf8\u0027),"},{"line_number":518,"context_line":"            data_sha256.encode(\u0027utf8\u0027)"},{"line_number":519,"context_line":"        ])"},{"line_number":520,"context_line":""}],"source_content_type":"text/x-python","patch_set":77,"id":"8395203a_664d7afd","line":517,"range":{"start_line":517,"start_character":12,"end_line":517,"end_character":51},"in_reply_to":"b670d687_5bb85a4b","updated":"2025-05-13 18:37:41.000000000","message":"Yeah, it\u0027s _such_ a [weird protocol](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#sigv4-chunked-body-definition). We could probably pull this out as a constant and save a little CPU -- but I expect the effect is negligible.","commit_id":"b236cd5fe95e49a52e5b169994f1c7898e2475af"}],"swift/common/middleware/s3api/s3response.py":[{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"92056ae4af8181498f2ae6291d4fe7903132b6ed","unresolved":true,"context_lines":[{"line_number":456,"context_line":"    _msg \u003d \u0027The request is not valid with the current state of the bucket.\u0027"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"class InvalidChunkSizeError(ErrorResponse):"},{"line_number":460,"context_line":"    _status \u003d \u0027403 Forbidden\u0027"},{"line_number":461,"context_line":"    _msg \u003d \u0027Only the last chunk is allowed to have a size less than 8192 bytes\u0027"},{"line_number":462,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"8c93a06b_4d083ebd","line":459,"updated":"2024-11-04 21:44:40.000000000","message":"I think the status of this error should be `400 Bad Request and the msg for the error is as follows:\n```\nchunk too big: choose chunk size \u003c\u003d 16MiB\n```\n\nbut we might need a cross-compat test to verify that that is the case","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3d12638d1815d137225ef3120158edcbba6f697a","unresolved":true,"context_lines":[{"line_number":456,"context_line":"    _msg \u003d \u0027The request is not valid with the current state of the bucket.\u0027"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"class InvalidChunkSizeError(ErrorResponse):"},{"line_number":460,"context_line":"    _status \u003d \u0027403 Forbidden\u0027"},{"line_number":461,"context_line":"    _msg \u003d \u0027Only the last chunk is allowed to have a size less than 8192 bytes\u0027"},{"line_number":462,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"937d6d1c_080f1b54","line":459,"in_reply_to":"8c93a06b_4d083ebd","updated":"2025-02-10 22:41:42.000000000","message":"No; this doesn\u0027t cover the too-large case -- in fact, as best I can tell, you can\u0027t get AWS to balk that the chunk size is too large. This is for too-small, and strangely enough, it\u0027s a 403.","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"bf344e63a9d27e6a936e67a0617f72faa657b856","unresolved":false,"context_lines":[{"line_number":456,"context_line":"    _msg \u003d \u0027The request is not valid with the current state of the bucket.\u0027"},{"line_number":457,"context_line":""},{"line_number":458,"context_line":""},{"line_number":459,"context_line":"class InvalidChunkSizeError(ErrorResponse):"},{"line_number":460,"context_line":"    _status \u003d \u0027403 Forbidden\u0027"},{"line_number":461,"context_line":"    _msg \u003d \u0027Only the last chunk is allowed to have a size less than 8192 bytes\u0027"},{"line_number":462,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"fb41551b_1c7d6d85","line":459,"in_reply_to":"937d6d1c_080f1b54","updated":"2025-02-12 17:04:40.000000000","message":"Acknowledged","commit_id":"b9746fd0ee6018aa1467e746c2c0d72315866794"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78d2c539e2f444e7a2519ee7f2f87ac9cf207f0f","unresolved":true,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"class InvalidChunkSizeError(ErrorResponse):"},{"line_number":448,"context_line":"    _status \u003d \u0027403 Forbidden\u0027"},{"line_number":449,"context_line":"    _msg \u003d \u0027Only the last chunk is allowed to have a size less than 8192 bytes\u0027"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"21100e53_ed4b1a23","line":448,"updated":"2025-02-14 15:48:55.000000000","message":"**So** weird...","commit_id":"4a8acad77fdeb3adf0f5e5683ff5f4ec04c52412"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"class InvalidChunkSizeError(ErrorResponse):"},{"line_number":448,"context_line":"    _status \u003d \u0027403 Forbidden\u0027"},{"line_number":449,"context_line":"    _msg \u003d \u0027Only the last chunk is allowed to have a size less than 8192 bytes\u0027"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":""}],"source_content_type":"text/x-python","patch_set":55,"id":"ef870c4e_dda15c7b","line":448,"in_reply_to":"21100e53_ed4b1a23","updated":"2025-02-26 18:24:09.000000000","message":"Acknowledged","commit_id":"4a8acad77fdeb3adf0f5e5683ff5f4ec04c52412"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":395,"context_line":"class IncompleteBody(ErrorResponse):"},{"line_number":396,"context_line":"    _status \u003d \u0027400 Bad Request\u0027"},{"line_number":397,"context_line":"    _msg \u003d \u0027You did not provide the number of bytes specified by the \u0027 \\"},{"line_number":398,"context_line":"           \u0027Content-Length HTTP header\u0027"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"class IncorrectNumberOfFilesInPostRequest(ErrorResponse):"}],"source_content_type":"text/x-python","patch_set":73,"id":"b6e2ff41_371ad2f2","line":398,"updated":"2025-04-16 18:09:08.000000000","message":"ok, so it turns out that the one place this is asserted is in a helper ``assertIncompleteBody`` that was already on master (since https://review.opendev.org/c/openstack/swift/+/920206/11/test/s3api/test_input_errors.py) but never previously called. This patch actually adds tests that use ``assertIncompleteBody`` so now we need to fix the message.\n\ncompat tests in test_input_errors.py DO fail if I restore the period ``.``","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01b77abda3199fe2354a2d2c06fa3bfd493acdd7","unresolved":false,"context_lines":[{"line_number":395,"context_line":"class IncompleteBody(ErrorResponse):"},{"line_number":396,"context_line":"    _status \u003d \u0027400 Bad Request\u0027"},{"line_number":397,"context_line":"    _msg \u003d \u0027You did not provide the number of bytes specified by the \u0027 \\"},{"line_number":398,"context_line":"           \u0027Content-Length HTTP header\u0027"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"class IncorrectNumberOfFilesInPostRequest(ErrorResponse):"}],"source_content_type":"text/x-python","patch_set":73,"id":"f195c132_eecce127","line":398,"in_reply_to":"b6e2ff41_371ad2f2","updated":"2025-04-28 19:52:48.000000000","message":"Acknowledged","commit_id":"162e66a209cfa653d4da93205a36327816c96101"}],"swift/common/middleware/s3api/s3token.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78d2c539e2f444e7a2519ee7f2f87ac9cf207f0f","unresolved":true,"context_lines":[{"line_number":370,"context_line":"                            # us it was valid), but we want to make sure the"},{"line_number":371,"context_line":"                            # secret gets plumbed back into s3api via the"},{"line_number":372,"context_line":"                            # callback for the sake of chunked transfers (which"},{"line_number":373,"context_line":"                            # may require multiple signature validations)"},{"line_number":374,"context_line":"                            memcache_client.set("},{"line_number":375,"context_line":"                                memcache_token_key,"},{"line_number":376,"context_line":"                                (headers, tenant, cred_ref.secret),"}],"source_content_type":"text/x-python","patch_set":55,"id":"2ab68d48_1935e38c","line":373,"updated":"2025-02-14 15:48:55.000000000","message":"Note that this has **not** been functionally validated one way or another.","commit_id":"4a8acad77fdeb3adf0f5e5683ff5f4ec04c52412"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":370,"context_line":"                            # us it was valid), but we want to make sure the"},{"line_number":371,"context_line":"                            # secret gets plumbed back into s3api via the"},{"line_number":372,"context_line":"                            # callback for the sake of chunked transfers (which"},{"line_number":373,"context_line":"                            # may require multiple signature validations)"},{"line_number":374,"context_line":"                            memcache_client.set("},{"line_number":375,"context_line":"                                memcache_token_key,"},{"line_number":376,"context_line":"                                (headers, tenant, cred_ref.secret),"}],"source_content_type":"text/x-python","patch_set":55,"id":"5b875c05_43e1d2d1","line":373,"in_reply_to":"2ab68d48_1935e38c","updated":"2025-02-26 18:24:09.000000000","message":"Tossed for now; we\u0027ll want to address it in a follow-up.","commit_id":"4a8acad77fdeb3adf0f5e5683ff5f4ec04c52412"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                                memcache_token_key,"},{"line_number":376,"context_line":"                                (headers, tenant, cred_ref.secret),"},{"line_number":377,"context_line":"                                time\u003dself._secret_cache_duration)"},{"line_number":378,"context_line":"                            self._logger.debug(\"Cached keystone credentials\")"},{"line_number":379,"context_line":"                    except Exception:"},{"line_number":380,"context_line":"                        self._logger.warning(\"Unable to cache secret\","},{"line_number":381,"context_line":"                                             exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":56,"id":"7261e97b_c328d469","line":378,"updated":"2025-02-14 17:04:50.000000000","message":"we need this, but at the moment there no unit test coverage. Shall we punt to a follow on?\n\nDo we have any zuul functional test that covers s3token/keystone?","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                                memcache_token_key,"},{"line_number":376,"context_line":"                                (headers, tenant, cred_ref.secret),"},{"line_number":377,"context_line":"                                time\u003dself._secret_cache_duration)"},{"line_number":378,"context_line":"                            self._logger.debug(\"Cached keystone credentials\")"},{"line_number":379,"context_line":"                    except Exception:"},{"line_number":380,"context_line":"                        self._logger.warning(\"Unable to cache secret\","},{"line_number":381,"context_line":"                                             exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":56,"id":"acca5cf9_3a2f24fd","line":378,"in_reply_to":"7261e97b_c328d469","updated":"2025-02-18 17:01:31.000000000","message":"The only jobs that cover our in-tree tests with keystone are the DSVM ones; those run the tests under `test/functional/` (not test/s3api), and there are many `SKIPPED: boto 2.x library is not installed` now that devstack is (or defaults to?) running py312.\n\nMaybe we could consider running the cross-compat tests as part of the DSVM job, too?","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8ac49e53700921b6fa03bb3d97c433acee0db62f","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                                memcache_token_key,"},{"line_number":376,"context_line":"                                (headers, tenant, cred_ref.secret),"},{"line_number":377,"context_line":"                                time\u003dself._secret_cache_duration)"},{"line_number":378,"context_line":"                            self._logger.debug(\"Cached keystone credentials\")"},{"line_number":379,"context_line":"                    except Exception:"},{"line_number":380,"context_line":"                        self._logger.warning(\"Unable to cache secret\","},{"line_number":381,"context_line":"                                             exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":56,"id":"3fb63faa_0b289a44","line":378,"in_reply_to":"9e2d7bd1_07789faf","updated":"2025-03-14 01:43:53.000000000","message":"I got https://review.opendev.org/c/openstack/swift/+/942133 passing, though it requires https://review.opendev.org/c/openstack/swift/+/942850 (`Add config option for whether to run s3_acl-requiring tests`), too. Do we want to merge that soon, too?\n\nI think we probably still won\u0027t hit this, though -- there should be plenty of setup/teardown requests that aren\u0027t using aws-chunked to get the token into cache. Maybe we could tack on a follow-up that turns off token caching? IDK that I\u0027d want to actually merge that (tests would take too long), but it\u0027d be an interesting proof-point.","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d7c05f160c9d300ff45e2267aea8f3488ef0268e","unresolved":true,"context_lines":[{"line_number":375,"context_line":"                                memcache_token_key,"},{"line_number":376,"context_line":"                                (headers, tenant, cred_ref.secret),"},{"line_number":377,"context_line":"                                time\u003dself._secret_cache_duration)"},{"line_number":378,"context_line":"                            self._logger.debug(\"Cached keystone credentials\")"},{"line_number":379,"context_line":"                    except Exception:"},{"line_number":380,"context_line":"                        self._logger.warning(\"Unable to cache secret\","},{"line_number":381,"context_line":"                                             exc_info\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":56,"id":"9e2d7bd1_07789faf","line":378,"in_reply_to":"acca5cf9_3a2f24fd","updated":"2025-02-18 21:14:19.000000000","message":"\u003e Maybe we could consider running the cross-compat tests as part of the DSVM job, too?\n\nOK, trying it out in https://review.opendev.org/c/openstack/swift/+/942133\n\nA few complications, though:\n\n- Multiple failures in `test/s3api/test_service.py` unless we enable `s3_acl` (mostly around users being able to see buckets they shouldn\u0027t)\n```\nFAILED test/s3api/test_service.py::TestGetServiceSigV4::test_empty_service - ...\nFAILED test/s3api/test_service.py::TestGetServiceSigV4::test_service_with_buckets\nFAILED test/s3api/test_service.py::TestGetServiceSigV2::test_empty_service - ...\nFAILED test/s3api/test_service.py::TestGetServiceSigV2::test_service_with_buckets\nFAILED test/s3api/test_service.py::TestGetServicePresignedV2::test_empty_service\nFAILED test/s3api/test_service.py::TestGetServicePresignedV2::test_service_with_buckets\nFAILED test/s3api/test_service.py::TestGetServicePresignedV4::test_empty_service\nFAILED test/s3api/test_service.py::TestGetServicePresignedV4::test_service_with_buckets\n```\n- Multiple failures in *both* test suites if we *do* enable `s3_acl` (often trouble with unexpected name translations in ACLs or errors listing versioned objects)\n```\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_bucket [1.076953s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_get_bucket_v2_with_fetch_owner [0.750518s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_get_bucket_with_delimiter [0.626934s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_get_bucket_with_marker [1.205039s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_get_bucket_with_max_keys [1.312747s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_get_bucket_with_multi_char_delimiter [1.107589s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_get_bucket_with_non_ascii_delimiter [1.120959s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_get_bucket_with_prefix [1.223179s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucket.test_put_bucket_error_key2 [0.486503s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_bucket [0.672218s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_get_bucket_v2_with_fetch_owner [1.421203s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_get_bucket_with_delimiter [1.018025s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_get_bucket_with_marker [0.658799s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_get_bucket_with_max_keys [0.706089s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_get_bucket_with_multi_char_delimiter [0.644289s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_get_bucket_with_non_ascii_delimiter [0.733579s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_get_bucket_with_prefix [0.598286s] ... FAILED\ntest.functional.s3api.test_bucket.TestS3ApiBucketSigV4.test_put_bucket_error_key2 [0.194212s] ... FAILED\ntest.functional.s3api.test_xxe_injection.TestS3ApiXxeInjection.test_put_bucket_acl [0.215595s] ... FAILED\n...\nFAILED test/s3api/test_service.py::TestGetServiceSigV4::test_service_with_buckets\nFAILED test/s3api/test_service.py::TestGetServiceSigV2::test_empty_service - ...\nFAILED test/s3api/test_service.py::TestGetServiceSigV2::test_service_with_buckets\nFAILED test/s3api/test_service.py::TestGetServicePresignedV2::test_empty_service\nFAILED test/s3api/test_service.py::TestGetServicePresignedV2::test_service_with_buckets\nFAILED test/s3api/test_service.py::TestGetServicePresignedV4::test_empty_service\nFAILED test/s3api/test_service.py::TestGetServicePresignedV4::test_service_with_buckets\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_copy_object\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_delete_versioned_deletes\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_delete_versioned_objects\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_get_versioned_object\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_get_versioned_object_invalid_params\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_get_versioned_object_key_marker\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_list_objects\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_multipart_upload\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_setup - boto...\nFAILED test/s3api/test_versioning.py::TestObjectVersioning::test_upload_fileobj_versioned\nERROR test/s3api/test_service.py::TestGetServiceSigV4::test_service_with_buckets\nERROR test/s3api/test_service.py::TestGetServiceSigV2::test_empty_service - b...\nERROR test/s3api/test_service.py::TestGetServiceSigV2::test_service_with_buckets\nERROR test/s3api/test_service.py::TestGetServicePresignedV2::test_empty_service\nERROR test/s3api/test_service.py::TestGetServicePresignedV2::test_service_with_buckets\nERROR test/s3api/test_service.py::TestGetServicePresignedV4::test_empty_service\nERROR test/s3api/test_service.py::TestGetServicePresignedV4::test_service_with_buckets\n```\n- As best I can tell, DSVM is the only environment where the gate tests with `s3_acl` off at the moment","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"}],"test/functional/s3api/s3_test_client.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":166,"context_line":"    config \u003d {\u0027addressing_style\u0027: \u0027path\u0027}"},{"line_number":167,"context_line":"    if s3_config:"},{"line_number":168,"context_line":"        config.update(s3_config)"},{"line_number":169,"context_line":"    config \u003d boto3.session.Config(s3\u003dconfig)"},{"line_number":170,"context_line":"    return boto3.client("},{"line_number":171,"context_line":"        \u0027s3\u0027, aws_access_key_id\u003daws_access_key,"},{"line_number":172,"context_line":"        aws_secret_access_key\u003daws_secret_key,"}],"source_content_type":"text/x-python","patch_set":73,"id":"496f37f3_9dee2277","line":169,"updated":"2025-04-16 18:09:08.000000000","message":"IIRC I added this but I don\u0027t think it is needed, see test/s3api/test_object.py","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    config \u003d {\u0027addressing_style\u0027: \u0027path\u0027}"},{"line_number":167,"context_line":"    if s3_config:"},{"line_number":168,"context_line":"        config.update(s3_config)"},{"line_number":169,"context_line":"    config \u003d boto3.session.Config(s3\u003dconfig)"},{"line_number":170,"context_line":"    return boto3.client("},{"line_number":171,"context_line":"        \u0027s3\u0027, aws_access_key_id\u003daws_access_key,"},{"line_number":172,"context_line":"        aws_secret_access_key\u003daws_secret_key,"}],"source_content_type":"text/x-python","patch_set":73,"id":"98f8ac32_f8f66e59","line":169,"in_reply_to":"496f37f3_9dee2277","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"}],"test/functional/s3api/test_object.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5f56ce513927701e01c33f1c46956a8914e8d8bc","unresolved":true,"context_lines":[{"line_number":47,"context_line":"class TestS3ApiObjectBoto3(S3ApiBaseBoto3):"},{"line_number":48,"context_line":"    def setUp(self):"},{"line_number":49,"context_line":"        super().setUp()"},{"line_number":50,"context_line":"        # I\u0027m not sure if this extra config is significant"},{"line_number":51,"context_line":"        s3_config \u003d {\u0027payload_signing_enabled\u0027: True,"},{"line_number":52,"context_line":"                     \u0027request_checksum_calculation\u0027: True}"},{"line_number":53,"context_line":"        self.conn \u003d get_boto3_conn(tf.config[\u0027s3_access_key\u0027],"}],"source_content_type":"text/x-python","patch_set":73,"id":"f6349bb7_7fcf4eb3","line":50,"updated":"2025-04-16 18:09:08.000000000","message":"IIRC I added this but I can\u0027t justify it now - perhaps when I was trying to  provoke older boto3 to use chunked transfer??","commit_id":"162e66a209cfa653d4da93205a36327816c96101"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"92eb42bec2f1130720fee8e0afa7308515c087f1","unresolved":false,"context_lines":[{"line_number":47,"context_line":"class TestS3ApiObjectBoto3(S3ApiBaseBoto3):"},{"line_number":48,"context_line":"    def setUp(self):"},{"line_number":49,"context_line":"        super().setUp()"},{"line_number":50,"context_line":"        # I\u0027m not sure if this extra config is significant"},{"line_number":51,"context_line":"        s3_config \u003d {\u0027payload_signing_enabled\u0027: True,"},{"line_number":52,"context_line":"                     \u0027request_checksum_calculation\u0027: True}"},{"line_number":53,"context_line":"        self.conn \u003d get_boto3_conn(tf.config[\u0027s3_access_key\u0027],"}],"source_content_type":"text/x-python","patch_set":73,"id":"84a8d637_769c6227","line":50,"in_reply_to":"f6349bb7_7fcf4eb3","updated":"2025-04-22 10:17:52.000000000","message":"Done","commit_id":"162e66a209cfa653d4da93205a36327816c96101"}],"test/s3api/__init__.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":36,"context_line":"    logging.getLogger(\u0027botocore\u0027).setLevel(logging.INFO)"},{"line_number":37,"context_line":"else:"},{"line_number":38,"context_line":"    logging.getLogger(\u0027boto3\u0027).setLevel(logging.DEBUG)"},{"line_number":39,"context_line":"    logging.getLogger(\u0027botocore\u0027).setLevel(logging.DEBUG)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ConfigError(Exception):"}],"source_content_type":"text/x-python","patch_set":50,"id":"f46c2403_b19b3143","line":39,"updated":"2025-02-12 18:58:38.000000000","message":"nit: flip the sense of if/else to avoid the not","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    logging.getLogger(\u0027botocore\u0027).setLevel(logging.INFO)"},{"line_number":37,"context_line":"else:"},{"line_number":38,"context_line":"    logging.getLogger(\u0027boto3\u0027).setLevel(logging.DEBUG)"},{"line_number":39,"context_line":"    logging.getLogger(\u0027botocore\u0027).setLevel(logging.DEBUG)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ConfigError(Exception):"}],"source_content_type":"text/x-python","patch_set":50,"id":"79c2c50d_bb4c990f","line":39,"in_reply_to":"f46c2403_b19b3143","updated":"2025-02-13 01:04:12.000000000","message":"I don\u0027t even remember why I did this; reverting.","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":261,"context_line":"class BaseS3TestCaseWithBucket(BaseS3Mixin, unittest.TestCase):"},{"line_number":262,"context_line":"    @classmethod"},{"line_number":263,"context_line":"    def setUpClass(cls):"},{"line_number":264,"context_line":"        cls.bucket_name \u003d cls.create_name(\u0027bucket\u0027)"},{"line_number":265,"context_line":"        client \u003d cls.get_s3_client(1)"},{"line_number":266,"context_line":"        client.create_bucket(Bucket\u003dcls.bucket_name)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"4e615ca7_9f8c8a04","line":264,"updated":"2025-02-14 17:04:50.000000000","message":"is there any significance to this change? if not then it seems unnecessary noise in a large patch","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":261,"context_line":"class BaseS3TestCaseWithBucket(BaseS3Mixin, unittest.TestCase):"},{"line_number":262,"context_line":"    @classmethod"},{"line_number":263,"context_line":"    def setUpClass(cls):"},{"line_number":264,"context_line":"        cls.bucket_name \u003d cls.create_name(\u0027bucket\u0027)"},{"line_number":265,"context_line":"        client \u003d cls.get_s3_client(1)"},{"line_number":266,"context_line":"        client.create_bucket(Bucket\u003dcls.bucket_name)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"c790d5bc_f37afa44","line":264,"in_reply_to":"23828a3e_6a91d755","updated":"2025-02-26 18:24:09.000000000","message":"Done in https://review.opendev.org/c/openstack/swift/+/942310","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"3b42077ebeef0c5f6b66e4145325a4f5e8ff947a","unresolved":false,"context_lines":[{"line_number":261,"context_line":"class BaseS3TestCaseWithBucket(BaseS3Mixin, unittest.TestCase):"},{"line_number":262,"context_line":"    @classmethod"},{"line_number":263,"context_line":"    def setUpClass(cls):"},{"line_number":264,"context_line":"        cls.bucket_name \u003d cls.create_name(\u0027bucket\u0027)"},{"line_number":265,"context_line":"        client \u003d cls.get_s3_client(1)"},{"line_number":266,"context_line":"        client.create_bucket(Bucket\u003dcls.bucket_name)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"898ca8c1_097ae1e8","line":264,"in_reply_to":"23828a3e_6a91d755","updated":"2025-03-01 17:24:17.000000000","message":"Seems we have followed here, ref: 942310: tests: Simplify test bucket name | https://review.opendev.org/c/openstack/swift/+/942310","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":true,"context_lines":[{"line_number":261,"context_line":"class BaseS3TestCaseWithBucket(BaseS3Mixin, unittest.TestCase):"},{"line_number":262,"context_line":"    @classmethod"},{"line_number":263,"context_line":"    def setUpClass(cls):"},{"line_number":264,"context_line":"        cls.bucket_name \u003d cls.create_name(\u0027bucket\u0027)"},{"line_number":265,"context_line":"        client \u003d cls.get_s3_client(1)"},{"line_number":266,"context_line":"        client.create_bucket(Bucket\u003dcls.bucket_name)"},{"line_number":267,"context_line":""}],"source_content_type":"text/x-python","patch_set":56,"id":"23828a3e_6a91d755","line":264,"in_reply_to":"4e615ca7_9f8c8a04","updated":"2025-02-18 17:01:31.000000000","message":"`create_name` already adds `test-` to the front; see:\n- https://github.com/openstack/swift/blob/2.34.0/test/s3api/__init__.py#L224-L226\n- https://github.com/openstack/swift/blob/2.34.0/test/s3api/__init__.py#L147\n\n@nairashwin952013@gmail.com this might be a good independent patch -- should be a quick review.","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"}],"test/s3api/test_input_errors.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":856,"context_line":"            body\u003dTEST_BODY,"},{"line_number":857,"context_line":"            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027unsigned-payload\u0027})"},{"line_number":858,"context_line":"        self.assertSHA256Mismatch(resp, \u0027unsigned-payload\u0027, _sha256(TEST_BODY))"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"    def test_no_md5_streaming_unsigned_no_encoding_no_length(self):"},{"line_number":861,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":862,"context_line":"            self.bucket_name,"}],"source_content_type":"text/x-python","patch_set":50,"id":"e799ab20_e6976696","line":859,"updated":"2025-02-12 18:58:38.000000000","message":"ok, there\u0027s 67 new tests and AFAICT 62 of them fail on master","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":false,"context_lines":[{"line_number":856,"context_line":"            body\u003dTEST_BODY,"},{"line_number":857,"context_line":"            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027unsigned-payload\u0027})"},{"line_number":858,"context_line":"        self.assertSHA256Mismatch(resp, \u0027unsigned-payload\u0027, _sha256(TEST_BODY))"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"    def test_no_md5_streaming_unsigned_no_encoding_no_length(self):"},{"line_number":861,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":862,"context_line":"            self.bucket_name,"}],"source_content_type":"text/x-python","patch_set":50,"id":"f04506d0_dd0d6e63","line":859,"in_reply_to":"e799ab20_e6976696","updated":"2025-02-14 17:04:50.000000000","message":"Acknowledged","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c4a1851e4861306a2e0a168d3dc920abc6ac54ff","unresolved":true,"context_lines":[{"line_number":1721,"context_line":"                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY)),"},{"line_number":1722,"context_line":"                \u0027x-amz-trailer\u0027:"},{"line_number":1723,"context_line":"                    \u0027x-amz-checksum-crc32, x-amz-checksm-sha256\u0027})"},{"line_number":1724,"context_line":"        self.assertMalformedTrailer(resp)"},{"line_number":1725,"context_line":""},{"line_number":1726,"context_line":"    def test_no_md5_streaming_unsigned_extra_trailer(self):"},{"line_number":1727,"context_line":"        chunked_body \u003d b\u0027\u0027.join("}],"source_content_type":"text/x-python","patch_set":53,"id":"f437d051_35bec675","line":1724,"updated":"2025-02-13 23:29:58.000000000","message":"We have this test failing against AWS:\n```\ntest/s3api/test_input_errors.py:1756 (TestV4AuthHeaders.test_no_md5_streaming_unsigned_multiple_trailers)\nself \u003d \u003ctest.s3api.test_input_errors.TestV4AuthHeaders testMethod\u003dtest_no_md5_streaming_unsigned_multiple_trailers\u003e\n\n    def test_no_md5_streaming_unsigned_multiple_trailers(self):\n        chunked_body \u003d b\u0027\u0027.join(\n            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)\n            for chunk in [TEST_BODY, b\u0027\u0027])[:-2]\n        chunked_body +\u003d \u0027\u0027.join([\n            f\u0027x-amz-checksum-crc32: {_crc32(TEST_BODY)}\\r\\n\u0027,\n            f\u0027x-amz-checksm-sha256: {_sha256(TEST_BODY)}\\r\\n\u0027,\n        ]).encode(\u0027ascii\u0027)\n        resp \u003d self.conn.make_request(\n            self.bucket_name,\n            \u0027test-obj\u0027,\n            method\u003d\u0027PUT\u0027,\n            body\u003dchunked_body,\n            headers\u003d{\n                \u0027x-amz-content-sha256\u0027: \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,\n                \u0027content-encoding\u0027: \u0027aws-chunked\u0027,\n                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY)),\n                \u0027x-amz-trailer\u0027:\n                    \u0027x-amz-checksum-crc32, x-amz-checksm-sha256\u0027})\n\u003e       self.assertMalformedTrailer(resp)\n\ntest_input_errors.py:1776: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \ntest_input_errors.py:1322: in assertMalformedTrailer\n    self.assertIn(\u0027\u003cCode\u003eMalformedTrailerError\u003c/Code\u003e\u0027, respbody)\nE   AssertionError: \u0027\u003cCode\u003eMalformedTrailerError\u003c/Code\u003e\u0027 not found in \u0027\u003c?xml version\u003d\"1.0\" encoding\u003d\"UTF-8\"?\u003e\\n\u003cError\u003e\u003cCode\u003eInvalidRequest\u003c/Code\u003e\u003cMessage\u003eThe value specified in the x-amz-trailer header is not supported\u003c/Message\u003e\u003cRequestId\u003eZHEP5GFX9B6CER5T\u003c/RequestId\u003e\u003cHostId\u003eA+nSoyi2VPncBiIStwWD0Ed0GVgHUtfVz81AnuUTuCrn0/nBhaMuU1kSH1VEnKn1UJReCKm1KeU\u003d\u003c/HostId\u003e\u003c/Error\u003e\u0027\n\n```","commit_id":"1b38348be4bb37c9e335d794b7e52eaff1e9edfb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1721,"context_line":"                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY)),"},{"line_number":1722,"context_line":"                \u0027x-amz-trailer\u0027:"},{"line_number":1723,"context_line":"                    \u0027x-amz-checksum-crc32, x-amz-checksm-sha256\u0027})"},{"line_number":1724,"context_line":"        self.assertMalformedTrailer(resp)"},{"line_number":1725,"context_line":""},{"line_number":1726,"context_line":"    def test_no_md5_streaming_unsigned_extra_trailer(self):"},{"line_number":1727,"context_line":"        chunked_body \u003d b\u0027\u0027.join("}],"source_content_type":"text/x-python","patch_set":53,"id":"23b91486_35451ae1","line":1724,"in_reply_to":"f437d051_35bec675","updated":"2025-04-02 14:19:50.000000000","message":"Done","commit_id":"1b38348be4bb37c9e335d794b7e52eaff1e9edfb"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":874,"context_line":"            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027unsigned-payload\u0027})"},{"line_number":875,"context_line":"        self.assertSHA256Mismatch(resp, \u0027unsigned-payload\u0027, _sha256(TEST_BODY))"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def test_no_md5_streaming_unsigned_no_encoding_no_length(self):"},{"line_number":878,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":879,"context_line":"            self.bucket_name,"},{"line_number":880,"context_line":"            \u0027test-obj\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"c56f1792_f8a3218a","line":877,"range":{"start_line":877,"start_character":13,"end_line":877,"end_character":20},"updated":"2025-02-14 17:04:50.000000000","message":"How significant is the \u0027no_md5\u0027 to the test? I dropped a content-md5 header into one and it made no difference.\n\nI\u0027m mostly asking because the tests names are long and if possible I\u0027d like to reflect the unsigned, unsigned-trailer etc better in the test names, so wonder if we can drop the no_md5 part.","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3baf06d82ea8891fb4d5cc61f646bb4c5ea3e91b","unresolved":false,"context_lines":[{"line_number":874,"context_line":"            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027unsigned-payload\u0027})"},{"line_number":875,"context_line":"        self.assertSHA256Mismatch(resp, \u0027unsigned-payload\u0027, _sha256(TEST_BODY))"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def test_no_md5_streaming_unsigned_no_encoding_no_length(self):"},{"line_number":878,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":879,"context_line":"            self.bucket_name,"},{"line_number":880,"context_line":"            \u0027test-obj\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"c2a0975e_515755da","line":877,"range":{"start_line":877,"start_character":13,"end_line":877,"end_character":20},"in_reply_to":"887a52aa_519066ac","updated":"2025-05-12 15:30:59.000000000","message":"Acknowledged","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":true,"context_lines":[{"line_number":874,"context_line":"            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027unsigned-payload\u0027})"},{"line_number":875,"context_line":"        self.assertSHA256Mismatch(resp, \u0027unsigned-payload\u0027, _sha256(TEST_BODY))"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"    def test_no_md5_streaming_unsigned_no_encoding_no_length(self):"},{"line_number":878,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":879,"context_line":"            self.bucket_name,"},{"line_number":880,"context_line":"            \u0027test-obj\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"887a52aa_519066ac","line":877,"range":{"start_line":877,"start_character":13,"end_line":877,"end_character":20},"in_reply_to":"c56f1792_f8a3218a","updated":"2025-02-18 17:01:31.000000000","message":"Mostly a hold-over from the last time I tried to both enforce some test name conventions and ensure full-matrix coverage here -- I\u0027d be fine with dropping `no_md5` from all the streaming-related tests.\n\nOh, speaking of -- I should try sending `x-amz-trailer: content-md5`...","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":896,"context_line":"                      \"header.\u003c/Message\u003e\","},{"line_number":897,"context_line":"                      respbody)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"    def test_no_md5_streaming_unsigned_not_encoded(self):"},{"line_number":900,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":901,"context_line":"            self.bucket_name,"},{"line_number":902,"context_line":"            \u0027test-obj\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"a961e96a_d556d9bd","line":899,"updated":"2025-02-14 17:04:50.000000000","message":"Some of these tests are overridden in TestV4AuthHeaders. I found that confusing, and suggests to me that they shouldn\u0027t be in this mixin which appears to be intended for tests that are common to all request flavours.\n\nLet\u0027s have another mixin for tests that are *not* intended for TestV4AuthHeaders","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":true,"context_lines":[{"line_number":896,"context_line":"                      \"header.\u003c/Message\u003e\","},{"line_number":897,"context_line":"                      respbody)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"    def test_no_md5_streaming_unsigned_not_encoded(self):"},{"line_number":900,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":901,"context_line":"            self.bucket_name,"},{"line_number":902,"context_line":"            \u0027test-obj\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"b825b445_cc668997","line":899,"in_reply_to":"a961e96a_d556d9bd","updated":"2025-02-18 17:01:31.000000000","message":"My rule was, if the request setup looks the same, they ought to have the same name. There\u0027s some power to be had in being able to run\n```\npytest  test/s3api/test_input_errors.py::TestV{2,4}Auth{Query,Headers}::{list of tests}\n```\nI\u0027d love to be able to [make it more clear when there\u0027s an override](https://review.opendev.org/c/openstack/swift/+/935409), though.","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":896,"context_line":"                      \"header.\u003c/Message\u003e\","},{"line_number":897,"context_line":"                      respbody)"},{"line_number":898,"context_line":""},{"line_number":899,"context_line":"    def test_no_md5_streaming_unsigned_not_encoded(self):"},{"line_number":900,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":901,"context_line":"            self.bucket_name,"},{"line_number":902,"context_line":"            \u0027test-obj\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"c476762b_8cc7d679","line":899,"in_reply_to":"b825b445_cc668997","updated":"2025-02-26 18:24:09.000000000","message":"Acknowledged","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":1464,"context_line":"                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY))})"},{"line_number":1465,"context_line":"        self.assertOK(resp)"},{"line_number":1466,"context_line":""},{"line_number":1467,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":1468,"context_line":"            self.bucket_name,"},{"line_number":1469,"context_line":"            \u0027test-obj\u0027,"},{"line_number":1470,"context_line":"            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})"}],"source_content_type":"text/x-python","patch_set":56,"id":"1761477f_f6693c22","line":1467,"updated":"2025-02-14 17:04:50.000000000","message":"I was initially confused that this was doing another PUT with different sha256. Although not necessary, perhaps we could include the method in the request constructor as a hint to the reader that this is a GET amongst many PUTs.","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":false,"context_lines":[{"line_number":1464,"context_line":"                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY))})"},{"line_number":1465,"context_line":"        self.assertOK(resp)"},{"line_number":1466,"context_line":""},{"line_number":1467,"context_line":"        resp \u003d self.conn.make_request("},{"line_number":1468,"context_line":"            self.bucket_name,"},{"line_number":1469,"context_line":"            \u0027test-obj\u0027,"},{"line_number":1470,"context_line":"            headers\u003d{\u0027x-amz-content-sha256\u0027: \u0027UNSIGNED-PAYLOAD\u0027})"}],"source_content_type":"text/x-python","patch_set":56,"id":"25846548_5a5c2711","line":1467,"in_reply_to":"1761477f_f6693c22","updated":"2025-02-18 17:01:31.000000000","message":"Done","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":1479,"context_line":"            self.bucket_name,"},{"line_number":1480,"context_line":"            \u0027test-obj\u0027,"},{"line_number":1481,"context_line":"            method\u003d\u0027PUT\u0027,"},{"line_number":1482,"context_line":"            body\u003diter([chunked_body]),"},{"line_number":1483,"context_line":"            headers\u003d{"},{"line_number":1484,"context_line":"                \u0027x-amz-content-sha256\u0027: \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":1485,"context_line":"                \u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"0601467d_4b21afd7","line":1482,"updated":"2025-02-14 17:04:50.000000000","message":"this test is a subset of the previous test except the use of iter() here. Is that significant? I can\u0027t see how, both tests send a single chunk + empty chunk","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":true,"context_lines":[{"line_number":1479,"context_line":"            self.bucket_name,"},{"line_number":1480,"context_line":"            \u0027test-obj\u0027,"},{"line_number":1481,"context_line":"            method\u003d\u0027PUT\u0027,"},{"line_number":1482,"context_line":"            body\u003diter([chunked_body]),"},{"line_number":1483,"context_line":"            headers\u003d{"},{"line_number":1484,"context_line":"                \u0027x-amz-content-sha256\u0027: \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":1485,"context_line":"                \u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"2a94f281_376bdccb","line":1482,"in_reply_to":"0601467d_4b21afd7","updated":"2025-02-18 17:01:31.000000000","message":"\u003e Is that significant?\n\nYes! It forces `requests` to use `Transfer-Encoding: chunked`\n\nThe test name was supposed to be a hint -- I [put some chunks in your chunks!](https://knowyourmeme.com/memes/xzibit-yo-dawg)","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":1479,"context_line":"            self.bucket_name,"},{"line_number":1480,"context_line":"            \u0027test-obj\u0027,"},{"line_number":1481,"context_line":"            method\u003d\u0027PUT\u0027,"},{"line_number":1482,"context_line":"            body\u003diter([chunked_body]),"},{"line_number":1483,"context_line":"            headers\u003d{"},{"line_number":1484,"context_line":"                \u0027x-amz-content-sha256\u0027: \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":1485,"context_line":"                \u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"d60fbec3_f083f1ad","line":1482,"in_reply_to":"2a94f281_376bdccb","updated":"2025-02-26 18:24:09.000000000","message":"Acknowledged","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":1667,"context_line":"                \u0027x-amz-trailer\u0027: \u0027x-amz-checksum-crc32\u0027})"},{"line_number":1668,"context_line":"        self.assertOK(resp)"},{"line_number":1669,"context_line":""},{"line_number":1670,"context_line":"    def test_no_md5_streaming_unsigned_no_amz_trailer(self):"},{"line_number":1671,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1672,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1673,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"22e1af5b_ea810c11","line":1670,"range":{"start_line":1670,"start_character":4,"end_line":1670,"end_character":54},"updated":"2025-02-14 17:04:50.000000000","message":"duplicates ``test_no_md5_streaming_unsigned`` line 1452","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":false,"context_lines":[{"line_number":1667,"context_line":"                \u0027x-amz-trailer\u0027: \u0027x-amz-checksum-crc32\u0027})"},{"line_number":1668,"context_line":"        self.assertOK(resp)"},{"line_number":1669,"context_line":""},{"line_number":1670,"context_line":"    def test_no_md5_streaming_unsigned_no_amz_trailer(self):"},{"line_number":1671,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1672,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1673,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"82d12bdb_c12195d8","line":1670,"range":{"start_line":1670,"start_character":4,"end_line":1670,"end_character":54},"in_reply_to":"22e1af5b_ea810c11","updated":"2025-02-18 17:01:31.000000000","message":"Sure enough -- I\u0027ve written so many tests, I\u0027ve lost track 😞","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":1958,"context_line":"        # As best we can tell, AWS doesn\u0027t care at all about how"},{"line_number":1959,"context_line":"        # \u003e The Content-Encoding representation header lists any encodings"},{"line_number":1960,"context_line":"        # \u003e that have been applied to the representation (message payload),"},{"line_number":1961,"context_line":"        # \u003e and in what order."},{"line_number":1962,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1963,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1964,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"ed6df71b_c1189f3e","line":1961,"updated":"2025-02-14 17:04:50.000000000","message":"wonky comment formatting","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":false,"context_lines":[{"line_number":1958,"context_line":"        # As best we can tell, AWS doesn\u0027t care at all about how"},{"line_number":1959,"context_line":"        # \u003e The Content-Encoding representation header lists any encodings"},{"line_number":1960,"context_line":"        # \u003e that have been applied to the representation (message payload),"},{"line_number":1961,"context_line":"        # \u003e and in what order."},{"line_number":1962,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1963,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1964,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])"}],"source_content_type":"text/x-python","patch_set":56,"id":"69ab628f_2b92ea4d","line":1961,"in_reply_to":"ed6df71b_c1189f3e","updated":"2025-02-18 17:01:31.000000000","message":"Was quoting MDN; would\u0027ve left a link, but it was too long :-/\n\nWill quote \u0026 point to an RFC instead.","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4ba1d224dc518af0c7a4dd666967bd9a0edf0955","unresolved":true,"context_lines":[{"line_number":1521,"context_line":"                \u0027x-amz-trailer\u0027: \u0027x-amz-checksum-crc32\u0027})"},{"line_number":1522,"context_line":"        self.assertOK(resp)"},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"    def test_strm_unsgnd_pyld_trl_content_sha256_in_trailer(self):"},{"line_number":1525,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1526,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1527,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])[:-2]"}],"source_content_type":"text/x-python","patch_set":72,"id":"93fbed69_c06c95e7","line":1524,"updated":"2025-04-12 17:12:53.000000000","message":"Not yet -- this needs to wait until the checksum patch, where we start actually validating trailers against an allow-list.","commit_id":"279331fdf8b22c85f0f5e5749f0fbed827a583cb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a78c6dcc524a8f7b8c3c4993b973002f508cbfc","unresolved":false,"context_lines":[{"line_number":1521,"context_line":"                \u0027x-amz-trailer\u0027: \u0027x-amz-checksum-crc32\u0027})"},{"line_number":1522,"context_line":"        self.assertOK(resp)"},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"    def test_strm_unsgnd_pyld_trl_content_sha256_in_trailer(self):"},{"line_number":1525,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1526,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1527,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])[:-2]"}],"source_content_type":"text/x-python","patch_set":72,"id":"1efacbbf_3c579ae8","line":1524,"in_reply_to":"93fbed69_c06c95e7","updated":"2025-04-21 22:36:30.000000000","message":"Done","commit_id":"279331fdf8b22c85f0f5e5749f0fbed827a583cb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4ba1d224dc518af0c7a4dd666967bd9a0edf0955","unresolved":true,"context_lines":[{"line_number":1702,"context_line":"                \u0027x-amz-trailer\u0027: \u0027x-amz-checksum-crc32c\u0027})"},{"line_number":1703,"context_line":"        self.assertMalformedTrailer(resp)"},{"line_number":1704,"context_line":""},{"line_number":1705,"context_line":"    def test_strm_unsgnd_pyld_trl_multiple_trailers(self):"},{"line_number":1706,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1707,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1708,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])[:-2]"}],"source_content_type":"text/x-python","patch_set":72,"id":"d7a848bc_fdcb9a7d","line":1705,"updated":"2025-04-12 17:12:53.000000000","message":"Not yet -- this needs to wait until the checksum patch, where we validate trailers more.","commit_id":"279331fdf8b22c85f0f5e5749f0fbed827a583cb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a78c6dcc524a8f7b8c3c4993b973002f508cbfc","unresolved":false,"context_lines":[{"line_number":1702,"context_line":"                \u0027x-amz-trailer\u0027: \u0027x-amz-checksum-crc32c\u0027})"},{"line_number":1703,"context_line":"        self.assertMalformedTrailer(resp)"},{"line_number":1704,"context_line":""},{"line_number":1705,"context_line":"    def test_strm_unsgnd_pyld_trl_multiple_trailers(self):"},{"line_number":1706,"context_line":"        chunked_body \u003d b\u0027\u0027.join("},{"line_number":1707,"context_line":"            b\u0027%x\\r\\n%s\\r\\n\u0027 % (len(chunk), chunk)"},{"line_number":1708,"context_line":"            for chunk in [TEST_BODY, b\u0027\u0027])[:-2]"}],"source_content_type":"text/x-python","patch_set":72,"id":"d85f79f4_a0d7b208","line":1705,"in_reply_to":"d7a848bc_fdcb9a7d","updated":"2025-04-21 22:36:30.000000000","message":"Done","commit_id":"279331fdf8b22c85f0f5e5749f0fbed827a583cb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4ba1d224dc518af0c7a4dd666967bd9a0edf0955","unresolved":true,"context_lines":[{"line_number":1720,"context_line":"                \u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":1721,"context_line":"                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY)),"},{"line_number":1722,"context_line":"                \u0027x-amz-trailer\u0027:"},{"line_number":1723,"context_line":"                    \u0027x-amz-checksum-crc32, x-amz-checksm-sha256\u0027})"},{"line_number":1724,"context_line":"        self.assertEqual(resp.status_code, 400, resp.content)"},{"line_number":1725,"context_line":"        self.assertIn(b\u0027\u003cCode\u003eInvalidRequest\u003c/Code\u003e\u0027, resp.content)"},{"line_number":1726,"context_line":"        self.assertIn(b\u0027\u003cMessage\u003eThe value specified in the x-amz-trailer \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"c89b6583_8d8878f3","line":1723,"range":{"start_line":1723,"start_character":49,"end_line":1723,"end_character":56},"updated":"2025-04-12 17:12:53.000000000","message":"Should this be \"checksum\"? I.e., do we want to test with multiple known-acceptable trailers (if only they were sent individually), or one known and one unknown?","commit_id":"279331fdf8b22c85f0f5e5749f0fbed827a583cb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4a78c6dcc524a8f7b8c3c4993b973002f508cbfc","unresolved":false,"context_lines":[{"line_number":1720,"context_line":"                \u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":1721,"context_line":"                \u0027x-amz-decoded-content-length\u0027: str(len(TEST_BODY)),"},{"line_number":1722,"context_line":"                \u0027x-amz-trailer\u0027:"},{"line_number":1723,"context_line":"                    \u0027x-amz-checksum-crc32, x-amz-checksm-sha256\u0027})"},{"line_number":1724,"context_line":"        self.assertEqual(resp.status_code, 400, resp.content)"},{"line_number":1725,"context_line":"        self.assertIn(b\u0027\u003cCode\u003eInvalidRequest\u003c/Code\u003e\u0027, resp.content)"},{"line_number":1726,"context_line":"        self.assertIn(b\u0027\u003cMessage\u003eThe value specified in the x-amz-trailer \u0027"}],"source_content_type":"text/x-python","patch_set":72,"id":"ffb53732_50078cdd","line":1723,"range":{"start_line":1723,"start_character":49,"end_line":1723,"end_character":56},"in_reply_to":"c89b6583_8d8878f3","updated":"2025-04-21 22:36:30.000000000","message":"Done","commit_id":"279331fdf8b22c85f0f5e5749f0fbed827a583cb"}],"test/s3api/test_object_checksums.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1568cc3c184b8db8bafab1acf0b2606bbcb2fbc7","unresolved":true,"context_lines":[{"line_number":533,"context_line":"        if not client._endpoint.host.startswith(\u0027https:\u0027):"},{"line_number":534,"context_line":"            # Check before we even do our first CreateBucket"},{"line_number":535,"context_line":"            # See https://github.com/boto/botocore/commit/1be21835"},{"line_number":536,"context_line":"            raise SkipTest(\u0027boto3 only supports trailing checksums over TLS\u0027)"},{"line_number":537,"context_line":"        super(TestStreamingObjectChecksums, self).setUp()"},{"line_number":538,"context_line":"        self.client._client_config.s3[\"payload_signing_enabled\"] \u003d \\"},{"line_number":539,"context_line":"            self.signing_enabled"}],"source_content_type":"text/x-python","patch_set":15,"id":"f15376ad_425f9c79","line":536,"updated":"2024-05-02 15:18:21.000000000","message":"I\u0027m not convinced we want to use boto for this testing -- too much reliance on the library\u0027s decision-making and quirks. Pretty sure we\u0027ll need our own `aws-chunked` client code to make sure we\u0027ve actually got things covered the way we want.","commit_id":"21bcec68ee162857d2208dfca93609acbb0eb1e9"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"93730bc76a9a2c7418b860779d228fb8906dbb13","unresolved":false,"context_lines":[{"line_number":533,"context_line":"        if not client._endpoint.host.startswith(\u0027https:\u0027):"},{"line_number":534,"context_line":"            # Check before we even do our first CreateBucket"},{"line_number":535,"context_line":"            # See https://github.com/boto/botocore/commit/1be21835"},{"line_number":536,"context_line":"            raise SkipTest(\u0027boto3 only supports trailing checksums over TLS\u0027)"},{"line_number":537,"context_line":"        super(TestStreamingObjectChecksums, self).setUp()"},{"line_number":538,"context_line":"        self.client._client_config.s3[\"payload_signing_enabled\"] \u003d \\"},{"line_number":539,"context_line":"            self.signing_enabled"}],"source_content_type":"text/x-python","patch_set":15,"id":"2e792632_7d0b245c","line":536,"in_reply_to":"c5610138_d3276447","updated":"2025-02-05 20:26:54.000000000","message":"Done","commit_id":"21bcec68ee162857d2208dfca93609acbb0eb1e9"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"d4c0bef01cbbd0f5a587a3734ede5f82b86aefbc","unresolved":true,"context_lines":[{"line_number":533,"context_line":"        if not client._endpoint.host.startswith(\u0027https:\u0027):"},{"line_number":534,"context_line":"            # Check before we even do our first CreateBucket"},{"line_number":535,"context_line":"            # See https://github.com/boto/botocore/commit/1be21835"},{"line_number":536,"context_line":"            raise SkipTest(\u0027boto3 only supports trailing checksums over TLS\u0027)"},{"line_number":537,"context_line":"        super(TestStreamingObjectChecksums, self).setUp()"},{"line_number":538,"context_line":"        self.client._client_config.s3[\"payload_signing_enabled\"] \u003d \\"},{"line_number":539,"context_line":"            self.signing_enabled"}],"source_content_type":"text/x-python","patch_set":15,"id":"c5610138_d3276447","line":536,"in_reply_to":"f15376ad_425f9c79","updated":"2024-10-30 16:15:18.000000000","message":"I agree, maybe we can use the minio client for our testing","commit_id":"21bcec68ee162857d2208dfca93609acbb0eb1e9"}],"test/unit/common/middleware/s3api/test_s3api.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":938,"context_line":""},{"line_number":939,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":940,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":941,"context_line":"                                     \u0027HTTP_AUTHORIZATION\u0027: \u0027AWS X:Y:Z\u0027},"},{"line_number":942,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":943,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":944,"context_line":"                                     \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":50,"id":"58b987a1_ffb81b7a","line":941,"range":{"start_line":941,"start_character":38,"end_line":941,"end_character":70},"updated":"2025-02-12 18:58:38.000000000","message":"overridden in headers","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":938,"context_line":""},{"line_number":939,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":940,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":941,"context_line":"                                     \u0027HTTP_AUTHORIZATION\u0027: \u0027AWS X:Y:Z\u0027},"},{"line_number":942,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":943,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":944,"context_line":"                                     \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":50,"id":"525f8963_f8168f49","line":941,"range":{"start_line":941,"start_character":38,"end_line":941,"end_character":70},"in_reply_to":"58b987a1_ffb81b7a","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":966,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":967,"context_line":"                                     \u0027HTTP_AUTHORIZATION\u0027: \u0027AWS X:Y:Z\u0027},"},{"line_number":968,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":969,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":970,"context_line":"                                     \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027,"}],"source_content_type":"text/x-python","patch_set":50,"id":"0d859370_411e4c65","line":967,"range":{"start_line":967,"start_character":37,"end_line":967,"end_character":70},"updated":"2025-02-12 18:58:38.000000000","message":"overridden in headers","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":964,"context_line":""},{"line_number":965,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":966,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":967,"context_line":"                                     \u0027HTTP_AUTHORIZATION\u0027: \u0027AWS X:Y:Z\u0027},"},{"line_number":968,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":969,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":970,"context_line":"                                     \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027,"}],"source_content_type":"text/x-python","patch_set":50,"id":"0fc4cade_0459d774","line":967,"range":{"start_line":967,"start_character":37,"end_line":967,"end_character":70},"in_reply_to":"0d859370_411e4c65","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6c20ae0449594c661628b9c3bd842fc1c898f24d","unresolved":true,"context_lines":[{"line_number":978,"context_line":""},{"line_number":979,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":980,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":981,"context_line":"                                     \u0027HTTP_AUTHORIZATION\u0027: \u0027AWS X:Y:Z\u0027},"},{"line_number":982,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":983,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":984,"context_line":"                                     \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":50,"id":"3e8f125a_5ef606b5","line":981,"range":{"start_line":981,"start_character":37,"end_line":981,"end_character":70},"updated":"2025-02-12 18:58:38.000000000","message":"ditto","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f07af3c2fbe3cbec9a50eeae50ef99f1aed737c9","unresolved":false,"context_lines":[{"line_number":978,"context_line":""},{"line_number":979,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":980,"context_line":"                            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":981,"context_line":"                                     \u0027HTTP_AUTHORIZATION\u0027: \u0027AWS X:Y:Z\u0027},"},{"line_number":982,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":983,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":984,"context_line":"                                     \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"}],"source_content_type":"text/x-python","patch_set":50,"id":"81733ea4_f3e4d759","line":981,"range":{"start_line":981,"start_character":37,"end_line":981,"end_character":70},"in_reply_to":"3e8f125a_5ef606b5","updated":"2025-02-13 01:04:12.000000000","message":"Done","commit_id":"7539776b363b86f33e902c6da61844a9ac72291b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":968,"context_line":"            \u0027STREAMING-AWS4-ECDSA-P256-SHA256-PAYLOAD-TRAILER\u0027"},{"line_number":969,"context_line":"        ]"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":972,"context_line":"                            method\u003d\u0027PUT\u0027,"},{"line_number":973,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":974,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":975,"context_line":"                                     \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027,"},{"line_number":976,"context_line":"                                     \u0027x-amz-decoded-content-length\u0027: \u00270\u0027,"},{"line_number":977,"context_line":"                                     \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":978,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":979,"context_line":"        status, _, body \u003d self.call_s3api(req)"},{"line_number":980,"context_line":"        self.assertEqual(status, \u0027400 Bad Request\u0027)"},{"line_number":981,"context_line":"        self.assertEqual(self._get_error_code(body),"},{"line_number":982,"context_line":"                         \u0027XAmzContentSHA256Mismatch\u0027)"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"        for sha256 in sha256_values:"},{"line_number":985,"context_line":"            req \u003d Request.blank(\u0027/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"a671f855_afdd7257","line":982,"range":{"start_line":971,"start_character":8,"end_line":982,"end_character":53},"updated":"2025-02-14 17:04:50.000000000","message":"this is just duplicating one of the sha256_values cases now?","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":968,"context_line":"            \u0027STREAMING-AWS4-ECDSA-P256-SHA256-PAYLOAD-TRAILER\u0027"},{"line_number":969,"context_line":"        ]"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":972,"context_line":"                            method\u003d\u0027PUT\u0027,"},{"line_number":973,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":974,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":975,"context_line":"                                     \u0027STREAMING-AWS4-HMAC-SHA256-PAYLOAD\u0027,"},{"line_number":976,"context_line":"                                     \u0027x-amz-decoded-content-length\u0027: \u00270\u0027,"},{"line_number":977,"context_line":"                                     \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":978,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":979,"context_line":"        status, _, body \u003d self.call_s3api(req)"},{"line_number":980,"context_line":"        self.assertEqual(status, \u0027400 Bad Request\u0027)"},{"line_number":981,"context_line":"        self.assertEqual(self._get_error_code(body),"},{"line_number":982,"context_line":"                         \u0027XAmzContentSHA256Mismatch\u0027)"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"        for sha256 in sha256_values:"},{"line_number":985,"context_line":"            req \u003d Request.blank(\u0027/bucket/object\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"939575ca_2d37289d","line":982,"range":{"start_line":971,"start_character":8,"end_line":982,"end_character":53},"in_reply_to":"a671f855_afdd7257","updated":"2025-04-02 14:19:50.000000000","message":"Done","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":981,"context_line":"        self.assertEqual(self._get_error_code(body),"},{"line_number":982,"context_line":"                         \u0027XAmzContentSHA256Mismatch\u0027)"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"        for sha256 in sha256_values:"},{"line_number":985,"context_line":"            req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":986,"context_line":"                                environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":987,"context_line":"                                headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"4436f592_adfdefc2","line":984,"updated":"2025-02-14 17:04:50.000000000","message":"although I have done it myself, these days I try to avoid for loops over test scenarios. If the test fails we don\u0027t immediately know which scenario failed.\n\nA better pattern IMHO would be to have a helper\n\n```\ndef _do_test_aws_chunked_bad_request(x_amz_content_sha256):\n ...\n```\n\nand then call it for each sha256_value:\n\ne.g.\n\n```\ndo_test_aws_chunked_bad_request(\u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027)\n```","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c54820f7a793c9e89ee05e00bcb354b65cf38c79","unresolved":true,"context_lines":[{"line_number":981,"context_line":"        self.assertEqual(self._get_error_code(body),"},{"line_number":982,"context_line":"                         \u0027XAmzContentSHA256Mismatch\u0027)"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"        for sha256 in sha256_values:"},{"line_number":985,"context_line":"            req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":986,"context_line":"                                environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":987,"context_line":"                                headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"8903aa76_ad5b878f","line":984,"in_reply_to":"4436f592_adfdefc2","updated":"2025-02-18 17:01:31.000000000","message":"Maybe eventually we\u0027ll get to [use subTest](https://review.opendev.org/c/openstack/swift/+/938966)!","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":981,"context_line":"        self.assertEqual(self._get_error_code(body),"},{"line_number":982,"context_line":"                         \u0027XAmzContentSHA256Mismatch\u0027)"},{"line_number":983,"context_line":""},{"line_number":984,"context_line":"        for sha256 in sha256_values:"},{"line_number":985,"context_line":"            req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":986,"context_line":"                                environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":987,"context_line":"                                headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":56,"id":"d63fa8b2_fcead477","line":984,"in_reply_to":"8903aa76_ad5b878f","updated":"2025-02-26 18:24:09.000000000","message":"Done when we squashed in https://review.opendev.org/c/openstack/swift/+/942126 (thanks!)","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":999,"context_line":"                          \u0027\u003c/ClientComputedContentSHA256\u003e\u0027,"},{"line_number":1000,"context_line":"                          body.decode(\u0027utf8\u0027))"},{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":1003,"context_line":"                            method\u003d\u0027PUT\u0027,"},{"line_number":1004,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":1005,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":1006,"context_line":"                                     \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":1007,"context_line":"                                     \u0027x-amz-decoded-content-length\u0027: \u00270\u0027,"},{"line_number":1008,"context_line":"                                     \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":1009,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":1010,"context_line":"        status, _, body \u003d self.call_s3api(req)"},{"line_number":1011,"context_line":"        self.assertEqual(status, \u0027400 Bad Request\u0027)"},{"line_number":1012,"context_line":"        self.assertEqual(self._get_error_code(body),"},{"line_number":1013,"context_line":"                         \u0027XAmzContentSHA256Mismatch\u0027)"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"    def test_object_tagging(self):"},{"line_number":1016,"context_line":"        self._test_unsupported_header(\u0027x-amz-tagging\u0027)"}],"source_content_type":"text/x-python","patch_set":56,"id":"8caa0d71_787979e0","line":1013,"range":{"start_line":1002,"start_character":8,"end_line":1013,"end_character":53},"updated":"2025-02-14 17:04:50.000000000","message":"...and this is another of them duplicated??","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":999,"context_line":"                          \u0027\u003c/ClientComputedContentSHA256\u003e\u0027,"},{"line_number":1000,"context_line":"                          body.decode(\u0027utf8\u0027))"},{"line_number":1001,"context_line":""},{"line_number":1002,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":1003,"context_line":"                            method\u003d\u0027PUT\u0027,"},{"line_number":1004,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"},{"line_number":1005,"context_line":"                                     \u0027x-amz-content-sha256\u0027:"},{"line_number":1006,"context_line":"                                     \u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027,"},{"line_number":1007,"context_line":"                                     \u0027x-amz-decoded-content-length\u0027: \u00270\u0027,"},{"line_number":1008,"context_line":"                                     \u0027Authorization\u0027: \u0027AWS test:tester:hmac\u0027,"},{"line_number":1009,"context_line":"                                     \u0027Date\u0027: self.get_date_header()})"},{"line_number":1010,"context_line":"        status, _, body \u003d self.call_s3api(req)"},{"line_number":1011,"context_line":"        self.assertEqual(status, \u0027400 Bad Request\u0027)"},{"line_number":1012,"context_line":"        self.assertEqual(self._get_error_code(body),"},{"line_number":1013,"context_line":"                         \u0027XAmzContentSHA256Mismatch\u0027)"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"    def test_object_tagging(self):"},{"line_number":1016,"context_line":"        self._test_unsupported_header(\u0027x-amz-tagging\u0027)"}],"source_content_type":"text/x-python","patch_set":56,"id":"4a4b7789_1add63b8","line":1013,"range":{"start_line":1002,"start_character":8,"end_line":1013,"end_character":53},"in_reply_to":"8caa0d71_787979e0","updated":"2025-04-02 14:19:50.000000000","message":"Done","commit_id":"030d6272a2b20c7db308e71cf0c30ef31e699944"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a2209ec4f95c072aaf821aef1dce87cb897a02e","unresolved":true,"context_lines":[{"line_number":918,"context_line":""},{"line_number":919,"context_line":"    def test_website_redirect_location(self):"},{"line_number":920,"context_line":"        self._test_unsupported_header(\u0027x-amz-website-redirect-location\u0027)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"    def test_aws_chunked_with_zero_bytes(self):"},{"line_number":923,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":924,"context_line":"                            method\u003d\u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":57,"id":"c24e73a1_b409be08","line":921,"updated":"2025-02-18 16:56:25.000000000","message":"do we want these tests here, or in test_s3request.py? seems like most similar tests are in test_s3request.py","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"01b77abda3199fe2354a2d2c06fa3bfd493acdd7","unresolved":false,"context_lines":[{"line_number":918,"context_line":""},{"line_number":919,"context_line":"    def test_website_redirect_location(self):"},{"line_number":920,"context_line":"        self._test_unsupported_header(\u0027x-amz-website-redirect-location\u0027)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"    def test_aws_chunked_with_zero_bytes(self):"},{"line_number":923,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":924,"context_line":"                            method\u003d\u0027PUT\u0027,"}],"source_content_type":"text/x-python","patch_set":57,"id":"c59f8171_2a00a5e4","line":921,"in_reply_to":"c24e73a1_b409be08","updated":"2025-04-28 19:52:48.000000000","message":"Moved.","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6a2209ec4f95c072aaf821aef1dce87cb897a02e","unresolved":true,"context_lines":[{"line_number":919,"context_line":"    def test_website_redirect_location(self):"},{"line_number":920,"context_line":"        self._test_unsupported_header(\u0027x-amz-website-redirect-location\u0027)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"    def test_aws_chunked_with_zero_bytes(self):"},{"line_number":923,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":924,"context_line":"                            method\u003d\u0027PUT\u0027,"},{"line_number":925,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":57,"id":"ed3a17fe_142314d1","line":922,"updated":"2025-02-18 16:56:25.000000000","message":"it\u0027s not immediately obvious to me what is distinct here w.r.t. test_aws_chunked_bad_request. Content-Length is 0 but it makes no difference tho this test if I remove Content-Length altogether, and then this test is the same as test_aws_chunked_bad_request.\n\nWhat *is* interesting is if x-amz-decoded-content-length is missing.\n\nI left some suggestions for cleaning up these tests here https://review.opendev.org/c/openstack/swift/+/942126","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"629d9c7e19c050085e5d94c764a2f14ddbfe8c28","unresolved":false,"context_lines":[{"line_number":919,"context_line":"    def test_website_redirect_location(self):"},{"line_number":920,"context_line":"        self._test_unsupported_header(\u0027x-amz-website-redirect-location\u0027)"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"    def test_aws_chunked_with_zero_bytes(self):"},{"line_number":923,"context_line":"        req \u003d Request.blank(\u0027/bucket/object\u0027,"},{"line_number":924,"context_line":"                            method\u003d\u0027PUT\u0027,"},{"line_number":925,"context_line":"                            headers\u003d{\u0027content-encoding\u0027: \u0027aws-chunked\u0027,"}],"source_content_type":"text/x-python","patch_set":57,"id":"4aab788f_2c98236d","line":922,"in_reply_to":"ed3a17fe_142314d1","updated":"2025-02-26 18:24:09.000000000","message":"Squashed in.","commit_id":"4185af65fac33a5ba42b2a46b40ac281646bd66d"}],"test/unit/common/middleware/s3api/test_s3request.py":[{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c28c36b84a06cbc16570fdf921d27032884cc1b1","unresolved":true,"context_lines":[{"line_number":1188,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1189,"context_line":"    def test_check_signature_sigv4_chunk_valid(self):"},{"line_number":1190,"context_line":"        environ \u003d {"},{"line_number":1191,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1192,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1193,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1194,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"0852a73f_410ab292","line":1191,"updated":"2024-11-04 17:01:17.000000000","message":"We will have to change the `HTTP_HOST` for these tests","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78d2c539e2f444e7a2519ee7f2f87ac9cf207f0f","unresolved":true,"context_lines":[{"line_number":1188,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1189,"context_line":"    def test_check_signature_sigv4_chunk_valid(self):"},{"line_number":1190,"context_line":"        environ \u003d {"},{"line_number":1191,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1192,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1193,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1194,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"2e28e65f_90a3961f","line":1191,"in_reply_to":"0852a73f_410ab292","updated":"2025-02-14 15:48:55.000000000","message":"Why? They pass, right?","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9162e5c67f279a4fd73adc16230f5b4ec7cb9cea","unresolved":true,"context_lines":[{"line_number":1188,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1189,"context_line":"    def test_check_signature_sigv4_chunk_valid(self):"},{"line_number":1190,"context_line":"        environ \u003d {"},{"line_number":1191,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1192,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1193,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1194,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"b54faced_ff3aa2c6","line":1191,"in_reply_to":"0852a73f_410ab292","updated":"2025-02-14 17:04:50.000000000","message":"this comment has not been addressed, can you elaborate - what needs to change and why?","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8ac49e53700921b6fa03bb3d97c433acee0db62f","unresolved":true,"context_lines":[{"line_number":1188,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1189,"context_line":"    def test_check_signature_sigv4_chunk_valid(self):"},{"line_number":1190,"context_line":"        environ \u003d {"},{"line_number":1191,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1192,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1193,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1194,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"a0261e59_72bf25ff","line":1191,"in_reply_to":"1b7beb54_2e3de3ec","updated":"2025-03-14 01:43:53.000000000","message":"Unit tests as a rule shouldn\u0027t contact any external services -- if they *do*, that\u0027s a bug: everyone should be able to run unit tests when offline.\n\nReally, I\u0027d say a *unit test* probably shouldn\u0027t be contacting a whole *service* at all -- though some of the tests in unit/proxy/test_server.py start actually listening to sockets and making requests against them. But that feels like it\u0027d be better as a functional test (IMHO)","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1188,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1189,"context_line":"    def test_check_signature_sigv4_chunk_valid(self):"},{"line_number":1190,"context_line":"        environ \u003d {"},{"line_number":1191,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1192,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1193,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1194,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"6ef66c26_fb9e9264","line":1191,"in_reply_to":"a0261e59_72bf25ff","updated":"2025-04-02 14:19:50.000000000","message":"Done","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"57230a488bf582e08774a3e4430ea192309742f3","unresolved":true,"context_lines":[{"line_number":1188,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1189,"context_line":"    def test_check_signature_sigv4_chunk_valid(self):"},{"line_number":1190,"context_line":"        environ \u003d {"},{"line_number":1191,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1192,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1193,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1194,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"1b7beb54_2e3de3ec","line":1191,"in_reply_to":"b54faced_ff3aa2c6","updated":"2025-03-11 15:48:17.000000000","message":"With an initial look, the test appeared confusing to me due to its external looking hostname `s3.test.com` threw me off so maybe adding a comment stating that this request doesn\u0027t contact any external service  ??","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c28c36b84a06cbc16570fdf921d27032884cc1b1","unresolved":true,"context_lines":[{"line_number":1229,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1230,"context_line":"    def test_check_signature_sigv4_chunk_invalid(self):"},{"line_number":1231,"context_line":"        environ \u003d {"},{"line_number":1232,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1233,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1234,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1235,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"8a6d6072_c7181ff9","line":1232,"updated":"2024-11-04 17:01:17.000000000","message":"same","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"802d366b42c95d0371a55205f38c60bec6838d35","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1230,"context_line":"    def test_check_signature_sigv4_chunk_invalid(self):"},{"line_number":1231,"context_line":"        environ \u003d {"},{"line_number":1232,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1233,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1234,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1235,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"f8fb11c4_0850ead8","line":1232,"in_reply_to":"8a6d6072_c7181ff9","updated":"2025-03-11 15:48:57.000000000","message":"https://review.opendev.org/c/openstack/swift/+/836755/comment/0852a73f_410ab292/","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c28c36b84a06cbc16570fdf921d27032884cc1b1","unresolved":true,"context_lines":[{"line_number":1268,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1269,"context_line":"    def test_check_signature_sigv4_chunk_wrong_size(self):"},{"line_number":1270,"context_line":"        environ \u003d {"},{"line_number":1271,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1272,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1273,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1274,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"a0179173_42c8b2a1","line":1271,"updated":"2024-11-04 17:01:17.000000000","message":"same","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"802d366b42c95d0371a55205f38c60bec6838d35","unresolved":false,"context_lines":[{"line_number":1268,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1269,"context_line":"    def test_check_signature_sigv4_chunk_wrong_size(self):"},{"line_number":1270,"context_line":"        environ \u003d {"},{"line_number":1271,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1272,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1273,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1274,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"a4033e50_1da405b9","line":1271,"in_reply_to":"a0179173_42c8b2a1","updated":"2025-03-11 15:48:57.000000000","message":"https://review.opendev.org/c/openstack/swift/+/836755/comment/0852a73f_410ab292/","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"c28c36b84a06cbc16570fdf921d27032884cc1b1","unresolved":true,"context_lines":[{"line_number":1307,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1308,"context_line":"    def test_check_signature_sigv4_chunk_no_last_chunk(self):"},{"line_number":1309,"context_line":"        environ \u003d {"},{"line_number":1310,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1311,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1312,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1313,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"2db94ea8_49a1c2d5","line":1310,"updated":"2024-11-04 17:01:17.000000000","message":"same","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"802d366b42c95d0371a55205f38c60bec6838d35","unresolved":false,"context_lines":[{"line_number":1307,"context_line":"    @patch.object(S3Request, \u0027_validate_dates\u0027, lambda *a: None)"},{"line_number":1308,"context_line":"    def test_check_signature_sigv4_chunk_no_last_chunk(self):"},{"line_number":1309,"context_line":"        environ \u003d {"},{"line_number":1310,"context_line":"            \u0027HTTP_HOST\u0027: \u0027s3.test.com\u0027,"},{"line_number":1311,"context_line":"            \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027,"},{"line_number":1312,"context_line":"            \u0027RAW_PATH_INFO\u0027: \u0027/test/file\u0027}"},{"line_number":1313,"context_line":"        headers \u003d {"}],"source_content_type":"text/x-python","patch_set":38,"id":"32ca78be_14bf8b36","line":1310,"in_reply_to":"2db94ea8_49a1c2d5","updated":"2025-03-11 15:48:57.000000000","message":"https://review.opendev.org/c/openstack/swift/+/836755/comment/0852a73f_410ab292/","commit_id":"6e06604eeb0a21adbb24e4cbe9035e2758120b9c"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"3fe02cde53d3dc36e4dcf9854c6972718f8a1468","unresolved":true,"context_lines":[{"line_number":1305,"context_line":"            \u0027X-Amz-Decoded-Content-Length\u0027: \u002725\u0027}"},{"line_number":1306,"context_line":"        body \u003d \u0027a;chunk-signature\u003d4a397f01db2cd700402dc38931b462e789ae49911d\u0027 \\"},{"line_number":1307,"context_line":"               \u0027c229d93c9f9c46fd3e0b21\\r\\nabcdefghij\\r\\n\u0027 \\"},{"line_number":1308,"context_line":"               \u00279;chunk-signature\u003d49177768ee3e9b77c6353ab0f3b9747d188adc11d4\u0027 \\"},{"line_number":1309,"context_line":"               \u00275b38be94a130616e6d64dc\\r\\nklmnopqrst\\r\\n\u0027 \\"},{"line_number":1310,"context_line":"               \u00275;chunk-signature\u003dc884ebbca35b923cf864854e2a906aa8f5895a7140\u0027 \\"},{"line_number":1311,"context_line":"               \u00276c73cc6d4ee057527a8c23\\r\\nuvwz\\n\\r\\n\u0027 \\"}],"source_content_type":"text/x-python","patch_set":63,"id":"03eafffb_509c75ab","line":1308,"updated":"2025-04-02 04:16:58.000000000","message":"Is this what is making it an invalid chunk? \n\nDamn that\u0027s hard to see. You really need to be knowing what your looking for. Maybe a comment for people who need to maintain but don\u0027t quite understand.\n\n```\n# 2nd chunk contains a an incorrect chunk size\n```","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"887eefcae54163f4395b4badc305120555b2a6bb","unresolved":false,"context_lines":[{"line_number":1305,"context_line":"            \u0027X-Amz-Decoded-Content-Length\u0027: \u002725\u0027}"},{"line_number":1306,"context_line":"        body \u003d \u0027a;chunk-signature\u003d4a397f01db2cd700402dc38931b462e789ae49911d\u0027 \\"},{"line_number":1307,"context_line":"               \u0027c229d93c9f9c46fd3e0b21\\r\\nabcdefghij\\r\\n\u0027 \\"},{"line_number":1308,"context_line":"               \u00279;chunk-signature\u003d49177768ee3e9b77c6353ab0f3b9747d188adc11d4\u0027 \\"},{"line_number":1309,"context_line":"               \u00275b38be94a130616e6d64dc\\r\\nklmnopqrst\\r\\n\u0027 \\"},{"line_number":1310,"context_line":"               \u00275;chunk-signature\u003dc884ebbca35b923cf864854e2a906aa8f5895a7140\u0027 \\"},{"line_number":1311,"context_line":"               \u00276c73cc6d4ee057527a8c23\\r\\nuvwz\\n\\r\\n\u0027 \\"}],"source_content_type":"text/x-python","patch_set":63,"id":"c010eb94_56585383","line":1308,"in_reply_to":"03eafffb_509c75ab","updated":"2025-04-02 14:19:50.000000000","message":"+1\n\nturns out the second chunk signature is also invalid - will fix that so it is only the length that is wrong","commit_id":"d2a016a234f3602866fc7027c4c0e3ede7f26fbd"}]}
