@@ -30,9 +30,6 @@ import Network.Wai.Middleware.AcceptOverride
30import Network.Wai.Middleware.RequestLogger
30import Network.Wai.Middleware.RequestLogger
31import Codec.Compression.GZip (decompress)
31import Codec.Compression.GZip (decompress)
33−import qualified Data.Conduit as C
34−import qualified Data.Conduit.List as CL
35−import Data.Conduit.Binary (sourceHandle)
36import Control.Monad.IO.Class (liftIO)
33import Control.Monad.IO.Class (liftIO)
37import Data.Maybe (fromMaybe)
34import Data.Maybe (fromMaybe)
38import Network.HTTP.Types (parseSimpleQuery, status200)
35import Network.HTTP.Types (parseSimpleQuery, status200)
@@ -128,7 +125,13 @@ parseRequestBody' :: BackEnd file
128parseRequestBody' sink (SRequest req bod) =
125parseRequestBody' sink (SRequest req bod) =
129 case getRequestBodyType req of
126 case getRequestBodyType req of
130 Nothing -> return ([], [])
127 Nothing -> return ([], [])
129+ ref <- I.newIORef $ L.toChunks bod
130+ let rb = I.atomicModifyIORef ref $ \chunks ->
131− Just rbt -> CL.sourceList (L.toChunks bod) C.$$ sinkRequestBody sink rbt
134+ sinkRequestBody sink rbt rb
133caseParseRequestBody :: Assertion
136caseParseRequestBody :: Assertion
134caseParseRequestBody =
137caseParseRequestBody =
@@ -295,7 +298,7 @@ caseTakeLine = do
297jsonpApp :: Application
300jsonpApp :: Application
298−jsonpApp = jsonp $ const $ return $ responseLBS
301+jsonpApp = jsonp $ \_ f -> f $ responseLBS
299 status200
302 status200
300 [("Content-Type", "application/json")]
303 [("Content-Type", "application/json")]
301 "{\"foo\":\"bar\"}"
304 "{\"foo\":\"bar\"}"
@@ -324,7 +327,7 @@ caseJsonp = flip runSession jsonpApp $ do
324 assertBody "{\"foo\":\"bar\"}" sres3
327 assertBody "{\"foo\":\"bar\"}" sres3
326gzipApp :: Application
329gzipApp :: Application
327−gzipApp = gzip def $ const $ return $ responseLBS status200
330+gzipApp = gzip def $ \_ f -> f $ responseLBS status200
328 [("Content-Type", "text/plain")]
331 [("Content-Type", "text/plain")]
@@ -332,7 +335,7 @@ gzipApp = gzip def $ const $ return $ responseLBS status200
332-- that the compression is skipped based on the presence of
335-- that the compression is skipped based on the presence of
333-- the Content-Encoding header.
336-- the Content-Encoding header.
334gzipPrecompressedApp :: Application
337gzipPrecompressedApp :: Application
335−gzipPrecompressedApp = gzip def $ const $ return $ responseLBS status200
338+gzipPrecompressedApp = gzip def $ \_ f -> f $ responseLBS status200
336 [("Content-Type", "text/plain"), ("Content-Encoding", "gzip")]
339 [("Content-Type", "text/plain"), ("Content-Encoding", "gzip")]
@@ -380,8 +383,8 @@ caseGzipBypassPre = flip runSession gzipPrecompressedApp $ do
380 assertBody "test" sres1 -- the body is not actually compressed
383 assertBody "test" sres1 -- the body is not actually compressed
382vhostApp1, vhostApp2, vhostApp :: Application
385vhostApp1, vhostApp2, vhostApp :: Application
383−vhostApp1 = const $ return $ responseLBS status200 [] "app1"
386+vhostApp1 _ f = f $ responseLBS status200 [] "app1"
384−vhostApp2 = const $ return $ responseLBS status200 [] "app2"
387+vhostApp2 _ f = f $ responseLBS status200 [] "app2"
385vhostApp = vhost
388vhostApp = vhost
386 [ ((== Just "foo.com") . lookup "host" . requestHeaders, vhostApp1)
389 [ ((== Just "foo.com") . lookup "host" . requestHeaders, vhostApp1)
@@ -400,7 +403,7 @@ caseVhost = flip runSession vhostApp $ do
400 assertBody "app2" sres2
403 assertBody "app2" sres2
402autoheadApp :: Application
405autoheadApp :: Application
403−autoheadApp = autohead $ const $ return $ responseLBS status200
406+autoheadApp = autohead $ \_ f -> f $ responseLBS status200
404 [("Foo", "Bar")] "body"
407 [("Foo", "Bar")] "body"
406caseAutohead :: Assertion
409caseAutohead :: Assertion
@@ -418,7 +421,7 @@ caseAutohead = flip runSession autoheadApp $ do
418 assertBody "" sres2
421 assertBody "" sres2
420moApp :: Application
423moApp :: Application
421−moApp = methodOverride $ \req -> return $ responseLBS status200
424+moApp = methodOverride $ \req f -> f $ responseLBS status200
422 [("Method", requestMethod req)] ""
425 [("Method", requestMethod req)] ""
424caseMethodOverride :: Assertion
427caseMethodOverride :: Assertion
@@ -442,7 +445,7 @@ caseMethodOverride = flip runSession moApp $ do
442 assertHeader "Method" "PUT" sres3
445 assertHeader "Method" "PUT" sres3
444mopApp :: Application
447mopApp :: Application
445−mopApp = methodOverridePost $ \req -> return $ responseLBS status200 [("Method", requestMethod req)] ""
448+mopApp = methodOverridePost $ \req f -> f $ responseLBS status200 [("Method", requestMethod req)] ""
447caseMethodOverridePost :: Assertion
450caseMethodOverridePost :: Assertion
448caseMethodOverridePost = flip runSession mopApp $ do
451caseMethodOverridePost = flip runSession mopApp $ do
@@ -468,7 +471,7 @@ caseMethodOverridePost = flip runSession mopApp $ do
468 assertHeader "Method" "POST" sres4
471 assertHeader "Method" "POST" sres4
470aoApp :: Application
473aoApp :: Application
471−aoApp = acceptOverride $ \req -> return $ responseLBS status200
474+aoApp = acceptOverride $ \req f -> f $ responseLBS status200
472 [("Accept", fromMaybe "" $ lookup "Accept" $ requestHeaders req)] ""
475 [("Accept", fromMaybe "" $ lookup "Accept" $ requestHeaders req)] ""
474caseAcceptOverride :: Assertion
477caseAcceptOverride :: Assertion
@@ -520,7 +523,7 @@ dalvikHelper includeLength = do
520 case getRequestBodyType request' of
523 case getRequestBodyType request' of
521 Nothing -> return ([], [])
524 Nothing -> return ([], [])
522 Just rbt -> withFile "test/requests/dalvik-request" ReadMode $ \h ->
525 Just rbt -> withFile "test/requests/dalvik-request" ReadMode $ \h ->
523− sourceHandle h C.$$ sinkRequestBody lbsBackEnd rbt
526+ sinkRequestBody lbsBackEnd rbt $ S.hGetSome h 2048
524 lookup "scannedTime" params @?= Just "1.298590056748E9"
527 lookup "scannedTime" params @?= Just "1.298590056748E9"
525 lookup "geoLong" params @?= Just "0"
528 lookup "geoLong" params @?= Just "0"
526 lookup "geoLat" params @?= Just "0"
529 lookup "geoLat" params @?= Just "0"
@@ -548,15 +551,15 @@ caseDebugRequestBody = do
548 postOutput = T.pack $ "POST / :: \nStatus: 200 OK. /\n"
551 postOutput = T.pack $ "POST / :: \nStatus: 200 OK. /\n"
549 getOutput params' = T.pack $ "GET /location :: \nGET " ++ show params' ++ "\nStatus: 200 OK. /location\n"
552 getOutput params' = T.pack $ "GET /location :: \nGET " ++ show params' ++ "\nStatus: 200 OK. /location\n"
551− debugApp output' req = do
554+ debugApp output' req send = do
552− iactual <- liftIO $ I.newIORef mempty
555+ iactual <- I.newIORef mempty
553− middleware <- liftIO $ mkRequestLogger def
556+ middleware <- mkRequestLogger def
554 { destination = Callback $ \strs -> I.modifyIORef iactual $ (`mappend` strs)
557 { destination = Callback $ \strs -> I.modifyIORef iactual $ (`mappend` strs)
555 , outputFormat = Detailed False
558 , outputFormat = Detailed False
557− res <- middleware (\_req -> return $ responseLBS status200 [ ] "") req
560+ res <- middleware (\_req f -> f $ responseLBS status200 [ ] "") req send
558− actual <- liftIO $ I.readIORef iactual
561+ actual <- I.readIORef iactual
559− liftIO $ assertEqual "debug" output $ logToBs actual
562+ assertEqual "debug" output $ logToBs actual
560 return res
563 return res
562 output = TE.encodeUtf8 $ T.toStrict output'
565 output = TE.encodeUtf8 $ T.toStrict output'
@@ -578,8 +581,8 @@ urlMapTestApp = mapUrls $
580 trivialApp :: S.ByteString -> Application
583 trivialApp :: S.ByteString -> Application
581− trivialApp name req =
584+ trivialApp name req f =
583 responseLBS
586 responseLBS
584 status200
587 status200
585 [ ("content-type", "text/plain")
588 [ ("content-type", "text/plain")