diff --git a/python-client/wmill/wmill/s3_reader.py b/python-client/wmill/wmill/s3_reader.py index 62161a6946..557bc9d200 100644 --- a/python-client/wmill/wmill/s3_reader.py +++ b/python-client/wmill/wmill/s3_reader.py @@ -22,6 +22,17 @@ class S3BufferedReader(BufferedReader): def __enter__(self): reader = self._context_manager.__enter__() + if reader.status_code >= 400: + error_bytes = reader.read() + try: + error_text = error_bytes.decode('utf-8') + except UnicodeDecodeError: + error_text = str(error_bytes) + raise httpx.HTTPStatusError( + f"Failed to load S3 file: {reader.status_code} {reader.reason_phrase} - {error_text}", + request=reader.request, + response=reader + ) self._iterator = reader.iter_bytes() return self diff --git a/typescript-client/client.ts b/typescript-client/client.ts index 25de187598..f2388d2962 100644 --- a/typescript-client/client.ts +++ b/typescript-client/client.ts @@ -717,7 +717,7 @@ export async function loadS3FileStream( const queryParams = new URLSearchParams(params); // We use raw fetch here b/c OpenAPI generated client doesn't handle Blobs nicely - const fileContentBlob = await fetch( + const response = await fetch( `${ OpenAPI.BASE }/w/${getWorkspace()}/job_helpers/download_s3_file?${queryParams}`, @@ -728,7 +728,16 @@ export async function loadS3FileStream( }, } ); - return fileContentBlob.blob(); + + // Check if the response was successful + if (!response.ok) { + const errorText = await response.text(); + throw new Error( + `Failed to load S3 file: ${response.status} ${response.statusText} - ${errorText}` + ); + } + + return response.blob(); } /**