@@ -26,7 +26,6 @@ import qualified System.IO
2626
2727import Data.ByteString (ByteString)
2828import qualified Data.ByteString.Char8 as B
29−import qualified Data.ByteString.Lazy as L
3029import Network
3130 ( listenOn, accept, sClose, PortID(PortNumber), Socket
3231 , withSocketsDo)
@@ -39,17 +38,15 @@ import Data.Maybe (isJust, fromJust, fromMaybe)
3938import Data.Typeable (Typeable)
4039
4140import Control.Arrow (first)
42−import Numeric (showHex)
4341
4442import Data.Enumerator (($$), Enumerator, enumList, (>>==))
4543import qualified Data.Enumerator as E
4644import Data.Enumerator.IO (iterHandle)
47−import Control.Monad.IO.Class (liftIO)
4845import Blaze.ByteString.Builder.Enumerator (builderToByteString)
4946import Blaze.ByteString.Builder.HTTP
5047 (chunkedTransferEncoding, chunkedTransferTerminator)
51−import Blaze.ByteString.Builder (fromByteString, Builder, toLazyByteString)
52−import Blaze.ByteString.Builder.Char8 (fromChar)
48+import Blaze.ByteString.Builder (fromByteString, Builder)
49+import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
5350import Data.Monoid (mconcat)
5451
5552run :: Port -> Application () -> IO ()
@@ -162,7 +159,7 @@ headers httpversion status responseHeaders = mconcat
162159 [ fromByteString "HTTP/"
163160 , fromByteString httpversion
164161 , fromChar ' '
165− , fromByteString $ B.pack $ show $ statusCode status
162+ , fromString $ show $ statusCode status
166163 , fromChar ' '
167164 , fromByteString $ statusMessage status
168165 , fromByteString "\r\n"
@@ -179,11 +176,12 @@ headers httpversion status responseHeaders = mconcat
179176
180177sendResponse :: HttpVersion -> Handle -> Response () -> IO ()
181178sendResponse hv handle res = do
182− responseEnumerator res $ \s hs -> do
183− liftIO $ L.hPutStr handle $ toLazyByteString $ headers hv s hs
184− i <- E.joinI $ chunk $$ E.joinI $ builderToByteString $$ iterHandle handle
185− liftIO $ B.hPutStr handle "\r\n"
186− return i
179+ responseEnumerator res $ \s hs ->
180+ enumList 1 [headers hv s hs]
181+ $$ E.joinI $ after (enumList 1 [fromByteString "\r\n"])
182+ $$ E.joinI $ chunk
183+ $$ E.joinI $ builderToByteString
184+ $$ iterHandle handle
187185 where
188186 chunk :: E.Enumeratee Builder Builder IO ()
189187 chunk = E.checkDone $ E.continue . step
@@ -204,3 +202,11 @@ parseHeaderNoAttr s =
204202 then B.drop 2 rest
205203 else rest
206204 in (k, rest')
205+
206+after :: Enumerator Builder IO b -> E.Enumeratee Builder Builder IO b
207+after enum =
208+ loop
209+ where
210+ loop = E.checkDone $ E.continue . step
211+ step k E.EOF = enum (E.Continue k) >>== return
212+ step k s = k s >>== loop