Skip to content

Commit d7b83f2

Browse files
committed
Support Buffer request body
1 parent 710e050 commit d7b83f2

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

src/Hyper/Node/Server.purs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import Prelude
1414
import Data.HTTP.Method as Method
1515
import Data.Int as Int
1616
import Data.StrMap as StrMap
17+
import Node.Buffer as Buffer
1718
import Node.HTTP as HTTP
1819
import Node.Stream as Stream
1920
import Control.IxMonad (ipure, (:*>), (:>>=))
@@ -32,10 +33,10 @@ import Hyper.Conn (Conn)
3233
import Hyper.Middleware (Middleware, evalMiddleware, lift')
3334
import Hyper.Middleware.Class (getConn, modifyConn)
3435
import Hyper.Port (Port(..))
35-
import Hyper.Request (class ReadableBody, class Request, RequestData)
36+
import Hyper.Request (class ReadableBody, class Request, RequestData, readBody)
3637
import Hyper.Response (class ResponseWritable, class Response, ResponseEnded, StatusLineOpen)
3738
import Hyper.Status (Status(..))
38-
import Node.Buffer (Buffer)
39+
import Node.Buffer (BUFFER, Buffer)
3940
import Node.Encoding (Encoding(..))
4041
import Node.HTTP (HTTP)
4142
import Node.Stream (Writable)
@@ -82,30 +83,36 @@ instance bufferNodeResponse :: (MonadAff e m)
8283
toResponse buf =
8384
ipure (write buf)
8485

85-
readBody
86+
readBodyAsBuffer
8687
:: forall e.
8788
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
9091
let stream = HTTP.requestAsStream request
9192
completeBody <- makeVar
92-
chunks <- makeVar' ""
93+
chunks <- makeVar' []
9394
e <- liftEff (catchException (pure <<< Just) (fillBody stream chunks completeBody *> pure Nothing))
9495
case e of
9596
Just err -> throwError err
9697
Nothing -> takeVar completeBody
9798
where
9899
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
102104

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
105112
readBody =
106113
_.request <$> getConn :>>=
107114
case _ of
108-
r -> lift' (liftAff (readBody r))
115+
r -> liftAff (readBodyAsBuffer r)
109116

110117
-- TODO: Make a newtype
111118
data HttpResponse state = HttpResponse HTTP.Response

src/Hyper/Request.purs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class Request req m where
3333
class Request req m <= BaseRequest req m
3434

3535
-- | A ReadableBody instance reads the request body for a specific body
36-
-- | reader type.
37-
class ReadableBody req m b | req -> b where
36+
-- | type.
37+
class ReadableBody req m b where
3838
readBody
3939
:: forall res c
4040
. Middleware

0 commit comments

Comments
 (0)