module Aws.SimpleDb.Query
where
import Aws.Credentials
import Aws.Http
import Aws.Query
import Aws.Signature
import Aws.SimpleDb.Info
import Aws.Util
import Data.List
import Data.Monoid
import qualified Blaze.ByteString.Builder as Blaze
import qualified Blaze.ByteString.Builder.Char8 as Blaze8
import qualified Data.ByteString as B
import qualified Network.HTTP.Types as HTTP
sdbSignQuery :: [(B.ByteString, B.ByteString)] -> SdbInfo -> SignatureData -> SignedQuery
sdbSignQuery q si sd
= SignedQuery {
sqMethod = method
, sqProtocol = sdbiProtocol si
, sqHost = host
, sqPort = sdbiPort si
, sqPath = path
, sqQuery = sq
, sqDate = Just $ signatureTime sd
, sqAuthorization = Nothing
, sqContentType = Nothing
, sqContentMd5 = Nothing
, sqAmzHeaders = []
, sqOtherHeaders = []
, sqBody = Nothing
, sqStringToSign = stringToSign
}
where
ah = HmacSHA256
q' = HTTP.simpleQueryToQuery . sort $ q ++ ("Version", "2009-04-15") : queryAuth
ti = signatureTimeInfo sd
cr = signatureCredentials sd
queryAuth = [case ti of
AbsoluteTimestamp time -> ("Timestamp", fmtAmzTime time)
AbsoluteExpires time -> ("Expires", fmtAmzTime time)
, ("AWSAccessKeyId", accessKeyID cr)
, ("SignatureMethod", amzHash ah)
, ("SignatureVersion", "2")
]
sq = ("Signature", Just sig) : q'
method = sdbiHttpMethod si
host = sdbiHost si
path = "/"
sig = signature cr ah stringToSign
stringToSign = Blaze.toByteString . mconcat $
intersperse (Blaze8.fromChar '\n')
[Blaze.copyByteString $ httpMethod method
, Blaze.copyByteString $ host
, Blaze.copyByteString $ path
, HTTP.renderQueryBuilder False q']