@@ -12,6 +12,7 @@ import qualified Data.ByteString.Char8 as S8
1212import qualified Data.ByteString.Lazy.Char8 as L8
1313import qualified Data.ByteString.Lazy as L
1414import qualified Data.Text.Lazy as T
15+import qualified Data.Text as TS
1516import qualified Data.Text.Encoding as TE
1617import Control.Arrow
1718
@@ -38,11 +39,19 @@ import qualified Data.IORef as I
3839specs :: Spec
3940specs = do
4041 describe "Network.Wai.Parse" $ do
42+ describe "parseContentType" $ do
43+ let go (x, y, z) = it (TS.unpack $ TE.decodeUtf8 x) $ parseContentType x `shouldBe` (y, z)
44+ mapM_ go
45+ [ ("text/plain", "text/plain", [])
46+ , ("text/plain; charset=UTF-8 ", "text/plain", [("charset", "UTF-8")])
47+ , ("text/plain; charset=UTF-8 ; boundary = foo", "text/plain", [("charset", "UTF-8"), ("boundary", "foo")])
48+ ]
4149 it "parseQueryString" caseParseQueryString
4250 it "parseQueryString with question mark" caseParseQueryStringQM
4351 it "parseHttpAccept" caseParseHttpAccept
4452 it "parseRequestBody" caseParseRequestBody
4553 it "multipart with plus" caseMultipartPlus
54+ it "multipart with multiple attributes" caseMultipartAttrs
4655 it "urlencoded with plus" caseUrlEncPlus
4756 {-
4857 , it "findBound" caseFindBound
@@ -188,6 +197,19 @@ caseMultipartPlus = do
188197 "--AaB03x--"
189198 ctype = "multipart/form-data; boundary=AaB03x"
190199
200+caseMultipartAttrs :: Assertion
201+caseMultipartAttrs = do
202+ result <- C.runResourceT $ parseRequestBody' lbsBackEnd $ toRequest ctype content
203+ liftIO $ result @?= ([("email", "has+plus")], [])
204+ where
205+ content = S8.pack $
206+ "--AaB03x\n" ++
207+ "Content-Disposition: form-data; name=\"email\"\n" ++
208+ "Content-Type: text/plain; charset=iso-8859-1\n\n" ++
209+ "has+plus\n" ++
210+ "--AaB03x--"
211+ ctype = "multipart/form-data; charset=UTF-8; boundary=AaB03x"
212+
191213caseUrlEncPlus :: Assertion
192214caseUrlEncPlus = do
193215 result <- C.runResourceT $ parseRequestBody' lbsBackEnd $ toRequest ctype content