From 26a4389de9968071d790df608e2b30131d1fca18 Mon Sep 17 00:00:00 2001 From: Maxime-J Date: Mon, 13 Mar 2023 18:55:55 +0000 Subject: [PATCH 1/2] handle OPTIONS content-length --- index.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 96e8178..71e30d9 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,6 @@ const { filterPseudoHeaders, copyHeaders, stripHttp1ConnectionHeaders, - filterHeaders, buildURL } = require('./lib/utils') @@ -53,11 +52,11 @@ function fastProxy (opts = {}) { let body = null // according to https://tools.ietf.org/html/rfc2616#section-4.3 - // proxy should ignore message body when it's a GET or HEAD request + // proxy should ignore message body when it's a GET, HEAD or OPTIONS request // when proxy this request, we should reset the content-length to make it a valid http request - if (req.method === 'GET' || req.method === 'HEAD') { - if (headers['content-length']) { - headers = filterHeaders(headers, 'content-length') + if (req.method === 'GET' || req.method === 'HEAD' || req.method === 'OPTIONS') { + if (headers.hasOwnProperty('content-length')) { + delete headers['content-length'] } } else { if (req.body) { From 68b701ab9b92297f241a66c17bd21606f4c47690 Mon Sep 17 00:00:00 2001 From: Maxime-J Date: Mon, 13 Mar 2023 20:04:56 +0000 Subject: [PATCH 2/2] update undici tests --- test/5.undici.test.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/test/5.undici.test.js b/test/5.undici.test.js index 4dcbdfa..f50357a 100644 --- a/test/5.undici.test.js +++ b/test/5.undici.test.js @@ -55,6 +55,9 @@ describe('undici', () => { res.setHeader('x-agent', 'fast-proxy') res.send(req.headers) }) + service.options('/service/headers', (req, res) => { + res.send(null, 204, {...req.headers}) + }) service.get('/service/timeout', async (req, res) => { await sleep(200) res.send('OK') @@ -87,11 +90,21 @@ describe('undici', () => { .set('content-length', '10') .then((response) => { expect(response.headers['x-agent']).to.equal('fast-proxy') - expect(response.body['content-length']).to.equal(undefined) // content-length is stripped for GET / HEAD requests + expect(response.body['content-length']).to.equal(undefined) // content-length is stripped for GET, HEAD and OPTIONS requests expect(response.body.host).to.equal('127.0.0.1:3000') }) }) + it('should 204 on OPTIONS /service/headers', async () => { + await request(gHttpServer) + .options('/service/headers') + .expect(204) + .set('content-length', '0') + .then((response) => { + expect(response.headers['content-length']).to.equal(undefined) // content-length is stripped for GET, HEAD and OPTIONS requests + }) + }) + it('should 504 on GET /service/timeout', async () => { await request(gHttpServer) .get('/service/timeout')