@@ -21,8 +21,8 @@ import Foreign.C.String
2121#else
2222import System.Cmd (rawSystem)
2323#endif
24−import Data.Conduit.Zlib (ungzip)
25−import Data.Conduit.Blaze (builderToByteString)
24+import Data.Conduit.Zlib (decompressFlush, WindowBits (WindowBits))
25+import Data.Conduit.Blaze (builderToByteStringFlush)
2626import qualified Data.Conduit as C
2727import qualified Data.Conduit.List as CL
2828
@@ -48,20 +48,25 @@ ping var app req
4848 let (s, hs, body) = responseSource res
4949 let (isEnc, headers') = fixHeaders id hs
5050 let headers'' = filter (\(x, _) -> x /= "content-length") headers'
51− let fixEnc src = if isEnc then src C.$= ungzip else src
51+ let fixEnc src =
52+ if isEnc then
53+ src C.$= decompressFlush (WindowBits 31)
54+ else src
5255 return $ ResponseSource s headers''
53− $ fixEnc (body C.$= builderToByteString)
56+ $ fixEnc (body C.$= builderToByteStringFlush)
5457 C.$= insideHead
55− C.$= CL.map fromByteString
58+ C.$= CL.map (fmap fromByteString)
5659
5760toInsert :: S.ByteString
5861toInsert = "<script>setInterval(function(){var x;if(window.XMLHttpRequest){x=new XMLHttpRequest();}else{x=new ActiveXObject(\"Microsoft.XMLHTTP\");}x.open(\"GET\",\"/_ping\",false);x.send();},60000)</script>"
5962
60−insideHead :: C.Conduit S.ByteString IO S.ByteString
63+insideHead :: C.Conduit (C.Flush S.ByteString) IO (C.Flush S.ByteString)
6164insideHead =
62− C.conduitState (Just (S.empty, whole)) push close
65+ C.conduitState (Just (S.empty, whole)) push' close
6366 where
6467 whole = "<head>"
68+ push' state (C.Chunk x) = (fmap . fmap . fmap) C.Chunk (push state x)
69+ push' state C.Flush = return (state, C.Producing [C.Flush])
6570 push (Just (held, atFront)) x
6671 | atFront `S.isPrefixOf` x = do
6772 let y = S.drop (S.length atFront) x
@@ -79,7 +84,7 @@ insideHead =
7984 return (Just (held', atFront'), C.Producing [held, x'])
8085 push Nothing x = return (Nothing, C.Producing [x])
8186
82− close (Just (held, _)) = return [held, toInsert]
87+ close (Just (held, _)) = return [C.Chunk held, C.Chunk toInsert]
8388 close Nothing = return []
8489
8590getOverlap :: S.ByteString -> S.ByteString -> (S.ByteString, S.ByteString, S.ByteString)