@@ -50,7 +50,6 @@ module Network.Wai
50 , requestBody
50 , requestBody
52 , requestBodyLength
52 , requestBodyLength
53− , resourceInternalState
54 -- ** Response
53 -- ** Response
55 , Response
54 , Response
56 , responseFile
55 , responseFile
@@ -62,6 +61,7 @@ module Network.Wai
62 , Middleware
61 , Middleware
63 , FilePart (..)
62 , FilePart (..)
64 , RequestBodyLength (..)
63 , RequestBodyLength (..)
65 -- ** Helper functions
65 -- ** Helper functions
66 , responseToSource
66 , responseToSource
67 , responseStatus
67 , responseStatus
@@ -69,7 +69,6 @@ module Network.Wai
70import Blaze.ByteString.Builder (Builder, fromLazyByteString)
70import Blaze.ByteString.Builder (Builder, fromLazyByteString)
71import Blaze.ByteString.Builder (fromByteString)
71import Blaze.ByteString.Builder (fromByteString)
72−import qualified Control.Monad.Trans.Resource as Res
73import qualified Data.ByteString as B
72import qualified Data.ByteString as B
74import qualified Data.ByteString.Lazy as L
73import qualified Data.ByteString.Lazy as L
75import Data.ByteString.Lazy.Char8 ()
74import Data.ByteString.Lazy.Char8 ()
@@ -78,6 +77,7 @@ import qualified Data.Conduit.Binary as CB
78import qualified Data.Conduit.List as CL
77import qualified Data.Conduit.List as CL
79import qualified Network.HTTP.Types as H
78import qualified Network.HTTP.Types as H
80import Network.Wai.Internal
79import Network.Wai.Internal
80+import qualified System.IO as IO
82responseFile :: H.Status -> H.ResponseHeaders -> FilePath -> Maybe FilePart -> Response
82responseFile :: H.Status -> H.ResponseHeaders -> FilePath -> Maybe FilePart -> Response
83responseFile = ResponseFile
83responseFile = ResponseFile
@@ -86,7 +86,7 @@ responseBuilder :: H.Status -> H.ResponseHeaders -> Builder -> Response
86responseBuilder = ResponseBuilder
86responseBuilder = ResponseBuilder
88responseSource :: H.Status -> H.ResponseHeaders -> C.Source IO (C.Flush Builder) -> Response
88responseSource :: H.Status -> H.ResponseHeaders -> C.Source IO (C.Flush Builder) -> Response
89−responseSource = ResponseSource
89+responseSource st hs src = ResponseSource st hs ($ src)
91responseStatus :: Response -> H.Status
91responseStatus :: Response -> H.Status
92responseStatus rsp =
92responseStatus rsp =
@@ -95,24 +95,19 @@ responseStatus rsp =
95 ResponseBuilder s _ _ -> s
95 ResponseBuilder s _ _ -> s
96 ResponseSource s _ _ -> s
96 ResponseSource s _ _ -> s
98−responseToSource :: Request
98+responseToSource :: Response
100− -> (H.Status, H.ResponseHeaders, C.Source IO (C.Flush Builder))
99+ -> (H.Status, H.ResponseHeaders, WithSource IO (C.Flush Builder) b)
101−responseToSource _ (ResponseSource s h b) = (s, h, b)
100+responseToSource (ResponseSource s h b) = (s, h, b)
102−responseToSource req (ResponseFile s h fp (Just part)) =
101+responseToSource (ResponseFile s h fp (Just part)) =
103− (s, h, transRes (sourceFilePart part fp) C.$= CL.map (C.Chunk . fromByteString))
102+ (s, h, \f -> IO.withFile fp IO.ReadMode $ \handle -> f $ sourceFilePart handle part C.$= CL.map (C.Chunk . fromByteString))
105− transRes = C.transPipe (flip Res.runInternalState (resourceInternalState req))
106−responseToSource req (ResponseFile s h fp Nothing) =
103+responseToSource (ResponseFile s h fp Nothing) =
107− (s, h, transRes (CB.sourceFile fp) C.$= CL.map (C.Chunk . fromByteString))
104+ (s, h, \f -> IO.withFile fp IO.ReadMode $ \handle -> f $ CB.sourceHandle handle C.$= CL.map (C.Chunk . fromByteString))
109− transRes = C.transPipe (flip Res.runInternalState (resourceInternalState req))
110−responseToSource _ (ResponseBuilder s h b) =
105+responseToSource (ResponseBuilder s h b) =
111− (s, h, CL.sourceList [C.Chunk b])
106+ (s, h, ($ CL.sourceList [C.Chunk b]))
113−sourceFilePart :: C.MonadResource m => FilePart -> FilePath -> C.Source m B.ByteString
108+sourceFilePart :: IO.Handle -> FilePart -> C.Source IO B.ByteString
114−sourceFilePart (FilePart offset count) fp =
109+sourceFilePart handle (FilePart offset count) =
115− CB.sourceFileRange fp (Just offset) (Just count)
110+ CB.sourceHandleRange handle (Just offset) (Just count)
117responseLBS :: H.Status -> H.ResponseHeaders -> L.ByteString -> Response
112responseLBS :: H.Status -> H.ResponseHeaders -> L.ByteString -> Response
118responseLBS s h = ResponseBuilder s h . fromLazyByteString
113responseLBS s h = ResponseBuilder s h . fromLazyByteString