From f65ad5adeb3f01ada28fb61fca1cdbebf682dbb0 Mon Sep 17 00:00:00 2001 From: Khafra Date: Mon, 17 Jun 2024 14:04:03 -0400 Subject: [PATCH] don't append empty origin --- lib/web/fetch/util.js | 11 +++++++---- test/fetch/issue-3334.js | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 test/fetch/issue-3334.js diff --git a/lib/web/fetch/util.js b/lib/web/fetch/util.js index e533ac957ca..550b41483de 100644 --- a/lib/web/fetch/util.js +++ b/lib/web/fetch/util.js @@ -260,10 +260,13 @@ function appendRequestOriginHeader (request) { // TODO: implement "byte-serializing a request origin" let serializedOrigin = request.origin - // "'client' is changed to an origin during fetching." - // This doesn't happen in undici (in most cases) because undici, by default, - // has no concept of origin. - if (serializedOrigin === 'client') { + // - "'client' is changed to an origin during fetching." + // This doesn't happen in undici (in most cases) because undici, by default, + // has no concept of origin. + // - request.origin can also be set to request.client.origin (client being + // an environment settings object), which is undefined without using + // setGlobalOrigin. + if (serializedOrigin === 'client' || serializedOrigin === undefined) { return } diff --git a/test/fetch/issue-3334.js b/test/fetch/issue-3334.js new file mode 100644 index 00000000000..968b2a797b7 --- /dev/null +++ b/test/fetch/issue-3334.js @@ -0,0 +1,27 @@ +'use strict' + +const { test } = require('node:test') +const { tspl } = require('@matteo.collina/tspl') +const { once } = require('node:events') +const { createServer } = require('node:http') +const { fetch } = require('../..') + +test('a non-empty origin is not appended (issue #3334)', async (t) => { + const { strictEqual } = tspl(t, { plan: 1 }) + const origin = 'https://origin.example.com' + + const server = createServer((req, res) => { + strictEqual(req.headers.origin, origin) + res.end() + }).listen(0) + + t.after(server.close.bind(server)) + await once(server, 'listening') + + await fetch(`http://localhost:${server.address().port}`, { + headers: { origin }, + body: '', + method: 'POST', + redirect: 'error' + }) +})