Move session header logic to yarToResponse

This commit is contained in:
Michael Snoyman 2013-03-12 10:41:17 +02:00
parent 77f41a18dd
commit a2d26e096d
2 changed files with 29 additions and 27 deletions

View File

@ -22,23 +22,34 @@ import Control.Exception (SomeException, handle)
import Blaze.ByteString.Builder (fromLazyByteString, import Blaze.ByteString.Builder (fromLazyByteString,
toLazyByteString) toLazyByteString)
import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy as L
import qualified Data.Map as Map
import Yesod.Core.Internal.Request (tokenKey)
import Data.Text.Encoding (encodeUtf8)
yarToResponse :: YesodResponse -> [(CI ByteString, ByteString)] -> Response yarToResponse :: Monad m
yarToResponse (YRWai a) _ = a => YesodResponse
yarToResponse (YRPlain s hs _ c _) extraHeaders = -> (SessionMap -> m [Header]) -- ^ save session
go c -> YesodRequest
where -> m Response
finalHeaders = extraHeaders ++ map headerToPair hs yarToResponse (YRWai a) _ _ = return a
yarToResponse (YRPlain s hs ct c newSess) saveSession yreq = do
extraHeaders <- do
let nsToken = maybe
newSess
(\n -> Map.insert tokenKey (encodeUtf8 n) newSess)
(reqToken yreq)
sessionHeaders <- saveSession nsToken
return $ ("Content-Type", ct) : map headerToPair sessionHeaders
let finalHeaders = extraHeaders ++ map headerToPair hs
finalHeaders' len = ("Content-Length", S8.pack $ show len) finalHeaders' len = ("Content-Length", S8.pack $ show len)
: finalHeaders : finalHeaders
let go (ContentBuilder b mlen) =
go (ContentBuilder b mlen) = let hs' = maybe finalHeaders finalHeaders' mlen
ResponseBuilder s hs' b in ResponseBuilder s hs' b
where
hs' = maybe finalHeaders finalHeaders' mlen
go (ContentFile fp p) = ResponseFile s finalHeaders fp p go (ContentFile fp p) = ResponseFile s finalHeaders fp p
go (ContentSource body) = ResponseSource s finalHeaders body go (ContentSource body) = ResponseSource s finalHeaders body
go (ContentDontEvaluate c') = go c' go (ContentDontEvaluate c') = go c'
return $ go c
-- | Convert Header to a key/value pair. -- | Convert Header to a key/value pair.
headerToPair :: Header headerToPair :: Header

View File

@ -37,7 +37,7 @@ import System.Random (newStdGen)
import Yesod.Core.Content import Yesod.Core.Content
import Yesod.Core.Class.Yesod import Yesod.Core.Class.Yesod
import Yesod.Core.Types import Yesod.Core.Types
import Yesod.Core.Internal.Request (parseWaiRequest, tokenKey, import Yesod.Core.Internal.Request (parseWaiRequest,
tooLargeResponse) tooLargeResponse)
import Yesod.Routes.Class (Route, renderRoute) import Yesod.Routes.Class (Route, renderRoute)
@ -241,16 +241,7 @@ yesodRunner handler' YesodRunnerEnv {..} req
{ rheOnError = runHandler rheSafe . errorHandler { rheOnError = runHandler rheSafe . errorHandler
} }
yar <- runHandler rhe handler yreq yar <- runHandler rhe handler yreq
extraHeaders <- case yar of liftIO $ yarToResponse yar saveSession yreq
(YRPlain _ _ ct _ newSess) -> do
let nsToken = maybe
newSess
(\n -> Map.insert tokenKey (encodeUtf8 n) newSess)
(reqToken yreq)
sessionHeaders <- liftIO (saveSession nsToken)
return $ ("Content-Type", ct) : map headerToPair sessionHeaders
_ -> return []
return $ yarToResponse yar extraHeaders
where where
maxLen = maximumContentLength yreMaster $ fmap yreToMaster yreRoute maxLen = maximumContentLength yreMaster $ fmap yreToMaster yreRoute
handler = yesodMiddleware handler' handler = yesodMiddleware handler'