From b38abdba0fc706bc19800a8fdd3c02de1df72d26 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sat, 15 Nov 2014 20:31:27 +0200 Subject: [PATCH] notModified and setEtag --- yesod-core/Yesod/Core/Handler.hs | 21 +++++++++++++++++++++ yesod-core/changelog.md | 2 ++ yesod-core/yesod-core.cabal | 2 +- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/yesod-core/Yesod/Core/Handler.hs b/yesod-core/Yesod/Core/Handler.hs index 36f8f5c4..30d6e088 100644 --- a/yesod-core/Yesod/Core/Handler.hs +++ b/yesod-core/Yesod/Core/Handler.hs @@ -94,6 +94,7 @@ module Yesod.Core.Handler , sendWaiApplication , sendRawResponse , sendRawResponseNoConduit + , notModified -- * Different representations -- $representations , selectRep @@ -112,6 +113,7 @@ module Yesod.Core.Handler , neverExpires , alreadyExpired , expiresAt + , setEtag -- * Session , SessionMap , lookupSession @@ -590,6 +592,13 @@ sendRawResponse raw = control $ \runInIO -> yield bs src' src +-- | Send a 304 not modified response immediately. This is a short-circuiting +-- action. +-- +-- Since 1.4.4 +notModified :: MonadHandler m => m a +notModified = sendWaiResponse $ W.responseBuilder H.status304 [] mempty + -- | Return a 404 not found page. Also denotes no handler available. notFound :: MonadHandler m => m a notFound = hcError NotFound @@ -699,6 +708,18 @@ alreadyExpired = setHeader "Expires" "Thu, 01 Jan 1970 05:05:05 GMT" expiresAt :: MonadHandler m => UTCTime -> m () expiresAt = setHeader "Expires" . formatRFC1123 +-- | Check the if-none-match header and, if it matches the given value, return +-- a 304 not modified response. Otherwise, set the etag header to the given +-- value. +-- +-- Since 1.4.4 +setEtag :: MonadHandler m => Text -> m () +setEtag etag = do + mmatch <- lookupHeader "if-none-match" + case mmatch of + Just x | encodeUtf8 etag == x -> notModified + _ -> addHeader "etag" etag + -- | Set a variable in the user's session. -- -- The session is handled by the clientsession package: it sets an encrypted diff --git a/yesod-core/changelog.md b/yesod-core/changelog.md index 6f008528..3f8c8c1e 100644 --- a/yesod-core/changelog.md +++ b/yesod-core/changelog.md @@ -1 +1,3 @@ +__1.4.4__ Add the `notModified` and `setEtag` functions. + __1.4.3__ Switch to mwc-random for token generation. diff --git a/yesod-core/yesod-core.cabal b/yesod-core/yesod-core.cabal index c6ca65a1..f84791dd 100644 --- a/yesod-core/yesod-core.cabal +++ b/yesod-core/yesod-core.cabal @@ -1,5 +1,5 @@ name: yesod-core -version: 1.4.3.1 +version: 1.4.4 license: MIT license-file: LICENSE author: Michael Snoyman