--- a/src/WrappedHttpHandler.php +++ b/src/WrappedHttpHandler.php @@ -171,6 +171,14 @@ if (!isset($err['response'])) { $parts = ['response' => null]; $serviceError .= $err['exception']->getMessage(); + } elseif ($err['response']->getStatusCode() < 300) { + // A 2xx response attached to a transport-level rejection is a + // partial success payload (e.g. an interrupted streamed download), + // not an error document. Parsing it reads the entire body into one + // string and can exhaust memory_limit on multi-GB sink downloads. + // TODO: remove once https://github.com/aws/aws-sdk-php/issues/3319 is fixed. + $parts = ['response' => $err['response']]; + $serviceError .= $err['exception']->getMessage(); } else { try { $parts = call_user_func(