on master help sign in
Allow people to manage session state between calls to runSession. (#629)
4b09d13fisx
wai-extra/ChangeLog.md+4
@@ -1,3 +1,7 @@
1+## 3.0.20.0
2+
3+* runSessionWith (runSession variant that gives access to ClientState) [#629](https://github.com/yesodweb/wai/pull/629)
4+
1## 3.0.19.1
5## 3.0.19.1
2
6
3* All loggers follow the autoFlush setting [#604](https://github.com/yesodweb/wai/pull/604)
7* All loggers follow the autoFlush setting [#604](https://github.com/yesodweb/wai/pull/604)
wai-extra/Network/Wai/Test.hs+3−17
@@ -39,15 +39,15 @@ import Data.Monoid (mempty, mappend)
39
39
40import Network.Wai
40import Network.Wai
41import Network.Wai.Internal (ResponseReceived (ResponseReceived))
41import Network.Wai.Internal (ResponseReceived (ResponseReceived))
42+import Network.Wai.Test.Internal
42import Control.Monad.IO.Class (liftIO)
43import Control.Monad.IO.Class (liftIO)
43import Control.Monad.Trans.Class (lift)
44import Control.Monad.Trans.Class (lift)
44import qualified Control.Monad.Trans.State as ST
45import qualified Control.Monad.Trans.State as ST
45−import Control.Monad.Trans.Reader (ReaderT, runReaderT, ask)
46+import Control.Monad.Trans.Reader (runReaderT, ask)
46import Control.Monad (unless)
47import Control.Monad (unless)
47import Control.DeepSeq (deepseq)
48import Control.DeepSeq (deepseq)
48import Control.Exception (throwIO, Exception)
49import Control.Exception (throwIO, Exception)
49import Data.Typeable (Typeable)
50import Data.Typeable (Typeable)
50−import Data.Map (Map)
51import qualified Data.Map as Map
51import qualified Data.Map as Map
52import qualified Web.Cookie as Cookie
52import qualified Web.Cookie as Cookie
53import Data.ByteString (ByteString)
53import Data.ByteString (ByteString)
@@ -64,17 +64,6 @@ import qualified Data.Text.Encoding as TE
64import Data.IORef
64import Data.IORef
65import Data.Time.Clock (getCurrentTime)
65import Data.Time.Clock (getCurrentTime)
66
66
67−type Session = ReaderT Application (ST.StateT ClientState IO)
68−
69−-- |
70−--
71−-- Since 3.0.6
72−type ClientCookies = Map ByteString Cookie.SetCookie
73−
74−data ClientState = ClientState
75− { clientCookies :: ClientCookies
76− }
77−
78-- |
67-- |
79--
68--
80-- Since 3.0.6
69-- Since 3.0.6
@@ -104,9 +93,7 @@ deleteClientCookie cookieName =
104 modifyClientCookies
93 modifyClientCookies
105 (Map.delete cookieName)
94 (Map.delete cookieName)
106
95
107−initState :: ClientState
96+-- | See also: 'runSessionWith'.
108−initState = ClientState Map.empty
109−
110runSession :: Session a -> Application -> IO a
97runSession :: Session a -> Application -> IO a
111runSession session app = ST.evalStateT (runReaderT session app) initState
98runSession session app = ST.evalStateT (runReaderT session app) initState
112
99
@@ -337,4 +324,3 @@ assertClientCookieValue s cookieName cookieValue = do
337 ]
324 ]
338 )
325 )
339 (Cookie.setCookieValue c == cookieValue)
326 (Cookie.setCookieValue c == cookieValue)
340−
wai-extra/Network/Wai/Test/Internal.hsnew file+35
@@ -0,0 +1,35 @@
1+module Network.Wai.Test.Internal where
2+
3+import Network.Wai
4+import qualified Control.Monad.Trans.State as ST
5+import Control.Monad.Trans.Reader (ReaderT, runReaderT)
6+import Data.Map (Map)
7+import qualified Data.Map as Map
8+import qualified Web.Cookie as Cookie
9+import Data.ByteString (ByteString)
10+
11+type Session = ReaderT Application (ST.StateT ClientState IO)
12+
13+-- |
14+--
15+-- Since 3.0.6
16+type ClientCookies = Map ByteString Cookie.SetCookie
17+
18+data ClientState = ClientState
19+ { clientCookies :: ClientCookies
20+ }
21+
22+-- |
23+--
24+-- Since 3.0.20.0
25+initState :: ClientState
26+initState = ClientState Map.empty
27+
28+-- | Like 'runSession', but if allows you to hand in cookies and get
29+-- the updated cookies back. One use case for this is writing tests
30+-- that address the application under test alternatingly through rest
31+-- api and through db handle.
32+--
33+-- Since 3.0.20.0
34+runSessionWith :: ClientState -> Session a -> Application -> IO (a, ClientState)
35+runSessionWith st session app = ST.runStateT (runReaderT session app) st
wai-extra/wai-extra.cabal+2−1
@@ -1,5 +1,5 @@
1Name: wai-extra
1Name: wai-extra
2−Version: 3.0.19.1
2+Version: 3.0.20.0
3Synopsis: Provides some basic WAI handlers and middleware.
3Synopsis: Provides some basic WAI handlers and middleware.
4description:
4description:
5 Provides basic WAI handler and middleware functionality:
5 Provides basic WAI handler and middleware functionality:
@@ -148,6 +148,7 @@ Library
148 Network.Wai.Request
148 Network.Wai.Request
149 Network.Wai.UrlMap
149 Network.Wai.UrlMap
150 Network.Wai.Test
150 Network.Wai.Test
151+ Network.Wai.Test.Internal
151 Network.Wai.EventSource
152 Network.Wai.EventSource
152 Network.Wai.EventSource.EventStream
153 Network.Wai.EventSource.EventStream
153 other-modules: Network.Wai.Middleware.RequestLogger.Internal
154 other-modules: Network.Wai.Middleware.RequestLogger.Internal