on master help sign in
Fixed jsonp
commitc088b0a117f72d047d605d49119e51fb34b430b6 authorMichael Snoyman <michael@snoyman.com> dateWed 15 Dec 2010, 21:22 (16 years ago) parent42be430
1 file changed+27−20
Network/Wai/Middleware/Jsonp.hs+27−20
Network/Wai/Middleware/Jsonp.hs+27−20
@@ -17,6 +17,9 @@ module Network.Wai.Middleware.Jsonp (jsonp) where
1717import Network.Wai
1818import qualified Data.ByteString.Char8 as B8
1919import Data.Maybe (fromMaybe)
20+import Data.Enumerator (($$), enumList, Step (..), Enumerator, Iteratee, Enumeratee, joinI, checkDone, continue, Stream (..), (>>==))
21+import Blaze.ByteString.Builder (fromByteString, Builder)
22+import Blaze.ByteString.Builder.Char8 (fromChar)
2023
2124takeCallback :: B8.ByteString -> Maybe B8.ByteString
2225takeCallback bs | B8.null bs = Nothing
@@ -63,33 +66,37 @@ jsonp app env = do
6366 where
6467 go c r@(ResponseLBS _ hs _) = go' c r hs
6568 go c r@(ResponseFile _ hs _) = go' c r hs
66− go c (ResponseEnumerator e) = go'' c e
69+ go c (ResponseEnumerator e) = addCallback c e
6770 go' c r hs =
6871 case checkJSON hs of
69− Just _ -> go'' c $ enumResponse r
72+ Just _ -> addCallback c $ responseEnumerator r
7073 Nothing -> return r
71− go'' e = undefined
7274 checkJSON hs =
7375 case fmap B8.unpack $ lookup "Content-Type" hs of
7476 Just "application/json" -> Just $ fixHeaders hs
75− Nothing -> Nothing
77+ _ -> Nothing
7678 fixHeaders = changeVal "Content-Type" "text/javascript"
77−
78−enumResponse :: Response a -> ResponseEnumerator a
79−enumResponse = error "FIXME"
80−
81−{-
82−addCallback :: B8.ByteString -> Enumerator -> Enumerator
83−addCallback cb (Enumerator e) = Enumerator $ \iter a -> do
84− ea' <- iter a $ B8.snoc cb '('
85− case ea' of
86− Left a' -> return $ Left a'
87− Right a' -> do
88− ea'' <- e iter a'
89− case ea'' of
90− Left a'' -> return $ Left a''
91− Right a'' -> iter a'' $ B8.singleton ')'
92−-}
79+ addCallback :: B8.ByteString -> ResponseEnumerator a -> IO (Response a)
80+ addCallback cb e =
81+ return $ ResponseEnumerator $ helper
82+ where
83+ helper f =
84+ e helper'
85+ where
86+ helper' s hs =
87+ case checkJSON hs of
88+ Just hs' -> wrap $$ f s hs'
89+ Nothing -> f s hs
90+ wrap :: Step Builder IO b -> Iteratee Builder IO b
91+ wrap step = joinI $ after (enumList 1 [fromChar ')'])
92+ $$ enumList 1 [fromByteString cb, fromChar '('] step
93+ after :: Enumerator Builder IO b -> Enumeratee Builder Builder IO b
94+ after enum =
95+ loop
96+ where
97+ loop = checkDone $ continue . step
98+ step k EOF = enum (Continue k) >>== return
99+ step k s = k s >>== loop
93100
94101changeVal :: Eq a
95102 => a