)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51b70ab8598b734689bac352035f08ab52693366","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e640017a_2f26a218","updated":"2025-04-02 13:53:50.000000000","message":"* Gets rid of a bunch of lines of code, \n* Only define hasher name and digest_size in one place (the CRCHasher class)\n* the NotImplemented error for crc64nvme (when it is removed in the next patchset) is triggered earlier and not as a side-effect of constructing a ChecksummingInput.","commit_id":"93c2908213210cbc9017e81a937bf2f6df558f89"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2da6155eee7474c3aa3fda0fedfbe4b10e6c11dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d16f2ae8_3d6b4135","updated":"2025-04-02 21:17:00.000000000","message":"this refactor seems fine, when you get to the end of the chain it does what we want:\n\n```\nDEBUG:botocore.endpoint:Sending http request: \u003cAWSPreparedRequest stream_output\u003dFalse, method\u003dPUT, url\u003dhttps://saio/s3test/test, headers\u003d{\u0027x-amz-sdk-checksum-algorithm\u0027: b\u0027crc64nvme\u0027, \u0027User-Agent\u0027: b\u0027Boto3/1.37.14 md/Botocore#1.37.14 md/awscrt#0.24.2 ua/2.1 os/linux#5.15.0-116-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython m/N cfg/retry-mode#legacy Botocore/1.37.14\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-crc64nvme\u0027, \u0027X-Amz-Decoded-Content-Length\u0027: b\u0027415865\u0027, \u0027host\u0027: b\u0027saio\u0027, \u0027X-Amz-Date\u0027: b\u002720250402T211553Z\u0027, \u0027x-amz-content-sha256\u0027: b\u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027, \u0027Authorization\u0027: b\u0027AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250402/us-east-1/s3/aws4_request, SignedHeaders\u003dcontent-encoding;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer, Signature\u003d2c8fa838878ced33b85943554db351e2ba3e5be55856f7482040d93cefe7abab\u0027, \u0027amz-sdk-invocation-id\u0027: b\u0027b4250b1e-f4da-4aeb-8367-e5a5ff7bd504\u0027, \u0027amz-sdk-request\u0027: b\u0027attempt\u003d1\u0027}\u003e\nDEBUG:botocore.httpsession:Certificate path: /usr/local/lib/python3.10/dist-packages/certifi/cacert.pem\nDEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): saio:443\nDEBUG:botocore.awsrequest:Waiting for 100 Continue response.\nDEBUG:botocore.awsrequest:Received a non 100 Continue response from the server, NOT sending request body.\nDEBUG:botocore.awsrequest:send() called, but response already received. Not sending data.\nDEBUG:urllib3.connectionpool:https://saio:443 \"PUT /s3test/test HTTP/1.1\" 501 None\nDEBUG:botocore.hooks:Event before-parse.s3.PutObject: calling handler \u003cfunction _handle_200_error at 0x7f1207051c60\u003e\nDEBUG:botocore.hooks:Event before-parse.s3.PutObject: calling handler \u003cfunction handle_expires_header at 0x7f1207051ab0\u003e\nDEBUG:botocore.parsers:Response headers: {\u0027Content-Type\u0027: \u0027application/xml\u0027, \u0027x-amz-id-2\u0027: \u0027tx1f0f64d4a8f940ad90639-0067eda909\u0027, \u0027x-amz-request-id\u0027: \u0027tx1f0f64d4a8f940ad90639-0067eda909\u0027, \u0027X-Trans-Id\u0027: \u0027tx1f0f64d4a8f940ad90639-0067eda909\u0027, \u0027X-Openstack-Request-Id\u0027: \u0027tx1f0f64d4a8f940ad90639-0067eda909\u0027, \u0027Date\u0027: \u0027Wed, 02 Apr 2025 21:15:53 GMT\u0027, \u0027Transfer-Encoding\u0027: \u0027chunked\u0027}\nDEBUG:botocore.parsers:Response body:\nb\"\u003c?xml version\u003d\u00271.0\u0027 encoding\u003d\u0027UTF-8\u0027?\u003e\\n\u003cError\u003e\u003cCode\u003eNotImplemented\u003c/Code\u003e\u003cMessage\u003eThe x-amz-checksum-crc64nvme algorithm is not supported.\u003c/Message\u003e\u003cRequestId\u003etx1f0f64d4a8f940ad90639-0067eda909\u003c/RequestId\u003e\u003c/Error\u003e\"\nDEBUG:botocore.hooks:Event needs-retry.s3.PutObject: calling handler \u003cfunction _update_status_code at 0x7f1207051d80\u003e\nDEBUG:botocore.hooks:Event needs-retry.s3.PutObject: calling handler \u003cbotocore.retryhandler.RetryHandler object at 0x7f12062868c0\u003e\nDEBUG:botocore.retryhandler:No retry needed.\nDEBUG:botocore.hooks:Event needs-retry.s3.PutObject: calling handler \u003cbound method S3RegionRedirectorv2.redirect_from_error of \u003cbotocore.utils.S3RegionRedirectorv2 object at 0x7f1206286980\u003e\u003e\nDEBUG:s3transfer.tasks:Exception raised.\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/tasks.py\", line 135, in __call__\n    return self._execute_main(kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/tasks.py\", line 158, in _execute_main\n    return_value \u003d self._main(**kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/upload.py\", line 796, in _main\n    client.put_object(Bucket\u003dbucket, Key\u003dkey, Body\u003dbody, **extra_args)\n  File \"/usr/local/lib/python3.10/dist-packages/botocore/client.py\", line 570, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/botocore/context.py\", line 124, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/botocore/client.py\", line 1031, in _make_api_call\n    raise error_class(parsed_response, operation_name)\nbotocore.exceptions.ClientError: An error occurred (NotImplemented) when calling the PutObject operation: The x-amz-checksum-crc64nvme algorithm is not supported.\nDEBUG:s3transfer.utils:Releasing acquire 0/None\nERROR:root:something broke\nTraceback (most recent call last):\n  File \"/usr/local/lib/python3.10/dist-packages/boto3/s3/transfer.py\", line 372, in upload_file\n    future.result()\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/futures.py\", line 103, in result\n    return self._coordinator.result()\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/futures.py\", line 264, in result\n    raise self._exception\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/tasks.py\", line 135, in __call__\n    return self._execute_main(kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/tasks.py\", line 158, in _execute_main\n    return_value \u003d self._main(**kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/s3transfer/upload.py\", line 796, in _main\n    client.put_object(Bucket\u003dbucket, Key\u003dkey, Body\u003dbody, **extra_args)\n  File \"/usr/local/lib/python3.10/dist-packages/botocore/client.py\", line 570, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/botocore/context.py\", line 124, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/botocore/client.py\", line 1031, in _make_api_call\n    raise error_class(parsed_response, operation_name)\nbotocore.exceptions.ClientError: An error occurred (NotImplemented) when calling the PutObject operation: The x-amz-checksum-crc64nvme algorithm is not supported.\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/vagrant/.scratch/nv-swift-gizmos/bin/boto_break.py\", line 103, in \u003cmodule\u003e\n    main()\n  File \"/vagrant/.scratch/nv-swift-gizmos/bin/boto_break.py\", line 93, in main\n    s3_client.upload_file(\n  File \"/usr/local/lib/python3.10/dist-packages/botocore/context.py\", line 124, in wrapper\n    return func(*args, **kwargs)\n  File \"/usr/local/lib/python3.10/dist-packages/boto3/s3/inject.py\", line 170, in upload_file\n    return transfer.upload_file(\n  File \"/usr/local/lib/python3.10/dist-packages/boto3/s3/transfer.py\", line 378, in upload_file\n    raise S3UploadFailedError(\nboto3.exceptions.S3UploadFailedError: Failed to upload test to s3test/test: An error occurred (NotImplemented) when calling the PutObject operation: The x-amz-checksum-crc64nvme algorithm is not supported.\n```","commit_id":"c7753bd9e155af0b01066aaa6087ab7a50a3f74b"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51b70ab8598b734689bac352035f08ab52693366","unresolved":true,"context_lines":[{"line_number":176,"context_line":"        super().__init__(wsgi_input)"},{"line_number":177,"context_line":"        self._expected_length \u003d content_length"},{"line_number":178,"context_line":"        self.checksum_info \u003d checksum_info"},{"line_number":179,"context_line":"        self._hasher \u003d self.checksum_info.new_hasher()"},{"line_number":180,"context_line":"        self.expected_raw_checksum \u003d expected_raw_checksum"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def chunk_update(self, chunk, eof, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"eb4a41dc_fd419c5c","side":"PARENT","line":179,"updated":"2025-04-02 13:53:50.000000000","message":"this where we would have had a NotImplementedError raised, which is pretty late in the handling","commit_id":"36511c9ba0870e4f3f8d2d534118442dd94662b6"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51b70ab8598b734689bac352035f08ab52693366","unresolved":true,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def __init__(self, wsgi_input, content_length,"},{"line_number":191,"context_line":"                 checksum_hasher, expected_raw_checksum,"},{"line_number":192,"context_line":"                 expected_trailer\u003dNone):"},{"line_number":193,"context_line":"        super().__init__(wsgi_input)"},{"line_number":194,"context_line":"        self._expected_length \u003d content_length"},{"line_number":195,"context_line":"        self._hasher \u003d checksum_hasher"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2d0d98_6774a3dc","line":192,"updated":"2025-04-02 13:53:50.000000000","message":"off-topic: I don\u0027t really like how this class has two modes: either it is given an expected checksum value, or it expects to get it from its wsgi_input\u0027s ``trailers`` attribute, and in the latter case its implicit that the wsgi_input even has a ``trailers`` attribute.\n\nI wonder about having a subclass for each case, or at least making it much more explicit which mode we\u0027re using when we plumb it to a wsgi_input.","commit_id":"93c2908213210cbc9017e81a937bf2f6df558f89"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"51b70ab8598b734689bac352035f08ab52693366","unresolved":true,"context_lines":[{"line_number":1426,"context_line":""},{"line_number":1427,"context_line":"        if checksum_headers:"},{"line_number":1428,"context_line":"            header, b64digest \u003d list(checksum_headers.items())[0]"},{"line_number":1429,"context_line":"            checksum_hasher \u003d _get_checksum_hasher(header)"},{"line_number":1430,"context_line":"            try:"},{"line_number":1431,"context_line":"                expected_raw_checksum \u003d strict_b64decode("},{"line_number":1432,"context_line":"                    b64digest,"}],"source_content_type":"text/x-python","patch_set":2,"id":"f96a68b2_70da6e7a","line":1429,"updated":"2025-04-02 13:53:50.000000000","message":"now we get the NotImplementedError raised here, before instantiating the ChecksummingInput","commit_id":"93c2908213210cbc9017e81a937bf2f6df558f89"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2da6155eee7474c3aa3fda0fedfbe4b10e6c11dc","unresolved":true,"context_lines":[{"line_number":99,"context_line":"    \u0027x-amz-checksum-crc32c\u0027: checksum.crc32c,"},{"line_number":100,"context_line":"    \u0027x-amz-checksum-crc64nvme\u0027: checksum.crc64nvme,"},{"line_number":101,"context_line":"    \u0027x-amz-checksum-sha1\u0027: sha1,"},{"line_number":102,"context_line":"    \u0027x-amz-checksum-sha256\u0027: sha256,"},{"line_number":103,"context_line":"}"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"43eb7cb2_f271a7d8","line":102,"updated":"2025-04-02 21:17:00.000000000","message":"FWIW I\u0027ve only ever taken notes showing awscli/boto3 sending`x-amz-checksum-crc32` and `x-amz-checksum-sha1` - I\u0027m going to see if I can provoke some of these other options.\n\nok a little more varity!\n\n```\nDEBUG:botocore.endpoint:Making request for OperationModel(name\u003dPutObject) with params: {\u0027url_path\u0027: \u0027/test\u0027, \u0027query_string\u0027: {}, \u0027method\u0027: \u0027PUT\u0027, \u0027headers\u0027: {\u0027x-amz-sdk-checksum-algorithm\u0027: \u0027CRC32\u0027, \u0027User-Agent\u0027: \u0027Boto3/1.37.14 md/Botocore#1.37.14 md/awscrt#0.24.2 ua/2.1 os/linux#5.15.0-116-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython m/N cfg/retry-mode#legacy Botocore/1.37.14\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: \u0027415865\u0027}, \u0027body\u0027: \u003cbotocore.httpchecksum.AwsChunkedWrapper object at 0x7fc23a2ec730\u003e, \u0027auth_path\u0027: \u0027/s3test/test\u0027, \u0027url\u0027: \u0027https://saio/s3test/test\u0027, \u0027context\u0027: {\u0027client_region\u0027: \u0027us-east-1\u0027, \u0027client_config\u0027: \u003cbotocore.config.Config object at 0x7fc23a529480\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: \u0027test\u0027, \u0027Body\u0027: \u003cs3transfer.utils.ReadFileChunk object at 0x7fc23a2cbac0\u003e, \u0027ChecksumAlgorithm\u0027: \u0027CRC32\u0027}}, \u0027input_params\u0027: {\u0027Bucket\u0027: \u0027s3test\u0027, \u0027Key\u0027: \u0027test\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\nDEBUG:botocore.endpoint:Making request for OperationModel(name\u003dPutObject) with params: {\u0027url_path\u0027: \u0027/test\u0027, \u0027query_string\u0027: {}, \u0027method\u0027: \u0027PUT\u0027, \u0027headers\u0027: {\u0027x-amz-sdk-checksum-algorithm\u0027: \u0027sha1\u0027, \u0027User-Agent\u0027: \u0027Boto3/1.37.14 md/Botocore#1.37.14 md/awscrt#0.24.2 ua/2.1 os/linux#5.15.0-116-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython m/N cfg/retry-mode#legacy Botocore/1.37.14\u0027, \u0027Expect\u0027: \u0027100-continue\u0027, \u0027Transfer-Encoding\u0027: \u0027chunked\u0027, \u0027Content-Encoding\u0027: \u0027aws-chunked\u0027, \u0027X-Amz-Trailer\u0027: \u0027x-amz-checksum-sha1\u0027, \u0027X-Amz-Decoded-Content-Length\u0027: \u0027415865\u0027}, \u0027body\u0027: \u003cbotocore.httpchecksum.AwsChunkedWrapper object at 0x7f7ff5904760\u003e, \u0027auth_path\u0027: \u0027/s3test/test\u0027, \u0027url\u0027: \u0027https://saio/s3test/test\u0027, \u0027context\u0027: {\u0027client_region\u0027: \u0027us-east-1\u0027, \u0027client_config\u0027: \u003cbotocore.config.Config object at 0x7f7ff5b494b0\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: \u0027test\u0027, \u0027Body\u0027: \u003cs3transfer.utils.ReadFileChunk object at 0x7f7ff5c17af0\u003e, \u0027ChecksumAlgorithm\u0027: \u0027sha1\u0027}}, \u0027input_params\u0027: {\u0027Bucket\u0027: \u0027s3test\u0027, \u0027Key\u0027: \u0027test\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: \u0027sha1\u0027, \u0027in\u0027: \u0027trailer\u0027, \u0027name\u0027: \u0027x-amz-checksum-sha1\u0027}}}}\n\nDEBUG:botocore.endpoint:Sending http request: \u003cAWSPreparedRequest stream_output\u003dFalse, method\u003dPUT, url\u003dhttps://saio/s3test/test, headers\u003d{\u0027x-amz-sdk-checksum-algorithm\u0027: b\u0027crc32c\u0027, \u0027User-Agent\u0027: b\u0027Boto3/1.37.14 md/Botocore#1.37.14 md/awscrt#0.24.2 ua/2.1 os/linux#5.15.0-116-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython m/N cfg/retry-mode#legacy Botocore/1.37.14\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-crc32c\u0027, \u0027X-Amz-Decoded-Content-Length\u0027: b\u0027415865\u0027, \u0027host\u0027: b\u0027saio\u0027, \u0027X-Amz-Date\u0027: b\u002720250402T211531Z\u0027, \u0027x-amz-content-sha256\u0027: b\u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027, \u0027Authorization\u0027: b\u0027AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250402/us-east-1/s3/aws4_request, SignedHeaders\u003dcontent-encoding;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer, Signature\u003d60252d394da5edc8b22353f4ca3bc60ca7f4542e34c6202c0e23d0de856c16b3\u0027, \u0027amz-sdk-invocation-id\u0027: b\u002783717aa8-b8c3-4a31-9f9f-1e01633a7a0b\u0027, \u0027amz-sdk-request\u0027: b\u0027attempt\u003d1\u0027}\u003e\n\n\n\n```","commit_id":"c7753bd9e155af0b01066aaa6087ab7a50a3f74b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"2da6155eee7474c3aa3fda0fedfbe4b10e6c11dc","unresolved":true,"context_lines":[{"line_number":1397,"context_line":"            for h, v in self.headers.items()"},{"line_number":1398,"context_line":"            if h.lower().startswith(\u0027x-amz-checksum-\u0027)}"},{"line_number":1399,"context_line":"        if any(h not in CHECKSUMS_BY_HEADER"},{"line_number":1400,"context_line":"               for h in checksum_headers):"},{"line_number":1401,"context_line":"            raise InvalidRequest(\u0027The algorithm type you specified in \u0027"},{"line_number":1402,"context_line":"                                 \u0027x-amz-checksum- header is invalid.\u0027)"},{"line_number":1403,"context_line":"        self._validate_checksum_header_cardinality(len(checksum_headers))"}],"source_content_type":"text/x-python","patch_set":3,"id":"b5c85aa9_f1921551","line":1400,"updated":"2025-04-02 21:17:00.000000000","message":"FWIW I\u0027m not sure I know how to get modern boto3 to send these headers on a PUT, I think when I set \n\n```\n    s3_client.upload_file(..., ExtraArgs\u003d{\u0027ChecksumAlgorithm\u0027: ...}\n```\n\nit\u0027s *always* going to send it as \n\n```\n\u0027X-Amz-Trailer\u0027: \u0027x-amz-checksum-crc32\u0027\n```\n\neven when I set \n\n```\n    s3_client \u003d session.client(\n        ...\n        config\u003dboto3.session.Config(request_checksum_calculation\u003d\u0027when_required\u0027),\n    )\n```\n\nI\u0027ll get `\u0027x-amz-content-sha256\u0027: b\u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027`\n\n\n```\nDEBUG:botocore.endpoint:Sending http request: \u003cAWSPreparedRequest stream_output\u003dFalse, method\u003dPUT, url\u003dhttps://saio/s3test/test, headers\u003d{\u0027x-amz-sdk-checksum-algorithm\u0027: b\u0027sha256\u0027, \u0027User-Agent\u0027: b\u0027Boto3/1.37.14 md/Botocore#1.37.14 md/awscrt#0.24.2 ua/2.1 os/linux#5.15.0-116-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython m/N cfg/retry-mode#legacy Botocore/1.37.14\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-sha256\u0027, \u0027X-Amz-Decoded-Content-Length\u0027: b\u0027415865\u0027, \u0027host\u0027: b\u0027saio\u0027, \u0027X-Amz-Date\u0027: b\u002720250402T211315Z\u0027, \u0027x-amz-content-sha256\u0027: b\u0027STREAMING-UNSIGNED-PAYLOAD-TRAILER\u0027, \u0027Authorization\u0027: b\u0027AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250402/us-east-1/s3/aws4_request, SignedHeaders\u003dcontent-encoding;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer, Signature\u003d0ba0f06846e8d63258c006799b81867992256e6a66991cd2298b3a310773cd86\u0027, \u0027amz-sdk-invocation-id\u0027: b\u0027b333d6f2-0a73-40a7-8b2f-4eb25a5da7db\u0027, \u0027amz-sdk-request\u0027: b\u0027attempt\u003d1\u0027}\u003e\n```\n\n... unless I don\u0027t specify a checksum-algorithm\n\n\n```\nDEBUG:botocore.endpoint:Sending http request: \u003cAWSPreparedRequest stream_output\u003dFalse, method\u003dPUT, url\u003dhttps://saio/s3test/test, headers\u003d{\u0027User-Agent\u0027: b\u0027Boto3/1.37.14 md/Botocore#1.37.14 md/awscrt#0.24.2 ua/2.1 os/linux#5.15.0-116-generic md/arch#x86_64 lang/python#3.10.12 md/pyimpl#CPython m/N cfg/retry-mode#legacy Botocore/1.37.14\u0027, \u0027Expect\u0027: b\u0027100-continue\u0027, \u0027host\u0027: b\u0027saio\u0027, \u0027X-Amz-Date\u0027: b\u002720250402T211058Z\u0027, \u0027x-amz-content-sha256\u0027: b\u00270b28a9321d6e2114b326e86b2a2f0100006d061f2dfea0c29da06b9d6049eab2\u0027, \u0027Authorization\u0027: b\u0027AWS4-HMAC-SHA256 Credential\u003dtest:tester/20250402/us-east-1/s3/aws4_request, SignedHeaders\u003dhost;x-amz-content-sha256;x-amz-date, Signature\u003dd11670e598fe1d31ac6664af89656b191a476cb5f2be7cd7792244a54b43425c\u0027, \u0027amz-sdk-invocation-id\u0027: b\u0027ea7d1f48-83db-4133-a2c9-b0d66a0278f2\u0027, \u0027amz-sdk-request\u0027: b\u0027attempt\u003d1\u0027, \u0027Content-Length\u0027: \u0027415865\u0027}\u003e\n```","commit_id":"c7753bd9e155af0b01066aaa6087ab7a50a3f74b"}]}
