packages feed

wai-extra 3.0.8.2 → 3.0.9

raw patch · 4 files changed

+99/−1 lines, 4 files

Files

ChangeLog.md view
@@ -1,3 +1,7 @@+## 3.0.9++* Network.Wai.Middleware.Routed module added+ ## 3.0.7  * Add appearsSecure: check if a request appears to be using SSL even in the
+ Network/Wai/Middleware/Routed.hs view
@@ -0,0 +1,39 @@+-- |+--+-- Since 3.0.9+module Network.Wai.Middleware.Routed+    ( routedMiddleware+    , hostedMiddleware+    ) where++import Network.Wai+import Data.ByteString (ByteString)+import Data.Text (Text)++-- | Apply a middleware based on a test of pathInfo+--+-- example:+--+-- > let corsify = routedMiddleWare ("static" `elem`) addCorsHeaders+--+-- Since 3.0.9+routedMiddleware :: ([Text] -> Bool) -- ^ Only use middleware if this pathInfo test returns True+                 -> Middleware -- ^ middleware to apply the path prefix guard to+                 -> Middleware -- ^ modified middleware+routedMiddleware pathCheck middle app req+  | pathCheck (pathInfo req) = middle app req+  | otherwise                = app req++-- | Only apply the middleware to certain hosts+--+-- Since 3.0.9+hostedMiddleware :: ByteString -- ^ Domain the middleware applies to+                 -> Middleware -- ^ middleware to apply the path prefix guard to+                 -> Middleware -- ^ modified middleware+hostedMiddleware domain middle app req+  | hasDomain domain req = middle app req+  | otherwise            = app req++hasDomain :: ByteString -> Request -> Bool+hasDomain domain req = maybe False (== domain) mHost+  where mHost = requestHeaderHost req
+ test/Network/Wai/Middleware/RoutedSpec.hs view
@@ -0,0 +1,53 @@+{-# LANGUAGE OverloadedStrings #-}+module Network.Wai.Middleware.RoutedSpec+    ( main+    , spec+    ) where++import Test.Hspec++import Network.Wai.Middleware.Routed+import Network.Wai.Middleware.ForceSSL (forceSSL)++import Network.HTTP.Types (methodPost, status200, status301, status307)+import Network.Wai+import Network.Wai.Test+import Data.ByteString (ByteString)+import Data.String (IsString)++main :: IO ()+main = hspec spec++spec :: Spec+spec = describe "forceSSL" $ do+  it "routed middleware" $ do+    let destination = "https://example.com/d/"+    let routedSslJsonApp prefix = routedMiddleware (checkPrefix prefix) forceSSL jsonApp+        checkPrefix p (p1:_) = p == p1+        checkPrefix _ _ = False++    flip runSession (routedSslJsonApp "r") $ do+        res <- testDPath "http"+        assertNoHeader location res+        assertStatus 200 res+        assertBody "{\"foo\":\"bar\"}" res++    flip runSession (routedSslJsonApp "d") $ do+        res2 <- testDPath "http"+        assertHeader location destination res2+        assertStatus 301 res2++jsonApp :: Application+jsonApp _req cps = cps $ responseLBS status200+   [("Content-Type", "application/json")]+      "{\"foo\":\"bar\"}"++testDPath :: ByteString -> Session SResponse+testDPath proto =+    request $ flip setRawPathInfo "/d/" defaultRequest+             { requestHeaders = [("X-Forwarded-Proto", proto)]+             , requestHeaderHost = Just "example.com"+             }++location :: IsString ci => ci+location = "Location"
wai-extra.cabal view
@@ -1,5 +1,5 @@ Name:                wai-extra-Version:             3.0.8.2+Version:             3.0.9 Synopsis:            Provides some basic WAI handlers and middleware. description:   Provides basic WAI handler and middleware functionality:@@ -135,6 +135,7 @@                      Network.Wai.Middleware.HttpAuth                      Network.Wai.Middleware.StreamFile                      Network.Wai.Middleware.ForceSSL+                     Network.Wai.Middleware.Routed                      Network.Wai.Parse                      Network.Wai.Request                      Network.Wai.UrlMap@@ -153,6 +154,7 @@                      Network.Wai.RequestSpec                      Network.Wai.Middleware.ApprootSpec                      Network.Wai.Middleware.ForceSSLSpec+                     Network.Wai.Middleware.RoutedSpec                      Network.Wai.Middleware.StripHeadersSpec                      WaiExtraSpec     build-depends:   base                      >= 4        && < 5