Move session header logic to yarToResponse
This commit is contained in:
parent
77f41a18dd
commit
a2d26e096d
@ -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
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user