@@ -8,52 +8,82 @@ import Test.Hspec
88
99import Data.ByteString (ByteString)
1010import Network.HTTP.Types (HeaderName)
11−import Network.Wai (Request(..), defaultRequest)
11+import Network.Wai (Request(..), defaultRequest, RequestBodyLength(..))
1212
1313import Network.Wai.Request
14+import Control.Exception (try)
15+import Control.Monad (forever)
1416
1517main :: IO ()
1618main = hspec spec
1719
1820spec :: Spec
19−spec = describe "appearsSecure" $ do
20− let insecureRequest = defaultRequest
21− { isSecure = False
22− , requestHeaders =
23− [ ("HTTPS", "off")
24− , ("HTTP_X_FORWARDED_SSL", "off")
25− , ("HTTP_X_FORWARDED_SCHEME", "http")
26− , ("HTTP_X_FORWARDED_PROTO", "http,xyz")
27− ]
28− }
29−
30− it "returns False for an insecure request" $
31− insecureRequest `shouldSatisfy` not . appearsSecure
32−
33− it "checks if the Request is actually secure" $ do
34− let req = insecureRequest { isSecure = True }
35−
36− req `shouldSatisfy` appearsSecure
37−
38− it "checks for HTTP: on" $ do
39− let req = addHeader "HTTPS" "on" insecureRequest
40−
41− req `shouldSatisfy` appearsSecure
42−
43− it "checks for HTTP_X_FORWARDED_SSL: on" $ do
44− let req = addHeader "HTTP_X_FORWARDED_SSL" "on" insecureRequest
45−
46− req `shouldSatisfy` appearsSecure
47−
48− it "checks for HTTP_X_FORWARDED_SCHEME: https" $ do
49− let req = addHeader "HTTP_X_FORWARDED_SCHEME" "https" insecureRequest
50−
51− req `shouldSatisfy` appearsSecure
52−
53− it "checks for HTTP_X_FORWARDED_PROTO: https,..." $ do
54− let req = addHeader "HTTP_X_FORWARDED_PROTO" "https,xyz" insecureRequest
55−
56− req `shouldSatisfy` appearsSecure
21+spec = do
22+ describe "requestSizeCheck" $ do
23+ it "too large content length should throw RequestSizeException" $ do
24+ let limit = 1024
25+ largeRequest = defaultRequest
26+ { isSecure = False
27+ , requestBodyLength = KnownLength (limit + 1)
28+ , requestBody = return "repeat this chunk"
29+ }
30+ checkedRequest <- requestSizeCheck limit largeRequest
31+ body <- try (requestBody checkedRequest)
32+ case body of
33+ Left (RequestSizeException l) -> l `shouldBe` limit
34+ Right _ -> expectationFailure "request size check failed"
35+
36+ it "too many chunks should throw RequestSizeException" $ do
37+ let limit = 1024
38+ largeRequest = defaultRequest
39+ { isSecure = False
40+ , requestBodyLength = ChunkedBody
41+ , requestBody = return "repeat this chunk"
42+ }
43+ checkedRequest <- requestSizeCheck limit largeRequest
44+ body <- try (forever $ requestBody checkedRequest)
45+ case body of
46+ Left (RequestSizeException l) -> l `shouldBe` limit
47+ Right _ -> expectationFailure "request size check failed"
48+
49+ describe "appearsSecure" $ do
50+ let insecureRequest = defaultRequest
51+ { isSecure = False
52+ , requestHeaders =
53+ [ ("HTTPS", "off")
54+ , ("HTTP_X_FORWARDED_SSL", "off")
55+ , ("HTTP_X_FORWARDED_SCHEME", "http")
56+ , ("HTTP_X_FORWARDED_PROTO", "http,xyz")
57+ ]
58+ }
59+
60+ it "returns False for an insecure request" $
61+ insecureRequest `shouldSatisfy` not . appearsSecure
62+
63+ it "checks if the Request is actually secure" $ do
64+ let req = insecureRequest { isSecure = True }
65+
66+ req `shouldSatisfy` appearsSecure
67+
68+ it "checks for HTTP: on" $ do
69+ let req = addHeader "HTTPS" "on" insecureRequest
70+
71+ req `shouldSatisfy` appearsSecure
72+
73+ it "checks for HTTP_X_FORWARDED_SSL: on" $ do
74+ let req = addHeader "HTTP_X_FORWARDED_SSL" "on" insecureRequest
75+
76+ req `shouldSatisfy` appearsSecure
77+
78+ it "checks for HTTP_X_FORWARDED_SCHEME: https" $ do
79+ let req = addHeader "HTTP_X_FORWARDED_SCHEME" "https" insecureRequest
80+
81+ req `shouldSatisfy` appearsSecure
82+
83+ it "checks for HTTP_X_FORWARDED_PROTO: https,..." $ do
84+ let req = addHeader "HTTP_X_FORWARDED_PROTO" "https,xyz" insecureRequest
85+
86+ req `shouldSatisfy` appearsSecure
5787
5888addHeader :: HeaderName -> ByteString -> Request -> Request
5989addHeader name value req = req