Skip to content

Commit fd0fbd6

Browse files
committed
Automatically intercept requests by Undici (v4.8.2+)
Previously versions of Undici don't support any kind of agent, which makes interception much more difficult. 4.8.2 includes an agent and a mechanism to configure it globally, making everything much easier.
1 parent b9f68fe commit fd0fbd6

File tree

6 files changed

+46
-14
lines changed

6 files changed

+46
-14
lines changed

overrides/js/prepend-node.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ wrapModule('superagent', function wrapSuperagent (loadedModule) {
8080
};
8181
});
8282

83+
wrapModule('undici', function wrapUndici (loadedModule) {
84+
const ProxyAgent = loadedModule.ProxyAgent;
85+
const setGlobalDispatcher = loadedModule.setGlobalDispatcher;
86+
87+
// Old Undici release, which can't be intercepted:
88+
if (!ProxyAgent || !setGlobalDispatcher) return;
89+
90+
setGlobalDispatcher(
91+
new ProxyAgent(process.env.HTTP_PROXY)
92+
);
93+
});
94+
8395
wrapModule('stripe', function wrapStripe (loadedModule) {
8496
if (loadedModule.INTERCEPTED_BY_HTTPTOOLKIT) return;
8597

package-lock.json

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
"ts-loader": "^6.0.0",
120120
"ts-node": "^8.4.1",
121121
"typescript": "^4.4.3",
122+
"undici": "^4.9.5",
122123
"unirest": "^0.6.0",
123124
"webpack": "^4.46.0",
124125
"webpack-cli": "^3.3.9",
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Test built-ins against their specific protocol
2-
require('http').get('http://example.com/js/http');
3-
require('https').get('https://example.com/js/https');
2+
require('http').get('http://example.test/js/http');
3+
require('https').get('https://example.test/js/https');
44

55
function sendRequestsTo(baseUrl) {
66
require('request').get(baseUrl + '/request');
@@ -12,11 +12,12 @@ function sendRequestsTo(baseUrl) {
1212
require('unirest').get(baseUrl + '/unirest', () => {});
1313
require('reqwest')(baseUrl + '/reqwest');
1414
require('needle').get(baseUrl + '/needle', () => {});
15+
require('undici').request(baseUrl + '/undici');
1516
}
1617

1718
// Test all other libs against both protocols
18-
sendRequestsTo('http://example.com/js');
19-
sendRequestsTo('https://example.com/js');
19+
sendRequestsTo('http://example.test/js');
20+
sendRequestsTo('https://example.test/js');
2021

2122
// Test libraries that need manual steps, and use their own URLs:
2223
require('stripe')('sk_test_hunter2').customers.list();

test/interceptors/existing-terminal.spec.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe('Existing terminal interceptor', function () {
7979
const { interceptor, server } = await interceptorSetup;
8080
const result = await interceptor.activate(server.port) as { port: number };
8181

82-
const mainRule = await server.get(/https?:\/\/example.com\/js\/.*/).thenReply(200);
82+
const mainRule = await server.get(/https?:\/\/example.test\/js\/.*/).thenReply(200);
8383
const stripeRule = await server.get('https://api.stripe.com/v1/customers').thenJson(200, {});
8484

8585
const scriptOutput = await execAsync(`
@@ -98,8 +98,8 @@ describe('Existing terminal interceptor', function () {
9898
])).map(r => r.url.replace(':443', '').replace(':80', ''));
9999

100100
// Built-in modules
101-
expect(seenRequests).to.include('http://example.com/js/http');
102-
expect(seenRequests).to.include('https://example.com/js/https');
101+
expect(seenRequests).to.include('http://example.test/js/http');
102+
expect(seenRequests).to.include('https://example.test/js/https');
103103

104104
// http & https with lots of popular libraries
105105
['http', 'https'].forEach((protocol) =>
@@ -112,9 +112,10 @@ describe('Existing terminal interceptor', function () {
112112
'bent',
113113
'unirest',
114114
'reqwest',
115-
'needle'
115+
'needle',
116+
'undici'
116117
].forEach((library) =>
117-
expect(seenRequests).to.include(`${protocol}://example.com/js/${library}`)
118+
expect(seenRequests).to.include(`${protocol}://example.test/js/${library}`)
118119
)
119120
);
120121

test/interceptors/fresh-terminal.spec.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ describe('Fresh terminal interceptor', function () {
4444

4545
const { server, httpsConfig } = await interceptorSetup;
4646

47-
const mainRule = await server.get(/https?:\/\/example.com\/js\/.*/).thenReply(200);
47+
const mainRule = await server.get(/https?:\/\/example.test\/js\/.*/).thenReply(200);
4848
const stripeRule = await server.get('https://api.stripe.com/v1/customers').thenJson(200, {});
4949

5050
// Spawn node, as if it was run inside an intercepted terminal
@@ -64,8 +64,8 @@ describe('Fresh terminal interceptor', function () {
6464
])).map(r => r.url.replace(':443', '').replace(':80', ''));
6565

6666
// Built-in modules
67-
expect(seenRequests).to.include('http://example.com/js/http');
68-
expect(seenRequests).to.include('https://example.com/js/https');
67+
expect(seenRequests).to.include('http://example.test/js/http');
68+
expect(seenRequests).to.include('https://example.test/js/https');
6969

7070
// http & https with lots of popular libraries
7171
['http', 'https'].forEach((protocol) =>
@@ -78,9 +78,10 @@ describe('Fresh terminal interceptor', function () {
7878
'bent',
7979
'unirest',
8080
'reqwest',
81-
'needle'
81+
'needle',
82+
'undici'
8283
].forEach((library) =>
83-
expect(seenRequests).to.include(`${protocol}://example.com/js/${library}`)
84+
expect(seenRequests).to.include(`${protocol}://example.test/js/${library}`)
8485
)
8586
);
8687

0 commit comments

Comments
 (0)