/
NodeHttpCodeGenerator.ts
129 lines (108 loc) · 3.76 KB
/
NodeHttpCodeGenerator.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
118
119
120
121
122
123
124
125
126
127
128
129
declare function require(module: string) : any;
declare function registerCodeGenerator(callback : Object) : void;
declare interface Request {
name: string;
url: string;
method: string;
headers: Object;
body: any;
httpBasicAuth: Object;
followRedirects: boolean,
sendCookies: boolean,
storeCookies: boolean,
timeout: number
}
class ParsedURL {
public schema = 'http';
public host = 'localhost';
public port = 80;
public path = '/';
constructor(url: string) {
const regexp = /(https?):\/\/([^\/:]+):?(\d*)(\/?.*)/;
const match = url.match(regexp);
if (match) {
this.schema = match[1];
this.host = match[2];
this.port = match[3].length > 0 ? +match[3] : (()=> {
if (this.schema == 'https') return 443;
return 80;
})();
this.path = match[4];
}
}
}
class NodeHttpCodeGenerator {
static title = "Node.js (require http/https)";
static fileExtension = "js";
static languageHighlighter = "js";
static identifier = "io.andrian.PawExtensions.NodeHttpCodeGenerator";
private multipleRequestNotice(request: Request[]) {
if (request.length > 1) {
return "// Warning: requests below are going to be executed in parallel\n\n"
}
return '';
}
public generate(context: any, requests: Request[], options) {
if (!Array.isArray(requests)) {
requests = [context.getCurrentRequest()];
}
return this.multipleRequestNotice(requests) + requests.map(this.generateRequest).join("\n");
}
private generateRequest(request: Request) {
const headers = request.headers;
for (var key in headers) {
headers[key] = headers[key].trim();
}
const parsedUrl = new ParsedURL(request.url);
return `// request ${request.name}
(function(callback) {
'use strict';
const httpTransport = require('${parsedUrl.schema}');
const responseEncoding = 'utf8';
const httpOptions = {
hostname: '${parsedUrl.host}',
port: '${parsedUrl.port}',
path: '${parsedUrl.path}',
method: '${request.method}',
headers: ${JSON.stringify(headers)}
};
httpOptions.headers['User-Agent'] = 'node ' + process.version;
${
(request.httpBasicAuth? ' // Using Basic Auth ' + JSON.stringify(request.httpBasicAuth) + "\n" : '') +
(request.followRedirects? " // Paw Follow Redirects option is not supported\n" : '') +
(request.storeCookies? " // Paw Store Cookies option is not supported\n" : '')
}
const request = httpTransport.request(httpOptions, (res) => {
let responseBufs = [];
let responseStr = '';
res.on('data', (chunk) => {
if (Buffer.isBuffer(chunk)) {
responseBufs.push(chunk);
}
else {
responseStr = responseStr + chunk;
}
}).on('end', () => {
responseStr = responseBufs.length > 0 ?
Buffer.concat(responseBufs).toString(responseEncoding) : responseStr;
callback(null, res.statusCode, res.headers, responseStr);
});
})
.setTimeout(${request.timeout})
.on('error', (error) => {
callback(error);
});
${
(request.body.length > 0) ? ' request.write(' + JSON.stringify(request.body) + ');' : ''
}
request.end();
})((error, statusCode, headers, body) => {
console.log('ERROR:', error);
console.log('STATUS:', statusCode);
console.log('HEADERS:', JSON.stringify(headers));
console.log('BODY:', body);
});
`;
}
}
registerCodeGenerator(NodeHttpCodeGenerator);