X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FHeaders.hs;h=5391743d1163833a1b47b8f10e14ef4edf91e369;hp=d4c51d5e24ae7681e91aff273ae9c5bbc29b2e70;hb=90fca0675b1694e69b8e431c989343855cbd125d;hpb=97295ba748af07f3b0b609f32aabdd52167d9799 diff --git a/Network/HTTP/Lucu/Headers.hs b/Network/HTTP/Lucu/Headers.hs index d4c51d5..5391743 100644 --- a/Network/HTTP/Lucu/Headers.hs +++ b/Network/HTTP/Lucu/Headers.hs @@ -12,7 +12,6 @@ module Network.HTTP.Lucu.Headers ( Headers , HasHeaders(..) - , headers ) where import Control.Applicative hiding (empty) @@ -25,6 +24,7 @@ import qualified Data.Collections.Newtype.TH as C import Data.Convertible.Base import Data.Convertible.Instances.Ascii () import Data.Convertible.Utils +import Data.Default import Data.List (intersperse) import qualified Data.Map as M (Map) import Data.Collections @@ -57,7 +57,7 @@ class HasHeaders a where getCIHeader ∷ CIAscii → a → Maybe CIAscii {-# INLINE getCIHeader #-} - getCIHeader = ((A.toCIAscii <$>) ∘) ∘ getHeader + getCIHeader = ((cs <$>) ∘) ∘ getHeader deleteHeader ∷ CIAscii → a → a {-# INLINE deleteHeader #-} @@ -111,11 +111,12 @@ instance ConvertSuccess Headers Ascii where convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder) instance ConvertSuccess Headers AsciiBuilder where - {-# INLINE convertSuccess #-} + {-# INLINEABLE convertSuccess #-} convertSuccess (Headers m) = mconcat (header <$> fromFoldable m) ⊕ cs ("\x0D\x0A" ∷ Ascii) where header ∷ (CIAscii, Ascii) → AsciiBuilder + {-# INLINE header #-} header (name, value) = cs name ⊕ cs (": " ∷ Ascii) ⊕ @@ -137,30 +138,31 @@ deriveAttempts [ ([t| Headers |], [t| Ascii |]) field-value の先頭および末尾にある LWS は全て削除され、それ以外の LWS は單一の SP に變換される。 -} -headers ∷ Parser Headers -{-# INLINEABLE headers #-} -headers = do xs ← many header +instance Default (Parser Headers) where + {-# INLINEABLE def #-} + def = do xs ← many header crlf return $ fromFoldable xs - where - header ∷ Parser (CIAscii, Ascii) - header = do name ← A.toCIAscii <$> token - void $ char ':' - skipMany lws - values ← content `sepBy` try lws - skipMany (try lws) - crlf - return (name, joinValues values) - - content ∷ Parser Ascii - {-# INLINE content #-} - content = A.unsafeFromByteString - <$> - takeWhile1 (\c → isText c ∧ c ≢ '\x20') - - joinValues ∷ [Ascii] → Ascii - {-# INLINE joinValues #-} - joinValues = A.fromAsciiBuilder - ∘ mconcat - ∘ intersperse (A.toAsciiBuilder "\x20") - ∘ (A.toAsciiBuilder <$>) + where + header ∷ Parser (CIAscii, Ascii) + {-# INLINEABLE header #-} + header = do name ← cs <$> token + void $ char ':' + skipMany lws + values ← content `sepBy` try lws + skipMany (try lws) + crlf + return (name, joinValues values) + + content ∷ Parser Ascii + {-# INLINEABLE content #-} + content = A.unsafeFromByteString + <$> + takeWhile1 (\c → isText c ∧ c ≢ '\x20') + + joinValues ∷ [Ascii] → Ascii + {-# INLINEABLE joinValues #-} + joinValues = cs + ∘ mconcat + ∘ intersperse (cs ("\x20" ∷ Ascii) ∷ AsciiBuilder) + ∘ (cs <$>)