-
Notifications
You must be signed in to change notification settings - Fork 0
/
fetch.js
76 lines (62 loc) · 1.38 KB
/
fetch.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
68
69
70
71
72
73
74
75
76
const http = require("http");
const https = require("https");
const fs = require("fs");
this.http = http
this.https = https
//beware of http flag, defaults to true or false
const fetch = (url, options = {}, ishttp = false) => {
return new Promise((resolve, reject) => {
const urlObj = new URL(url);
let req
let protocol
if(ishttp){
protocol = 'http'
}else{
protocol = 'https'
}
req = this[protocol].request(urlObj, options, (res) => {
const response = new Response({
statusCode: res.statusCode,
headers: res.headers,
url: res.url,
});
const buffers = [];
res.on("data", (data) => {
buffers.push(data);
});
res.on("end", () => {
response.setBody(buffers);
resolve(response)
});
})
req.on("error", (e) => {
reject(e);
});
req.end();
});
};
class Response {
headers;
#body;
url;
statusCode;
constructor({ headers, body, statusCode, url }) {
this.headers = headers;
this.body = body;
this.statusCode = statusCode;
this.url = url;
}
async json() {
return JSON.parse(Buffer.concat(this.body).toString());
}
async text() {
return Buffer.concat(this.body).toString();
}
async blob() {
return Buffer.concat(this.body);
}
setBody(body) {
this.body = body;
}
}
module.exports = fetch;