@@ -1,6 +1,8 @@
11{-# LANGUAGE CPP #-}
22{-# LANGUAGE OverloadedStrings #-}
33-- | Redirect non-SSL requests to https
4+--
5+-- Since 3.0.7
46module Network.Wai.Middleware.ForceSSL
57 ( forceSSL
68 ) where
@@ -10,14 +12,18 @@ import Network.Wai.Request
1012
1113#if __GLASGOW_HASKELL__ < 710
1214import Control.Applicative ((<$>))
15+import Data.Monoid (mempty)
1316#endif
1417
1518import Data.Monoid ((<>))
1619import Network.HTTP.Types (hLocation, methodGet, status301, status307)
1720
18−import qualified Data.ByteString.Char8 as C
21+import qualified Data.ByteString as S
22+import Data.Word8 (_colon)
1923
2024-- | For requests that don't appear secure, redirect to https
25+--
26+-- Since 3.0.7
2127forceSSL :: Middleware
2228forceSSL app req sendResponse =
2329 case (appearsSecure req, redirectResponse req) of
@@ -26,9 +32,9 @@ forceSSL app req sendResponse =
2632
2733redirectResponse :: Request -> Maybe Response
2834redirectResponse req = do
29− (host:_) <- C.split ':' <$> requestHeaderHost req
35+ (host, _) <- S.break (== _colon) <$> requestHeaderHost req
3036
31− return $ responseBuilder status [(hLocation, location host)] ""
37+ return $ responseBuilder status [(hLocation, location host)] mempty
3238
3339 where
3440 location h = "https://" <> h <> rawPathInfo req <> rawQueryString req