@@ -2,6 +2,7 @@ import stream
2
2
import io
3
3
import io/error
4
4
import stringbuffer
5
+ import bytearray
5
6
6
7
// Async iterables
7
8
// ---------------
@@ -33,6 +34,7 @@ interface RequestBuilder {
33
34
def port(port: Int): Unit
34
35
def protocol(proto: Protocol): Unit
35
36
def header(key: String, value: String): Unit
37
+ def body{ writer: => Unit / emit[Byte] }: Unit
36
38
}
37
39
interface ResponseReader {
38
40
def status(): Int
@@ -123,10 +125,18 @@ namespace jsNode {
123
125
"""
124
126
125
127
extern type NativeResponse
126
- extern async def runHTTP(obj: js::JsObj): NativeResponse =
127
- jsNode "$effekt.capture(callback => http.request(${obj}, callback).on('error', callback).end())"
128
- extern async def runHTTPS(obj: js::JsObj): NativeResponse =
129
- jsNode "$effekt.capture(callback => https.request(${obj}, callback).on('error', callback).end())"
128
+ extern async def runHTTP(obj: js::JsObj, body: ByteArray): NativeResponse =
129
+ jsNode """$effekt.capture(callback => {
130
+ let req = http.request(${obj}, callback).on('error', callback);
131
+ req.write(${body})
132
+ req.end()
133
+ })"""
134
+ extern async def runHTTPS(obj: js::JsObj, body: ByteArray): NativeResponse =
135
+ jsNode """$effekt.capture(callback => {
136
+ let req = https.request(${obj}, callback).on('error', callback);
137
+ req.write(${body})
138
+ req.end();
139
+ })"""
130
140
131
141
extern io def statusCode(r: NativeResponse): Int =
132
142
jsNode "${r}.statusCode"
@@ -162,17 +172,19 @@ namespace jsNode {
162
172
val options = js::empty()
163
173
options.js::set("headers", js::empty())
164
174
var protocol = HTTPS()
175
+ var reqBody: ByteArray = allocate(0)
165
176
try body() with RequestBuilder {
166
177
def method(m) = resume(options.js::set("method", m.show))
167
178
def hostname(n) = resume(options.js::set("hostname", n))
168
179
def path(p) = resume(options.js::set("path", p))
169
180
def port(p) = resume(options.js::set("port", p))
170
181
def header(k, v) = resume(options.js::set("headers", k, v))
171
182
def protocol(p) = resume(protocol = p)
183
+ def body() = resume{ {wr} => reqBody = collectBytes{ wr } }
172
184
}
173
185
val res = protocol match {
174
- case HTTP() => runHTTP(options)
175
- case HTTPS() => runHTTPS(options)
186
+ case HTTP() => runHTTP(options, reqBody )
187
+ case HTTPS() => runHTTPS(options, reqBody )
176
188
}
177
189
if(res.isError) { println(res.genericShow); do raise(RequestError(), "Request failed") }
178
190
@@ -226,6 +238,7 @@ namespace jsWeb {
226
238
def port(p) = resume(port = p)
227
239
def header(k, v) = resume(options.js::set("headers", k, v))
228
240
def protocol(p) = resume(protocol = p)
241
+ def body() = resume{ {wr} => options.js::set("body", collectBytes{wr}) }
229
242
}
230
243
val url = s"${protocol.show}://${hostname}:${port.show}${path}"
231
244
val res = run(url, options)
0 commit comments