{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Network.AWS.Sign.V2Header
( v2Header
) where
import Data.Monoid
import Data.Time
import Network.AWS.Data.Body
import Network.AWS.Data.ByteString
import Network.AWS.Data.Crypto
import Network.AWS.Data.Headers
import Network.AWS.Data.Log
import Network.AWS.Data.Path
import Network.AWS.Data.Time
import qualified Network.AWS.Sign.V2Header.Base as V2
import Network.AWS.Types
import qualified Network.HTTP.Conduit as Client
import Network.HTTP.Types
data V2Header = V2Header
{ metaTime :: !UTCTime
, metaEndpoint :: !Endpoint
, metaSignature :: !ByteString
, headers :: !Network.HTTP.Types.RequestHeaders
, signer :: !ByteString
}
instance ToLog V2Header where
build V2Header{..} = buildLines
[ "[Version 2 Header Metadata] {"
, " time = " <> build metaTime
, " endpoint = " <> build (_endpointHost metaEndpoint)
, " signature = " <> build metaSignature
, " headers = " <> build headers
, " signer = " <> build signer
, "}"
]
v2Header :: Signer
v2Header = Signer sign (const sign)
sign :: Algorithm a
sign Request{..} AuthEnv{..} r t = Signed meta rq
where
meta = Meta (V2Header t end signature headers signer)
signer = V2.newSigner headers meth path' _rqQuery
rq = (clientRequest end _svcTimeout)
{ Client.method = meth
, Client.path = path'
, Client.queryString = toBS _rqQuery
, Client.requestHeaders = headers
, Client.requestBody = toRequestBody _rqBody
}
meth = toBS _rqMethod
path' = toBS (escapePath _rqPath)
end@Endpoint{..} = _svcEndpoint r
Service{..} = _rqService
signature = digestToBase Base64
. hmacSHA1 (toBS _authSecret) $ signer
headers =
hdr hDate time
. hdr hAuthorization ("AWS " <> toBS _authAccess <> ":" <> signature)
$ _rqHeaders
time = toBS (Time t :: RFC822)