diff --git a/config/default.yaml b/config/default.yaml index 167691726..12c25f8b3 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -15,6 +15,10 @@ secrets: # Generate one using `openssl rand -hex 32` peertube: '' +# How long PeerTube should wait to receive the entire request +http_timeouts: + request: '5 minutes' + rates_limit: api: # 50 attempts in 10 seconds @@ -61,7 +65,6 @@ rates_limit: window: 5 seconds max: 5 - oauth2: token_lifetime: access_token: '1 day' @@ -339,6 +342,9 @@ security: powered_by_header: enabled: true +http_server: + request_timeout: '5 minutes' + tracker: # If you disable the tracker, you disable the P2P on your PeerTube instance enabled: true diff --git a/config/production.yaml.example b/config/production.yaml.example index 47ab89a37..7c1df414f 100644 --- a/config/production.yaml.example +++ b/config/production.yaml.example @@ -13,6 +13,10 @@ secrets: # Generate one using `openssl rand -hex 32` peertube: '' +# How long PeerTube should wait to receive the entire request +http_timeouts: + request: '5 minutes' + rates_limit: api: # 50 attempts in 10 seconds @@ -59,7 +63,6 @@ rates_limit: window: 5 seconds max: 5 - oauth2: token_lifetime: access_token: '1 day' diff --git a/server/core/controllers/api/videos/upload.ts b/server/core/controllers/api/videos/upload.ts index f9da69ab4..2dfd14ff6 100644 --- a/server/core/controllers/api/videos/upload.ts +++ b/server/core/controllers/api/videos/upload.ts @@ -8,7 +8,7 @@ import { setupUploadResumableRoutes, uploadx } from '@server/lib/uploadx.js' import { buildNextVideoState } from '@server/lib/video-state.js' import { openapiOperationDoc } from '@server/middlewares/doc.js' import express from 'express' -import { VideoAuditView, auditLoggerFactory, getAuditIdFromRes } from '../../../helpers/audit-logger.js' +import { auditLoggerFactory, getAuditIdFromRes, VideoAuditView } from '../../../helpers/audit-logger.js' import { createReqFiles } from '../../../helpers/express-utils.js' import { logger, loggerTagsFactory } from '../../../helpers/logger.js' import { CONSTRAINTS_FIELDS, MIMETYPES } from '../../../initializers/constants.js' @@ -17,7 +17,6 @@ import { asyncMiddleware, asyncRetryTransactionMiddleware, authenticate, - setReqTimeout, videosAddLegacyValidator, videosAddResumableInitValidator, videosAddResumableValidator @@ -42,7 +41,6 @@ uploadRouter.post( '/upload', openapiOperationDoc({ operationId: 'uploadLegacy' }), authenticate, - setReqTimeout(1000 * 60 * 10), // Uploading the video could be long reqVideoFileAdd, asyncMiddleware(videosAddLegacyValidator), asyncRetryTransactionMiddleware(addVideoLegacy) diff --git a/server/core/initializers/checker-before-init.ts b/server/core/initializers/checker-before-init.ts index a1505d187..9d90dac95 100644 --- a/server/core/initializers/checker-before-init.ts +++ b/server/core/initializers/checker-before-init.ts @@ -14,6 +14,7 @@ export function checkMissedConfig () { 'webserver.hostname', 'webserver.port', 'secrets.peertube', + 'http_timeouts.request', 'trust_proxy', 'oauth2.token_lifetime.access_token', 'oauth2.token_lifetime.refresh_token', diff --git a/server/core/initializers/config.ts b/server/core/initializers/config.ts index 12b53e36c..5f8f29397 100644 --- a/server/core/initializers/config.ts +++ b/server/core/initializers/config.ts @@ -29,6 +29,9 @@ const CONFIG = { SECRETS: { PEERTUBE: config.get('secrets.peertube') }, + HTTP_TIMEOUTS: { + REQUEST: parseDurationToMs(config.get('http_timeouts.request')) + }, DATABASE: { DBNAME: config.has('database.name') ? config.get('database.name') : 'peertube' + config.get('database.suffix'), HOSTNAME: config.get('database.hostname'), diff --git a/server/core/middlewares/express.ts b/server/core/middlewares/express.ts deleted file mode 100644 index e215f194e..000000000 --- a/server/core/middlewares/express.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { HttpStatusCode } from '@peertube/peertube-models' -import { logger } from '@server/helpers/logger.js' -import express from 'express' - -export function setReqTimeout (timeoutMs: number) { - return (req: express.Request, res: express.Response, next: express.NextFunction) => { - req.setTimeout(timeoutMs, () => { - logger.error('Express request timeout in ' + req.originalUrl) - - return res.fail({ - status: HttpStatusCode.REQUEST_TIMEOUT_408, - message: 'Request has timed out.' - }) - }) - - next() - } -} diff --git a/server/core/middlewares/index.ts b/server/core/middlewares/index.ts index fafb398e5..c554a33da 100644 --- a/server/core/middlewares/index.ts +++ b/server/core/middlewares/index.ts @@ -10,6 +10,5 @@ export * from './sort.js' export * from './user-right.js' export * from './dnt.js' export * from './error.js' -export * from './express.js' export * from './doc.js' export * from './csp.js' diff --git a/server/server.ts b/server/server.ts index 64d8ef3fb..418aeb950 100644 --- a/server/server.ts +++ b/server/server.ts @@ -283,6 +283,8 @@ app.use((err, req, res: express.Response, _next) => { const { server, trackerServer } = createWebsocketTrackerServer(app) +server.requestTimeout = CONFIG.HTTP_TIMEOUTS.REQUEST + // ----------- Run ----------- async function startApplication () {