wai-extra 3.0.29 → 3.0.29.1
raw patch · 5 files changed
+69/−27 lines, 5 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ChangeLog.md +4/−0
- Network/Wai/Test.hs +22/−14
- example/Main.hs +2/−2
- test/Network/Wai/TestSpec.hs +40/−10
- wai-extra.cabal +1/−1
ChangeLog.md view
@@ -1,5 +1,9 @@ # Changelog for wai-extra +## 3.0.29.1++* Fix `Network.Wai.Test.request` always sending an empty request body [#794](https://github.com/yesodweb/wai/pull/794)+ ## 3.0.29 * Export `Network.Wai.EventSource.eventStreamAppRaw` [#786](https://github.com/yesodweb/wai/pull/786)
Network/Wai/Test.hs view
@@ -99,6 +99,10 @@ data SRequest = SRequest { simpleRequest :: Request , simpleRequestBody :: L.ByteString+ -- ^ Request body that will override the one set in 'simpleRequest'.+ --+ -- This is usually simpler than setting the body as a stateful IO-action+ -- in 'simpleRequest'. } data SResponse = SResponse { simpleStatus :: H.Status@@ -106,8 +110,16 @@ , simpleBody :: L.ByteString } deriving (Show, Eq)+ request :: Request -> Session SResponse-request = srequest . flip SRequest L.empty+request req = do+ app <- ask+ req' <- addCookiesToRequest req+ response <- liftIO $ do+ ref <- newIORef $ error "runResponse gave no result"+ ResponseReceived <- app req' (runResponse ref)+ readIORef ref+ extractSetCookieFromSResponse response -- | Set whole path (request path + query string). setPath :: Request -> S8.ByteString -> Request@@ -166,22 +178,18 @@ (Map.fromList [(Cookie.setCookieName c, c) | c <- newClientCookies ])) return response +-- | Similar to 'request', but allows setting the request body as a plain+-- 'L.ByteString'. srequest :: SRequest -> Session SResponse srequest (SRequest req bod) = do- app <- ask refChunks <- liftIO $ newIORef $ L.toChunks bod- let req' = req- { requestBody = atomicModifyIORef refChunks $ \bss ->- case bss of- [] -> ([], S.empty)- x:y -> (y, x)- }- req'' <- addCookiesToRequest req'- response <- liftIO $ do- ref <- newIORef $ error "runResponse gave no result"- ResponseReceived <- app req'' (runResponse ref)- readIORef ref- extractSetCookieFromSResponse response+ request $+ req+ { requestBody = atomicModifyIORef refChunks $ \bss ->+ case bss of+ [] -> ([], S.empty)+ x:y -> (y, x)+ } runResponse :: IORef SResponse -> Response -> IO ResponseReceived runResponse ref res = do
example/Main.hs view
@@ -42,10 +42,10 @@ where handle counter emit flush = do threadDelay 1000000- emit $ ServerEvent (Just $ string8 "raw")+ _ <- emit $ ServerEvent (Just $ string8 "raw") Nothing [string8 . show $ counter]- flush+ _ <- flush handle (counter + 1) emit flush main :: IO ()
test/Network/Wai/TestSpec.hs view
@@ -3,6 +3,8 @@ import Control.Monad (void) +import qualified Data.IORef as IORef+ import qualified Data.Text.Encoding as TE import Data.Time.Calendar (fromGregorian)@@ -53,25 +55,53 @@ it "sets rawQueryString to empty string" $ do rawQueryString (setPath defaultRequest "/foo/bar/baz") `shouldBe` "" + describe "srequest" $ do++ let echoApp req respond = do+ reqBody <- L8.fromStrict <$> getRequestBodyChunk req+ let reqHeaders = requestHeaders req+ respond $+ responseLBS+ status200+ reqHeaders+ reqBody++ it "returns the response body of an echo app" $ do+ sresp <- flip runSession echoApp $+ srequest $ SRequest defaultRequest "request body"+ simpleBody sresp `shouldBe` "request body"+ describe "request" $ do - let simpleApp _req respond =+ let echoApp req respond = do+ reqBody <- L8.fromStrict <$> getRequestBodyChunk req+ let reqHeaders = requestHeaders req respond $ responseLBS status200- [("foo", "bar")]- "simple"+ reqHeaders+ reqBody - it "returns the status code of a simple app on default request" $ do- sresp <- runSession (request defaultRequest) simpleApp+ it "returns the status code of an echo app on default request" $ do+ sresp <- runSession (request defaultRequest) echoApp simpleStatus sresp `shouldBe` status200 - it "returns the response body of a simple app on default request" $ do- sresp <- runSession (request defaultRequest) simpleApp- simpleBody sresp `shouldBe` "simple"+ it "returns the response body of an echo app" $ do+ bodyRef <- IORef.newIORef "request body"+ let getBodyChunk = IORef.atomicModifyIORef bodyRef $ \leftover -> ("", leftover)+ sresp <- flip runSession echoApp $+ request $+ defaultRequest+ { requestBody = getBodyChunk+ }+ simpleBody sresp `shouldBe` "request body" - it "returns the response headers of a simple app on default request" $ do- sresp <- runSession (request defaultRequest) simpleApp+ it "returns the response headers of an echo app" $ do+ sresp <- flip runSession echoApp $+ request $+ defaultRequest+ { requestHeaders = [("foo", "bar")]+ } simpleHeaders sresp `shouldBe` [("foo", "bar")] let cookieApp req respond =
wai-extra.cabal view
@@ -1,5 +1,5 @@ Name: wai-extra-Version: 3.0.29+Version: 3.0.29.1 Synopsis: Provides some basic WAI handlers and middleware. description: Provides basic WAI handler and middleware functionality: