15
15
module Servant.Client.Internal.XhrClient where
16
16
17
17
import Control.Arrow
18
- import Data.ByteString.Builder (toLazyByteString )
19
18
import Control.Concurrent
20
19
import Control.Exception
21
20
import Control.Monad
@@ -25,22 +24,24 @@ import Control.Monad.Error.Class (MonadError (..))
25
24
import Control.Monad.Reader
26
25
import Control.Monad.Trans.Control (MonadBaseControl (.. ))
27
26
import Control.Monad.Trans.Except
28
- import qualified Data.ByteString.Char8 as BS
27
+ import Data.ByteString.Builder (toLazyByteString )
28
+ import qualified Data.ByteString.Char8 as BS
29
29
import Data.CaseInsensitive
30
30
import Data.Char
31
31
import Data.Foldable (toList )
32
32
import Data.Functor.Alt (Alt (.. ))
33
+ import Data.IORef (modifyIORef , newIORef , readIORef )
33
34
import Data.Proxy (Proxy (.. ))
34
- import qualified Data.Sequence as Seq
35
+ import qualified Data.Sequence as Seq
35
36
import Data.String.Conversions
36
37
import Foreign.StablePtr
37
38
import GHC.Generics
38
39
import GHCJS.Foreign.Callback
39
40
import GHCJS.Prim
40
41
import GHCJS.Types
41
42
import JavaScript.Web.Location
43
+ import Network.HTTP.Media (renderHeader )
42
44
import Network.HTTP.Types
43
- import Network.HTTP.Media (renderHeader )
44
45
import Servant.Client.Core
45
46
46
47
newtype JSXMLHttpRequest = JSXMLHttpRequest JSVal
@@ -152,7 +153,8 @@ performXhr xhr burl request = do
152
153
153
154
openXhr xhr (cs $ requestMethod request) (toUrl burl request) True
154
155
setHeaders xhr request
155
- sendXhr xhr (toBody request)
156
+ body <- toBody request
157
+ sendXhr xhr body
156
158
takeMVar waiter
157
159
158
160
freeStablePtr s
@@ -226,11 +228,31 @@ foreign import javascript unsafe "$1.send()"
226
228
foreign import javascript unsafe " $1.send($2)"
227
229
js_sendXhrWithBody :: JSXMLHttpRequest -> JSVal -> IO ()
228
230
229
- toBody :: Request -> Maybe String
231
+ toBody :: Request -> IO ( Maybe String )
230
232
toBody request = case requestBody request of
231
- Nothing -> Nothing
232
- Just (RequestBodyLBS " " , _) -> Nothing
233
- Just (RequestBodyLBS x, _) -> Just $ cs x
233
+ Nothing -> return Nothing
234
+ Just (a, _) -> go a
235
+
236
+ where
237
+ go :: RequestBody -> IO (Maybe String )
238
+ go x = case x of
239
+ RequestBodyLBS x -> return $ mBody x
240
+ RequestBodyBS x -> return $ mBody x
241
+ RequestBodyBuilder _ x -> return $ mBody $ toLazyByteString x
242
+ RequestBodyStream _ x -> mBody <$> readBody x
243
+ RequestBodyStreamChunked x -> mBody <$> readBody x
244
+ RequestBodyIO x -> x >>= go
245
+
246
+ mBody :: ConvertibleStrings a String => a -> Maybe String
247
+ mBody x = let y = cs x in if y == " " then Nothing else Just y
248
+
249
+ readBody writer = do
250
+ m <- newIORef mempty
251
+ _ <- writer (\ bsAct -> do
252
+ bs <- bsAct
253
+ modifyIORef m (<> bs))
254
+ readIORef m
255
+
234
256
235
257
-- * inspecting the xhr response
236
258
0 commit comments