@@ -12,6 +12,7 @@ import qualified Data.ByteString.Char8 as S8
12import qualified Data.ByteString.Lazy.Char8 as L8
12import qualified Data.ByteString.Lazy.Char8 as L8
13import qualified Data.ByteString.Lazy as L
13import qualified Data.ByteString.Lazy as L
14import qualified Data.Text.Lazy as T
14import qualified Data.Text.Lazy as T
15+import qualified Data.Text as TS
15import qualified Data.Text.Encoding as TE
16import qualified Data.Text.Encoding as TE
16import Control.Arrow
17import Control.Arrow
@@ -38,11 +39,19 @@ import qualified Data.IORef as I
38specs :: Spec
39specs :: Spec
40 describe "Network.Wai.Parse" $ do
41 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)
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")])
41 it "parseQueryString" caseParseQueryString
49 it "parseQueryString" caseParseQueryString
42 it "parseQueryString with question mark" caseParseQueryStringQM
50 it "parseQueryString with question mark" caseParseQueryStringQM
43 it "parseHttpAccept" caseParseHttpAccept
51 it "parseHttpAccept" caseParseHttpAccept
44 it "parseRequestBody" caseParseRequestBody
52 it "parseRequestBody" caseParseRequestBody
45 it "multipart with plus" caseMultipartPlus
53 it "multipart with plus" caseMultipartPlus
54+ it "multipart with multiple attributes" caseMultipartAttrs
46 it "urlencoded with plus" caseUrlEncPlus
55 it "urlencoded with plus" caseUrlEncPlus
48 , it "findBound" caseFindBound
57 , it "findBound" caseFindBound
@@ -188,6 +197,19 @@ caseMultipartPlus = do
188 "--AaB03x--"
197 "--AaB03x--"
189 ctype = "multipart/form-data; boundary=AaB03x"
198 ctype = "multipart/form-data; boundary=AaB03x"
200+caseMultipartAttrs :: Assertion
201+caseMultipartAttrs = do
202+ result <- C.runResourceT $ parseRequestBody' lbsBackEnd $ toRequest ctype content
203+ liftIO $ result @?= ([("email", "has+plus")], [])
207+ "Content-Disposition: form-data; name=\"email\"\n" ++
208+ "Content-Type: text/plain; charset=iso-8859-1\n\n" ++
211+ ctype = "multipart/form-data; charset=UTF-8; boundary=AaB03x"
191caseUrlEncPlus :: Assertion
213caseUrlEncPlus :: Assertion
192caseUrlEncPlus = do
214caseUrlEncPlus = do
193 result <- C.runResourceT $ parseRequestBody' lbsBackEnd $ toRequest ctype content
215 result <- C.runResourceT $ parseRequestBody' lbsBackEnd $ toRequest ctype content