@@ -25,6 +25,7 @@ import Network.Wai.Middleware.MethodOverridePost
2525import Network.Wai.Middleware.AcceptOverride
2626import Network.Wai.Middleware.RequestLogger
2727import Codec.Compression.GZip (decompress)
28+import Network.Wai.Middleware.StreamFile
2829
2930import Control.Monad.IO.Class (liftIO)
3031import Data.Maybe (fromMaybe)
@@ -57,6 +58,8 @@ spec = do
5758 it "method override post" caseMethodOverridePost
5859 it "accept override" caseAcceptOverride
5960 it "debug request body" caseDebugRequestBody
61+ it "stream file" caseStreamFile
62+ it "stream LBS" caseStreamLBS
6063
6164toRequest :: S8.ByteString -> S8.ByteString -> SRequest
6265toRequest ctype content = SRequest defaultRequest
@@ -419,3 +422,27 @@ casesUrlMap = [pair1, pair2, pair3, pair4]
419422 pair4 = makePair "should 404 if none match" $ do
420423 res4 <- get "/api/v3"
421424 assertStatus 404 res4
425+
426+testFile :: FilePath
427+testFile = "test/WaiExtraSpec.hs"
428+
429+streamFileApp :: Application
430+streamFileApp = streamFile $ \_ f -> f $ responseFile status200 [] testFile Nothing
431+
432+caseStreamFile :: Assertion
433+caseStreamFile = flip runSession streamFileApp $ do
434+ sres <- request defaultRequest
435+ assertStatus 200 sres
436+ assertBodyContains "caseStreamFile" sres
437+ assertNoHeader "Transfer-Encoding" sres
438+
439+streamLBSApp :: Application
440+streamLBSApp = streamFile $ \_ f -> f $ responseLBS status200
441+ [("Content-Type", "text/plain")]
442+ "test"
443+
444+caseStreamLBS :: Assertion
445+caseStreamLBS = flip runSession streamLBSApp $ do
446+ sres <- request defaultRequest
447+ assertStatus 200 sres
448+ assertBody "test" sres