From 5497e584e951f6ed9e54d4b8845ee3ce1ee6900c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Fri, 10 Apr 2026 18:49:12 -0400 Subject: [PATCH] test: another test --- src/request.js | 56 +++++++++++++-------------------------------- src/routes/debug.js | 9 +++++++- 2 files changed, 24 insertions(+), 41 deletions(-) diff --git a/src/request.js b/src/request.js index 0ce283428a..5f58449109 100644 --- a/src/request.js +++ b/src/request.js @@ -1,8 +1,7 @@ 'use strict'; const dns = require('dns').promises; -// require('undici'); // keep this here, needed for SSRF (see `lookup()`) -const { Agent } = require('undici'); +const { Agent, setGlobalDispatcher } = require('undici'); const nconf = require('nconf'); const ipaddr = require('ipaddr.js'); const { CookieJar } = require('tough-cookie'); @@ -57,6 +56,9 @@ function lookup(hostname, options, callback) { // trusted, do regular lookup dns.lookup(hostname, options).then((addresses) => { callback(null, addresses); + }).catch((err) => { + console.log('lookup error', err); + callback(err); }); return; } @@ -72,33 +74,21 @@ function lookup(hostname, options, callback) { }); } -const dispatcher = new Agent({ +class NodeBBAgent extends Agent { + dispatch(opts, handler) { + if (opts.headers) { + delete opts.headers['sec-fetch-mode']; + } + return super.dispatch(opts, handler); + } +} + +const dispatcher = new NodeBBAgent({ connect: { lookup }, - interceptors: [ - (dispatch) => { - return (opts, handler) => { - // opts.headers can be an object or an array of strings - if (opts.headers) { - if (Array.isArray(opts.headers)) { - // Handle header arrays (less common with fetch, but possible) - for (let i = 0; i < opts.headers.length; i += 2) { - if (opts.headers[i].toLowerCase() === 'sec-fetch-mode') { - opts.headers.splice(i, 2); - break; - } - } - } else { - // Handle standard object headers - delete opts.headers['sec-fetch-mode']; - delete opts.headers['Sec-Fetch-Mode']; - } - } - return dispatch(opts, handler); - }; - }, - ], }); +setGlobalDispatcher(dispatcher); + async function call(url, method, { body, timeout, jar, ...config } = {}) { const { ok } = await check(url); if (!ok) { @@ -118,7 +108,6 @@ async function call(url, method, { body, timeout, jar, ...config } = {}) { 'user-agent': userAgent, ...config.headers, }, - dispatcher, }; if (timeout > 0) { opts.signal = AbortSignal.timeout(timeout); @@ -131,21 +120,8 @@ async function call(url, method, { body, timeout, jar, ...config } = {}) { opts.body = body; } } - // Workaround for https://github.com/nodejs/undici/issues/1305 - // if (global[Symbol.for('undici.globalDispatcher.1')] !== undefined) { - // class FetchAgent extends global[Symbol.for('undici.globalDispatcher.1')].constructor { - // dispatch(opts, handler) { - // delete opts.headers['sec-fetch-mode']; - // return super.dispatch(opts, handler); - // } - // } - // opts.dispatcher = new FetchAgent({ - // connect: { lookup }, - // }); - // } const response = await fetchImpl(url, opts); - const { headers } = response; const contentType = headers.get('content-type'); const isJSON = contentType && jsonTest.test(contentType); diff --git a/src/routes/debug.js b/src/routes/debug.js index b4ad76721f..d3fd63143c 100644 --- a/src/routes/debug.js +++ b/src/routes/debug.js @@ -10,7 +10,14 @@ module.exports = function (app) { const router = express.Router(); router.get('/test', async (req, res) => { - res.redirect(404); + // res.redirect(404); + const request = require('../request'); + try { + const { body: csv } = await request.get('https://example.org/blocklist'); + res.json({ csv }); + } catch (err) { + res.status(500).json({ error: err.message }); + } }); // Redoc