@@ -19,8 +19,9 @@ import Network.Wai
1919import qualified Data.ByteString.Char8 as B8
2020import Data.Maybe (fromMaybe)
2121import Data.Enumerator (($$), enumList, Step (..), Enumerator, Iteratee, Enumeratee, joinI, checkDone, continue, Stream (..), (>>==))
22−import Blaze.ByteString.Builder (fromByteString, Builder)
22+import Blaze.ByteString.Builder (copyByteString, Builder)
2323import Blaze.ByteString.Builder.Char8 (fromChar)
24+import Data.Monoid (mappend)
2425
2526takeCallback :: B8.ByteString -> Maybe B8.ByteString
2627takeCallback bs | B8.null bs = Nothing
@@ -66,6 +67,14 @@ jsonp app env = do
6667 Just c -> go c res
6768 where
6869 go c r@(ResponseFile _ hs _) = go' c r hs
70+ go c r@(ResponseBuilder s hs b) =
71+ case checkJSON hs of
72+ Nothing -> return r
73+ Just hs' -> return $ ResponseBuilder s hs' $
74+ copyByteString c
75+ `mappend` fromChar '('
76+ `mappend` b
77+ `mappend` fromChar ')'
6978 go c (ResponseEnumerator e) = addCallback c e
7079 go' c r hs =
7180 case checkJSON hs of
@@ -90,7 +99,7 @@ jsonp app env = do
9099 Nothing -> f s hs
91100 wrap :: Step Builder IO b -> Iteratee Builder IO b
92101 wrap step = joinI $ after (enumList 1 [fromChar ')'])
93− $$ enumList 1 [fromByteString cb, fromChar '('] step
102+ $$ enumList 1 [copyByteString cb, fromChar '('] step
94103 after :: Enumerator Builder IO b -> Enumeratee Builder Builder IO b
95104 after enum =
96105 loop