Fix pinned lookup for dual-stack HTTPS requests
This commit is contained in:
1 parent
cc2fd05062
commit
93f07e838e
2 files changed
+22
-3
No files matched your search
@@ -35,6 +35,12 @@ function validateWeebRequest(value, options = {}) {
|
|||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function pinnedLookup(selected) {
|
||||||
|
return (_hostname, lookupOptions, callback) => lookupOptions.all
|
||||||
|
? callback(null, [{ address: selected.address, family: selected.family }])
|
||||||
|
: callback(null, selected.address, selected.family);
|
||||||
|
}
|
||||||
|
|
||||||
async function pinnedFetch(value, options = {}) {
|
async function pinnedFetch(value, options = {}) {
|
||||||
const url = new URL(value);
|
const url = new URL(value);
|
||||||
if (url.protocol !== 'https:') throw new Error('Pinned transport requires HTTPS');
|
if (url.protocol !== 'https:') throw new Error('Pinned transport requires HTTPS');
|
||||||
@@ -48,7 +54,7 @@ async function pinnedFetch(value, options = {}) {
|
|||||||
const request = https.request(url, {
|
const request = https.request(url, {
|
||||||
method: 'GET', headers: options.headers, signal: options.signal,
|
method: 'GET', headers: options.headers, signal: options.signal,
|
||||||
agent: false,
|
agent: false,
|
||||||
lookup: (_hostname, _lookupOptions, callback) => callback(null, selected.address, selected.family),
|
lookup: pinnedLookup(selected),
|
||||||
}, response => {
|
}, response => {
|
||||||
let bytes = 0;
|
let bytes = 0;
|
||||||
const chunks = [];
|
const chunks = [];
|
||||||
@@ -82,4 +88,4 @@ function createWeebHttp(options = {}) {
|
|||||||
return new SlowHttp({ ...options, transport: pinnedFetch, validateUrl: validateWeebRequest });
|
return new SlowHttp({ ...options, transport: pinnedFetch, validateUrl: validateWeebRequest });
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { publicAddress, validateWeebRequest, pinnedFetch, createWeebHttp };
|
module.exports = { publicAddress, validateWeebRequest, pinnedLookup, pinnedFetch, createWeebHttp };
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
const test = require('node:test');
|
const test = require('node:test');
|
||||||
const assert = require('node:assert/strict');
|
const assert = require('node:assert/strict');
|
||||||
const { SlowHttp, StopScrapeError } = require('../lib/http');
|
const { SlowHttp, StopScrapeError } = require('../lib/http');
|
||||||
const { publicAddress, validateWeebRequest } = require('../plugins/broker');
|
const { publicAddress, validateWeebRequest, pinnedLookup } = require('../plugins/broker');
|
||||||
|
|
||||||
test('plugin broker rejects local, private, non-TLS, and cross-source URLs', () => {
|
test('plugin broker rejects local, private, non-TLS, and cross-source URLs', () => {
|
||||||
for (const address of ['127.0.0.1', '10.0.0.5', '192.168.1.1', '169.254.169.254', '::1', '::ffff:127.0.0.1']) {
|
for (const address of ['127.0.0.1', '10.0.0.5', '192.168.1.1', '169.254.169.254', '::1', '::ffff:127.0.0.1']) {
|
||||||
@@ -17,6 +17,19 @@ test('plugin broker rejects local, private, non-TLS, and cross-source URLs', ()
|
|||||||
assert.doesNotThrow(() => validateWeebRequest('https://img.example/page.jpg'));
|
assert.doesNotThrow(() => validateWeebRequest('https://img.example/page.jpg'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('pinned DNS lookup supports both Node single-address and all-address requests', () => {
|
||||||
|
const lookup = pinnedLookup({ address: '1.1.1.1', family: 4 });
|
||||||
|
lookup('example.com', { all: false }, (error, address, family) => {
|
||||||
|
assert.equal(error, null);
|
||||||
|
assert.equal(address, '1.1.1.1');
|
||||||
|
assert.equal(family, 4);
|
||||||
|
});
|
||||||
|
lookup('example.com', { all: true }, (error, addresses) => {
|
||||||
|
assert.equal(error, null);
|
||||||
|
assert.deepEqual(addresses, [{ address: '1.1.1.1', family: 4 }]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test('redirect hops are validated and paced before another request', async () => {
|
test('redirect hops are validated and paced before another request', async () => {
|
||||||
const calls = [];
|
const calls = [];
|
||||||
const http = new SlowHttp({
|
const http = new SlowHttp({
|
||||||
|
|||||||
Reference in new issue
Block a user