@@ -50,7 +50,6 @@ module Network.Wai
5050 , requestBody
5151 , vault
5252 , requestBodyLength
53− , resourceInternalState
5453 -- ** Response
5554 , Response
5655 , responseFile
@@ -62,6 +61,7 @@ module Network.Wai
6261 , Middleware
6362 , FilePart (..)
6463 , RequestBodyLength (..)
64+ , WithSource
6565 -- ** Helper functions
6666 , responseToSource
6767 , responseStatus
@@ -69,7 +69,6 @@ module Network.Wai
6969
7070import Blaze.ByteString.Builder (Builder, fromLazyByteString)
7171import Blaze.ByteString.Builder (fromByteString)
72−import qualified Control.Monad.Trans.Resource as Res
7372import qualified Data.ByteString as B
7473import qualified Data.ByteString.Lazy as L
7574import Data.ByteString.Lazy.Char8 ()
@@ -78,6 +77,7 @@ import qualified Data.Conduit.Binary as CB
7877import qualified Data.Conduit.List as CL
7978import qualified Network.HTTP.Types as H
8079import Network.Wai.Internal
80+import qualified System.IO as IO
8181
8282responseFile :: H.Status -> H.ResponseHeaders -> FilePath -> Maybe FilePart -> Response
8383responseFile = ResponseFile
@@ -86,7 +86,7 @@ responseBuilder :: H.Status -> H.ResponseHeaders -> Builder -> Response
8686responseBuilder = ResponseBuilder
8787
8888responseSource :: H.Status -> H.ResponseHeaders -> C.Source IO (C.Flush Builder) -> Response
89−responseSource = ResponseSource
89+responseSource st hs src = ResponseSource st hs ($ src)
9090
9191responseStatus :: Response -> H.Status
9292responseStatus rsp =
@@ -95,24 +95,19 @@ responseStatus rsp =
9595 ResponseBuilder s _ _ -> s
9696 ResponseSource s _ _ -> s
9797
98−responseToSource :: Request
99− -> Response
100− -> (H.Status, H.ResponseHeaders, C.Source IO (C.Flush Builder))
101−responseToSource _ (ResponseSource s h b) = (s, h, b)
102−responseToSource req (ResponseFile s h fp (Just part)) =
103− (s, h, transRes (sourceFilePart part fp) C.$= CL.map (C.Chunk . fromByteString))
104− where
105− transRes = C.transPipe (flip Res.runInternalState (resourceInternalState req))
106−responseToSource req (ResponseFile s h fp Nothing) =
107− (s, h, transRes (CB.sourceFile fp) C.$= CL.map (C.Chunk . fromByteString))
108− where
109− transRes = C.transPipe (flip Res.runInternalState (resourceInternalState req))
110−responseToSource _ (ResponseBuilder s h b) =
111− (s, h, CL.sourceList [C.Chunk b])
112−
113−sourceFilePart :: C.MonadResource m => FilePart -> FilePath -> C.Source m B.ByteString
114−sourceFilePart (FilePart offset count) fp =
115− CB.sourceFileRange fp (Just offset) (Just count)
98+responseToSource :: Response
99+ -> (H.Status, H.ResponseHeaders, WithSource IO (C.Flush Builder) b)
100+responseToSource (ResponseSource s h b) = (s, h, b)
101+responseToSource (ResponseFile s h fp (Just part)) =
102+ (s, h, \f -> IO.withFile fp IO.ReadMode $ \handle -> f $ sourceFilePart handle part C.$= CL.map (C.Chunk . fromByteString))
103+responseToSource (ResponseFile s h fp Nothing) =
104+ (s, h, \f -> IO.withFile fp IO.ReadMode $ \handle -> f $ CB.sourceHandle handle C.$= CL.map (C.Chunk . fromByteString))
105+responseToSource (ResponseBuilder s h b) =
106+ (s, h, ($ CL.sourceList [C.Chunk b]))
107+
108+sourceFilePart :: IO.Handle -> FilePart -> C.Source IO B.ByteString
109+sourceFilePart handle (FilePart offset count) =
110+ CB.sourceHandleRange handle (Just offset) (Just count)
116111
117112responseLBS :: H.Status -> H.ResponseHeaders -> L.ByteString -> Response
118113responseLBS s h = ResponseBuilder s h . fromLazyByteString