From c4626888460dfc4fbefa694a74412c37bb1b80ff Mon Sep 17 00:00:00 2001 From: Bert Blommers Date: Wed, 28 Sep 2022 09:33:27 +0000 Subject: [PATCH] S3 - UploadFile with ChecksumAlgorithm changes body content (#5498) --- moto/s3/responses.py | 21 ++++++++++++++++++++- tests/test_s3/red.jpg | Bin 633 -> 0 bytes tests/test_s3/test_s3.py | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) delete mode 100644 tests/test_s3/red.jpg diff --git a/moto/s3/responses.py b/moto/s3/responses.py index cdb9cf211..49221db9c 100644 --- a/moto/s3/responses.py +++ b/moto/s3/responses.py @@ -1104,6 +1104,15 @@ class S3Response(BaseResponse): line = body_io.readline() return bytes(new_body) + def _handle_encoded_body(self, body, content_length): + body_io = io.BytesIO(body) + # first line should equal '{content_length}\r\n + body_io.readline() + # Body contains actual data next + return body_io.read(content_length) + # last line should equal + # amz-checksum-sha256:<..>\r\n + @amzn_request_id def key_response(self, request, full_url, headers): # Key and Control are lumped in because splitting out the regex is too much of a pain :/ @@ -1384,12 +1393,22 @@ class S3Response(BaseResponse): checksum_header = f"x-amz-checksum-{checksum_algorithm.lower()}" checksum_value = request.headers.get(checksum_header) if not checksum_value and checksum_algorithm: - search = re.search(r"x-amz-checksum-\w+:(\w+={1,2})", body.decode()) + # Extract the checksum-value from the body first + search = re.search(b"x-amz-checksum-\w+:(\w+={1,2})", body) checksum_value = search.group(1) if search else None if checksum_value: response_headers.update({checksum_header: checksum_value}) + # Extract the actual data from the body second + if ( + request.headers.get("x-amz-content-sha256", None) + == "STREAMING-UNSIGNED-PAYLOAD-TRAILER" + ): + body = self._handle_encoded_body( + body, int(request.headers["x-amz-decoded-content-length"]) + ) + bucket_key_enabled = request.headers.get( "x-amz-server-side-encryption-bucket-key-enabled", None ) diff --git a/tests/test_s3/red.jpg b/tests/test_s3/red.jpg deleted file mode 100644 index 6fb9aed7c88160a18eb8cb0b412f80a7a47ffced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmex=oIr{vTiv|EDQ{cwTw*63@n1ILW+itY{G$w>`H|qMvW5}awt1(JSZA; z@q>zSQc)8pmzcPOq?D?fx`w8fiK&^ng{76Vi>sTvho@I?NN8AiL}XNQN@`kqMrKxV zNoiSmMP*fUOKV$uM`zch$y26In?7UatVN5LEM2yI#mZHiHgDOwZTpU$yAB;ba`f2o z6DLnyx_ss8wd*%--g@}x@sp>|p1*kc>f@)+U%r0({^RE_kiQrin8CgR5fG1|`Ad+2 ziIItgg_(sNL#