forked from pankleks/planck-http-fetch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFetch.ts
117 lines (97 loc) · 3.58 KB
/
Fetch.ts
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import * as Http from "http";
import * as Https from "https";
import * as Url from "url";
class FetchEx extends Error {
constructor(message: string, public readonly statusCode?: number) {
super(message);
}
}
export class Fetch {
protected readonly _options: Https.RequestOptions;
constructor(url: string, timeoutMS = 10000) {
const temp = Url.parse(url);
this._options = {
hostname: temp.hostname,
port: Number.parseInt(temp.port),
path: temp.path,
protocol: temp.protocol,
method: "GET",
timeout: timeoutMS,
rejectUnauthorized: true,
headers: {}
};
}
head(key: string, value: any) {
this._options.headers[key] = value;
return this;
}
unauthorized() {
this._options.rejectUnauthorized = false;
return this;
}
basicAuth(user: string, password: string) {
this._options.headers["Authorization"] = "Basic " + Buffer.from(user + ":" + password).toString("base64");
return this;
}
bearerAuth(token: string) {
this._options.headers["Authorization"] = `Bearer ${token}`;
return this;
}
private initRequest(resolve: (response: Http.IncomingMessage) => void, reject: (ex: FetchEx) => void) {
const request = (this._options.protocol === "http:" ? Http.request : Https.request)(
this._options,
(response) => {
if (response.statusCode < 200 || response.statusCode > 299)
reject(new FetchEx(`http resp. invalid code = ${response.statusCode}, ${response.statusMessage}`, response.statusCode));
else {
response.on("error", (ex) => {
reject(new FetchEx(`http resp. error, ${ex.message || ex}`, response.statusCode));
});
resolve(response);
}
});
request.on("error", (ex) => {
reject(new FetchEx(`http req. error, ${ex.message || ex}`));
});
return request;
}
fetch(content?: string | Buffer, contentType = "application/json;charset=utf-8", method?: string, encoding?: string) {
if (content != null) {
this._options.method = "POST";
this._options.headers["Content-Type"] = contentType;
this._options.headers["Content-Length"] = Buffer.byteLength(content, encoding || "utf8");
}
if (method != null)
this._options.method = method;
return new Promise<string>((resolve, reject) => {
const request = this.initRequest(
(response) => {
response.setEncoding(encoding || "utf8");
let data = "";
response.on("data", (chunk) => {
data += chunk;
});
response.on("end", () => {
resolve(data);
});
},
reject);
if (content != null)
request.write(content, encoding);
request.end();
});
}
pipe(stream: NodeJS.WritableStream, end?: boolean) {
return new Promise<string>((resolve, reject) => {
const request = this.initRequest(
(response) => {
response.pipe(stream, { end });
stream.on("finish", () => {
resolve();
});
},
reject);
request.end();
});
}
}