packages feed

wai-middleware-content-type 0.1.1.1 → 0.2.0

raw patch · 17 files changed

+313/−998 lines, 17 filesdep −wai-utildep ~urlpathdep ~waidep ~wai-transformersPVP ok

version bump matches the API change (PVP)

Dependencies removed: wai-util

Dependency ranges changed: urlpath, wai, wai-transformers

API changes (from Hackage documentation)

- Network.Wai.Middleware.ContentType: fileExtsToMiddleware :: (MonadIO m) => FileExtListenerT (MiddlewareT m) m () -> MiddlewareT m
- Network.Wai.Middleware.ContentType: invalidEncoding :: MonadIO m => MiddlewareT m -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType: lookupResponse :: (MonadIO m) => Maybe AcceptHeader -> Maybe FileExt -> FileExtListenerT (MiddlewareT m) m () -> m (Maybe (MiddlewareT m))
- Network.Wai.Middleware.ContentType: possibleFileExts :: AcceptHeader -> [FileExt]
- Network.Wai.Middleware.ContentType: type AcceptHeader = ByteString
- Network.Wai.Middleware.ContentType.Blaze: blaze :: MonadIO m => Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeHeaders :: MonadIO m => RequestHeaders -> Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeHeadersWith :: MonadIO m => (Response -> Response) -> RequestHeaders -> Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeOnly :: Html -> Response
- Network.Wai.Middleware.ContentType.Blaze: blazeOnlyHeaders :: RequestHeaders -> Html -> Response
- Network.Wai.Middleware.ContentType.Blaze: blazeOnlyStatus :: Status -> Html -> Response
- Network.Wai.Middleware.ContentType.Blaze: blazeOnlyStatusHeaders :: Status -> RequestHeaders -> Html -> Response
- Network.Wai.Middleware.ContentType.Blaze: blazeStatus :: MonadIO m => Status -> Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeStatusHeaders :: MonadIO m => Status -> RequestHeaders -> Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeStatusHeadersWith :: MonadIO m => (Response -> Response) -> Status -> RequestHeaders -> Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeStatusWith :: MonadIO m => (Response -> Response) -> Status -> Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Blaze: blazeWith :: MonadIO m => (Response -> Response) -> Html -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Builder: builder :: MonadIO m => FileExt -> RequestHeaders -> Builder -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Builder: builderOnly :: RequestHeaders -> Builder -> Response
- Network.Wai.Middleware.ContentType.Builder: builderOnlyStatus :: Status -> RequestHeaders -> Builder -> Response
- Network.Wai.Middleware.ContentType.Builder: builderStatus :: MonadIO m => FileExt -> Status -> RequestHeaders -> Builder -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Builder: builderStatusWith :: MonadIO m => (Response -> Response) -> FileExt -> Status -> RequestHeaders -> Builder -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Builder: builderWith :: MonadIO m => (Response -> Response) -> FileExt -> RequestHeaders -> Builder -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.ByteString: bytestring :: MonadIO m => FileExt -> RequestHeaders -> ByteString -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.ByteString: bytestringOnly :: RequestHeaders -> ByteString -> Response
- Network.Wai.Middleware.ContentType.ByteString: bytestringOnlyStatus :: Status -> RequestHeaders -> ByteString -> Response
- Network.Wai.Middleware.ContentType.ByteString: bytestringStatus :: MonadIO m => FileExt -> Status -> RequestHeaders -> ByteString -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.ByteString: bytestringStatusWith :: MonadIO m => (Response -> Response) -> FileExt -> Status -> RequestHeaders -> ByteString -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.ByteString: bytestringWith :: MonadIO m => (Response -> Response) -> FileExt -> RequestHeaders -> ByteString -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassius :: MonadIO m => Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusHeaders :: MonadIO m => RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusHeadersWith :: MonadIO m => (Response -> Response) -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusOnly :: Css -> Response
- Network.Wai.Middleware.ContentType.Cassius: cassiusOnlyHeaders :: RequestHeaders -> Css -> Response
- Network.Wai.Middleware.ContentType.Cassius: cassiusOnlyStatus :: Status -> Css -> Response
- Network.Wai.Middleware.ContentType.Cassius: cassiusOnlyStatusHeaders :: Status -> RequestHeaders -> Css -> Response
- Network.Wai.Middleware.ContentType.Cassius: cassiusStatus :: MonadIO m => Status -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusStatusHeaders :: MonadIO m => Status -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusStatusHeadersWith :: MonadIO m => (Response -> Response) -> Status -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusStatusWith :: MonadIO m => (Response -> Response) -> Status -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Cassius: cassiusWith :: MonadIO m => (Response -> Response) -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clay :: MonadIO m => Config -> [App] -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clayHeaders :: MonadIO m => Config -> [App] -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clayHeadersWith :: MonadIO m => (Response -> Response) -> Config -> [App] -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clayOnly :: Config -> [App] -> Css -> Response
- Network.Wai.Middleware.ContentType.Clay: clayOnlyHeaders :: Config -> [App] -> RequestHeaders -> Css -> Response
- Network.Wai.Middleware.ContentType.Clay: clayOnlyStatus :: Config -> [App] -> Status -> Css -> Response
- Network.Wai.Middleware.ContentType.Clay: clayOnlyStatusHeaders :: Config -> [App] -> Status -> RequestHeaders -> Css -> Response
- Network.Wai.Middleware.ContentType.Clay: clayStatus :: MonadIO m => Config -> [App] -> Status -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clayStatusHeaders :: MonadIO m => Config -> [App] -> Status -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clayStatusHeadersWith :: MonadIO m => (Response -> Response) -> Config -> [App] -> Status -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clayStatusWith :: MonadIO m => (Response -> Response) -> Config -> [App] -> Status -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Clay: clayWith :: MonadIO m => (Response -> Response) -> Config -> [App] -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: json :: (ToJSON j, MonadIO m) => j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonHeaders :: (ToJSON j, MonadIO m) => RequestHeaders -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonHeadersWith :: (ToJSON j, MonadIO m) => (Response -> Response) -> RequestHeaders -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonOnly :: ToJSON j => j -> Response
- Network.Wai.Middleware.ContentType.Json: jsonOnlyHeaders :: ToJSON j => RequestHeaders -> j -> Response
- Network.Wai.Middleware.ContentType.Json: jsonOnlyStatus :: ToJSON j => Status -> j -> Response
- Network.Wai.Middleware.ContentType.Json: jsonOnlyStatusHeaders :: ToJSON j => Status -> RequestHeaders -> j -> Response
- Network.Wai.Middleware.ContentType.Json: jsonStatus :: (ToJSON j, MonadIO m) => Status -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonStatusHeaders :: (ToJSON j, MonadIO m) => Status -> RequestHeaders -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonStatusHeadersWith :: (ToJSON j, MonadIO m) => (Response -> Response) -> Status -> RequestHeaders -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonStatusWith :: (ToJSON j, MonadIO m) => (Response -> Response) -> Status -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonWith :: (ToJSON j, MonadIO m) => (Response -> Response) -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonp :: (ToJSON j, MonadIO m) => j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonpOnly :: ToJSON j => j -> Response
- Network.Wai.Middleware.ContentType.Json: jsonpOnlyStatus :: ToJSON j => Status -> j -> Response
- Network.Wai.Middleware.ContentType.Json: jsonpStatus :: (ToJSON j, MonadIO m) => Status -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonpStatusWith :: (ToJSON j, MonadIO m) => (Response -> Response) -> Status -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Json: jsonpWith :: (ToJSON j, MonadIO m) => (Response -> Response) -> j -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: julius :: MonadIO m => Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusHeaders :: MonadIO m => RequestHeaders -> Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusHeadersWith :: MonadIO m => (Response -> Response) -> RequestHeaders -> Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusOnly :: Javascript -> Response
- Network.Wai.Middleware.ContentType.Julius: juliusOnlyHeaders :: RequestHeaders -> Javascript -> Response
- Network.Wai.Middleware.ContentType.Julius: juliusOnlyStatus :: Status -> Javascript -> Response
- Network.Wai.Middleware.ContentType.Julius: juliusOnlyStatusHeaders :: Status -> RequestHeaders -> Javascript -> Response
- Network.Wai.Middleware.ContentType.Julius: juliusStatus :: MonadIO m => Status -> Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusStatusHeaders :: MonadIO m => Status -> RequestHeaders -> Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusStatusHeadersWith :: MonadIO m => (Response -> Response) -> Status -> RequestHeaders -> Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusStatusWith :: MonadIO m => (Response -> Response) -> Status -> Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Julius: juliusWith :: MonadIO m => (Response -> Response) -> Javascript -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucid :: MonadIO m => HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidHeaders :: MonadIO m => RequestHeaders -> HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidHeadersWith :: MonadIO m => (Response -> Response) -> RequestHeaders -> HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidOnly :: Monad m => HtmlT m () -> m Response
- Network.Wai.Middleware.ContentType.Lucid: lucidOnlyHeaders :: Monad m => RequestHeaders -> HtmlT m () -> m Response
- Network.Wai.Middleware.ContentType.Lucid: lucidOnlyStatus :: Monad m => Status -> HtmlT m () -> m Response
- Network.Wai.Middleware.ContentType.Lucid: lucidOnlyStatusHeaders :: Monad m => Status -> RequestHeaders -> HtmlT m () -> m Response
- Network.Wai.Middleware.ContentType.Lucid: lucidStatus :: MonadIO m => Status -> HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidStatusHeaders :: MonadIO m => Status -> RequestHeaders -> HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidStatusHeadersWith :: MonadIO m => (Response -> Response) -> Status -> RequestHeaders -> HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidStatusWith :: MonadIO m => (Response -> Response) -> Status -> HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucid: lucidWith :: MonadIO m => (Response -> Response) -> HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: lucius :: MonadIO m => Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusHeaders :: MonadIO m => RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusHeadersWith :: MonadIO m => (Response -> Response) -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusOnly :: Css -> Response
- Network.Wai.Middleware.ContentType.Lucius: luciusOnlyHeaders :: RequestHeaders -> Css -> Response
- Network.Wai.Middleware.ContentType.Lucius: luciusOnlyStatus :: Status -> Css -> Response
- Network.Wai.Middleware.ContentType.Lucius: luciusOnlyStatusHeaders :: Status -> RequestHeaders -> Css -> Response
- Network.Wai.Middleware.ContentType.Lucius: luciusStatus :: MonadIO m => Status -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusStatusHeaders :: MonadIO m => Status -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusStatusHeadersWith :: MonadIO m => (Response -> Response) -> Status -> RequestHeaders -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusStatusWith :: MonadIO m => (Response -> Response) -> Status -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Lucius: luciusWith :: MonadIO m => (Response -> Response) -> Css -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Middleware: middleware :: Monad m => FileExt -> MiddlewareT m -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdown :: MonadIO m => Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownHeaders :: MonadIO m => RequestHeaders -> Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownHeadersWith :: MonadIO m => (Response -> Response) -> RequestHeaders -> Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownOnly :: Pandoc -> Response
- Network.Wai.Middleware.ContentType.Pandoc: markdownOnlyHeaders :: RequestHeaders -> Pandoc -> Response
- Network.Wai.Middleware.ContentType.Pandoc: markdownOnlyStatus :: Status -> Pandoc -> Response
- Network.Wai.Middleware.ContentType.Pandoc: markdownOnlyStatusHeaders :: Status -> RequestHeaders -> Pandoc -> Response
- Network.Wai.Middleware.ContentType.Pandoc: markdownStatus :: MonadIO m => Status -> Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownStatusHeaders :: MonadIO m => Status -> RequestHeaders -> Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownStatusHeadersWith :: MonadIO m => (Response -> Response) -> Status -> RequestHeaders -> Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownStatusWith :: MonadIO m => (Response -> Response) -> Status -> Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Pandoc: markdownWith :: MonadIO m => (Response -> Response) -> Pandoc -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: text :: MonadIO m => Text -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: textHeaders :: MonadIO m => RequestHeaders -> Text -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: textHeadersWith :: MonadIO m => (Response -> Response) -> RequestHeaders -> Text -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: textOnly :: Text -> Response
- Network.Wai.Middleware.ContentType.Text: textOnlyHeaders :: RequestHeaders -> Text -> Response
- Network.Wai.Middleware.ContentType.Text: textOnlyStatus :: Status -> Text -> Response
- Network.Wai.Middleware.ContentType.Text: textOnlyStatusHeaders :: Status -> RequestHeaders -> Text -> Response
- Network.Wai.Middleware.ContentType.Text: textStatus :: MonadIO m => Status -> Text -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: textStatusHeaders :: MonadIO m => Status -> RequestHeaders -> Text -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: textStatusHeadersWith :: MonadIO m => (Response -> Response) -> Status -> RequestHeaders -> Text -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: textStatusWith :: MonadIO m => (Response -> Response) -> Status -> Text -> FileExtListenerT (MiddlewareT m) m ()
- Network.Wai.Middleware.ContentType.Text: textWith :: MonadIO m => (Response -> Response) -> Text -> FileExtListenerT (MiddlewareT m) m ()
+ Network.Wai.Middleware.ContentType: lookupFileExt :: Maybe AcceptHeader -> Maybe FileExt -> FileExtMap r -> Maybe r
+ Network.Wai.Middleware.ContentType.Blaze: blazeBody :: Monad m => Html -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Blaze: blazeOnlyBody :: Html -> Body
+ Network.Wai.Middleware.ContentType.Blaze: blazeOnlyResponse :: Html -> Response
+ Network.Wai.Middleware.ContentType.Blaze: blazeResponse :: Monad m => Html -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.ByteString: bytestringBody :: Monad m => FileExt -> ByteString -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.ByteString: bytestringOnlyBody :: ByteString -> Body
+ Network.Wai.Middleware.ContentType.ByteString: bytestringOnlyResponse :: ByteString -> Response
+ Network.Wai.Middleware.ContentType.ByteString: bytestringResponse :: Monad m => FileExt -> ByteString -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Cassius: cassiusBody :: Monad m => Css -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Cassius: cassiusOnlyBody :: Css -> Body
+ Network.Wai.Middleware.ContentType.Cassius: cassiusOnlyResponse :: Css -> Response
+ Network.Wai.Middleware.ContentType.Cassius: cassiusResponse :: Monad m => Css -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Clay: clayBody :: Monad m => Config -> [App] -> Css -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Clay: clayOnlyBody :: Config -> [App] -> Css -> Body
+ Network.Wai.Middleware.ContentType.Clay: clayOnlyResponse :: Config -> [App] -> Css -> Response
+ Network.Wai.Middleware.ContentType.Clay: clayResponse :: Monad m => Config -> [App] -> Css -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Json: jsonBody :: (ToJSON j, Monad m) => j -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Json: jsonOnlyBody :: ToJSON j => j -> Body
+ Network.Wai.Middleware.ContentType.Json: jsonOnlyResponse :: ToJSON j => j -> Response
+ Network.Wai.Middleware.ContentType.Json: jsonResponse :: (ToJSON j, Monad m) => j -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Julius: juliusBody :: Monad m => Javascript -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Julius: juliusOnlyBody :: Javascript -> Body
+ Network.Wai.Middleware.ContentType.Julius: juliusOnlyResponse :: Javascript -> Response
+ Network.Wai.Middleware.ContentType.Julius: juliusResponse :: Monad m => Javascript -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Lucid: lucidBody :: Monad m => HtmlT m () -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Lucid: lucidOnlyBody :: Monad m => HtmlT m () -> m Body
+ Network.Wai.Middleware.ContentType.Lucid: lucidOnlyResponse :: Monad m => HtmlT m () -> m Response
+ Network.Wai.Middleware.ContentType.Lucid: lucidResponse :: Monad m => HtmlT m () -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Lucius: luciusBody :: Monad m => Css -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Lucius: luciusOnlyBody :: Css -> Body
+ Network.Wai.Middleware.ContentType.Lucius: luciusOnlyResponse :: Css -> Response
+ Network.Wai.Middleware.ContentType.Lucius: luciusResponse :: Monad m => Css -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Pandoc: markdownBody :: Monad m => Pandoc -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Pandoc: markdownOnlyBody :: Pandoc -> Body
+ Network.Wai.Middleware.ContentType.Pandoc: markdownOnlyResponse :: Pandoc -> Response
+ Network.Wai.Middleware.ContentType.Pandoc: markdownResponse :: Monad m => Pandoc -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Text: textBody :: Monad m => Text -> FileExtListenerT Body m ()
+ Network.Wai.Middleware.ContentType.Text: textOnlyBody :: Text -> Body
+ Network.Wai.Middleware.ContentType.Text: textOnlyResponse :: Text -> Response
+ Network.Wai.Middleware.ContentType.Text: textResponse :: Monad m => Text -> FileExtListenerT Response m ()
+ Network.Wai.Middleware.ContentType.Types: invalidEncoding :: Monad m => r -> FileExtListenerT r m ()
+ Network.Wai.Middleware.ContentType.Types: possibleFileExts :: AcceptHeader -> [FileExt]
+ Network.Wai.Middleware.ContentType.Types: type AcceptHeader = ByteString

Files

− examples/Example.hs
@@ -1,32 +0,0 @@-{-# LANGUAGE-    OverloadedStrings-  #-}--module Main where--import Network.Wai.Handler.Warp-import Network.Wai.Trans-import Network.Wai.Middleware.ContentType-import Network.HTTP.Types-import qualified Data.Text as T-import qualified Lucid     as L-import Control.Monad.IO.Class---data AppError = AppError--myListener :: MonadIO m => FileExtListenerT (MiddlewareT m) m ()-myListener = do-  text "Text!"-  json ("Json!" :: T.Text)-  lucid (L.toHtmlRaw ("Html!" :: T.Text))--myApp :: MonadIO m => MiddlewareT m-myApp = fileExtsToMiddleware myListener--main :: IO ()-main = run 3000 (myApp defApp)-  where-    defApp :: Application-    defApp _ respond =-      respond $ textOnlyStatus status404 "404"
src/Network/Wai/Middleware/ContentType.hs view
@@ -11,44 +11,14 @@ Stability   : experimental Portability : GHC -Import this module to use all the application end-point combinators:--> {-# LANGUAGE->     OverloadedStrings->   #-}->-> import Network.Wai.Middleware.ContentType-> import qualified Data.Text as T-> import qualified Lucid as L->-> myApp :: MonadIO m => MiddlewareT-> myApp = fileExtsToMiddleware $ do->   text "Text!"->   json ("Json!" :: T.Text)->   lucid (L.toHtmlRaw ("Html!" :: T.Text))--If you would like to embed a 'Network.Wai.Trans.MiddlewareT' as a response to-a particular supported file extension / content type, import-"Network.Wai.Middleware.ContentType.Middleware":--> import Network.Wai.Middleware.ContentType-> import Network.Wai.Middleware.ContentType.Middleware->-> myApp = fileExtsToMiddleware $->   middleware Css myMiddleware -}  module Network.Wai.Middleware.ContentType-  ( -- * Utilities-    fileExtsToMiddleware-  , lookupResponse-  , possibleFileExts-  , invalidEncoding-  , AcceptHeader+  ( lookupFileExt+   , -- * Re-Exports     module Network.Wai.Middleware.ContentType.Types   , module Network.Wai.Middleware.ContentType.Blaze-  , module Network.Wai.Middleware.ContentType.Builder   , module Network.Wai.Middleware.ContentType.ByteString   , module Network.Wai.Middleware.ContentType.Cassius   , module Network.Wai.Middleware.ContentType.Clay@@ -60,12 +30,8 @@   , module Network.Wai.Middleware.ContentType.Pandoc   ) where -import Network.Wai.Trans-import Network.HTTP.Types (HeaderName)-import Network.HTTP.Media (mapAccept) import Network.Wai.Middleware.ContentType.Types hiding (tell') import Network.Wai.Middleware.ContentType.Blaze-import Network.Wai.Middleware.ContentType.Builder import Network.Wai.Middleware.ContentType.ByteString import Network.Wai.Middleware.ContentType.Cassius import Network.Wai.Middleware.ContentType.Clay@@ -76,86 +42,25 @@ import Network.Wai.Middleware.ContentType.Text import Network.Wai.Middleware.ContentType.Pandoc -import Network.Wai.Middleware.ContentType.Middleware (middleware)+import qualified Network.Wai.Middleware.ContentType.Types as CT -import qualified Data.ByteString   as BS import qualified Data.HashMap.Lazy as HM-import Data.Maybe (fromMaybe, catMaybes) import Data.Monoid-import Control.Monad.Trans import Control.Monad --type AcceptHeader = BS.ByteString---- | Turn a map of content types to middlewares, into a middleware.-fileExtsToMiddleware :: ( MonadIO m-                        ) => FileExtListenerT (MiddlewareT m) m ()-                          -> MiddlewareT m-fileExtsToMiddleware contentRoutes app req respond = do-  let mAcceptBS = Prelude.lookup ("Accept" :: HeaderName) $ requestHeaders req-      mFe       = getFileExt (pathInfo req)-  mMiddleware <- lookupResponse mAcceptBS mFe contentRoutes-  fromMaybe (app req respond) $ do-    mid <- mMiddleware-    pure (mid app req respond)--{-# INLINEABLE fileExtsToMiddleware #-}- -- | Given an HTTP @Accept@ header and a content type to base lookups off of, and -- a map of responses, find a response.-lookupResponse :: ( MonadIO m-                  ) => Maybe AcceptHeader-                    -> Maybe FileExt-                    -> FileExtListenerT (MiddlewareT m) m ()-                    -> m (Maybe (MiddlewareT m))-lookupResponse mAcceptBS mFe fexts =-  lookupFileExt <$> execFileExtListenerT fexts+lookupFileExt :: Maybe AcceptHeader+              -> Maybe FileExt+              -> FileExtMap r+              -> Maybe r+lookupFileExt mAcceptBS mFe fexts =+  getFirst . foldMap (First . flip HM.lookup fexts) . findFE $+    maybe allFileExts possibleFileExts mAcceptBS   where-    lookupFileExt xs =-      let attempts = findFE $ maybe allFileExts possibleFileExts mAcceptBS-      in  getFirst $ foldMap (First . flip HM.lookup xs) attempts-     findFE :: [FileExt] -> [FileExt]     findFE xs =       case mFe of         Nothing -> xs         Just fe -> fe <$ guard (fe `elem` xs) -{-# INLINEABLE lookupResponse #-}---- | Takes an @Accept@ header and returns the other--- file types handleable, in order of prescedence.-possibleFileExts :: AcceptHeader -> [FileExt]-possibleFileExts accept = if not (null wildcard) then wildcard else computed-  where-    computed :: [FileExt]-    computed = concat $-      catMaybes [ mapAccept [ ("application/json"       :: BS.ByteString, [Json])-                            , ("application/javascript" :: BS.ByteString, [JavaScript,Json])-                            ] accept-                , mapAccept [ ("text/html" :: BS.ByteString, [Html])-                            ] accept-                , mapAccept [ ("text/plain" :: BS.ByteString, [Text, Markdown])-                            ] accept-                , mapAccept [ ("text/markdown" :: BS.ByteString, [Markdown])-                            ] accept-                , mapAccept [ ("text/css" :: BS.ByteString, [Css])-                            ] accept-                ]--    wildcard :: [FileExt]-    wildcard = fromMaybe [] $ mapAccept [ ("*/*" :: BS.ByteString, allFileExts)-                                        ] accept--{-# INLINEABLE possibleFileExts #-}---- | Use this combinator as the last one, as a "catch-all":------   > myApp = do---   >   text "foo"---   >   invalidEncoding myErrorHandler-invalidEncoding :: MonadIO m => MiddlewareT m -> FileExtListenerT (MiddlewareT m) m ()-invalidEncoding mid = mapM_ (`middleware` mid) allFileExts--{-# INLINEABLE invalidEncoding #-}
src/Network/Wai/Middleware/ContentType/Blaze.hs view
@@ -1,96 +1,37 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Blaze where  import           Network.Wai.Middleware.ContentType.Types-import           Network.Wai.Middleware.ContentType.Builder+import           Network.HTTP.Types                      (status200)+import           Network.Wai                             (Response, responseBuilder)+import           Network.Wai.HTTP2                       (Body, streamBuilder) -import           Network.HTTP.Types                      (RequestHeaders,-                                                          Status, status200)-import           Network.Wai.Trans import qualified Text.Blaze.Html                         as H import qualified Text.Blaze.Html.Renderer.Utf8           as H-import           Control.Monad.IO.Class                  (MonadIO)+import qualified Data.HashMap.Lazy                       as HM   -- * Lifted Combinators --- | Uses @Html@ as the key in the map, and @"text/html"@ as the content type.-blaze :: MonadIO m =>-         H.Html -> FileExtListenerT (MiddlewareT m) m ()-blaze = blazeStatusHeaders status200 [("Content-Type", "text/html")]--{-# INLINEABLE blaze #-}--blazeWith :: MonadIO m =>-             (Response -> Response) -> H.Html-          -> FileExtListenerT (MiddlewareT m) m ()-blazeWith f = blazeStatusHeadersWith f status200 [("Content-Type", "text/html")]--{-# INLINEABLE blazeWith #-}--blazeStatus :: MonadIO m =>-               Status -> H.Html-            -> FileExtListenerT (MiddlewareT m) m ()-blazeStatus s = blazeStatusHeaders s [("Content-Type", "text/html")]--{-# INLINEABLE blazeStatus #-}--blazeStatusWith :: MonadIO m =>-                   (Response -> Response) -> Status -> H.Html-                -> FileExtListenerT (MiddlewareT m) m ()-blazeStatusWith f s = blazeStatusHeadersWith f s [("Content-Type", "text/html")]--{-# INLINEABLE blazeStatusWith #-}--blazeHeaders :: MonadIO m =>-                RequestHeaders -> H.Html-             -> FileExtListenerT (MiddlewareT m) m ()-blazeHeaders = blazeStatusHeaders status200--{-# INLINEABLE blazeHeaders #-}--blazeHeadersWith :: MonadIO m =>-                    (Response -> Response) -> RequestHeaders -> H.Html-                 -> FileExtListenerT (MiddlewareT m) m ()-blazeHeadersWith f = blazeStatusHeadersWith f status200--{-# INLINEABLE blazeHeadersWith #-}--blazeStatusHeaders :: MonadIO m =>-                      Status -> RequestHeaders -> H.Html-                   -> FileExtListenerT (MiddlewareT m) m ()-blazeStatusHeaders = blazeStatusHeadersWith id--{-# INLINEABLE blazeStatusHeaders #-}--blazeStatusHeadersWith :: MonadIO m =>-                          (Response -> Response) -> Status -> RequestHeaders -> H.Html-                       -> FileExtListenerT (MiddlewareT m) m ()-blazeStatusHeadersWith f s hs =-  builderStatusWith f Html s hs . H.renderHtmlBuilder--{-# INLINEABLE blazeStatusHeadersWith #-}---- * 'Network.Wai.Response' Only--blazeOnly :: H.Html -> Response-blazeOnly = blazeOnlyStatusHeaders status200 [("Content-Type", "text/html")]--{-# INLINEABLE blazeOnly #-}+blazeResponse :: Monad m =>+                 H.Html+              -> FileExtListenerT Response m ()+blazeResponse i =+  tell' $ HM.singleton Html (blazeOnlyResponse i) -blazeOnlyHeaders :: RequestHeaders -> H.Html -> Response-blazeOnlyHeaders = blazeOnlyStatusHeaders status200+{-# INLINEABLE blazeResponse #-} -{-# INLINEABLE blazeOnlyHeaders #-}+blazeBody :: Monad m =>+             H.Html+          -> FileExtListenerT Body m ()+blazeBody i =+  tell' $ HM.singleton Html (blazeOnlyBody i) -blazeOnlyStatus :: Status -> H.Html -> Response-blazeOnlyStatus s = blazeOnlyStatusHeaders s [("Content-Type", "text/html")]+{-# INLINEABLE blazeBody #-} -{-# INLINEABLE blazeOnlyStatus #-}+-- * Data Only -blazeOnlyStatusHeaders :: Status -> RequestHeaders -> H.Html -> Response-blazeOnlyStatusHeaders s hs =-  builderOnlyStatus s hs . H.renderHtmlBuilder+blazeOnlyResponse :: H.Html -> Response+blazeOnlyResponse = responseBuilder status200 [] . H.renderHtmlBuilder -{-# INLINEABLE blazeOnlyStatusHeaders #-}+blazeOnlyBody :: H.Html -> Body+blazeOnlyBody = streamBuilder . H.renderHtmlBuilder
− src/Network/Wai/Middleware/ContentType/Builder.hs
@@ -1,61 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Network.Wai.Middleware.ContentType.Builder where--import           Network.Wai.Middleware.ContentType.Types-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans--import qualified Data.ByteString.Builder                 as BU-import qualified Data.HashMap.Lazy                       as HM-import           Control.Monad.IO.Class----- * Lifted Combinators---- | A builder is ambiguous, therefore we require @RequestHeaders@ and a @FileExt@ to be explicitly--- supplied.-builder :: MonadIO m =>-           FileExt -> RequestHeaders -> BU.Builder-        -> FileExtListenerT (MiddlewareT m) m ()-builder e  = builderStatus e status200--{-# INLINEABLE builder #-}--builderWith :: MonadIO m =>-               (Response -> Response) -> FileExt -> RequestHeaders -> BU.Builder-            -> FileExtListenerT (MiddlewareT m) m ()-builderWith f e = builderStatusWith f e status200--{-# INLINEABLE builderWith #-}--builderStatus :: MonadIO m =>-                 FileExt -> Status -> RequestHeaders -> BU.Builder-              -> FileExtListenerT (MiddlewareT m) m ()-builderStatus = builderStatusWith id--{-# INLINEABLE builderStatus #-}--builderStatusWith :: MonadIO m =>-                     (Response -> Response) -> FileExt -> Status -> RequestHeaders -> BU.Builder-                  -> FileExtListenerT (MiddlewareT m) m ()-builderStatusWith f e s hs i =-  let r = builderOnlyStatus s hs i in-  FileExtListenerT $ tell' $-    HM.singleton e (\_ _ respond -> respond $! f r)--{-# INLINEABLE builderStatusWith #-}----- * 'Network.Wai.Response' Only--builderOnly :: RequestHeaders -> BU.Builder -> Response-builderOnly = builderOnlyStatus status200--{-# INLINEABLE builderOnly #-}---- | The exact same thing as @Network.Wai.responseBuilder@.-builderOnlyStatus :: Status -> RequestHeaders -> BU.Builder -> Response-builderOnlyStatus = responseBuilder--{-# INLINEABLE builderOnlyStatus #-}
src/Network/Wai/Middleware/ContentType/ByteString.hs view
@@ -1,63 +1,41 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.ByteString where  import           Network.Wai.Middleware.ContentType.Types-import           Network.Wai.Middleware.ContentType.Middleware-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans-import qualified Network.Wai.Util                        as U+import           Network.HTTP.Types                      (status200)+import           Network.Wai                             (Response, responseLBS)+import           Network.Wai.HTTP2                       (Body, streamBuilder) -import qualified Data.ByteString.Lazy                    as B-import           Control.Monad.Trans (lift)-import           Control.Monad.IO.Class+import qualified Data.ByteString.Lazy                    as LBS+import qualified Blaze.ByteString.Builder.ByteString     as BU+import qualified Data.HashMap.Lazy                       as HM   -- * Lifted Combinators --- | @ByteString@ is ambiguous - we need to know what @RequestHeaders@ and @FileExt@ should be associated.-bytestring :: MonadIO m => FileExt -> RequestHeaders -> B.ByteString-           -> FileExtListenerT (MiddlewareT m) m ()-bytestring e = bytestringStatus e status200--{-# INLINEABLE bytestring #-}--bytestringWith :: MonadIO m => (Response -> Response) -> FileExt -> RequestHeaders -> B.ByteString-               -> FileExtListenerT (MiddlewareT m) m ()-bytestringWith f e = bytestringStatusWith f e status200--{-# INLINEABLE bytestringWith #-}--bytestringStatus :: MonadIO m => FileExt -> Status -> RequestHeaders -> B.ByteString-                 -> FileExtListenerT (MiddlewareT m) m ()-bytestringStatus = bytestringStatusWith id--{-# INLINEABLE bytestringStatus #-}+bytestringResponse :: Monad m =>+                      FileExt+                   -> LBS.ByteString+                   -> FileExtListenerT Response m ()+bytestringResponse fe i =+  tell' $ HM.singleton fe (bytestringOnlyResponse i) +{-# INLINEABLE bytestringResponse #-} -bytestringStatusWith :: MonadIO m =>-                        (Response -> Response)-                     -> FileExt-                     -> Status-                     -> RequestHeaders-                     -> B.ByteString-                     -> FileExtListenerT (MiddlewareT m) m ()-bytestringStatusWith f fe s hs i = do-  r <- lift $ U.bytestring s hs i-  middleware fe (\_ _ respond -> respond (f r))+bytestringBody :: Monad m =>+                  FileExt+               -> LBS.ByteString+               -> FileExtListenerT Body m ()+bytestringBody fe i =+  tell' $ HM.singleton fe (bytestringOnlyBody i) -{-# INLINEABLE bytestringStatusWith #-}+{-# INLINEABLE bytestringBody #-}  --- * 'Network.Wai.Response' Only--bytestringOnly :: RequestHeaders -> B.ByteString -> Response-bytestringOnly = bytestringOnlyStatus status200--{-# INLINEABLE bytestringOnly #-}+-- * Data Only  -- | The exact same thing as @Network.Wai.responseLBS@.-bytestringOnlyStatus :: Status -> RequestHeaders -> B.ByteString -> Response-bytestringOnlyStatus = responseLBS+bytestringOnlyResponse :: LBS.ByteString -> Response+bytestringOnlyResponse = responseLBS status200 [] -{-# INLINEABLE bytestringOnlyStatus #-}+bytestringOnlyBody :: LBS.ByteString -> Body+bytestringOnlyBody = streamBuilder . BU.fromLazyByteString
src/Network/Wai/Middleware/ContentType/Cassius.hs view
@@ -1,70 +1,40 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Cassius where -import           Network.Wai.Middleware.ContentType.Types as FE-import           Network.Wai.Middleware.ContentType.Builder-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.Wai.Middleware.ContentType.Types as CT+import           Network.Wai.Middleware.ContentType.Text+import           Network.Wai                              (Response)+import           Network.Wai.HTTP2                        (Body)  import           Text.Cassius-import qualified Data.Text.Lazy.Encoding                 as LT-import           Control.Monad.IO.Class                  (MonadIO)+import qualified Data.Text.Lazy.Encoding                  as LT+import qualified Data.HashMap.Lazy                        as HM   -- * Lifted Combinators --- | Uses @cassius@ as the key in the map, and @"cassius/plain"@ as the content type.-cassius :: MonadIO m => Css -> FileExtListenerT (MiddlewareT m) m ()-cassius = cassiusStatusHeaders status200 [("Content-Type", "text/css")]--cassiusWith :: MonadIO m =>-               (Response -> Response) -> Css-            -> FileExtListenerT (MiddlewareT m) m ()-cassiusWith f = cassiusStatusHeadersWith f status200 [("Content-Type", "text/css")]--cassiusStatus :: MonadIO m =>-                 Status -> Css-              -> FileExtListenerT (MiddlewareT m) m ()-cassiusStatus s = cassiusStatusHeaders s [("Content-Type", "text/css")]--cassiusStatusWith :: MonadIO m =>-                     (Response -> Response) -> Status -> Css-                  -> FileExtListenerT (MiddlewareT m) m ()-cassiusStatusWith f s = cassiusStatusHeadersWith f s [("Content-Type", "text/css")]--cassiusHeaders :: MonadIO m =>-                  RequestHeaders -> Css-               -> FileExtListenerT (MiddlewareT m) m ()-cassiusHeaders = cassiusStatusHeaders status200+cassiusResponse :: Monad m =>+                   Css+                -> FileExtListenerT Response m ()+cassiusResponse i =+  tell' $ HM.singleton CT.Css (cassiusOnlyResponse i) -cassiusHeadersWith :: MonadIO m =>-                      (Response -> Response) -> RequestHeaders -> Css-                   -> FileExtListenerT (MiddlewareT m) m ()-cassiusHeadersWith f = cassiusStatusHeadersWith f status200+{-# INLINEABLE cassiusResponse #-} -cassiusStatusHeaders :: MonadIO m =>-                        Status -> RequestHeaders -> Css-                     -> FileExtListenerT (MiddlewareT m) m ()-cassiusStatusHeaders = cassiusStatusHeadersWith id+cassiusBody :: Monad m =>+               Css+            -> FileExtListenerT Body m ()+cassiusBody i =+  tell' $ HM.singleton CT.Css (cassiusOnlyBody i) -cassiusStatusHeadersWith :: MonadIO m =>-                            (Response -> Response) -> Status -> RequestHeaders -> Css-                         -> FileExtListenerT (MiddlewareT m) m ()-cassiusStatusHeadersWith f s hs =-  builderStatusWith f Css s hs . LT.encodeUtf8Builder . renderCss+{-# INLINEABLE cassiusBody #-}  --- * 'Network.Wai.Response' Only--cassiusOnly :: Css -> Response-cassiusOnly = cassiusOnlyStatusHeaders status200 [("Content-Type", "text/css")]--cassiusOnlyStatus :: Status -> Css -> Response-cassiusOnlyStatus s = cassiusOnlyStatusHeaders s [("Content-Type", "text/css")]+-- * Data Only -cassiusOnlyHeaders :: RequestHeaders -> Css -> Response-cassiusOnlyHeaders = cassiusOnlyStatusHeaders status200+cassiusOnlyResponse :: Css -> Response+cassiusOnlyResponse =+  textOnlyResponse . renderCss -cassiusOnlyStatusHeaders :: Status -> RequestHeaders -> Css -> Response-cassiusOnlyStatusHeaders s hs = builderOnlyStatus s hs . LT.encodeUtf8Builder . renderCss+cassiusOnlyBody :: Css -> Body+cassiusOnlyBody =+  textOnlyBody . renderCss
src/Network/Wai/Middleware/ContentType/Clay.hs view
@@ -1,97 +1,40 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Clay where -import           Network.Wai.Middleware.ContentType.Types-import           Network.Wai.Middleware.ContentType.Builder-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.Wai.Middleware.ContentType.Types as CT+import           Network.Wai.Middleware.ContentType.Text+import           Network.Wai                              (Response)+import           Network.Wai.HTTP2                        (Body)  import           Clay.Render import           Clay.Stylesheet-import qualified Data.Text.Lazy.Encoding                 as LT-import           Control.Monad.IO.Class                  (MonadIO)+import qualified Data.HashMap.Lazy                        as HM   -- * Lifted Combinators --- | Uses @Text@ as the key in the map, and @"text/css"@ as the content type.-clay :: MonadIO m =>-        Config -> [App] -> Css-     -> FileExtListenerT (MiddlewareT m) m ()-clay c as = clayStatusHeaders c as status200 [("Content-Type", "text/css")]--{-# INLINEABLE clay #-}--clayWith :: MonadIO m =>-            (Response -> Response) -> Config -> [App] -> Css-         -> FileExtListenerT (MiddlewareT m) m ()-clayWith f c as = clayStatusHeadersWith f c as status200 [("Content-Type", "text/css")]--{-# INLINEABLE clayWith #-}--clayStatus :: MonadIO m =>-              Config -> [App] -> Status -> Css-           -> FileExtListenerT (MiddlewareT m) m ()-clayStatus c as s = clayStatusHeaders c as s [("Content-Type", "text/css")]--{-# INLINEABLE clayStatus #-}--clayStatusWith :: MonadIO m =>-                  (Response -> Response) -> Config -> [App] -> Status -> Css-               -> FileExtListenerT (MiddlewareT m) m ()-clayStatusWith f c as s = clayStatusHeadersWith f c as s [("Content-Type", "text/css")]--{-# INLINEABLE clayStatusWith #-}--clayHeaders :: MonadIO m =>-               Config -> [App] -> RequestHeaders -> Css-            -> FileExtListenerT (MiddlewareT m) m ()-clayHeaders c as = clayStatusHeaders c as status200--{-# INLINEABLE clayHeaders #-}--clayHeadersWith :: MonadIO m =>-                   (Response -> Response) -> Config -> [App] -> RequestHeaders -> Css-                -> FileExtListenerT (MiddlewareT m) m ()-clayHeadersWith f c as = clayStatusHeadersWith f c as status200--{-# INLINEABLE clayHeadersWith #-}--clayStatusHeaders :: MonadIO m =>-                     Config -> [App] -> Status -> RequestHeaders -> Css-                  -> FileExtListenerT (MiddlewareT m) m ()-clayStatusHeaders = clayStatusHeadersWith id+clayResponse :: Monad m =>+                Config -> [App] -> Css+             -> FileExtListenerT Response m ()+clayResponse c as i =+  tell' $ HM.singleton CT.Css (clayOnlyResponse c as i) -{-# INLINEABLE clayStatusHeaders #-}+{-# INLINEABLE clayResponse #-} -clayStatusHeadersWith :: MonadIO m =>-                         (Response -> Response) -> Config -> [App] -> Status -> RequestHeaders -> Css-                      -> FileExtListenerT (MiddlewareT m) m ()-clayStatusHeadersWith f c as s hs =-  builderStatusWith f Css s hs . LT.encodeUtf8Builder . renderWith c as+clayBody :: Monad m =>+            Config -> [App] -> Css+         -> FileExtListenerT Body m ()+clayBody c as i =+  tell' $ HM.singleton CT.Css (clayOnlyBody c as i) -{-# INLINEABLE clayStatusHeadersWith #-}+{-# INLINEABLE clayBody #-}  --- * 'Network.Wai.Response' Only--clayOnly :: Config -> [App] -> Css -> Response-clayOnly c as = clayOnlyStatusHeaders c as status200 [("Content-Type", "text/css")]--{-# INLINEABLE clayOnly #-}--clayOnlyStatus :: Config -> [App] -> Status -> Css -> Response-clayOnlyStatus c as s = clayOnlyStatusHeaders c as s [("Content-Type", "text/css")]--{-# INLINEABLE clayOnlyStatus #-}--clayOnlyHeaders :: Config -> [App] -> RequestHeaders -> Css -> Response-clayOnlyHeaders c as = clayOnlyStatusHeaders c as status200--{-# INLINEABLE clayOnlyHeaders #-}+-- * Data Only -clayOnlyStatusHeaders :: Config -> [App] -> Status -> RequestHeaders -> Css -> Response-clayOnlyStatusHeaders c as s hs = builderOnlyStatus s hs . LT.encodeUtf8Builder . renderWith c as+clayOnlyResponse :: Config -> [App] -> Css -> Response+clayOnlyResponse c as =+  textOnlyResponse . renderWith c as -{-# INLINEABLE clayOnlyStatusHeaders #-}+clayOnlyBody :: Config -> [App] -> Css -> Body+clayOnlyBody c as =+  textOnlyBody . renderWith c as
src/Network/Wai/Middleware/ContentType/Json.hs view
@@ -1,148 +1,45 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Json where  import           Network.Wai.Middleware.ContentType.Types import           Network.Wai.Middleware.ContentType.ByteString-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.Wai                             (Response)+import           Network.Wai.HTTP2                       (Body)  import qualified Data.Aeson                              as A-import           Control.Monad.IO.Class                  (MonadIO)    -- * Lifted Combinators --- | Uses @Json@ as the key in the map, and @"application/json"@ as the content type.-json :: ( A.ToJSON j-        , MonadIO m-        ) => j -> FileExtListenerT (MiddlewareT m) m ()-json = jsonStatusHeaders status200 [("Content-Type", "application/json")]--{-# INLINEABLE json #-}--jsonWith :: ( A.ToJSON j-            , MonadIO m-            ) => (Response -> Response) -> j -> FileExtListenerT (MiddlewareT m) m ()-jsonWith f = jsonStatusHeadersWith f status200 [("Content-Type", "application/json")]--{-# INLINEABLE jsonWith #-}--jsonStatus :: ( A.ToJSON j-              , MonadIO m-              ) => Status -> j -> FileExtListenerT (MiddlewareT m) m ()-jsonStatus s = jsonStatusHeaders s [("Content-Type", "application/json")]--{-# INLINEABLE jsonStatus #-}--jsonStatusWith :: ( A.ToJSON j-                  , MonadIO m-                  ) => (Response -> Response) -> Status -> j-                    -> FileExtListenerT (MiddlewareT m) m ()-jsonStatusWith f s = jsonStatusHeadersWith f s [("Content-Type", "application/json")]--{-# INLINEABLE jsonStatusWith #-}---- | Uses @Json@ as the key in the map, and @"application/javascript"@ as the content type.-jsonp :: ( A.ToJSON j-         , MonadIO m-         ) => j -> FileExtListenerT (MiddlewareT m) m ()-jsonp = jsonStatusHeaders status200 [("Content-Type", "application/javascript")]--{-# INLINEABLE jsonp #-}--jsonpWith :: ( A.ToJSON j-             , MonadIO m-             ) => (Response -> Response) -> j -> FileExtListenerT (MiddlewareT m) m ()-jsonpWith f = jsonStatusHeadersWith f status200 [("Content-Type", "application/javascript")]--{-# INLINEABLE jsonpWith #-}--jsonpStatus :: ( A.ToJSON j-               , MonadIO m-               ) => Status -> j -> FileExtListenerT (MiddlewareT m) m ()-jsonpStatus s = jsonStatusHeaders s [("Content-Type", "application/javascript")]--{-# INLINEABLE jsonpStatus #-}--jsonpStatusWith :: ( A.ToJSON j-                   , MonadIO m-                   ) => (Response -> Response) -> Status -> j-                     -> FileExtListenerT (MiddlewareT m) m ()-jsonpStatusWith f s = jsonStatusHeadersWith f s [("Content-Type", "application/javascript")]--{-# INLINEABLE jsonpStatusWith #-}--jsonHeaders :: ( A.ToJSON j-               , MonadIO m-               ) => RequestHeaders -> j-                 -> FileExtListenerT (MiddlewareT m) m ()-jsonHeaders = jsonStatusHeaders status200--{-# INLINEABLE jsonHeaders #-}--jsonHeadersWith :: ( A.ToJSON j-                   , MonadIO m-                   ) => (Response -> Response) -> RequestHeaders -> j-                     -> FileExtListenerT (MiddlewareT m) m ()-jsonHeadersWith f = jsonStatusHeadersWith f status200--{-# INLINEABLE jsonHeadersWith #-}--jsonStatusHeaders :: ( A.ToJSON j-                     , MonadIO m-                     ) => Status -> RequestHeaders -> j-                       -> FileExtListenerT (MiddlewareT m) m ()-jsonStatusHeaders = jsonStatusHeadersWith id+jsonResponse :: ( A.ToJSON j+                , Monad m+                ) => j+                  -> FileExtListenerT Response m ()+jsonResponse =+  bytestringResponse Json . A.encode -{-# INLINEABLE jsonStatusHeaders #-}+{-# INLINEABLE jsonResponse #-} -jsonStatusHeadersWith :: ( A.ToJSON j-                         , MonadIO m-                         ) => (Response -> Response) -> Status -> RequestHeaders -> j-                           -> FileExtListenerT (MiddlewareT m) m ()-jsonStatusHeadersWith f s hs =-  bytestringStatusWith f Json s hs . A.encode+jsonBody :: ( A.ToJSON j+            , Monad m+            ) => j+              -> FileExtListenerT Body m ()+jsonBody =+  bytestringBody Json . A.encode -{-# INLINEABLE jsonStatusHeadersWith #-}+{-# INLINEABLE jsonBody #-}  --- * 'Network.Wai.Response' Only--jsonOnly :: A.ToJSON j =>-            j -> Response-jsonOnly = jsonOnlyStatusHeaders status200 [("Content-Type", "application/json")]--{-# INLINEABLE jsonOnly #-}--jsonOnlyStatus :: A.ToJSON j =>-            Status -> j -> Response-jsonOnlyStatus s = jsonOnlyStatusHeaders s [("Content-Type", "application/json")]--{-# INLINEABLE jsonOnlyStatus #-}--jsonpOnly :: A.ToJSON j =>-            j -> Response-jsonpOnly = jsonOnlyStatusHeaders status200 [("Content-Type", "application/javascript")]--{-# INLINEABLE jsonpOnly #-}--jsonpOnlyStatus :: A.ToJSON j =>-            Status -> j -> Response-jsonpOnlyStatus s = jsonOnlyStatusHeaders s [("Content-Type", "application/javascript")]--{-# INLINEABLE jsonpOnlyStatus #-}+-- * Data Only -jsonOnlyHeaders :: A.ToJSON j =>-            RequestHeaders -> j -> Response-jsonOnlyHeaders = jsonOnlyStatusHeaders status200+jsonOnlyResponse :: A.ToJSON j => j -> Response+jsonOnlyResponse =+  bytestringOnlyResponse . A.encode -{-# INLINEABLE jsonOnlyHeaders #-}+{-# INLINEABLE jsonOnlyResponse #-} -jsonOnlyStatusHeaders :: A.ToJSON j =>-            Status -> RequestHeaders -> j -> Response-jsonOnlyStatusHeaders s hs =-  bytestringOnlyStatus s hs . A.encode+jsonOnlyBody :: A.ToJSON j => j -> Body+jsonOnlyBody =+  bytestringOnlyBody . A.encode -{-# INLINEABLE jsonOnlyStatusHeaders #-}+{-# INLINEABLE jsonOnlyBody #-}
src/Network/Wai/Middleware/ContentType/Julius.hs view
@@ -1,72 +1,39 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Julius where -import           Network.Wai.Middleware.ContentType.Types-import qualified Network.Wai.Middleware.ContentType.Types as CT-import           Network.Wai.Middleware.ContentType.Builder-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.Wai.Middleware.ContentType.Types as CT+import           Network.Wai.Middleware.ContentType.Text+import           Network.Wai                              (Response)+import           Network.Wai.HTTP2                        (Body)  import           Text.Julius-import qualified Data.Text.Lazy.Encoding                 as LT-import           Control.Monad.IO.Class                  (MonadIO)+import qualified Data.HashMap.Lazy                        as HM   -- * Lifted Combinators --- | Uses @julius@ as the key in the map, and @"application/javascript"@ as the content type.-julius :: MonadIO m =>-          Javascript -> FileExtListenerT (MiddlewareT m) m ()-julius = juliusStatusHeaders status200 [("Content-Type", "application/javascript")]--juliusWith :: MonadIO m =>-              (Response -> Response) -> Javascript-           -> FileExtListenerT (MiddlewareT m) m ()-juliusWith f = juliusStatusHeadersWith f status200 [("Content-Type", "application/javascript")]--juliusStatus :: MonadIO m =>-                Status -> Javascript-             -> FileExtListenerT (MiddlewareT m) m ()-juliusStatus s = juliusStatusHeaders s [("Content-Type", "application/javascript")]--juliusStatusWith :: MonadIO m =>-                    (Response -> Response) -> Status -> Javascript-                 -> FileExtListenerT (MiddlewareT m) m ()-juliusStatusWith f s = juliusStatusHeadersWith f s [("Content-Type", "application/javascript")]--juliusHeaders :: MonadIO m =>-                 RequestHeaders -> Javascript-              -> FileExtListenerT (MiddlewareT m) m ()-juliusHeaders = juliusStatusHeaders status200+juliusResponse :: Monad m =>+                  Javascript+               -> FileExtListenerT Response m ()+juliusResponse i =+  tell' $ HM.singleton CT.JavaScript (juliusOnlyResponse i) -juliusHeadersWith :: MonadIO m =>-                     (Response -> Response) -> RequestHeaders -> Javascript-                  -> FileExtListenerT (MiddlewareT m) m ()-juliusHeadersWith f = juliusStatusHeadersWith f status200+{-# INLINEABLE juliusResponse #-} -juliusStatusHeaders :: MonadIO m =>-                       Status -> RequestHeaders -> Javascript-                    -> FileExtListenerT (MiddlewareT m) m ()-juliusStatusHeaders = juliusStatusHeadersWith id+juliusBody :: Monad m =>+              Javascript+           -> FileExtListenerT Body m ()+juliusBody i =+  tell' $ HM.singleton CT.JavaScript (juliusOnlyBody i) -juliusStatusHeadersWith :: MonadIO m =>-                           (Response -> Response) -> Status -> RequestHeaders -> Javascript-                        -> FileExtListenerT (MiddlewareT m) m ()-juliusStatusHeadersWith f s hs =-  builderStatusWith f CT.JavaScript s hs . LT.encodeUtf8Builder . renderJavascript+{-# INLINEABLE juliusBody #-}  --- * 'Network.Wai.Response' Only--juliusOnly :: Javascript -> Response-juliusOnly = juliusOnlyStatusHeaders status200 [("Content-Type", "application/javascript")]--juliusOnlyStatus :: Status -> Javascript -> Response-juliusOnlyStatus s = juliusOnlyStatusHeaders s [("Content-Type", "application/javascript")]+-- * Data Only -juliusOnlyHeaders :: RequestHeaders -> Javascript -> Response-juliusOnlyHeaders = juliusOnlyStatusHeaders status200+juliusOnlyResponse :: Javascript -> Response+juliusOnlyResponse =+  textOnlyResponse . renderJavascript -juliusOnlyStatusHeaders :: Status -> RequestHeaders -> Javascript -> Response-juliusOnlyStatusHeaders s hs = builderOnlyStatus s hs . LT.encodeUtf8Builder . renderJavascript+juliusOnlyBody :: Javascript -> Body+juliusOnlyBody =+  textOnlyBody . renderJavascript
src/Network/Wai/Middleware/ContentType/Lucid.hs view
@@ -1,99 +1,47 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Lucid where  import           Network.Wai.Middleware.ContentType.Types-import           Network.Wai.Middleware.ContentType.Builder-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.HTTP.Types                      (status200)+import           Network.Wai                             (Response, responseBuilder)+import           Network.Wai.HTTP2                       (Body, streamBuilder)  import qualified Lucid.Base                              as L import           Control.Monad.Trans+import qualified Data.HashMap.Lazy                       as HM   -- * Lifted Combinators --- | Uses the @Html@ key in the map, and @"text/html"@ as the content type.-lucid :: MonadIO m => L.HtmlT m () -> FileExtListenerT (MiddlewareT m) m ()-lucid = lucidStatusHeaders status200 [("Content-Type", "text/html")]--{-# INLINEABLE lucid #-}--lucidWith :: MonadIO m =>-             (Response -> Response) -> L.HtmlT m ()-          -> FileExtListenerT (MiddlewareT m) m ()-lucidWith f = lucidStatusHeadersWith f status200 [("Content-Type", "text/html")]--{-# INLINEABLE lucidWith #-}--lucidStatus :: MonadIO m =>-               Status -> L.HtmlT m ()-            -> FileExtListenerT (MiddlewareT m) m ()-lucidStatus s = lucidStatusHeaders s [("Content-Type", "text/html")]--{-# INLINEABLE lucidStatus #-}--lucidStatusWith :: MonadIO m =>-                   (Response -> Response) -> Status -> L.HtmlT m ()-                -> FileExtListenerT (MiddlewareT m) m ()-lucidStatusWith f s = lucidStatusHeadersWith f s [("Content-Type", "text/html")]--{-# INLINEABLE lucidStatusWith #-}--lucidHeaders :: MonadIO m =>-                RequestHeaders -> L.HtmlT m ()-             -> FileExtListenerT (MiddlewareT m) m ()-lucidHeaders = lucidStatusHeaders status200--{-# INLINEABLE lucidHeaders #-}--lucidHeadersWith :: MonadIO m =>-                    (Response -> Response) -> RequestHeaders -> L.HtmlT m ()-                 -> FileExtListenerT (MiddlewareT m) m ()-lucidHeadersWith f = lucidStatusHeadersWith f status200--{-# INLINEABLE lucidHeadersWith #-}--lucidStatusHeaders :: MonadIO m =>-                      Status -> RequestHeaders -> L.HtmlT m ()-                   -> FileExtListenerT (MiddlewareT m) m ()-lucidStatusHeaders = lucidStatusHeadersWith id+lucidResponse :: Monad m =>+                 L.HtmlT m ()+              -> FileExtListenerT Response m ()+lucidResponse i = do+  i' <- lift $ lucidOnlyResponse i+  tell' $ HM.singleton Html i' -{-# INLINEABLE lucidStatusHeaders #-}+{-# INLINEABLE lucidResponse #-} -lucidStatusHeadersWith :: MonadIO m =>-                          (Response -> Response) -> Status -> RequestHeaders -> L.HtmlT m ()-                       -> FileExtListenerT (MiddlewareT m) m ()-lucidStatusHeadersWith f s hs i = do-  i' <- lift $ L.execHtmlT i-  builderStatusWith f Html s hs i'+lucidBody :: Monad m =>+             L.HtmlT m ()+          -> FileExtListenerT Body m ()+lucidBody i = do+  i' <- lift $ lucidOnlyBody i+  tell' $ HM.singleton Html i' -{-# INLINEABLE lucidStatusHeadersWith #-}+{-# INLINEABLE lucidBody #-}   --- * 'Network.Wai.Response' Only--lucidOnly :: Monad m =>-             L.HtmlT m () -> m Response-lucidOnly = lucidOnlyStatusHeaders status200 [("Content-Type", "text/html")]--{-# INLINEABLE lucidOnly #-}--lucidOnlyStatus :: Monad m =>-             Status -> L.HtmlT m () -> m Response-lucidOnlyStatus s = lucidOnlyStatusHeaders s [("Content-Type", "text/html")]--{-# INLINEABLE lucidOnlyStatus #-}+-- * Data Only -lucidOnlyHeaders :: Monad m =>-             RequestHeaders -> L.HtmlT m () -> m Response-lucidOnlyHeaders = lucidOnlyStatusHeaders status200+lucidOnlyResponse :: Monad m => L.HtmlT m () -> m Response+lucidOnlyResponse i =+  responseBuilder status200 [] <$> L.execHtmlT i -{-# INLINEABLE lucidOnlyHeaders #-}+{-# INLINEABLE lucidOnlyResponse #-} -lucidOnlyStatusHeaders :: Monad m =>-             Status -> RequestHeaders -> L.HtmlT m () -> m Response-lucidOnlyStatusHeaders s hs i = builderOnlyStatus s hs <$> L.execHtmlT i+lucidOnlyBody :: Monad m => L.HtmlT m () -> m Body+lucidOnlyBody i =+  streamBuilder <$> L.execHtmlT i -{-# INLINEABLE lucidOnlyStatusHeaders #-}+{-# INLINEABLE lucidOnlyBody #-}
src/Network/Wai/Middleware/ContentType/Lucius.hs view
@@ -1,70 +1,37 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Lucius where -import           Network.Wai.Middleware.ContentType.Types-import           Network.Wai.Middleware.ContentType.Builder-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.Wai.Middleware.ContentType.Types as CT+import           Network.Wai.Middleware.ContentType.Text+import           Network.Wai                              (Response)+import           Network.Wai.HTTP2                        (Body)  import           Text.Lucius-import qualified Data.Text.Lazy.Encoding                 as LT-import           Control.Monad.IO.Class                  (MonadIO)+import qualified Data.HashMap.Lazy                        as HM   -- * Lifted Combinators --- | Uses @lucius@ as the key in the map, and @"lucius/css"@ as the content type.-lucius :: MonadIO m => Css -> FileExtListenerT (MiddlewareT m) m ()-lucius = luciusStatusHeaders status200 [("Content-Type", "text/css")]+luciusResponse :: Monad m => Css -> FileExtListenerT Response m ()+luciusResponse i =+  tell' $ HM.singleton CT.Css (luciusOnlyResponse i) -luciusWith :: MonadIO m =>-              (Response -> Response) -> Css-           -> FileExtListenerT (MiddlewareT m) m ()-luciusWith f = luciusStatusHeadersWith f status200 [("Content-Type", "text/css")]+{-# INLINEABLE luciusResponse #-} -luciusStatus :: MonadIO m =>-                Status -> Css-             -> FileExtListenerT (MiddlewareT m) m ()-luciusStatus s = luciusStatusHeaders s [("Content-Type", "text/css")]+luciusBody :: Monad m => Css -> FileExtListenerT Body m ()+luciusBody i =+  tell' $ HM.singleton CT.Css (luciusOnlyBody i) -luciusStatusWith :: MonadIO m =>-                    (Response -> Response) -> Status -> Css-                 -> FileExtListenerT (MiddlewareT m) m ()-luciusStatusWith f s = luciusStatusHeadersWith f s [("Content-Type", "text/css")]+{-# INLINEABLE luciusBody #-} -luciusHeaders :: MonadIO m =>-                 RequestHeaders -> Css-              -> FileExtListenerT (MiddlewareT m) m ()-luciusHeaders = luciusStatusHeaders status200 -luciusHeadersWith :: MonadIO m =>-                     (Response -> Response) -> RequestHeaders -> Css-                  -> FileExtListenerT (MiddlewareT m) m ()-luciusHeadersWith f = luciusStatusHeadersWith f status200+-- * Data Only -luciusStatusHeaders :: MonadIO m =>-                       Status -> RequestHeaders -> Css-                    -> FileExtListenerT (MiddlewareT m) m ()-luciusStatusHeaders = luciusStatusHeadersWith id+luciusOnlyResponse :: Css -> Response+luciusOnlyResponse =+  textOnlyResponse . renderCss -luciusStatusHeadersWith :: MonadIO m =>-                           (Response -> Response) -> Status -> RequestHeaders -> Css-                        -> FileExtListenerT (MiddlewareT m) m ()-luciusStatusHeadersWith f s hs =-  builderStatusWith f Css s hs . LT.encodeUtf8Builder . renderCss+luciusOnlyBody :: Css -> Body+luciusOnlyBody =+  textOnlyBody . renderCss  --- * 'Network.Wai.Response' Only--luciusOnly :: Css -> Response-luciusOnly = luciusOnlyStatusHeaders status200 [("Content-Type", "text/css")]--luciusOnlyStatus :: Status -> Css -> Response-luciusOnlyStatus s = luciusOnlyStatusHeaders s [("Content-Type", "text/css")]--luciusOnlyHeaders :: RequestHeaders -> Css -> Response-luciusOnlyHeaders = luciusOnlyStatusHeaders status200--luciusOnlyStatusHeaders :: Status -> RequestHeaders -> Css -> Response-luciusOnlyStatusHeaders s hs = builderOnlyStatus s hs . LT.encodeUtf8Builder . renderCss
− src/Network/Wai/Middleware/ContentType/Middleware.hs
@@ -1,15 +0,0 @@-module Network.Wai.Middleware.ContentType.Middleware where--import Network.Wai.Middleware.ContentType.Types-import Network.Wai.Trans-import qualified Data.HashMap.Lazy as HM----- | Lifts a @MiddlewareT@ directly as a response to a file extension.-middleware :: Monad m =>-              FileExt-           -> MiddlewareT m-           -> FileExtListenerT (MiddlewareT m) m ()-middleware f m = tell' (HM.singleton f m)--{-# INLINEABLE middleware #-}
src/Network/Wai/Middleware/ContentType/Pandoc.hs view
@@ -1,71 +1,37 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Pandoc where  import           Network.Wai.Middleware.ContentType.Types-import           Network.Wai.Middleware.ContentType.Builder-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.Wai.Middleware.ContentType.Text+import           Network.Wai                              (Response)+import           Network.Wai.HTTP2                        (Body)  import qualified Data.Text.Lazy                           as LT-import qualified Data.Text.Lazy.Encoding                  as LT import qualified Text.Pandoc                              as P-import           Control.Monad.Trans+import qualified Data.HashMap.Lazy                        as HM   -- * Lifted Combinators --- | Uses the @Html@ key in the map, and @"text/html"@ as the content type.-markdown :: MonadIO m => P.Pandoc -> FileExtListenerT (MiddlewareT m) m ()-markdown = markdownStatusHeaders status200 [("Content-Type", "text/markdown")]--markdownWith :: MonadIO m =>-             (Response -> Response) -> P.Pandoc-          -> FileExtListenerT (MiddlewareT m) m ()-markdownWith f = markdownStatusHeadersWith f status200 [("Content-Type", "text/markdown")]--markdownStatus :: MonadIO m =>-               Status -> P.Pandoc-            -> FileExtListenerT (MiddlewareT m) m ()-markdownStatus s = markdownStatusHeaders s [("Content-Type", "text/markdown")]--markdownStatusWith :: MonadIO m =>-                   (Response -> Response) -> Status -> P.Pandoc-                -> FileExtListenerT (MiddlewareT m) m ()-markdownStatusWith f s = markdownStatusHeadersWith f s [("Content-Type", "text/markdown")]--markdownHeaders :: MonadIO m =>-                RequestHeaders -> P.Pandoc-             -> FileExtListenerT (MiddlewareT m) m ()-markdownHeaders = markdownStatusHeaders status200+markdownResponse :: Monad m => P.Pandoc -> FileExtListenerT Response m ()+markdownResponse i =+  tell' $ HM.singleton Markdown (markdownOnlyResponse i) -markdownHeadersWith :: MonadIO m =>-                    (Response -> Response) -> RequestHeaders -> P.Pandoc-                 -> FileExtListenerT (MiddlewareT m) m ()-markdownHeadersWith f = markdownStatusHeadersWith f status200+{-# INLINEABLE markdownResponse #-} -markdownStatusHeaders :: MonadIO m =>-                      Status -> RequestHeaders -> P.Pandoc-                   -> FileExtListenerT (MiddlewareT m) m ()-markdownStatusHeaders = markdownStatusHeadersWith id+markdownBody :: Monad m => P.Pandoc -> FileExtListenerT Body m ()+markdownBody i =+  tell' $ HM.singleton Markdown (markdownOnlyBody i) -markdownStatusHeadersWith :: MonadIO m =>-                          (Response -> Response) -> Status -> RequestHeaders -> P.Pandoc-                       -> FileExtListenerT (MiddlewareT m) m ()-markdownStatusHeadersWith f s hs =-  builderStatusWith f Markdown s hs . LT.encodeUtf8Builder . LT.pack . P.writeMarkdown P.def+{-# INLINEABLE markdownBody #-}  --- * 'Network.Wai.Response' Only--markdownOnly :: P.Pandoc -> Response-markdownOnly = markdownOnlyStatusHeaders status200 [("Content-Type", "text/markdown")]+-- * Data Only -markdownOnlyStatus :: Status -> P.Pandoc -> Response-markdownOnlyStatus s = markdownOnlyStatusHeaders s [("Content-Type", "text/markdown")]+markdownOnlyResponse :: P.Pandoc -> Response+markdownOnlyResponse =+  textOnlyResponse . LT.pack . P.writeMarkdown P.def -markdownOnlyHeaders :: RequestHeaders -> P.Pandoc -> Response-markdownOnlyHeaders = markdownOnlyStatusHeaders status200+markdownOnlyBody :: P.Pandoc -> Body+markdownOnlyBody =+  textOnlyBody . LT.pack . P.writeMarkdown P.def -markdownOnlyStatusHeaders :: Status -> RequestHeaders -> P.Pandoc -> Response-markdownOnlyStatusHeaders s hs = builderOnlyStatus s hs . LT.encodeUtf8Builder . LT.pack . P.writeMarkdown P.def
src/Network/Wai/Middleware/ContentType/Text.hs view
@@ -1,94 +1,37 @@-{-# LANGUAGE OverloadedStrings #-}- module Network.Wai.Middleware.ContentType.Text where  import           Network.Wai.Middleware.ContentType.Types-import           Network.Wai.Middleware.ContentType.Builder-import           Network.HTTP.Types                      (RequestHeaders, Status, status200)-import           Network.Wai.Trans+import           Network.HTTP.Types                       (status200)+import           Network.Wai                              (Response, responseBuilder)+import           Network.Wai.HTTP2                        (Body, streamBuilder) -import qualified Data.Text.Lazy                          as LT-import qualified Data.Text.Lazy.Encoding                 as LT-import           Control.Monad.IO.Class                  (MonadIO)+import qualified Data.Text.Lazy                           as LT+import qualified Data.Text.Lazy.Encoding                  as LT+import qualified Data.HashMap.Lazy                        as HM   -- * Lifted Combinators --- | Uses @Text@ as the key in the map, and @"text/plain"@ as the content type.-text :: MonadIO m => LT.Text -> FileExtListenerT (MiddlewareT m) m ()-text = textStatusHeaders status200 [("Content-Type", "text/plain")]--{-# INLINEABLE text #-}--textWith :: MonadIO m =>-            (Response -> Response) -> LT.Text-         -> FileExtListenerT (MiddlewareT m) m ()-textWith f = textStatusHeadersWith f status200 [("Content-Type", "text/plain")]--{-# INLINEABLE textWith #-}--textStatus :: MonadIO m =>-              Status -> LT.Text-           -> FileExtListenerT (MiddlewareT m) m ()-textStatus s = textStatusHeaders s [("Content-Type", "text/plain")]--{-# INLINEABLE textStatus #-}--textStatusWith :: MonadIO m =>-                  (Response -> Response) -> Status -> LT.Text-               -> FileExtListenerT (MiddlewareT m) m ()-textStatusWith f s = textStatusHeadersWith f s [("Content-Type", "text/plain")]--{-# INLINEABLE textStatusWith #-}--textHeaders :: MonadIO m =>-               RequestHeaders -> LT.Text-            -> FileExtListenerT (MiddlewareT m) m ()-textHeaders = textStatusHeaders status200--{-# INLINEABLE textHeaders #-}--textHeadersWith :: MonadIO m =>-                   (Response -> Response) -> RequestHeaders -> LT.Text-                -> FileExtListenerT (MiddlewareT m) m ()-textHeadersWith f = textStatusHeadersWith f status200--{-# INLINEABLE textHeadersWith #-}--textStatusHeaders :: MonadIO m =>-                     Status -> RequestHeaders -> LT.Text-                  -> FileExtListenerT (MiddlewareT m) m ()-textStatusHeaders = textStatusHeadersWith id+textResponse :: Monad m => LT.Text -> FileExtListenerT Response m ()+textResponse i =+  tell' $ HM.singleton Text (textOnlyResponse i) -{-# INLINEABLE textStatusHeaders #-}+{-# INLINEABLE textResponse #-} -textStatusHeadersWith :: MonadIO m =>-                         (Response -> Response) -> Status -> RequestHeaders -> LT.Text-                      -> FileExtListenerT (MiddlewareT m) m ()-textStatusHeadersWith f s hs =-  builderStatusWith f Text s hs . LT.encodeUtf8Builder+textBody :: Monad m => LT.Text -> FileExtListenerT Body m ()+textBody i =+  tell' $ HM.singleton Text (textOnlyBody i) -{-# INLINEABLE textStatusHeadersWith #-}+{-# INLINEABLE textBody #-}  --- * 'Network.Wai.Response' Only--textOnly :: LT.Text -> Response-textOnly = textOnlyStatusHeaders status200 [("Content-Type", "text/plain")]--{-# INLINEABLE textOnly #-}--textOnlyStatus :: Status -> LT.Text -> Response-textOnlyStatus s = textOnlyStatusHeaders s [("Content-Type", "text/plain")]--{-# INLINEABLE textOnlyStatus #-}--textOnlyHeaders :: RequestHeaders -> LT.Text -> Response-textOnlyHeaders = textOnlyStatusHeaders status200+-- * Data Only -{-# INLINEABLE textOnlyHeaders #-}+textOnlyResponse :: LT.Text -> Response+textOnlyResponse =+  responseBuilder status200 [] . LT.encodeUtf8Builder -textOnlyStatusHeaders :: Status -> RequestHeaders -> LT.Text -> Response-textOnlyStatusHeaders s hs = builderOnlyStatus s hs . LT.encodeUtf8Builder+textOnlyBody :: LT.Text -> Body+textOnlyBody =+  streamBuilder . LT.encodeUtf8Builder -{-# INLINEABLE textOnlyStatusHeaders #-}
src/Network/Wai/Middleware/ContentType/Types.hs view
@@ -32,14 +32,19 @@   , execFileExtListenerT   , -- * Utilities     tell'+  , AcceptHeader+  , possibleFileExts+  , invalidEncoding   ) where -import           Network.Wai.Trans import qualified Data.Text              as T-import           Data.HashMap.Lazy+import           Data.HashMap.Lazy hiding (null)+import qualified Data.HashMap.Lazy as HM import           Data.Monoid+import           Data.Maybe (fromMaybe, catMaybes) import           Data.Url import           Data.Hashable+import qualified Data.ByteString        as BS import           Control.Applicative import           Control.Monad.Base import           Control.Monad.Catch@@ -54,6 +59,7 @@ import           Control.Monad.Morph  import           GHC.Generics+import           Network.HTTP.Media (mapAccept)   -- | Version of 'Control.Monad.Writer.tell' for 'Control.Monad.State.StateT'@@ -142,4 +148,47 @@ execFileExtListenerT :: Monad m => FileExtListenerT r m a -> m (FileExtMap r) execFileExtListenerT xs = execStateT (runFileExtListenerT xs) mempty +++-- * Headers++type AcceptHeader = BS.ByteString++ {-# INLINEABLE execFileExtListenerT #-}++-- | Takes an @Accept@ header and returns the other+-- file types handleable, in order of prescedence.+possibleFileExts :: AcceptHeader -> [FileExt]+possibleFileExts accept = if not (null wildcard) then wildcard else computed+  where+    computed :: [FileExt]+    computed = concat $+      catMaybes [ mapAccept [ ("application/json"       :: BS.ByteString, [Json])+                            , ("application/javascript" :: BS.ByteString, [JavaScript,Json])+                            ] accept+                , mapAccept [ ("text/html" :: BS.ByteString, [Html])+                            ] accept+                , mapAccept [ ("text/plain" :: BS.ByteString, [Text, Markdown])+                            ] accept+                , mapAccept [ ("text/markdown" :: BS.ByteString, [Markdown])+                            ] accept+                , mapAccept [ ("text/css" :: BS.ByteString, [Css])+                            ] accept+                ]++    wildcard :: [FileExt]+    wildcard = fromMaybe [] $ mapAccept [ ("*/*" :: BS.ByteString, allFileExts)+                                        ] accept++{-# INLINEABLE possibleFileExts #-}++-- | Use this combinator as the last one, as a "catch-all":+--+--   > myApp = do+--   >   text "foo"+--   >   invalidEncoding myErrorHandler -- handles all except text/plain+invalidEncoding :: Monad m => r -> FileExtListenerT r m ()+invalidEncoding r = mapM_ (\t -> tell' $ HM.singleton t r) allFileExts++{-# INLINEABLE invalidEncoding #-}
test/Network/Wai/Middleware/ContentTypeSpec.hs view
@@ -7,6 +7,7 @@  import Network.Wai.Middleware.ContentType import Network.Wai.Trans+import Network.Wai.Internal import Network.HTTP.Types import qualified Data.Text      as T import qualified Data.Text.Lazy as LT@@ -157,16 +158,24 @@         406  app :: Application-app = fileExtsToMiddleware allExamples $ \_ resp ->-  resp $ textOnlyStatus status406 "Something went wrong"+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) = textOnlyResponse "Something went wrong"+                 in (ResponseBuilder status406 [] r)+      Just r  -> r -allExamples :: FileExtListenerT Middleware IO ()+allExamples :: FileExtListenerT Response IO () allExamples = do-  text "Text!"-  json ("Json!" :: T.Text)-  lucid (L.toHtmlRaw ("Html!" :: T.Text))-  cassius ([SL.lucius|body {background: #fff;}|] undefined)-  julius  ([SJ.julius|function foo () {return;}|] undefined)-  markdown $ case P.readMarkdown P.def "*Pandoc*!" of-               Left e -> error $ show e-               Right p -> p+  textResponse "Text!"+  jsonResponse ("Json!" :: T.Text)+  lucidResponse (L.toHtmlRaw ("Html!" :: T.Text))+  cassiusResponse ([SL.lucius|body {background: #fff;}|] undefined)+  juliusResponse  ([SJ.julius|function foo () {return;}|] undefined)+  markdownResponse $+    case P.readMarkdown P.def "*Pandoc*!" of+      Left e -> error $ show e+      Right p -> p
wai-middleware-content-type.cabal view
@@ -1,5 +1,5 @@ Name:                   wai-middleware-content-type-Version:                0.1.1.1+Version:                0.2.0 Author:                 Athan Clark <athan.clark@gmail.com> Maintainer:             Athan Clark <athan.clark@gmail.com> License:                BSD3@@ -23,7 +23,6 @@   Exposed-Modules:      Network.Wai.Middleware.ContentType                         Network.Wai.Middleware.ContentType.Types                         Network.Wai.Middleware.ContentType.Blaze-                        Network.Wai.Middleware.ContentType.Builder                         Network.Wai.Middleware.ContentType.ByteString                         Network.Wai.Middleware.ContentType.Cassius                         Network.Wai.Middleware.ContentType.Clay@@ -33,7 +32,6 @@                         Network.Wai.Middleware.ContentType.Lucius                         Network.Wai.Middleware.ContentType.Pandoc                         Network.Wai.Middleware.ContentType.Text-                        Network.Wai.Middleware.ContentType.Middleware   Build-Depends:        base >= 4.8 && < 5                       , aeson                       , blaze-builder@@ -58,8 +56,6 @@                       , unordered-containers                       , urlpath >= 5.0.0.1                       , wai-                      , wai-transformers >= 0.0.4-                      , wai-util  Test-Suite test   Type:                 exitcode-stdio-1.0@@ -71,7 +67,6 @@   Other-Modules:        Network.Wai.Middleware.ContentType                         Network.Wai.Middleware.ContentType.Types                         Network.Wai.Middleware.ContentType.Blaze-                        Network.Wai.Middleware.ContentType.Builder                         Network.Wai.Middleware.ContentType.ByteString                         Network.Wai.Middleware.ContentType.Cassius                         Network.Wai.Middleware.ContentType.Clay@@ -81,7 +76,6 @@                         Network.Wai.Middleware.ContentType.Lucius                         Network.Wai.Middleware.ContentType.Pandoc                         Network.Wai.Middleware.ContentType.Text-                        Network.Wai.Middleware.ContentType.Middleware                         Network.Wai.Middleware.ContentTypeSpec   Build-Depends:        base >= 4.8 && < 5                       , aeson@@ -113,61 +107,7 @@                       , unordered-containers                       , wai                       , wai-transformers-                      , wai-util                       , warp--Executable example-  if flag(Example)-    Buildable: True-  else-    Buildable: False-  Default-Language:     Haskell2010-  HS-Source-Dirs:       src-                      , examples-  GHC-Options:          -Wall -threaded-  Main-Is:              Example.hs-  Other-Modules:        Network.Wai.Middleware.ContentType-                        Network.Wai.Middleware.ContentType.Types-                        Network.Wai.Middleware.ContentType.Blaze-                        Network.Wai.Middleware.ContentType.Builder-                        Network.Wai.Middleware.ContentType.ByteString-                        Network.Wai.Middleware.ContentType.Cassius-                        Network.Wai.Middleware.ContentType.Clay-                        Network.Wai.Middleware.ContentType.Json-                        Network.Wai.Middleware.ContentType.Julius-                        Network.Wai.Middleware.ContentType.Lucid-                        Network.Wai.Middleware.ContentType.Lucius-                        Network.Wai.Middleware.ContentType.Pandoc-                        Network.Wai.Middleware.ContentType.Text-                        Network.Wai.Middleware.ContentType.Middleware-  Build-Depends:        base >= 4.8 && < 5-                      , aeson-                      , blaze-builder-                      , blaze-html-                      , bytestring-                      , clay-                      , exceptions-                      , hashable-                      , http-media-                      , http-types-                      , lucid-                      , mmorph-                      , monad-control-                      , monad-logger-                      , mtl-                      , pandoc-                      , resourcet-                      , shakespeare-                      , text-                      , transformers-                      , transformers-base-                      , urlpath-                      , unordered-containers-                      , wai-                      , wai-transformers-                      , wai-util-                      , warp-   Source-Repository head