@@ -32,7 +32,8 @@ spec = do
3232 , ("text/plain; charset=UTF-8 ; boundary = foo", "text/plain", [("charset", "UTF-8"), ("boundary", "foo")])
3333 ]
3434 it "parseHttpAccept" caseParseHttpAccept
35− it "parseRequestBody" caseParseRequestBody
35+ describe "parseRequestBody" $ do
36+ caseParseRequestBody
3637 it "multipart with plus" caseMultipartPlus
3738 it "multipart with multiple attributes" caseMultipartAttrs
3839 it "urlencoded with plus" caseUrlEncPlus
@@ -60,67 +61,68 @@ parseRequestBody' sink (SRequest req bod) =
6061 x:y -> (y, x)
6162 sinkRequestBody sink rbt rb
6263
63−caseParseRequestBody :: Assertion
64−caseParseRequestBody =
65− t
64+caseParseRequestBody :: Spec
65+caseParseRequestBody = do
66+ it "parsing post x-www-form-urlencoded" $ do
67+ let content1 = "foo=bar&baz=bin"
68+ let ctype1 = "application/x-www-form-urlencoded"
69+ result1 <- parseRequestBody' lbsBackEnd $ toRequest ctype1 content1
70+ result1 `shouldBe` ([("foo", "bar"), ("baz", "bin")], [])
71+
72+ let ctype2 = "multipart/form-data; boundary=AaB03x"
73+ let expectedsmap2 =
74+ [ ("title", "A File")
75+ , ("summary", "This is my file\nfile test")
76+ ]
77+ let textPlain = "text/plain; charset=iso-8859-1"
78+ let expectedfile2 =
79+ [("document", FileInfo "b.txt" textPlain "This is a file.\nIt has two lines.")]
80+ let expected2 = (expectedsmap2, expectedfile2)
81+
82+ it "parsing post multipart/form-data" $ do
83+ result2 <- parseRequestBody' lbsBackEnd $ toRequest ctype2 content2
84+ result2 `shouldBe` expected2
85+
86+ it "parsing post multipart/form-data 2" $ do
87+ result2' <- parseRequestBody' lbsBackEnd $ toRequest' ctype2 content2
88+ result2' `shouldBe` expected2
89+
90+
91+ let ctype3 = "multipart/form-data; boundary=----WebKitFormBoundaryB1pWXPZ6lNr8RiLh"
92+ let expectedsmap3 = []
93+ let expectedfile3 = [("yaml", FileInfo "README" "application/octet-stream" "Photo blog using Hack.\n")]
94+ let expected3 = (expectedsmap3, expectedfile3)
95+
96+ it "parsing actual post multipart/form-data" $ do
97+ result3 <- parseRequestBody' lbsBackEnd $ toRequest ctype3 content3
98+ result3 `shouldBe` expected3
99+
100+ it "parsing actual post multipart/form-data 2" $ do
101+ result3' <- parseRequestBody' lbsBackEnd $ toRequest' ctype3 content3
102+ result3' `shouldBe` expected3
66103 where
67104 content2 =
68− "--AaB03x\n" <>
69− "Content-Disposition: form-data; name=\"document\"; filename=\"b.txt\"\n" <>
70− "Content-Type: text/plain; charset=iso-8859-1\n\n" <>
71− "This is a file.\n" <>
72− "It has two lines.\n" <>
73− "--AaB03x\n" <>
74− "Content-Disposition: form-data; name=\"title\"\n" <>
75− "Content-Type: text/plain; charset=iso-8859-1\n\n" <>
76− "A File\n" <>
77− "--AaB03x\n" <>
78− "Content-Disposition: form-data; name=\"summary\"\n" <>
79− "Content-Type: text/plain; charset=iso-8859-1\n\n" <>
80− "This is my file\n" <>
81− "file test\n" <>
82− "--AaB03x--"
83− content3 = "------WebKitFormBoundaryB1pWXPZ6lNr8RiLh\r\nContent-Disposition: form-data; name=\"yaml\"; filename=\"README\"\r\nContent-Type: application/octet-stream\r\n\r\nPhoto blog using Hack.\n\r\n------WebKitFormBoundaryB1pWXPZ6lNr8RiLh--\r\n"
84− t = do
85− let content1 = "foo=bar&baz=bin"
86− let ctype1 = "application/x-www-form-urlencoded"
87− result1 <- parseRequestBody' lbsBackEnd $ toRequest ctype1 content1
88− assertEqual "parsing post x-www-form-urlencoded"
89− ([("foo", "bar"), ("baz", "bin")], [])
90− result1
91−
92− let ctype2 = "multipart/form-data; boundary=AaB03x"
93− result2 <- parseRequestBody' lbsBackEnd $ toRequest ctype2 content2
94− let expectedsmap2 =
95− [ ("title", "A File")
96− , ("summary", "This is my file\nfile test")
97− ]
98− let textPlain = "text/plain; charset=iso-8859-1"
99− let expectedfile2 =
100− [("document", FileInfo "b.txt" textPlain "This is a file.\nIt has two lines.")]
101− let expected2 = (expectedsmap2, expectedfile2)
102− assertEqual "parsing post multipart/form-data"
103− expected2
104− result2
105−
106− let ctype3 = "multipart/form-data; boundary=----WebKitFormBoundaryB1pWXPZ6lNr8RiLh"
107− result3 <- parseRequestBody' lbsBackEnd $ toRequest ctype3 content3
108− let expectedsmap3 = []
109− let expectedfile3 = [("yaml", FileInfo "README" "application/octet-stream" "Photo blog using Hack.\n")]
110− let expected3 = (expectedsmap3, expectedfile3)
111− assertEqual "parsing actual post multipart/form-data"
112− expected3
113− result3
114−
115− result2' <- parseRequestBody' lbsBackEnd $ toRequest' ctype2 content2
116− assertEqual "parsing post multipart/form-data 2"
117− expected2
118− result2'
119−
120− result3' <- parseRequestBody' lbsBackEnd $ toRequest' ctype3 content3
121− assertEqual "parsing actual post multipart/form-data 2"
122− expected3
123− result3'
105+ "--AaB03x\n"
106+ <> "Content-Disposition: form-data; name=\"document\"; filename=\"b.txt\"\n"
107+ <> "Content-Type: text/plain; charset=iso-8859-1\n\n"
108+ <> "This is a file.\n"
109+ <> "It has two lines.\n"
110+ <> "--AaB03x\n"
111+ <> "Content-Disposition: form-data; name=\"title\"\n"
112+ <> "Content-Type: text/plain; charset=iso-8859-1\n\n"
113+ <> "A File\n"
114+ <> "--AaB03x\n"
115+ <> "Content-Disposition: form-data; name=\"summary\"\n"
116+ <> "Content-Type: text/plain; charset=iso-8859-1\n\n"
117+ <> "This is my file\n"
118+ <> "file test\n"
119+ <> "--AaB03x--"
120+ content3 =
121+ "------WebKitFormBoundaryB1pWXPZ6lNr8RiLh\r\n"
122+ <> "Content-Disposition: form-data; name=\"yaml\"; filename=\"README\"\r\n"
123+ <> "Content-Type: application/octet-stream\r\n\r\n"
124+ <> "Photo blog using Hack.\n\r\n"
125+ <> "------WebKitFormBoundaryB1pWXPZ6lNr8RiLh--\r\n"
124126
125127caseMultipartPlus :: Assertion
126128caseMultipartPlus = do