import Data.Monoid.Unicode
import Data.Text (Text)
import Network.HTTP.Lucu.Parser.Http
-import Network.HTTP.Lucu.Utils
+import Network.HTTP.Lucu.RFC2231
import Prelude hiding (min)
import Prelude.Unicode
( A.toAsciiBuilder (A.fromCIAscii maj) ⊕
A.toAsciiBuilder "/" ⊕
A.toAsciiBuilder (A.fromCIAscii min) ⊕
- if null params then
- (∅)
- else
- A.toAsciiBuilder "; " ⊕
- joinWith "; " (map printPair params)
+ printParams params
)
- where
- printPair ∷ (CIAscii, Ascii) → A.AsciiBuilder
- printPair (name, value)
- = A.toAsciiBuilder (A.fromCIAscii name) ⊕
- A.toAsciiBuilder "=" ⊕
- if C8.any ((¬) ∘ isToken) (A.toByteString value) then
- quoteStr value
- else
- A.toAsciiBuilder value
-- |Parse 'MIMEType' from an 'Ascii'. This function throws an
-- exception for parse error.
mimeTypeP = do maj ← A.toCIAscii <$> token
_ ← char '/'
min ← A.toCIAscii <$> token
- params ← P.many paramP
+ params ← paramsP
return $ MIMEType maj min params
- where
- paramP ∷ Parser (CIAscii, Ascii)
- paramP = try $
- do skipMany lws
- _ ← char ';'
- skipMany lws
- name ← A.toCIAscii <$> token
- _ ← char '='
- value ← token <|> quotedStr
- return (name, value)
mimeTypeListP ∷ Parser [MIMEType]
mimeTypeListP = listOf mimeTypeP
{-# LANGUAGE
DoAndIfThenElse
, OverloadedStrings
+ , RecordWildCards
, ScopedTypeVariables
, UnicodeSyntax
#-}
)
where
import Control.Applicative hiding (many)
-import Data.Ascii (Ascii, CIAscii, AsciiBuilder)
+import Data.Ascii (Ascii, CIAscii)
import qualified Data.Ascii as A
import Data.Attoparsec.Char8
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as LS
-import Data.Char
-import Data.List
import Data.Map (Map)
+import qualified Data.Map as M
import Data.Maybe
import Data.Monoid.Unicode
import Data.Text (Text)
import Network.HTTP.Lucu.Headers
import Network.HTTP.Lucu.Parser.Http
import Network.HTTP.Lucu.RFC2231
-import Network.HTTP.Lucu.Response
-import Network.HTTP.Lucu.Utils
import Prelude.Unicode
-- |This data type represents a form value and possibly an uploaded
partName ∷ Monad m ⇒ Part → m Text
{-# INLINEABLE partName #-}
-partName pt
- = case find ((≡ "name") ∘ fst) $ dParams $ ptContDispo pt of
- Just (_, name)
+partName (Part {..})
+ = case M.lookup "name" $ dParams ptContDispo of
+ Just name
→ return name
Nothing
→ fail ("form-data without name: " ⧺
- A.toString (printContDispo $ ptContDispo pt))
+ A.toString (printContDispo ptContDispo))
partFileName ∷ Part → Maybe Text
{-# INLINEABLE partFileName #-}
-partFileName pt
- = snd <$> (find ((== "filename") ∘ fst) $ dParams $ ptContDispo pt)
+partFileName (Part {..})
+ = M.lookup "filename" $ dParams ptContDispo
getContDispo ∷ Monad m ⇒ Headers → m ContDispo
{-# INLINEABLE getContDispo #-}
contDispoP ∷ Parser ContDispo
contDispoP = do dispoType ← A.toCIAscii <$> token
- params ← many paramP
+ params ← paramsP
return $ ContDispo dispoType params
- where
- paramP ∷ Parser (CIAscii, Ascii)
- paramP = do skipMany lws
- _ ← char ';'
- skipMany lws
- name ← A.toCIAscii <$> token
- _ ← char '='
- value ← token <|> quotedStr
- return (name, value)