, fromHeaders
, headersP
- , hPutHeaders
+ , printHeaders
)
where
import Control.Applicative
-import Data.Ascii (Ascii, CIAscii)
+import Data.Ascii (Ascii, AsciiBuilder, CIAscii)
import qualified Data.Ascii as A
import Data.Attoparsec.Char8 as P
import qualified Data.ByteString as BS
import qualified Data.Map as M
import Data.Monoid
import Data.Monoid.Unicode
-import Network.HTTP.Lucu.HandleLike
import Network.HTTP.Lucu.Parser.Http
import Network.HTTP.Lucu.Utils
import Prelude.Unicode
-}
headersP ∷ Parser Headers
{-# INLINEABLE headersP #-}
-headersP = do xs ← P.many $ try header
+headersP = do xs ← P.many header
crlf
return $ toHeaders xs
where
{-# INLINE joinValues #-}
joinValues = A.fromAsciiBuilder ∘ joinWith "\x20" ∘ map A.toAsciiBuilder
-hPutHeaders ∷ HandleLike h => h → Headers → IO ()
-hPutHeaders !h !(Headers m)
- = mapM_ putH (M.toList m) >> hPutBS h "\r\n"
+printHeaders ∷ Headers → AsciiBuilder
+printHeaders (Headers m)
+ = mconcat (map printHeader (M.toList m)) ⊕
+ A.toAsciiBuilder "\x0D\x0A"
where
- putH ∷ (CIAscii, Ascii) → IO ()
- putH (!name, !value)
- = do hPutBS h (A.ciToByteString name)
- hPutBS h ": "
- hPutBS h (A.toByteString value)
- hPutBS h "\r\n"
+ printHeader ∷ (CIAscii, Ascii) → AsciiBuilder
+ printHeader (name, value)
+ = A.toAsciiBuilder (A.fromCIAscii name) ⊕
+ A.toAsciiBuilder ": " ⊕
+ A.toAsciiBuilder value ⊕
+ A.toAsciiBuilder "\x0D\x0A"