-- | -- Module : Amazonka.S3.Encryption.Decrypt -- Copyright : (c) 2013-2023 Brendan Hay -- License : Mozilla Public License, v. 2.0. -- Maintainer : Brendan Hay -- Stability : provisional -- Portability : non-portable (GHC extensions) module Amazonka.S3.Encryption.Decrypt where import qualified Amazonka as AWS import Amazonka.Core import Amazonka.Prelude import qualified Amazonka.S3 as S3 import Amazonka.S3.Encryption.Envelope import Amazonka.S3.Encryption.Instructions import Amazonka.S3.Encryption.Types import qualified Amazonka.S3.Lens as S3 import Control.Lens ((%~), (^.)) import qualified Control.Monad.Except as Except import qualified Network.HTTP.Client as Client decrypted :: S3.GetObject -> (Decrypt S3.GetObject, GetInstructions) decrypted x = (Decrypt x, getInstructions x) newtype Decrypt a = Decrypt a newtype Decrypted a = Decrypted { runDecrypted :: forall m. MonadResource m => Key -> AWS.Env -> Maybe Envelope -> m a } instance AWSRequest (Decrypt S3.GetObject) where type AWSResponse (Decrypt S3.GetObject) = Decrypted S3.GetObjectResponse request overrides (Decrypt x) = coerce (request overrides x) response l s p r = Except.runExceptT $ do rs <- Except.ExceptT (response l s (proxy p) r) let body = Client.responseBody rs decrypt = Decrypted $ \key env m -> do encrypted <- case m of Nothing -> fromMetadata key env (body ^. S3.getObjectResponse_metadata) Just e -> pure e pure (body & S3.getObjectResponse_body %~ bodyDecrypt encrypted) pure (decrypt <$ rs) proxy :: forall a. Proxy (Decrypt a) -> Proxy a proxy = const Proxy