Skip to content

Commit f099ec8

Browse files
committed
Merge pull request #319 from andolini/master
2 parents 0349a02 + 65f674e commit f099ec8

File tree

4 files changed

+100
-25
lines changed

4 files changed

+100
-25
lines changed

package-lock.json

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

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@
3333
"http_ece": "1.0.5",
3434
"jws": "^3.1.3",
3535
"minimist": "^1.2.0",
36-
"urlsafe-base64": "^1.0.0"
36+
"urlsafe-base64": "^1.0.0",
37+
"https-proxy-agent": "^2.1.1"
3738
},
3839
"devDependencies": {
3940
"chalk": "^2.3.0",

src/web-push-lib.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const urlBase64 = require('urlsafe-base64');
44
const url = require('url');
55
const https = require('https');
6+
const HttpsProxyAgent = require('https-proxy-agent');
67

78
const WebPushError = require('./web-push-error.js');
89
const vapidHelper = require('./vapid-helper.js');
@@ -109,14 +110,16 @@ WebPushLib.prototype.generateRequestDetails =
109110
let timeToLive = DEFAULT_TTL;
110111
let extraHeaders = {};
111112
let contentEncoding = webPushConstants.supportedContentEncodings.AES_GCM;
113+
let proxy;
112114

113115
if (options) {
114116
const validOptionKeys = [
115117
'headers',
116118
'gcmAPIKey',
117119
'vapidDetails',
118120
'TTL',
119-
'contentEncoding'
121+
'contentEncoding',
122+
'proxy'
120123
];
121124
const optionKeys = Object.keys(options);
122125
for (let i = 0; i < optionKeys.length; i += 1) {
@@ -162,6 +165,14 @@ WebPushLib.prototype.generateRequestDetails =
162165
throw new Error('Unsupported content encoding specified.');
163166
}
164167
}
168+
169+
if (options.proxy) {
170+
if (typeof options.proxy === 'string') {
171+
proxy = options.proxy;
172+
} else {
173+
console.warn('Attempt to use proxy option, but invalid type it should be a string ');
174+
}
175+
}
165176
}
166177

167178
if (typeof timeToLive === 'undefined') {
@@ -250,6 +261,10 @@ WebPushLib.prototype.generateRequestDetails =
250261
requestDetails.body = requestPayload;
251262
requestDetails.endpoint = subscription.endpoint;
252263

264+
if (proxy) {
265+
requestDetails.proxy = proxy;
266+
}
267+
253268
return requestDetails;
254269
};
255270

@@ -286,6 +301,10 @@ WebPushLib.prototype.sendNotification =
286301
httpsOptions.headers = requestDetails.headers;
287302
httpsOptions.method = requestDetails.method;
288303

304+
if (requestDetails.proxy) {
305+
httpsOptions.agent = new HttpsProxyAgent(requestDetails.proxy);
306+
}
307+
289308
const pushRequest = https.request(httpsOptions, function(pushResponse) {
290309
let responseText = '';
291310

test/test-generate-request-details.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,4 +271,18 @@ suite('Test Generate Request Details', function() {
271271
assert.ok(audience, 'Audience exists');
272272
assert.equal(audience, 'http://example.com:4242', 'Audience contains expected value with port');
273273
});
274+
275+
test('Proxy option', function() {
276+
let subscription = { endpoint: 'https://127.0.0.1:8080' };
277+
let message;
278+
let extraOptions = {
279+
'proxy': 'proxy'
280+
};
281+
let details = webPush.generateRequestDetails(
282+
subscription,
283+
message,
284+
extraOptions
285+
);
286+
assert.equal(details.proxy, extraOptions.proxy);
287+
});
274288
});

0 commit comments

Comments
 (0)