feat: add gzip and deflate decompression support and request timeout option
This commit is contained in:
15
dist/index.js
vendored
15
dist/index.js
vendored
@ -2,13 +2,21 @@ import http from "http";
|
||||
import https from "https";
|
||||
import { URL } from "url";
|
||||
import querystring from "querystring";
|
||||
import zlib from "zlib";
|
||||
const decompress = (data, header) => {
|
||||
if (header === "gzip")
|
||||
return zlib.gunzipSync(data);
|
||||
if (header === "deflate")
|
||||
return zlib.inflateSync(data);
|
||||
return data;
|
||||
};
|
||||
const readData = (res, mode) => new Promise((resolve, reject) => {
|
||||
const chunks = [];
|
||||
res
|
||||
.on("data", chunk => chunks.push(chunk))
|
||||
.on("end", () => {
|
||||
const data = Buffer.concat(chunks);
|
||||
try {
|
||||
const data = decompress(Buffer.concat(chunks), res.headers["content-encoding"]);
|
||||
if (mode === "json")
|
||||
resolve(JSON.parse(data.toString("utf8")));
|
||||
else if (mode === "buffer")
|
||||
@ -39,6 +47,7 @@ export default async (urlString, options = {}) => {
|
||||
headers: {
|
||||
...options.headers,
|
||||
...(body ? { "Content-Length": Buffer.byteLength(body) } : {}),
|
||||
"Accept-Encoding": "gzip, deflate"
|
||||
}
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
@ -55,6 +64,10 @@ export default async (urlString, options = {}) => {
|
||||
arrayBuffer: () => readData(res, "arraybuffer")
|
||||
});
|
||||
});
|
||||
req.setTimeout(options.timeout || 5e3, () => {
|
||||
req.destroy();
|
||||
reject(new Error("Request timed out"));
|
||||
});
|
||||
req.on("error", reject);
|
||||
if (body)
|
||||
req.write(body);
|
||||
|
Reference in New Issue
Block a user