UNPKG

9.82 kBJavaScriptView Raw
1"use strict";
2var __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};
9Object.defineProperty(exports, "__esModule", { value: true });
10const HTTPS = __importStar(require("https"));
11const HTTP = __importStar(require("http"));
12const URL = __importStar(require("url"));
13const fs_1 = require("fs");
14var timeout_num = 30 * 1000;
15var taskGenId = 0;
16function makeTaskId() {
17 ++taskGenId;
18 return taskGenId;
19}
20var task_cache = {};
21let cert_cache = {};
22function 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}
35exports.loadCert = loadCert;
36/**
37 * 异步流程执行网络请求
38 * @param type
39 * @param url
40 * @param data
41 * @param retry
42 * @param headers
43 * @param dtype
44 * @param rtype
45 */
46function http_quest(type, url, data = {}, retry = 0, headers = {}, _option) {
47 // 这里url增加一个 http https 头检查
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}
77exports.http_quest = http_quest;
78function 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}
101function 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); // 额外多2K的数据容量
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}
113function 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}
157function 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}
185function 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}
201function 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}
236function 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}