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 qualified Data.Ascii as A
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy as L
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
, sqBody = L.empty
, 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", A.toByteString $ fmtAmzTime time)
AbsoluteExpires time -> ("Expires", A.toByteString $ 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 = B.intercalate "\n" $ map A.toByteString
[httpMethod method, host, path, HTTP.renderQuery False q']