@@ -14,6 +14,7 @@ import Prelude
14
14
import Data.HTTP.Method as Method
15
15
import Data.Int as Int
16
16
import Data.StrMap as StrMap
17
+ import Node.Buffer as Buffer
17
18
import Node.HTTP as HTTP
18
19
import Node.Stream as Stream
19
20
import Control.IxMonad (ipure , (:*>), (:>>=))
@@ -32,10 +33,10 @@ import Hyper.Conn (Conn)
32
33
import Hyper.Middleware (Middleware , evalMiddleware , lift' )
33
34
import Hyper.Middleware.Class (getConn , modifyConn )
34
35
import Hyper.Port (Port (..))
35
- import Hyper.Request (class ReadableBody , class Request , RequestData )
36
+ import Hyper.Request (class ReadableBody , class Request , RequestData , readBody )
36
37
import Hyper.Response (class ResponseWritable , class Response , ResponseEnded , StatusLineOpen )
37
38
import Hyper.Status (Status (..))
38
- import Node.Buffer (Buffer )
39
+ import Node.Buffer (BUFFER , Buffer )
39
40
import Node.Encoding (Encoding (..))
40
41
import Node.HTTP (HTTP )
41
42
import Node.Stream (Writable )
@@ -82,30 +83,36 @@ instance bufferNodeResponse :: (MonadAff e m)
82
83
toResponse buf =
83
84
ipure (write buf)
84
85
85
- readBody
86
+ readBodyAsBuffer
86
87
:: forall e .
87
88
HttpRequest
88
- -> Aff (http :: HTTP , avar :: AVAR | e ) String
89
- readBody (HttpRequest request _) = do
89
+ -> Aff (http :: HTTP , avar :: AVAR , buffer :: BUFFER | e ) Buffer
90
+ readBodyAsBuffer (HttpRequest request _) = do
90
91
let stream = HTTP .requestAsStream request
91
92
completeBody <- makeVar
92
- chunks <- makeVar' " "
93
+ chunks <- makeVar' []
93
94
e <- liftEff (catchException (pure <<< Just ) (fillBody stream chunks completeBody *> pure Nothing ))
94
95
case e of
95
96
Just err -> throwError err
96
97
Nothing -> takeVar completeBody
97
98
where
98
99
fillBody stream chunks completeBody = do
99
- Stream .onDataString stream UTF8 \chunk -> void do
100
- launchAff (modifyVar (_ <> chunk) chunks)
101
- Stream .onEnd stream $ void (launchAff (takeVar chunks >>= putVar completeBody))
100
+ Stream .onData stream \chunk -> void do
101
+ launchAff (modifyVar (_ <> [chunk]) chunks)
102
+ Stream .onEnd stream $ void (launchAff (takeVar chunks >>= concat' >>= putVar completeBody))
103
+ concat' = liftEff <<< Buffer .concat
102
104
103
- instance requestBodyReaderReqestBody :: (Monad m , MonadAff (http :: HTTP , avar :: AVAR | e ) m )
104
- => ReadableBody HttpRequest m String where
105
+ instance readableBodyHttpRequestString :: (Monad m , MonadAff (http :: HTTP , avar :: AVAR , buffer :: BUFFER | e ) m )
106
+ => ReadableBody HttpRequest m String where
107
+ readBody =
108
+ readBody :>>= (liftEff <<< Buffer .toString UTF8 )
109
+
110
+ instance readableBodyHttpRequestBuffer :: (Monad m , MonadAff (http :: HTTP , avar :: AVAR , buffer :: BUFFER | e ) m )
111
+ => ReadableBody HttpRequest m Buffer where
105
112
readBody =
106
113
_.request <$> getConn :>>=
107
114
case _ of
108
- r -> lift' ( liftAff (readBody r) )
115
+ r -> liftAff (readBodyAsBuffer r )
109
116
110
117
-- TODO: Make a newtype
111
118
data HttpResponse state = HttpResponse HTTP.Response
0 commit comments