Skip to content

Commit 40d3550

Browse files
Gayathri Srividya RajavarapuGayathri Srividya Rajavarapu
authored andcommitted
fix: drop Expect header before S3 REST signing
1 parent 6da06ad commit 40d3550

2 files changed

Lines changed: 59 additions & 0 deletions

File tree

pyiceberg/io/fsspec.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,12 @@ def __call__(self, request: "AWSRequest", **_: Any) -> None:
139139

140140
signer_headers.update(get_header_properties(self.properties))
141141

142+
# Some S3-compatible signer services reject requests carrying Expect: 100-continue.
143+
# Strip this transport hint before asking the service to sign request headers.
144+
for header in list(request.headers):
145+
if header.lower() == "expect":
146+
del request.headers[header]
147+
142148
signer_body = {
143149
"method": request.method,
144150
"region": request.context["client_region"],

tests/io/test_fsspec.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,59 @@ def test_s3v4_rest_signer_endpoint(requests_mock: Mocker) -> None:
10181018
}
10191019

10201020

1021+
def test_s3v4_rest_signer_strips_expect_header(requests_mock: Mocker) -> None:
1022+
new_uri = "https://other-bucket/metadata/snap-8048355899640248710-1-a5c8ea2d-aa1f-48e8-89f4-1fa69db8c742.avro"
1023+
requests_mock.post(
1024+
f"{TEST_URI}/v1/aws/s3/sign",
1025+
json={
1026+
"uri": new_uri,
1027+
"headers": {
1028+
"Authorization": [
1029+
"AWS4-HMAC-SHA256 Credential=ASIAQPRZZYGHUT57DL3I/20221017/us-west-2/s3/aws4_request, "
1030+
"SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, "
1031+
"Signature=430582a17d61ab02c272896fa59195f277af4bdf2121c441685e589f044bbe02"
1032+
],
1033+
"Host": ["bucket.s3.us-west-2.amazonaws.com"],
1034+
"User-Agent": ["Botocore/1.27.59 Python/3.10.7 Darwin/21.5.0"],
1035+
"x-amz-content-sha256": ["UNSIGNED-PAYLOAD"],
1036+
"X-Amz-Date": ["20221017T102940Z"],
1037+
"X-Amz-Security-Token": [
1038+
"YQoJb3JpZ2luX2VjEDoaCXVzLXdlc3QtMiJGMEQCID/fFxZP5oaEgQmcwP6XhZa0xSq9lmLSx8ffaWbySfUPAiAesa7sjd/WV4uwRTO0S03y/MWVtgpH+/NyZQ4bZgLVriqrAggTEAEaDDAzMzQwNzIyMjE1OSIMOeFOWhZIurMmAqjsKogCxMCqxX8ZjK0gacAkcDqBCyA7qTSLhdfKQIH/w7WpLBU1km+cRUWWCudan6gZsAq867DBaKEP7qI05DAWr9MChAkgUgyI8/G3Z23ET0gAedf3GsJbakB0F1kklx8jPmj4BPCht9RcTiXiJ5DxTS/cRCcalIQXmPFbaJSqpBusVG2EkWnm1v7VQrNPE2Os2b2P293vpbhwkyCEQiGRVva4Sw9D1sKvqSsK10QCRG+os6dFEOu1kARaXi6pStvR4OVmj7OYeAYjzaFchn7nz2CSae0M4IluiYQ01eQAywbfRo9DpKSmDM/DnPZWJnD/woLhaaaCrCxSSEaFsvGOHFhLd3Rknw1v0jADMILUtJoGOp4BpqKqyMz0CY3kpKL0jfR3ykTf/ge9wWVE0Alr7wRIkGCIURkhslGHqSyFRGoTqIXaxU+oPbwlw/0w/nYO7qQ6bTANOWye/wgw4h/NmJ6vU7wnZTXwREf1r6MF72++bE/fMk19LfVb8jN/qrUqAUXTc8gBAUxL5pgy8+oT/JnI2BkVrrLS4ilxEXP9Ahm+6GDUYXV4fBpqpZwdkzQ/5Gw="
1039+
],
1040+
},
1041+
"extensions": {},
1042+
},
1043+
status_code=200,
1044+
)
1045+
1046+
request = AWSRequest(
1047+
method="PUT",
1048+
url="https://bucket/metadata/snap-8048355899640248710-1-a5c8ea2d-aa1f-48e8-89f4-1fa69db8c742.avro",
1049+
headers={
1050+
"User-Agent": "Botocore/1.27.59 Python/3.10.7 Darwin/21.5.0",
1051+
"Expect": "100-continue",
1052+
},
1053+
data=b"abc",
1054+
params={},
1055+
auth_path="/metadata/snap-8048355899640248710-1-a5c8ea2d-aa1f-48e8-89f4-1fa69db8c742.avro",
1056+
)
1057+
request.context = {
1058+
"client_region": "us-west-2",
1059+
"has_streaming_input": False,
1060+
"auth_type": None,
1061+
"signing": {"bucket": "bucket"},
1062+
"retries": {"attempt": 1, "invocation-id": "75d143fb-0219-439b-872c-18213d1c8d54"},
1063+
}
1064+
1065+
signer = S3V4RestSigner(properties={"token": "abc", "uri": TEST_URI})
1066+
signer(request)
1067+
1068+
assert requests_mock.last_request is not None
1069+
signer_request_body = requests_mock.last_request.json()
1070+
assert "expect" not in {header.lower() for header in signer_request_body["headers"]}
1071+
assert "expect" not in {header.lower() for header in request.headers}
1072+
1073+
10211074
def test_s3v4_rest_signer_forbidden(requests_mock: Mocker) -> None:
10221075
requests_mock.post(
10231076
f"{TEST_URI}/v1/aws/s3/sign",

0 commit comments

Comments
 (0)