@@ -17,9 +17,10 @@ import Control.Applicative (liftA2, liftA3)
1717import Control.Arrow (second)
1818import Control.Monad (join)
1919import Control.Monad.IO.Class (MonadIO, liftIO)
20+import Data.Bifunctor (first)
2021import qualified Data.ByteString.Lazy.Char8 as BL
2122import qualified Data.Map as Map
22−import Data.Maybe (catMaybes)
23+import Data.Maybe (catMaybes, fromMaybe)
2324import Data.Functor.Compose
2425import Data.Monoid ((<>))
2526import Data.Proxy (Proxy(..))
@@ -279,15 +280,10 @@ performRequest reqMeth req reqHost trigger = do
279280 return (resps, badReqs)
280281
281282
282−#ifdef ghcjs_HOST_OS
283−type XhrPayload = String
284−bytesToPayload :: BL.ByteString -> XhrPayload
285−bytesToPayload = BL.unpack
286−#else
287283type XhrPayload = T.Text
288284bytesToPayload :: BL.ByteString -> XhrPayload
289−bytesToPayload = T.pack . BL.unpack
290−#endif
285+bytesToPayload = TE.decodeUtf8 . BL.toStrict
286+
291287
292288performRequestNoBody :: forall t m tag.(SupportsServantReflex t m)
293289 => Text
@@ -296,20 +292,10 @@ performRequestNoBody :: forall t m tag.(SupportsServantReflex t m)
296292 -> Event t tag -> m (Event t (tag, ReqResult NoContent))
297293performRequestNoBody reqMeth req reqHost trigger = do
298294 (resp, badReq) <- performRequest reqMeth req reqHost trigger
299− return $ leftmost [ fmap (ResponseSuccess NoContent) <$> resp, fmap RequestFailure <$> badReq]
295+ let decodeResp = const $ Right NoContent
296+ return $ leftmost [ fmap (second (evalResponse decodeResp)) resp,
297+ fmap (second RequestFailure) badReq]
300298
301−performRequestsNoBody :: forall t m f tag. (SupportsServantReflex t m, Traversable f)
302− => Text
303− -> Dynamic t (f (Req t))
304− -> Dynamic t BaseUrl
305− -> Event t tag -> m (Event t (tag, f (ReqResult NoContent)))
306−performRequestsNoBody reqMeth reqs reqHost trigger = do
307− resp <- performRequests reqMeth reqs reqHost trigger
308− return $ (fmap . fmap) aux <$> resp
309− where
310− aux (Right x) = ResponseSuccess NoContent x
311− aux (Left e) = RequestFailure e
312− -- return $ leftmost [ fmap (ResponseSuccess NoContent) resp, fmap RequestFailure badReq]
313299
314300
315301performRequestCT
@@ -323,13 +309,15 @@ performRequestCT
323309 -> m (Event t (tag, ReqResult a))
324310performRequestCT ct reqMeth req reqHost trigger = do
325311 (resp, badReq) <- performRequest reqMeth req reqHost trigger
326− let decodes = ffor resp $ fmap (\xhr ->
327− ((mimeUnrender ct . BL.fromStrict . TE.encodeUtf8)
328− =<< note "No body text" (_xhrResponse_responseText xhr), xhr))
329− reqs = ffor decodes $ fmap (\case
330− (Right a, r) -> ResponseSuccess a r
331− (Left e, r) -> ResponseFailure (T.pack e) r)
332− return $ leftmost [reqs, fmap RequestFailure <$> badReq]
312+ let decodeResp x = first T.pack .
313+ mimeUnrender ct .
314+ BL.fromStrict .
315+ TE.encodeUtf8 =<< note "No body text"
316+ (_xhrResponse_responseText x)
317+
318+ return $ leftmost [fmap (second (evalResponse decodeResp)) resp,
319+ fmap (second RequestFailure) badReq]
320+
333321
334322performRequestsCT
335323 :: (SupportsServantReflex t m,
@@ -342,14 +330,52 @@ performRequestsCT
342330 -> m (Event t (tag, f (ReqResult a)))
343331performRequestsCT ct reqMeth reqs reqHost trigger = do
344332 resps <- performRequests reqMeth reqs reqHost trigger
345− return $ fmap (second (fmap reqToResult)) resps
346− where
347− reqToResult (Left e) = RequestFailure e
348− reqToResult (Right x) = case _xhrResponse_responseText x of
349− Nothing -> ResponseFailure "No request body" x
350− Just bod -> case mimeUnrender ct . BL.fromStrict . TE.encodeUtf8 $ bod of
351− Left e -> ResponseFailure (T.pack e) x
352− Right v -> ResponseSuccess v x
333+ let decodeResp x = first T.pack .
334+ mimeUnrender ct .
335+ BL.fromStrict .
336+ TE.encodeUtf8 =<< note "No body text"
337+ (_xhrResponse_responseText x)
338+ return $ ffor resps $ \(t, rs) ->
339+ (t, ffor rs $ \r -> case r of
340+ Left e -> RequestFailure e
341+ Right g -> evalResponse decodeResp g
342+ )
343+
344+
345+performRequestsNoBody
346+ :: (SupportsServantReflex t m,
347+ Traversable f)
348+ => Text
349+ -> Dynamic t (f (Req t))
350+ -> Dynamic t BaseUrl
351+ -> Event t tag
352+ -> m (Event t (tag, f (ReqResult NoContent)))
353+performRequestsNoBody reqMeth reqs reqHost trigger = do
354+ resps <- performRequests reqMeth reqs reqHost trigger
355+ let decodeResp = const $ Right NoContent
356+ return $ ffor resps $ \(t, rs) ->
357+ (t, ffor rs $ \r -> case r of
358+ Left e -> RequestFailure e
359+ Right g -> evalResponse decodeResp g
360+ )
361+
362+
363+
364+------------------------------------------------------------------------------
365+evalResponse :: (XhrResponse -> Either Text a) -> XhrResponse -> ReqResult a
366+evalResponse decode xhr =
367+ let okStatus = _xhrResponse_status xhr < 400
368+ errMsg = fromMaybe
369+ ("Empty response with error code " <>
370+ T.pack (show $ _xhrResponse_status xhr))
371+ (_xhrResponse_responseText xhr)
372+ respPayld = if okStatus
373+ then either (flip ResponseFailure xhr)
374+ (flip ResponseSuccess xhr) (decode xhr)
375+ else ResponseFailure errMsg xhr
376+ in respPayld
377+
378+
353379
354380
355381note :: e -> Maybe a -> Either e a