-
Notifications
You must be signed in to change notification settings - Fork 224
/
http-request.test.js
136 lines (120 loc) · 3.88 KB
/
http-request.test.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
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
130
131
132
133
134
135
136
/*
* Copyright Elasticsearch B.V. and other contributors where applicable.
* Licensed under the BSD 2-Clause License; you may not use this file except in
* compliance with the BSD 2-Clause License.
*/
'use strict';
var test = require('tape');
const http = require('http');
const { httpRequest } = require('../lib/http-request');
const shimmer = require('../lib/instrumentation/shimmer');
test('httpRequest - no timeouts', function (t) {
const server = http
.createServer(function onReq(_req, res) {
res.end('hi');
})
.listen(function onListening() {
const port = server.address().port;
const req = httpRequest(`http://127.0.0.1:${port}`, function onRes(res) {
t.equal(res.statusCode, 200, 'got 200 response');
server.close(function () {
t.end();
});
});
req.end();
});
});
test('httpRequest - get timeout', function (t) {
// 1. Start a server with a slow (500s) response time.
const server = http
.createServer(function onReq(_req, res) {
setTimeout(function () {
res.end('hi');
}, 500);
})
.listen(function onListening() {
const port = server.address().port;
// 2. Make a request to that server that we expect to *timeout*.
const req = httpRequest(
`http://127.0.0.1:${port}`,
{
connectTimeout: 30,
timeout: 100,
},
function onRes(res) {
t.fail('got client response, but did not expect it');
},
);
// 3. Get a 'timeout' event.
req.on('timeout', function () {
t.pass('got timeout event, as expected');
// 4. It is the responsibility of the caller to clean up the request.
req.destroy(new Error('cleaning up after timeout'));
});
req.on('connectTimeout', function () {
t.fail('got connectTimeout, but did not expect it');
});
// 5. We expect an 'error' event from our self-called `res.destroy()`.
req.on('error', function (err) {
t.ok(err);
t.equal(err.message, 'cleaning up after timeout');
server.close(function () {
t.end();
});
});
req.end();
});
});
test('httpRequest - get connectTimeout', function (t) {
// A torturous Node.js http client Agent that breaks all socket connections
// by throwing away the 'connect' event on any created sockets.
class MyHttpAgent extends http.Agent {
createConnection(opts, cb) {
const socket = super.createConnection(opts, cb);
shimmer.wrap(socket, 'emit', function (origEmit) {
return function wrappedEmit(name) {
if (name === 'connect') {
return;
}
return origEmit.call(this, ...arguments);
};
});
return socket;
}
}
const server = http.createServer((req, res) => {
res.end('hi');
});
server.listen(0, () => {
// 1. Send a request to a normal server, using a client HTTP agent that
// makes all connections time out.
const req = httpRequest(
`http://127.0.0.1:${server.address().port}`,
{
connectTimeout: 100,
timeout: 5000,
agent: new MyHttpAgent(),
},
function onRes(res) {
t.fail('got client response, but did not expect it');
},
);
req.on('timeout', function () {
t.fail('got timeout, but did not expect it');
});
// 2. Get a 'connectTimeout' event.
req.on('connectTimeout', function () {
t.pass('got connectTimeout event, as expected');
// 3. It is the responsibility of the caller to clean up the request.
req.destroy(new Error('cleaning up after connectTimeout'));
});
// 4. We expect an 'error' event from our self-called `res.destroy()`.
req.on('error', function (err) {
t.ok(err);
t.equal(err.message, 'cleaning up after connectTimeout');
t.end();
server.close();
});
req.end();
});
});