|
1 |
| -var http = require('http') |
2 |
| -var qs = require('querystring') |
3 |
| -var getFilesStream = require('./get-files-stream') |
4 |
| - |
5 |
| -exports = module.exports = function getRequestAPI (config) { |
6 |
| - return requestAPI |
7 |
| - |
8 |
| - function requestAPI (path, args, opts, files, buffer, cb) { |
9 |
| - var query, stream, contentType |
10 |
| - contentType = 'application/json' |
| 1 | +var request = require('superagent') |
11 | 2 |
|
12 |
| - if (Array.isArray(path)) path = path.join('/') |
| 3 | +var safeJSONParser = require('./json-parser') |
| 4 | +var getFilesStream = require('./get-files-stream') |
13 | 5 |
|
14 |
| - opts = opts || {} |
| 6 | +var isNode = !global.window |
15 | 7 |
|
16 |
| - if (args && !Array.isArray(args)) args = [args] |
17 |
| - if (args) opts.arg = args |
| 8 | +function requestAPI (config, path, args, opts, files, buffer, cb) { |
| 9 | + opts = opts || {} |
| 10 | + if (Array.isArray(path)) path = path.join('/') |
| 11 | + if (args && !Array.isArray(args)) args = [args] |
| 12 | + if (args) opts.arg = args |
18 | 13 |
|
19 |
| - if (files) { |
20 |
| - stream = getFilesStream(files, opts) |
21 |
| - if (!stream.boundary) { |
22 |
| - throw new Error('no boundary in multipart stream') |
23 |
| - } |
24 |
| - contentType = 'multipart/form-data; boundary=' + stream.boundary |
25 |
| - } |
26 |
| - |
27 |
| - if (typeof buffer === 'function') { |
28 |
| - cb = buffer |
29 |
| - buffer = false |
30 |
| - } |
| 14 | + if (typeof buffer === 'function') { |
| 15 | + cb = buffer |
| 16 | + buffer = false |
| 17 | + } |
31 | 18 |
|
32 |
| - // this option is only used internally, not passed to daemon |
33 |
| - delete opts.followSymlinks |
| 19 | + // this option is only used internally, not passed to daemon |
| 20 | + delete opts.followSymlinks |
34 | 21 |
|
35 |
| - opts['stream-channels'] = true |
36 |
| - query = qs.stringify(opts) |
| 22 | + var method = files ? 'POST' : 'GET' |
| 23 | + var url = `${config.host}:${config.port}${config['api-path']}${path}` |
37 | 24 |
|
38 |
| - var reqo = { |
39 |
| - method: files ? 'POST' : 'GET', |
40 |
| - host: config.host, |
41 |
| - port: config.port, |
42 |
| - path: config['api-path'] + path + '?' + query, |
43 |
| - headers: { |
44 |
| - 'User-Agent': config['user-agent'], |
45 |
| - 'Content-Type': contentType |
46 |
| - }, |
47 |
| - withCredentials: false |
48 |
| - } |
| 25 | + var req = request(method, url) |
| 26 | + .set('User-Agent', config['user-agent']) |
| 27 | + .query(opts) |
| 28 | + .query('stream-channels') |
| 29 | + .parse(safeJSONParser.bind(null, buffer)) |
| 30 | + .on('error', cb) |
| 31 | + .on('response', res => { |
| 32 | + if (res.error) return cb(res.error) |
49 | 33 |
|
50 |
| - var req = http.request(reqo, function (res) { |
51 |
| - var data = '' |
52 |
| - var objects = [] |
53 |
| - var stream = !!res.headers && !!res.headers['x-stream-output'] |
54 |
| - var chunkedObjects = !!res.headers && !!res.headers['x-chunked-output'] |
| 34 | + var headers = !!res.headers |
| 35 | + var stream = headers && !!res.headers['x-stream-output'] |
| 36 | + var chunkedObjects = headers && !!res.headers['x-chunked-output'] |
55 | 37 |
|
56 | 38 | if (stream && !buffer) return cb(null, res)
|
57 | 39 | if (chunkedObjects && buffer) return cb(null, res)
|
58 | 40 |
|
59 |
| - res.on('data', function (chunk) { |
60 |
| - if (!chunkedObjects) { |
61 |
| - data += chunk |
62 |
| - return data |
63 |
| - } |
64 |
| - |
65 |
| - try { |
66 |
| - var obj = JSON.parse(chunk.toString()) |
67 |
| - objects.push(obj) |
68 |
| - } catch (e) { |
69 |
| - chunkedObjects = false |
70 |
| - data += chunk |
71 |
| - } |
72 |
| - }) |
73 |
| - res.on('end', function () { |
74 |
| - var parsed |
75 |
| - |
76 |
| - if (!chunkedObjects) { |
77 |
| - try { |
78 |
| - parsed = JSON.parse(data) |
79 |
| - data = parsed |
80 |
| - } catch (e) {} |
81 |
| - } else { |
82 |
| - data = objects |
83 |
| - } |
84 |
| - |
85 |
| - if (res.statusCode >= 400 || !res.statusCode) { |
86 |
| - if (!data) data = new Error() |
87 |
| - return cb(data, null) |
88 |
| - } |
89 |
| - return cb(null, data) |
90 |
| - }) |
91 |
| - res.on('error', function (err) { |
92 |
| - return cb(err, null) |
93 |
| - }) |
| 41 | + return cb(null, res.body) |
94 | 42 | })
|
95 | 43 |
|
96 |
| - req.on('error', function (err) { |
97 |
| - return cb(err, null) |
98 |
| - }) |
| 44 | + // Superagent does not support buffering on the client side |
| 45 | + if (isNode) { |
| 46 | + req.buffer(buffer) |
| 47 | + } |
99 | 48 |
|
100 |
| - if (stream) { |
101 |
| - stream.pipe(req) |
102 |
| - } else { |
103 |
| - req.end() |
| 49 | + if (files) { |
| 50 | + var stream = getFilesStream(files, opts) |
| 51 | + if (!stream.boundary) { |
| 52 | + return cb(new Error('no boundary in multipart stream')) |
104 | 53 | }
|
105 |
| - |
106 |
| - return req |
| 54 | + req.set('Content-Type', 'multipart/form-data; boundary=' + stream.boundary) |
| 55 | + stream.pipe(req) |
| 56 | + } else { |
| 57 | + req.end() |
107 | 58 | }
|
108 | 59 | }
|
| 60 | + |
| 61 | +module.exports = function getRequestAPI (config) { |
| 62 | + return requestAPI.bind(null, config) |
| 63 | +} |
0 commit comments