Summary
Calling AWS S3 through an existing Connection from a Python function always fails with HTTP 403. AWS reports the host header is present in the request but not included in the SigV4 signature. The identical URL and Connection work from Deluge invokeurl.
Environment
Zoho One Enterprise, US DC. Function language: Python 3.12.5 (new multi-language Functions UI). Connection: service "AWS S3", region us-east-1, link name awss3useast1.
Repro (Python, using the documented ZRC pattern)
from zrc import ZRC, RequestConfig
def runner(context, basicIO):
cfg = RequestConfig()
cfg.setConnection("awss3useast1")
resp = ZRC.get("https://s3.us-east-1.amazonaws.com/walkthruphoto.com/data/products.json", cfg)
basicIO.write(resp.getData())
Result: ConnectionError: Connection Error: 403 with body:
<Error><Code>AccessDenied</Code>
<Message>There were headers present in the request which were not signed</Message>
<HeadersNotSigned>host</HeadersNotSigned></Error>
Same call from Deluge - works (200)
resp = invokeurl
[
url :"https://s3.us-east-1.amazonaws.com/walkthruphoto.com/data/products.json"
type :GET
connection:"awss3useast1"
detailed:true
];
Also tried, same 403
context.getConnection("awss3useast1").makeRequest(url, "GET") (low-level connector)Host and x-amz-content-sha256 headers explicitlyhttps://s3.us-east-1.amazonaws.com/Expected
A Python/Java/Node function using a Connection should produce the same signed request that Deluge invokeurl does - i.e. host included in SignedHeaders.
Impact
S3 reads/writes cannot be moved from Deluge to Python functions until this is fixed. CRM API calls via ZRC.get("/crm/v8/...") work fine - the problem is only with external Connections (at least AWS S3).