@@ -33,6 +33,7 @@ module Network.Wai
3333 , responseEnumerator
3434 , Application
3535 , Middleware
36+ , FilePart (..)
3637 -- * Response body smart constructors
3738 , responseLBS
3839 ) where
@@ -40,13 +41,14 @@ module Network.Wai
4041import qualified Data.ByteString as B
4142import qualified Data.ByteString.Lazy as L
4243import Data.Typeable (Typeable)
43−import Data.Enumerator (Iteratee, ($$), joinI, run_)
44+import Data.Enumerator (Enumerator, Iteratee, ($$), joinI, run_)
4445import qualified Data.Enumerator as E
4546import Data.Enumerator.Binary (enumFile)
4647import Blaze.ByteString.Builder (Builder, fromByteString, fromLazyByteString)
4748import Network.Socket (SockAddr)
4849import qualified Network.HTTP.Types as H
4950import Data.Text (Text)
51+import Data.ByteString.Lazy.Char8 () -- makes it easier to use responseLBS
5052
5153-- | Information on the request sent by the client. This abstracts away the
5254-- details of the underlying implementation.
@@ -78,22 +80,31 @@ data Request = Request
7880 deriving Typeable
7981
8082data Response
81− = ResponseFile H.Status H.ResponseHeaders FilePath
83+ = ResponseFile H.Status H.ResponseHeaders FilePath (Maybe FilePart)
8284 | ResponseBuilder H.Status H.ResponseHeaders Builder
8385 | ResponseEnumerator (forall a. ResponseEnumerator a)
8486 deriving Typeable
8587
88+data FilePart = FilePart
89+ { filePartOffset :: Integer
90+ , filePartByteCount :: Integer
91+ }
92+
8693type ResponseEnumerator a =
8794 (H.Status -> H.ResponseHeaders -> Iteratee Builder IO a) -> IO a
8895
8996responseEnumerator :: Response -> ResponseEnumerator a
9097responseEnumerator (ResponseEnumerator e) f = e f
91−responseEnumerator (ResponseFile s h fp) f =
92− run_ $ enumFile fp $$ joinI $ E.map fromByteString $$ f s h
98+responseEnumerator (ResponseFile s h fp mpart) f =
99+ run_ $ (maybe enumFile enumFilePart) mpart fp $$ joinI
100+ $ E.map fromByteString $$ f s h
93101responseEnumerator (ResponseBuilder s h b) f = run_ $ do
94102 E.yield () $ E.Chunks [b]
95103 f s h
96104
105+enumFilePart :: FilePart -> FilePath -> Enumerator B.ByteString IO a
106+enumFilePart (FilePart offset count) fp = undefined
107+
97108responseLBS :: H.Status -> H.ResponseHeaders -> L.ByteString -> Response
98109responseLBS s h = ResponseBuilder s h . fromLazyByteString
99110