X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FMIMEParams.hs;fp=Network%2FHTTP%2FLucu%2FMIMEParams.hs;h=37410330bd25fee7c589f5a1c3b7a234cbce0e18;hp=6f9eb7e1b8a9f4055b0bc878578d6b2679952991;hb=1de2506621977a383b991cadce024f626023908b;hpb=5f2ef377345fc47aabc63c1325df82c1cd9da9ed diff --git a/Network/HTTP/Lucu/MIMEParams.hs b/Network/HTTP/Lucu/MIMEParams.hs index 6f9eb7e..3741033 100644 --- a/Network/HTTP/Lucu/MIMEParams.hs +++ b/Network/HTTP/Lucu/MIMEParams.hs @@ -16,7 +16,6 @@ -- (). module Network.HTTP.Lucu.MIMEParams ( MIMEParams - , mimeParams ) where import Control.Applicative hiding (empty) @@ -25,7 +24,9 @@ import Control.Monad.Unicode import Data.Ascii (Ascii, CIAscii, AsciiBuilder) import qualified Data.Ascii as A import Data.Attoparsec.Char8 +import Data.Attoparsec.Parsable import Data.Bits +import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as BS import Data.Char import Data.Collections @@ -145,34 +146,33 @@ section ∷ ExtendedParam → Integer section (InitialEncodedParam {..}) = 0 section ep = epSection ep --- |'Parser' for MIME parameter values. -mimeParams ∷ Parser MIMEParams -{-# INLINEABLE mimeParams #-} -mimeParams = decodeParams =≪ many (try paramP) +instance Parsable ByteString MIMEParams where + {-# INLINEABLE parser #-} + parser = decodeParams =≪ many (try parser) -paramP ∷ Parser ExtendedParam -paramP = do skipMany lws - void $ char ';' - skipMany lws - epm ← nameP - void $ char '=' - case epm of - (name, 0, True) - → do (charset, payload) ← initialEncodedValue - return $ InitialEncodedParam name charset payload - (name, sect, True) - → do payload ← encodedPayload - return $ ContinuedEncodedParam name sect payload - (name, sect, False) - → do payload ← token <|> quotedStr - return $ AsciiParam name sect payload +instance Parsable ByteString ExtendedParam where + parser = do skipMany lws + void $ char ';' + skipMany lws + epm ← name + void $ char '=' + case epm of + (nm, 0, True) + → do (charset, payload) ← initialEncodedValue + return $ InitialEncodedParam nm charset payload + (nm, sect, True) + → do payload ← encodedPayload + return $ ContinuedEncodedParam nm sect payload + (nm, sect, False) + → do payload ← token <|> quotedStr + return $ AsciiParam nm sect payload -nameP ∷ Parser (CIAscii, Integer, Bool) -nameP = do name ← (cs ∘ A.unsafeFromByteString) <$> - takeWhile1 (\c → isToken c ∧ c ≢ '*') - sect ← option 0 $ try (char '*' *> decimal ) - isEncoded ← option False $ try (char '*' *> pure True) - return (name, sect, isEncoded) +name ∷ Parser (CIAscii, Integer, Bool) +name = do nm ← (cs ∘ A.unsafeFromByteString) <$> + takeWhile1 (\c → isToken c ∧ c ≢ '*') + sect ← option 0 $ try (char '*' *> decimal ) + isEncoded ← option False $ try (char '*' *> pure True) + return (nm, sect, isEncoded) initialEncodedValue ∷ Parser (CIAscii, BS.ByteString) initialEncodedValue