on fa92d08 help sign in
wai-extra/ChangeLog.md−4
since splitsnapshots
unifiedsplit
@@ -1,9 +1,5 @@
1# Changelog for wai-extra
1# Changelog for wai-extra
2
2
3−## 3.0.29.1
4−
5−* Fix `Network.Wai.Test.request` always sending an empty request body [#794](https://github.com/yesodweb/wai/pull/794)
6−
7## 3.0.29
3## 3.0.29
8
4
9* Export `Network.Wai.EventSource.eventStreamAppRaw` [#786](https://github.com/yesodweb/wai/pull/786)
5* Export `Network.Wai.EventSource.eventStreamAppRaw` [#786](https://github.com/yesodweb/wai/pull/786)
wai-extra/Network/Wai/Test.hs+14−22
@@ -99,10 +99,6 @@ runSession session app = ST.evalStateT (runReaderT session app) initState
99data SRequest = SRequest
99data SRequest = SRequest
100 { simpleRequest :: Request
100 { simpleRequest :: Request
101 , simpleRequestBody :: L.ByteString
101 , simpleRequestBody :: L.ByteString
102− -- ^ Request body that will override the one set in 'simpleRequest'.
103− --
104− -- This is usually simpler than setting the body as a stateful IO-action
105− -- in 'simpleRequest'.
106 }
102 }
107data SResponse = SResponse
103data SResponse = SResponse
108 { simpleStatus :: H.Status
104 { simpleStatus :: H.Status
@@ -110,16 +106,8 @@ data SResponse = SResponse
110 , simpleBody :: L.ByteString
106 , simpleBody :: L.ByteString
111 }
107 }
112 deriving (Show, Eq)
108 deriving (Show, Eq)
113−
114request :: Request -> Session SResponse
109request :: Request -> Session SResponse
115−request req = do
110+request = srequest . flip SRequest L.empty
116− app <- ask
117− req' <- addCookiesToRequest req
118− response <- liftIO $ do
119− ref <- newIORef $ error "runResponse gave no result"
120− ResponseReceived <- app req' (runResponse ref)
121− readIORef ref
122− extractSetCookieFromSResponse response
123
111
124-- | Set whole path (request path + query string).
112-- | Set whole path (request path + query string).
125setPath :: Request -> S8.ByteString -> Request
113setPath :: Request -> S8.ByteString -> Request
@@ -178,18 +166,22 @@ extractSetCookieFromSResponse response = do
178 (Map.fromList [(Cookie.setCookieName c, c) | c <- newClientCookies ]))
166 (Map.fromList [(Cookie.setCookieName c, c) | c <- newClientCookies ]))
179 return response
167 return response
180
168
181−-- | Similar to 'request', but allows setting the request body as a plain
182−-- 'L.ByteString'.
183srequest :: SRequest -> Session SResponse
169srequest :: SRequest -> Session SResponse
184srequest (SRequest req bod) = do
170srequest (SRequest req bod) = do
171+ app <- ask
185 refChunks <- liftIO $ newIORef $ L.toChunks bod
172 refChunks <- liftIO $ newIORef $ L.toChunks bod
186− request $
187− req
173+ let req' = req
188− { requestBody = atomicModifyIORef refChunks $ \bss ->
174+ { requestBody = atomicModifyIORef refChunks $ \bss ->
189− case bss of
175+ case bss of
190− [] -> ([], S.empty)
176+ [] -> ([], S.empty)
191− x:y -> (y, x)
177+ x:y -> (y, x)
192− }
178+ }
179+ req'' <- addCookiesToRequest req'
180+ response <- liftIO $ do
181+ ref <- newIORef $ error "runResponse gave no result"
182+ ResponseReceived <- app req'' (runResponse ref)
183+ readIORef ref
184+ extractSetCookieFromSResponse response
193
185
194runResponse :: IORef SResponse -> Response -> IO ResponseReceived
186runResponse :: IORef SResponse -> Response -> IO ResponseReceived
195runResponse ref res = do
187runResponse ref res = do
wai-extra/test/Network/Wai/TestSpec.hs+11−41
@@ -3,8 +3,6 @@ module Network.Wai.TestSpec (main, spec) where
3
3
4import Control.Monad (void)
4import Control.Monad (void)
5
5
6−import qualified Data.IORef as IORef
7−
8import qualified Data.Text.Encoding as TE
6import qualified Data.Text.Encoding as TE
9
7
10import Data.Time.Calendar (fromGregorian)
8import Data.Time.Calendar (fromGregorian)
@@ -55,53 +53,25 @@ spec = do
55 it "sets rawQueryString to empty string" $ do
53 it "sets rawQueryString to empty string" $ do
56 rawQueryString (setPath defaultRequest "/foo/bar/baz") `shouldBe` ""
54 rawQueryString (setPath defaultRequest "/foo/bar/baz") `shouldBe` ""
57
55
58− describe "srequest" $ do
59−
60− let echoApp req respond = do
61− reqBody <- L8.fromStrict <$> getRequestBodyChunk req
62− let reqHeaders = requestHeaders req
63− respond $
64− responseLBS
65− status200
66− reqHeaders
67− reqBody
68−
69− it "returns the response body of an echo app" $ do
70− sresp <- flip runSession echoApp $
71− srequest $ SRequest defaultRequest "request body"
72− simpleBody sresp `shouldBe` "request body"
73−
74 describe "request" $ do
56 describe "request" $ do
75
57
76− let echoApp req respond = do
58+ let simpleApp _req respond =
77− reqBody <- L8.fromStrict <$> getRequestBodyChunk req
78− let reqHeaders = requestHeaders req
79 respond $
59 respond $
80 responseLBS
60 responseLBS
81 status200
61 status200
82− reqHeaders
62+ [("foo", "bar")]
83− reqBody
63+ "simple"
84
64
85− it "returns the status code of an echo app on default request" $ do
65+ it "returns the status code of a simple app on default request" $ do
86− sresp <- runSession (request defaultRequest) echoApp
66+ sresp <- runSession (request defaultRequest) simpleApp
87 simpleStatus sresp `shouldBe` status200
67 simpleStatus sresp `shouldBe` status200
88
68
89− it "returns the response body of an echo app" $ do
69+ it "returns the response body of a simple app on default request" $ do
90− bodyRef <- IORef.newIORef "request body"
91− let getBodyChunk = IORef.atomicModifyIORef bodyRef $ \leftover -> ("", leftover)
92− sresp <- flip runSession echoApp $
93− request $
94− defaultRequest
70+ sresp <- runSession (request defaultRequest) simpleApp
95− { requestBody = getBodyChunk
96− }
97− simpleBody sresp `shouldBe` "request body"
71+ simpleBody sresp `shouldBe` "simple"
98−
72+
99− it "returns the response headers of an echo app" $ do
73+ it "returns the response headers of a simple app on default request" $ do
100− sresp <- flip runSession echoApp $
101− request $
102− defaultRequest
74+ sresp <- runSession (request defaultRequest) simpleApp
103− { requestHeaders = [("foo", "bar")]
104− }
105 simpleHeaders sresp `shouldBe` [("foo", "bar")]
75 simpleHeaders sresp `shouldBe` [("foo", "bar")]
106
76
107 let cookieApp req respond =
77 let cookieApp req respond =
wai-extra/wai-extra.cabal+1−1
@@ -1,5 +1,5 @@
1Name: wai-extra
1Name: wai-extra
2−Version: 3.0.29.1
2+Version: 3.0.29
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: