mirror of
https://github.com/commercialhaskell/stackage-server.git
synced 2026-01-26 10:51:56 +01:00
Cache-friendly headers #29
This commit is contained in:
parent
6618b8b4e3
commit
8649e9d97b
@ -2,6 +2,7 @@ module Handler.StackageIndex where
|
|||||||
|
|
||||||
import Import
|
import Import
|
||||||
import Data.BlobStore
|
import Data.BlobStore
|
||||||
|
import Network.Wai (responseBuilder)
|
||||||
|
|
||||||
getStackageIndexR :: PackageSetIdent -> Handler TypedContent
|
getStackageIndexR :: PackageSetIdent -> Handler TypedContent
|
||||||
getStackageIndexR ident = do
|
getStackageIndexR ident = do
|
||||||
@ -9,9 +10,31 @@ getStackageIndexR ident = do
|
|||||||
case msrc of
|
case msrc of
|
||||||
Nothing -> notFound
|
Nothing -> notFound
|
||||||
Just src -> do
|
Just src -> do
|
||||||
|
setEtag $ toPathPiece ident
|
||||||
addHeader "content-disposition" "attachment; filename=\"00-index.tar.gz\""
|
addHeader "content-disposition" "attachment; filename=\"00-index.tar.gz\""
|
||||||
|
neverExpires
|
||||||
|
cacheSeconds 31536000
|
||||||
respondSource "application/x-gzip" $ mapOutput (Chunk . toBuilder) src
|
respondSource "application/x-gzip" $ mapOutput (Chunk . toBuilder) src
|
||||||
|
|
||||||
|
-- FIXME BEGIN: move into yesod-core
|
||||||
|
|
||||||
|
-- | Send a 304 not modified response immediately. This is a short-circuiting
|
||||||
|
-- action.
|
||||||
|
notModified :: MonadHandler m => m a
|
||||||
|
notModified = sendWaiResponse $ responseBuilder status304 [] mempty
|
||||||
|
|
||||||
|
-- | 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.
|
||||||
|
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
|
||||||
|
|
||||||
|
-- FIXME END: move into yesod-core
|
||||||
|
|
||||||
getStackageBundleR :: PackageSetIdent -> Handler TypedContent
|
getStackageBundleR :: PackageSetIdent -> Handler TypedContent
|
||||||
getStackageBundleR ident = do
|
getStackageBundleR ident = do
|
||||||
msrc <- storeRead $ SnapshotBundle ident
|
msrc <- storeRead $ SnapshotBundle ident
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user