-
Notifications
You must be signed in to change notification settings - Fork 18
/
extract.js
67 lines (60 loc) · 1.61 KB
/
extract.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
64
65
66
67
"use strict";
const url = require("url");
const qs = require("querystring");
const pathToRegexp = require("path-to-regexp");
const format = require("../template/format");
module.exports.incomingRequest = req => {
return new Promise((resolve, reject) => {
const result = {};
const urlObj = url.parse(req.url);
result.method = req.method;
result.path = urlObj.pathname;
result.query = qs.parse(urlObj.query);
result.url = req.url;
result.headers = req.headers;
if (req.body) {
result.body = req.body;
return resolve(result);
}
// has some body contents
if (req.headers && req.headers["content-length"]) {
var data = "";
req.on("readable", () => {
const chunk = req.read();
if (chunk) {
data += chunk;
}
});
req.on("end", () => {
result.body = JSON.parse(data);
resolve(result);
});
req.on("error", reject);
} else {
return resolve(result);
}
});
};
module.exports.outgoingRequest = (req, opts) => {
const result = {};
result.path =
req.path.indexOf(":") >= 0
? tryCompilePath(req.path, req.values)
: req.path;
const query = req.query && qs.stringify(format(req.query, req.values));
if (query) {
result.path += `?${query}`;
}
result.method = req.method;
result.headers = (req.headers && format(req.headers, req.values)) || {};
result.host = opts.host;
result.port = opts.port;
return result;
};
function tryCompilePath(path, values) {
try {
return pathToRegexp.compile(path)(values);
} catch (e) {
return path.replace(/:/g, "");
}
}