module Aws.Sqs.Query where
import Aws.Credentials
import Aws.Http
import Aws.Query
import Aws.Sqs.Info
import Aws.Sqs.Model
import Aws.Signature
import Data.List
import Data.Monoid
import Data.Ord
import Data.Time
import System.Locale
import qualified Blaze.ByteString.Builder as Blaze
import qualified Blaze.ByteString.Builder.Char8 as Blaze8
import qualified Data.ByteString.Char8 as BC
import qualified Data.Text.Encoding as TE
import qualified Network.HTTP.Types as HTTP
data SqsQuery = SqsQuery{
sqsQueueName :: Maybe QueueName,
sqsQuery :: HTTP.Query
}
sqsSignQuery :: SqsQuery -> SqsInfo -> SignatureData -> SignedQuery
sqsSignQuery SqsQuery{..} SqsInfo{..} SignatureData{..}
= SignedQuery {
sqMethod = method
, sqProtocol = sqsProtocol
, sqHost = endpointHost sqsEndpoint
, sqPort = sqsPort
, sqPath = path
, sqQuery = signedQuery
, sqDate = Just signatureTime
, sqAuthorization = Nothing
, sqBody = Nothing
, sqStringToSign = stringToSign
, sqContentType = Nothing
, sqContentMd5 = Nothing
, sqAmzHeaders = []
, sqOtherHeaders = []
}
where
method = PostQuery
path = case sqsQueueName of
Just x -> TE.encodeUtf8 $ printQueueName x
Nothing -> "/"
expandedQuery = sortBy (comparing fst)
( sqsQuery ++ [ ("AWSAccessKeyId", Just(accessKeyID signatureCredentials)),
("Expires", Just(BC.pack expiresString)),
("SignatureMethod", Just("HmacSHA256")), ("SignatureVersion",Just("2")), ("Version",Just("2009-02-01"))
])
expires = AbsoluteExpires $ sqsDefaultExpiry `addUTCTime` signatureTime
expiresString = formatTime defaultTimeLocale "%FT%TZ" (fromAbsoluteTimeInfo expires)
sig = signature signatureCredentials HmacSHA256 stringToSign
stringToSign = Blaze.toByteString . mconcat . intersperse (Blaze8.fromChar '\n') . concat $
[[Blaze.copyByteString $ httpMethod method]
, [Blaze.copyByteString $ endpointHost sqsEndpoint]
, [Blaze.copyByteString path]
, [Blaze.copyByteString $ HTTP.renderQuery False expandedQuery ]]
signedQuery = expandedQuery ++ (HTTP.simpleQueryToQuery $ makeAuthQuery)
makeAuthQuery = [("Signature", sig)]