module Mongrel2.Response
( Response
, mkResponse
) where
import Blaze.ByteString.Builder (Builder, toByteString, fromByteString)
import Blaze.Text.Int (integral)
import Data.ByteString (ByteString)
import Data.ByteString.Char8 ()
import Data.List (intersperse)
import Data.Monoid
import Mongrel2.Types (ClientID, UUID)
import qualified Data.ByteString as S
type Response = ByteString
buildSpace :: Builder
buildSpace = fromByteString " "
buildUUID :: UUID -> Builder
buildUUID = fromByteString
buildNetstring :: Builder -> Builder
buildNetstring b =
mconcat [ integral $ S.length s
, fromByteString ":"
, fromByteString s
]
where
s = toByteString b
buildClientIDList :: [ClientID] -> Builder
buildClientIDList cids =
mconcat $ intersperse buildSpace $ map integral cids
mkResponse :: UUID -> [ClientID] -> Builder -> Response
mkResponse uuid clientIDs bodyBuilder =
toByteString $ mconcat [ buildUUID uuid
, buildSpace
, buildNetstring $ buildClientIDList clientIDs
, fromByteString ", "
, bodyBuilder ]