1 | "use strict";
|
2 | var __importStar = (this && this.__importStar) || function (mod) {
|
3 | if (mod && mod.__esModule) return mod;
|
4 | var result = {};
|
5 | if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
6 | result["default"] = mod;
|
7 | return result;
|
8 | };
|
9 | Object.defineProperty(exports, "__esModule", { value: true });
|
10 | const HTTPS = __importStar(require("https"));
|
11 | const HTTP = __importStar(require("http"));
|
12 | const URL = __importStar(require("url"));
|
13 | const fs_1 = require("fs");
|
14 | var timeout_num = 30 * 1000;
|
15 | var taskGenId = 0;
|
16 | function makeTaskId() {
|
17 | ++taskGenId;
|
18 | return taskGenId;
|
19 | }
|
20 | var task_cache = {};
|
21 | let cert_cache = {};
|
22 | function loadCert(name, cert_path, key_path, passphrase) {
|
23 | try {
|
24 | cert_cache[name] = {
|
25 | cert: fs_1.readFileSync(cert_path),
|
26 | key: fs_1.readFileSync(key_path),
|
27 | pass: passphrase
|
28 | };
|
29 | return true;
|
30 | }
|
31 | catch (e) {
|
32 | return false;
|
33 | }
|
34 | }
|
35 | exports.loadCert = loadCert;
|
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 | function http_quest(type, url, data = {}, retry = 0, headers = {}, _option) {
|
47 |
|
48 | let checkHead = url.slice(0, 7);
|
49 | if (checkHead != 'http://' && checkHead != 'https:/') {
|
50 |
|
51 | url = 'http://' + url;
|
52 | }
|
53 | type = type.toLowerCase();
|
54 | return new Promise(function (resolve, reject) {
|
55 | let option = {};
|
56 | if (typeof _option == 'string') {
|
57 | option = { dtype: _option };
|
58 | }
|
59 | else {
|
60 | option = Object.assign(option, _option || {});
|
61 | }
|
62 | var taskId = makeTaskId();
|
63 | task_cache[taskId] = {
|
64 | taskId: taskId,
|
65 | url: url,
|
66 | retry: retry,
|
67 | data: data,
|
68 | type: type,
|
69 | headers: headers,
|
70 | option: option,
|
71 | resolve: resolve,
|
72 | reject: reject
|
73 | };
|
74 | make_quest(taskId);
|
75 | });
|
76 | }
|
77 | exports.http_quest = http_quest;
|
78 | function onResponse(taskid, res) {
|
79 | let task = task_cache[taskid];
|
80 | if (task) {
|
81 | task.res = res;
|
82 | if (res) {
|
83 | let size = Math.min(parseInt(res.headers["content-length"] || '1024'), 128 * 1024);
|
84 | task.respon_data = Buffer.alloc(size);
|
85 | task.respon_len = 0;
|
86 | res.on("data", onData.bind(null, taskid));
|
87 | res.on("end", onEnd.bind(null, taskid));
|
88 | res.on("error", onEnd.bind(null, taskid));
|
89 | }
|
90 | else if (!task.respon_data) {
|
91 |
|
92 | if (task.retry > 0) {
|
93 | --task.retry;
|
94 | }
|
95 | else {
|
96 | onEnd(taskid);
|
97 | }
|
98 | }
|
99 | }
|
100 | }
|
101 | function onData(taskid, data) {
|
102 | let info = task_cache[taskid];
|
103 | if (!info || info.respon_len == undefined || info.respon_data == undefined)
|
104 | return;
|
105 | if (info.respon_len + data.length > info.respon_data.length) {
|
106 |
|
107 | let nbuff = Buffer.alloc(info.respon_len + data.length + 2 * 1024);
|
108 | info.respon_data.copy(nbuff, 0, 0, info.respon_len);
|
109 | info.respon_data = nbuff;
|
110 | }
|
111 | info.respon_len += data.copy(info.respon_data, info.respon_len, 0, data.length);
|
112 | }
|
113 | function onEnd(taskid) {
|
114 | let info = task_cache[taskid];
|
115 | if (!info)
|
116 | return;
|
117 | let out = null;
|
118 | if (info.respon_data && info.respon_len) {
|
119 | out = info.respon_data.slice(0, info.respon_len);
|
120 | }
|
121 | switch (info.option.respon_type) {
|
122 | case 'json':
|
123 | try {
|
124 | out && (out = JSON.parse(out.toString()));
|
125 | }
|
126 | catch (e) {
|
127 | out && (out = out.toString());
|
128 | }
|
129 | break;
|
130 | case 'buffer':
|
131 | break;
|
132 | case 'text':
|
133 | case undefined:
|
134 | out && (out = out.toString());
|
135 | break;
|
136 | default:
|
137 | break;
|
138 | }
|
139 | if (out) {
|
140 | if (info.option.respon_head) {
|
141 | info.resolve([out, info.res ? info.res.headers : {}]);
|
142 | }
|
143 | else {
|
144 | info.resolve(out);
|
145 | }
|
146 | }
|
147 | else {
|
148 | if (info.option.respon_head) {
|
149 | info.reject(['404 ' + info.url, info.res ? info.res.headers : {}]);
|
150 | }
|
151 | else {
|
152 | info.reject('404 ' + info.url);
|
153 | }
|
154 | }
|
155 | delete task_cache[taskid];
|
156 | }
|
157 | function make_quest(taskId) {
|
158 | let task = task_cache[taskId];
|
159 | if (task.type == 'get') {
|
160 | http_get(task);
|
161 | }
|
162 | else if (task.type == 'post') {
|
163 | if (task.option.request_type == 'formdata') {
|
164 | let Needle = require('needle');
|
165 | Needle.post(task.url, task.data, { multipart: true }, function (err, res) {
|
166 | if (err) {
|
167 | onEnd(taskId);
|
168 | return;
|
169 | }
|
170 | let size = Math.min(parseInt(res.headers["content-length"] || '1024'), 128 * 1024);
|
171 | task.respon_data = Buffer.alloc(size);
|
172 | task.respon_len = 0;
|
173 | onData(taskId, res.raw);
|
174 | onEnd(taskId);
|
175 | });
|
176 | }
|
177 | else {
|
178 | http_post(task);
|
179 | }
|
180 | }
|
181 | else {
|
182 | process.nextTick(function () { onResponse(taskId); });
|
183 | }
|
184 | }
|
185 | function stringify(method, data) {
|
186 | if (typeof data == 'object') {
|
187 | let urldata = [];
|
188 | for (let key in data) {
|
189 | let value = data[key];
|
190 | if (typeof value == 'object') {
|
191 | value = JSON.stringify(value);
|
192 | }
|
193 | urldata.push(`${key}=${encodeURIComponent(value)}`);
|
194 | }
|
195 | return urldata.join('&');
|
196 | }
|
197 | if (data == undefined)
|
198 | data = '';
|
199 | return encodeURIComponent(data);
|
200 | }
|
201 | function http_get(task) {
|
202 | let url = task.url;
|
203 | let headers = task.headers;
|
204 | try {
|
205 | let urldata = stringify('get', task.data);
|
206 | if (urldata.length > 0) {
|
207 | if (url.indexOf('?') >= 0) {
|
208 | url = url + '&' + urldata;
|
209 | }
|
210 | else {
|
211 | url = url + '?' + urldata;
|
212 | }
|
213 | }
|
214 | let opt = URL.parse(url);
|
215 | if (headers) {
|
216 | if (!opt['headers'])
|
217 | opt['headers'] = {};
|
218 | for (let key in headers) {
|
219 | opt['headers'][key] = headers[key];
|
220 | }
|
221 | }
|
222 | let cert_info = cert_cache[task.option.ca_name || ''];
|
223 | if (cert_info) {
|
224 | opt.cert = cert_info.cert;
|
225 | opt.key = cert_info.key;
|
226 | opt.passphrase = cert_info.pass;
|
227 | }
|
228 | let r = (url.indexOf('https://') == 0) ? HTTPS.get(opt, function (res) { onResponse(task.taskId, res); }) : HTTP.get(opt, function (res) { onResponse(task.taskId, res); });
|
229 | r.on("error", function (e) { onResponse(task.taskId); });
|
230 | r.setTimeout(timeout_num, function () { onResponse(task.taskId); });
|
231 | }
|
232 | catch (e) {
|
233 | process.nextTick(function () { onResponse(task.taskId); });
|
234 | }
|
235 | }
|
236 | function http_post(task) {
|
237 | let url = task.url;
|
238 | let data = task.data;
|
239 | let headers = task.headers;
|
240 | let type = task.option.request_type || 'text';
|
241 | try {
|
242 | let contents = "";
|
243 | let Query = URL.parse(url);
|
244 | Query['method'] = 'POST';
|
245 | switch (type) {
|
246 | case 'plain': {
|
247 | contents = data;
|
248 | Query['headers'] = {
|
249 | 'Content-Type': 'text/plain',
|
250 | 'Content-Length': Buffer.byteLength(contents)
|
251 | };
|
252 | break;
|
253 | }
|
254 | case 'json': {
|
255 | if (typeof data == 'string') {
|
256 | contents = data;
|
257 | }
|
258 | else {
|
259 | contents = JSON.stringify(data);
|
260 | }
|
261 | Query['headers'] = {
|
262 | 'Content-Type': 'application/json',
|
263 | 'Content-Length': Buffer.byteLength(contents)
|
264 | };
|
265 | break;
|
266 | }
|
267 | case 'xml': {
|
268 | contents = data;
|
269 | Query['headers'] = {
|
270 | 'Content-Type': 'text/xml',
|
271 | };
|
272 | break;
|
273 | }
|
274 | default: {
|
275 | contents = stringify('post', data);
|
276 | Query['headers'] = {
|
277 | 'Content-Type': 'application/x-www-form-urlencoded',
|
278 | 'Content-Length': contents.length
|
279 | };
|
280 | break;
|
281 | }
|
282 | }
|
283 | if (headers) {
|
284 | for (let key in headers) {
|
285 | Query['headers'][key] = headers[key];
|
286 | }
|
287 | }
|
288 | let cert_info = cert_cache[task.option.ca_name || ''];
|
289 | if (cert_info) {
|
290 | Query.cert = cert_info.cert;
|
291 | Query.key = cert_info.key;
|
292 | Query.passphrase = cert_info.pass;
|
293 | }
|
294 | let r = (url.indexOf('https://') == 0) ? HTTPS.request(Query, function (res) { onResponse(task.taskId, res); }) : HTTP.request(Query, function (res) { onResponse(task.taskId, res); });
|
295 | r.on("error", function () { onResponse(task.taskId); });
|
296 | r.write(contents, 'utf8');
|
297 | r.end();
|
298 | r.setTimeout(timeout_num, function () { onResponse(task.taskId); });
|
299 | }
|
300 | catch (e) {
|
301 | process.nextTick(function () { onResponse(task.taskId); });
|
302 | }
|
303 | }
|