packages feed

wai-middleware-content-type 0.2.1 → 0.3.0

raw patch · 14 files changed

+87/−53 lines, 14 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Network.Wai.Middleware.ContentType: fileExtsToMiddleware :: Monad m => FileExtListenerT Response m a -> MiddlewareT m
+ Network.Wai.Middleware.ContentType.Types: mapResponse :: Monad m => ((Status -> ResponseHeaders -> Response) -> Response) -> FileExtListenerT (Status -> ResponseHeaders -> Response) m a -> FileExtListenerT Response m a
- Network.Wai.Middleware.ContentType.Blaze: blaze :: Monad m => Html -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Blaze: blaze :: Monad m => Html -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeOnly :: Html -> Response
+ Network.Wai.Middleware.ContentType.Blaze: blazeOnly :: Html -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.ByteString: bytestring :: Monad m => FileExt -> ByteString -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.ByteString: bytestring :: Monad m => FileExt -> ByteString -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.ByteString: bytestringOnly :: ByteString -> Response
+ Network.Wai.Middleware.ContentType.ByteString: bytestringOnly :: ByteString -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.Cassius: cassius :: Monad m => Css -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Cassius: cassius :: Monad m => Css -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusOnly :: Css -> Response
+ Network.Wai.Middleware.ContentType.Cassius: cassiusOnly :: Css -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.Clay: clay :: Monad m => Config -> [App] -> Css -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Clay: clay :: Monad m => Config -> [App] -> Css -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Clay: clayOnly :: Config -> [App] -> Css -> Response
+ Network.Wai.Middleware.ContentType.Clay: clayOnly :: Config -> [App] -> Css -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.Json: json :: (ToJSON j, Monad m) => j -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Json: json :: (ToJSON j, Monad m) => j -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Json: jsonOnly :: ToJSON j => j -> Response
+ Network.Wai.Middleware.ContentType.Json: jsonOnly :: ToJSON j => j -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.Julius: julius :: Monad m => Javascript -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Julius: julius :: Monad m => Javascript -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusOnly :: Javascript -> Response
+ Network.Wai.Middleware.ContentType.Julius: juliusOnly :: Javascript -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.Lucid: lucid :: Monad m => HtmlT m () -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Lucid: lucid :: Monad m => HtmlT m () -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidOnly :: Monad m => HtmlT m () -> m Response
+ Network.Wai.Middleware.ContentType.Lucid: lucidOnly :: Monad m => HtmlT m () -> m (Status -> ResponseHeaders -> Response)
- Network.Wai.Middleware.ContentType.Lucius: lucius :: Monad m => Css -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Lucius: lucius :: Monad m => Css -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusOnly :: Css -> Response
+ Network.Wai.Middleware.ContentType.Lucius: luciusOnly :: Css -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.Pandoc: markdown :: Monad m => Pandoc -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Pandoc: markdown :: Monad m => Pandoc -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownOnly :: Pandoc -> Response
+ Network.Wai.Middleware.ContentType.Pandoc: markdownOnly :: Pandoc -> Status -> ResponseHeaders -> Response
- Network.Wai.Middleware.ContentType.Text: text :: Monad m => Text -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Text: text :: Monad m => Text -> FileExtListenerT (Status -> ResponseHeaders -> Response) m ()
- Network.Wai.Middleware.ContentType.Text: textOnly :: Text -> Response
+ Network.Wai.Middleware.ContentType.Text: textOnly :: Text -> Status -> ResponseHeaders -> Response

Files

src/Network/Wai/Middleware/ContentType.hs view
@@ -15,6 +15,7 @@  module Network.Wai.Middleware.ContentType   ( lookupFileExt+  , fileExtsToMiddleware    , -- * Re-Exports     module Network.Wai.Middleware.ContentType.Types@@ -42,6 +43,8 @@ import Network.Wai.Middleware.ContentType.Text import Network.Wai.Middleware.ContentType.Pandoc +import Network.Wai.Trans (Response, MiddlewareT, requestHeaders,+                         pathInfo) import qualified Data.HashMap.Lazy as HM import Data.Monoid import Control.Monad@@ -62,3 +65,11 @@         Nothing -> xs         Just fe -> fe <$ guard (fe `elem` xs) +fileExtsToMiddleware :: Monad m => FileExtListenerT Response m a -> MiddlewareT m+fileExtsToMiddleware xs app req respond = do+  map <- execFileExtListenerT xs+  let mAcceptHeader = lookup "Accept" (requestHeaders req)+      mFileExt      = getFileExt (pathInfo req)+  case lookupFileExt mAcceptHeader mFileExt map of+    Nothing -> app req respond+    Just r  -> respond r
src/Network/Wai/Middleware/ContentType/Blaze.hs view
@@ -1,7 +1,7 @@ module Network.Wai.Middleware.ContentType.Blaze where  import           Network.Wai.Middleware.ContentType.Types-import           Network.HTTP.Types                      (status200)+import           Network.HTTP.Types                      (Status, ResponseHeaders) import           Network.Wai                             (Response, responseBuilder)  import qualified Text.Blaze.Html                         as H@@ -13,7 +13,7 @@  blaze :: Monad m =>          H.Html-      -> FileExtListenerT Response m ()+      -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () blaze i =   tell' $ HM.singleton Html (blazeOnly i) @@ -21,6 +21,6 @@  -- * Data Only -blazeOnly :: H.Html -> Response-blazeOnly = responseBuilder status200 [] . H.renderHtmlBuilder+blazeOnly :: H.Html -> Status -> ResponseHeaders -> Response+blazeOnly h s hs = responseBuilder s hs (H.renderHtmlBuilder h) 
src/Network/Wai/Middleware/ContentType/ByteString.hs view
@@ -1,7 +1,7 @@ module Network.Wai.Middleware.ContentType.ByteString where  import           Network.Wai.Middleware.ContentType.Types-import           Network.HTTP.Types                      (status200)+import           Network.HTTP.Types                      (Status, ResponseHeaders) import           Network.Wai                             (Response, responseLBS)  import qualified Data.ByteString.Lazy                    as LBS@@ -14,7 +14,7 @@ bytestring :: Monad m =>               FileExt            -> LBS.ByteString-           -> FileExtListenerT Response m ()+           -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () bytestring fe i =   tell' $ HM.singleton fe (bytestringOnly i) @@ -24,5 +24,5 @@ -- * Data Only  -- | The exact same thing as @Network.Wai.responseLBS@.-bytestringOnly :: LBS.ByteString -> Response-bytestringOnly = responseLBS status200 []+bytestringOnly :: LBS.ByteString -> Status -> ResponseHeaders -> Response+bytestringOnly b s hs = responseLBS s hs b
src/Network/Wai/Middleware/ContentType/Cassius.hs view
@@ -2,10 +2,10 @@  import           Network.Wai.Middleware.ContentType.Types as CT import           Network.Wai.Middleware.ContentType.Text+import           Network.HTTP.Types                       (Status, ResponseHeaders) import           Network.Wai                              (Response)  import           Text.Cassius-import qualified Data.Text.Lazy.Encoding                  as LT import qualified Data.HashMap.Lazy                        as HM  @@ -13,7 +13,7 @@  cassius :: Monad m =>            Css-        -> FileExtListenerT Response m ()+        -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () cassius i =   tell' $ HM.singleton CT.Css (cassiusOnly i) @@ -22,6 +22,6 @@  -- * Data Only -cassiusOnly :: Css -> Response-cassiusOnly =-  textOnly . renderCss+cassiusOnly :: Css -> Status -> ResponseHeaders -> Response+cassiusOnly c =+  textOnly (renderCss c)
src/Network/Wai/Middleware/ContentType/Clay.hs view
@@ -2,6 +2,7 @@  import           Network.Wai.Middleware.ContentType.Types as CT import           Network.Wai.Middleware.ContentType.Text+import           Network.HTTP.Types                       (Status, ResponseHeaders) import           Network.Wai                              (Response)  import           Clay.Render@@ -13,7 +14,7 @@  clay :: Monad m =>         Config -> [App] -> Css-     -> FileExtListenerT Response m ()+     -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () clay c as i =   tell' $ HM.singleton CT.Css (clayOnly c as i) @@ -22,6 +23,6 @@  -- * Data Only -clayOnly :: Config -> [App] -> Css -> Response-clayOnly c as =-  textOnly . renderWith c as+clayOnly :: Config -> [App] -> Css -> Status -> ResponseHeaders -> Response+clayOnly c as css =+  textOnly (renderWith c as css)
src/Network/Wai/Middleware/ContentType/Json.hs view
@@ -2,6 +2,7 @@  import           Network.Wai.Middleware.ContentType.Types import           Network.Wai.Middleware.ContentType.ByteString+import           Network.HTTP.Types                      (Status, ResponseHeaders) import           Network.Wai                             (Response)  import qualified Data.Aeson                              as A@@ -13,7 +14,7 @@ json :: ( A.ToJSON j         , Monad m         ) => j-          -> FileExtListenerT Response m ()+          -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () json =   bytestring Json . A.encode @@ -21,8 +22,8 @@  -- * Data Only -jsonOnly :: A.ToJSON j => j -> Response-jsonOnly =-  bytestringOnly . A.encode+jsonOnly :: A.ToJSON j => j -> Status -> ResponseHeaders -> Response+jsonOnly j =+  bytestringOnly (A.encode j)  {-# INLINEABLE jsonOnly #-}
src/Network/Wai/Middleware/ContentType/Julius.hs view
@@ -2,6 +2,7 @@  import           Network.Wai.Middleware.ContentType.Types as CT import           Network.Wai.Middleware.ContentType.Text+import           Network.HTTP.Types                       (Status, ResponseHeaders) import           Network.Wai                              (Response)  import           Text.Julius@@ -12,7 +13,7 @@  julius :: Monad m =>           Javascript-       -> FileExtListenerT Response m ()+       -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () julius i =   tell' $ HM.singleton CT.JavaScript (juliusOnly i) @@ -21,6 +22,6 @@  -- * Data Only -juliusOnly :: Javascript -> Response-juliusOnly =-  textOnly . renderJavascript+juliusOnly :: Javascript -> Status -> ResponseHeaders -> Response+juliusOnly j =+  textOnly (renderJavascript j)
src/Network/Wai/Middleware/ContentType/Lucid.hs view
@@ -1,7 +1,7 @@ module Network.Wai.Middleware.ContentType.Lucid where  import           Network.Wai.Middleware.ContentType.Types-import           Network.HTTP.Types                      (status200)+import           Network.HTTP.Types                      (Status, ResponseHeaders) import           Network.Wai                             (Response, responseBuilder)  import qualified Lucid.Base                              as L@@ -13,7 +13,7 @@  lucid :: Monad m =>          L.HtmlT m ()-      -> FileExtListenerT Response m ()+      -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () lucid i = do   i' <- lift (lucidOnly i)   tell' (HM.singleton Html i')@@ -23,8 +23,8 @@  -- * Data Only -lucidOnly :: Monad m => L.HtmlT m () -> m Response+lucidOnly :: Monad m => L.HtmlT m () -> m (Status -> ResponseHeaders -> Response) lucidOnly i =-  responseBuilder status200 [] <$> L.execHtmlT i+  (\b s hs -> responseBuilder s hs b) <$> L.execHtmlT i  {-# INLINEABLE lucidOnly #-}
src/Network/Wai/Middleware/ContentType/Lucius.hs view
@@ -2,6 +2,7 @@  import           Network.Wai.Middleware.ContentType.Types as CT import           Network.Wai.Middleware.ContentType.Text+import           Network.HTTP.Types                       (Status, ResponseHeaders) import           Network.Wai                              (Response)  import           Text.Lucius@@ -10,7 +11,9 @@  -- * Lifted Combinators -lucius :: Monad m => Css -> FileExtListenerT Response m ()+lucius :: Monad m =>+          Css+       -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () lucius i =   tell' $ HM.singleton CT.Css (luciusOnly i) @@ -19,6 +22,6 @@  -- * Data Only -luciusOnly :: Css -> Response-luciusOnly =-  textOnly . renderCss+luciusOnly :: Css -> Status -> ResponseHeaders -> Response+luciusOnly c =+  textOnly (renderCss c)
src/Network/Wai/Middleware/ContentType/Pandoc.hs view
@@ -2,6 +2,7 @@  import           Network.Wai.Middleware.ContentType.Types import           Network.Wai.Middleware.ContentType.Text+import           Network.HTTP.Types                       (Status, ResponseHeaders) import           Network.Wai                              (Response)  import qualified Data.Text.Lazy                           as LT@@ -11,7 +12,9 @@  -- * Lifted Combinators -markdown :: Monad m => P.Pandoc -> FileExtListenerT Response m ()+markdown :: Monad m =>+            P.Pandoc+         -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () markdown i =   tell' $ HM.singleton Markdown (markdownOnly i) @@ -20,6 +23,6 @@  -- * Data Only -markdownOnly :: P.Pandoc -> Response-markdownOnly =-  textOnly . LT.pack . P.writeMarkdown P.def+markdownOnly :: P.Pandoc -> Status -> ResponseHeaders -> Response+markdownOnly p =+  textOnly (LT.pack $ P.writeMarkdown P.def p)
src/Network/Wai/Middleware/ContentType/Text.hs view
@@ -1,7 +1,7 @@ module Network.Wai.Middleware.ContentType.Text where  import           Network.Wai.Middleware.ContentType.Types-import           Network.HTTP.Types                       (status200)+import           Network.HTTP.Types                       (Status, ResponseHeaders) import           Network.Wai                              (Response, responseBuilder)  import qualified Data.Text.Lazy                           as LT@@ -11,7 +11,9 @@  -- * Lifted Combinators -text :: Monad m => LT.Text -> FileExtListenerT Response m ()+text :: Monad m =>+        LT.Text+     -> FileExtListenerT (Status -> ResponseHeaders -> Response) m () text i =   tell' $ HM.singleton Text (textOnly i) @@ -20,7 +22,7 @@  -- * Data Only -textOnly :: LT.Text -> Response-textOnly =-  responseBuilder status200 [] . LT.encodeUtf8Builder+textOnly :: LT.Text -> Status -> ResponseHeaders -> Response+textOnly t s hs =+  responseBuilder s hs (LT.encodeUtf8Builder t) 
src/Network/Wai/Middleware/ContentType/Types.hs view
@@ -30,6 +30,7 @@   , FileExtMap   , FileExtListenerT (..)   , execFileExtListenerT+  , mapResponse   , -- * Utilities     tell'   , AcceptHeader@@ -59,6 +60,8 @@ import           Control.Monad.Morph  import           GHC.Generics+import           Network.HTTP.Types (Status, ResponseHeaders)+import           Network.Wai.Trans (Response) import           Network.HTTP.Media (mapAccept)  @@ -114,6 +117,8 @@  {-# INLINEABLE toExt #-} ++ type FileExtMap a = HashMap FileExt a  -- | The monad for our DSL - when using the combinators, our result will be this@@ -144,6 +149,18 @@   liftBaseWith = defaultLiftBaseWith   restoreM     = defaultRestoreM +mapResponse :: Monad m =>+               ((Status -> ResponseHeaders -> Response) -> Response)+            -> FileExtListenerT (Status -> ResponseHeaders -> Response) m a+            -> FileExtListenerT Response m a+mapResponse f (FileExtListenerT xs) =+  FileExtListenerT $ mapState (HM.map f) (HM.map (const . const)) xs+  where+    mapState to from xs = do+      i <- get+      (x,s) <- lift (runStateT xs (from i))+      put (to s)+      pure x  execFileExtListenerT :: Monad m => FileExtListenerT r m a -> m (FileExtMap r) execFileExtListenerT xs = execStateT (runFileExtListenerT xs) mempty
test/Network/Wai/Middleware/ContentTypeSpec.hs view
@@ -158,18 +158,12 @@         406  app :: Application-app req respond = do-  xs <- execFileExtListenerT allExamples-  let mAcceptHeader = lookup "Accept" (requestHeaders req)-      mFileExt      = getFileExt (pathInfo req)-  respond $-    case lookupFileExt mAcceptHeader mFileExt xs of-      Nothing -> let (ResponseBuilder s h r) = textOnly "Something went wrong"-                 in (ResponseBuilder status406 [] r)-      Just r  -> r+app =+  fileExtsToMiddleware allExamples $+  (\req respond -> respond (textOnly "Something went wrong" status406 []))  allExamples :: FileExtListenerT Response IO ()-allExamples = do+allExamples = mapResponse (\f -> f status200 []) $ do   text "Text!"   json ("Json!" :: T.Text)   lucid (L.toHtmlRaw ("Html!" :: T.Text))
wai-middleware-content-type.cabal view
@@ -1,5 +1,5 @@ Name:                   wai-middleware-content-type-Version:                0.2.1+Version:                0.3.0 Author:                 Athan Clark <athan.clark@gmail.com> Maintainer:             Athan Clark <athan.clark@gmail.com> License:                BSD3@@ -56,6 +56,7 @@                       , unordered-containers                       , urlpath >= 5.0.0.1                       , wai >= 3.2+                      , wai-transformers  Test-Suite test   Type:                 exitcode-stdio-1.0