acme-http-0.2.0: Acme/Response.hs
{-# LANGUAGE RecordWildCards, OverloadedStrings #-}
module Acme.Response where
import Acme.Types (Response(..))
import Data.ByteString (ByteString, concat, append)
import Data.ByteString.Char8 () -- instance IsString ByteString
import Prelude hiding (concat)
------------------------------------------------------------------------------
-- send a response
------------------------------------------------------------------------------
pong :: (ByteString -> IO ()) -> IO ()
pong send =
do send "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: 4\r\n\r\nPONG"
sendResponse :: (ByteString -> IO ()) -> Response -> IO ()
sendResponse send PongResponse = pong send
sendResponse send ByteStringResponse{..} =
send $ concat (statusLine rsCode : (formatHeaders rsHeaders) ++ [rsBody])
where
formatHeaders :: [(ByteString, ByteString)] -> [ByteString]
formatHeaders [] = ["\r\n"]
formatHeaders ((f,v):hs) = [ f, ": " , v , "\r\n"] ++ formatHeaders hs
------------------------------------------------------------------------------
-- Status Lines
------------------------------------------------------------------------------
{-
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
-}
-- FIXME: can the http version always be 1.1 or do we need to match the caller?
statusLine :: Int -> ByteString
statusLine 200 = ok_status
ok_status :: ByteString
ok_status = "HTTP/1.1 200 OK\r\n"