diff --git a/lib/server.js b/lib/server.js index 327f2a70d7..4e302f9904 100644 --- a/lib/server.js +++ b/lib/server.js @@ -248,6 +248,11 @@ class S3Server { }); } + // Starting NodeJS v18, the default timeout, when `undefined`, is + // 5 minutes. We must set the value to zero to allow for long + // upload durations. + server.requestTimeout = 0; // disabling request timeout + server.on('connection', socket => { socket.on('error', err => logger.info('request rejected', { error: err })); diff --git a/package.json b/package.json index 3b831b2c9c..d763c31853 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@zenko/cloudserver", - "version": "9.0.19", + "version": "9.0.20", "description": "Zenko CloudServer, an open-source Node.js implementation of a server handling the Amazon S3 protocol", "main": "index.js", "engines": { diff --git a/tests/unit/server.js b/tests/unit/server.js index 84f9761643..e0d8604e30 100644 --- a/tests/unit/server.js +++ b/tests/unit/server.js @@ -2,6 +2,8 @@ const assert = require('assert'); const sinon = require('sinon'); +const http = require('http'); +const https = require('https'); const arsenal = require('arsenal'); const uuid = require('uuid'); const logger = require('../../lib/utilities/logger'); @@ -210,3 +212,41 @@ describe('S3Server', () => { }); }); }); + +describe('S3Server request timeout', () => { + let sandbox; + let mockServer; + + beforeEach(() => { + sandbox = sinon.createSandbox(); + + // Create a mock server to capture the requestTimeout setting + mockServer = { + requestTimeout: null, + on: sandbox.stub(), + listen: sandbox.stub(), + address: sandbox.stub().returns({ address: '127.0.0.1', port: 8000 }), + }; + + // Mock server creation to return our mock + sandbox.stub(http, 'createServer').returns(mockServer); + sandbox.stub(https, 'createServer').returns(mockServer); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should set server.requestTimeout to 0 when starting server', () => { + const server = new S3Server({ + ...defaultConfig, + https: false + }); + + // Call _startServer which should set requestTimeout = 0 + server._startServer(() => {}, 8000, '127.0.0.1'); + + // Verify that requestTimeout was set to 0 + assert.strictEqual(mockServer.requestTimeout, 0); + }); +});