-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.js
63 lines (48 loc) · 1.56 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
var parse = require('fast-json-parse')
var concat = require('concat-stream')
var assert = require('assert')
var http2 = require('http2')
var URL = require('url').URL
var pump = require('pump')
module.exports = function request (opts, cb) {
assert.equal(typeof opts, 'object', 'http2-request: opts should be type object')
assert.ok(opts.url, 'http2-request: opts.url should be provided')
if (!opts.connectOpts) opts.connectOpts = {}
var url = new URL(opts.url)
var clientSession = http2.connect(url.origin, opts.connectOpts)
clientSession.on('error', function (err) {
return cb(err)
})
if (!opts.clientOpts) opts.clientOpts = {}
if (!opts.json) opts.json = true
var reqHeaders = Object.assign({ ':method': opts.method || 'GET' }, opts.headers)
var req = clientSession.request(reqHeaders, opts.clientOpts)
req.on('response', function (headers) {
headers.statusCode = headers[':status']
headers.isOk = function () {
return headers[':status'] < 299
}
flush(null, headers)
})
req.on('error', function (err) {
flush(err)
})
function flush (err, headers) {
if (err) return cb(err)
if (!opts.body || typeof opts.body === 'string') {
req.end(opts.body)
} else if (opts.body.pipe) {
pump(opts.body, req)
}
pump(req, concat(end))
function end (buf) {
clientSession.destroy()
if (opts.json) {
var body = parse(buf.toString('utf8'))
if (body.err) cb(body.err)
return cb(null, headers, body.value)
}
cb(null, headers, buf.toString('utf8'))
}
}
}