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
finalHeaders' len = ("Content-Length", S8.pack $ show len) yarToResponse (YRPlain s hs ct c newSess) saveSession yreq = do
: finalHeaders extraHeaders <- do
let nsToken = maybe
go (ContentBuilder b mlen) = newSess
ResponseBuilder s hs' b (\n -> Map.insert tokenKey (encodeUtf8 n) newSess)
where (reqToken yreq)
hs' = maybe finalHeaders finalHeaders' mlen sessionHeaders <- saveSession nsToken
go (ContentFile fp p) = ResponseFile s finalHeaders fp p return $ ("Content-Type", ct) : map headerToPair sessionHeaders
go (ContentSource body) = ResponseSource s finalHeaders body let finalHeaders = extraHeaders ++ map headerToPair hs
go (ContentDontEvaluate c') = go c' finalHeaders' len = ("Content-Length", S8.pack $ show len)
: finalHeaders
let go (ContentBuilder b mlen) =
let hs' = maybe finalHeaders finalHeaders' mlen
in ResponseBuilder s hs' b
go (ContentFile fp p) = ResponseFile s finalHeaders fp p
go (ContentSource body) = ResponseSource s finalHeaders body
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'