fix: add dedicated http code response upon a request with too large payload (#1019)
* fix: add dedicated http code response upon a request with too large payload * fix error log
This commit is contained in:
parent
e2205c3849
commit
6062f85000
4 changed files with 52 additions and 10 deletions
|
@ -43,6 +43,10 @@ void container.load().then((container) => {
|
||||||
const env: Env = new Env()
|
const env: Env = new Env()
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
|
const requestPayloadLimit = env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)
|
||||||
|
? `${+env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)}mb`
|
||||||
|
: '50mb'
|
||||||
|
|
||||||
const server = new InversifyExpressServer(container)
|
const server = new InversifyExpressServer(container)
|
||||||
|
|
||||||
server.setConfig((app) => {
|
server.setConfig((app) => {
|
||||||
|
@ -73,7 +77,7 @@ void container.load().then((container) => {
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
app.use(json({ limit: '50mb' }))
|
app.use(json({ limit: requestPayloadLimit }))
|
||||||
app.use(
|
app.use(
|
||||||
text({
|
text({
|
||||||
type: ['text/plain', 'application/x-www-form-urlencoded', 'application/x-www-form-urlencoded; charset=utf-8'],
|
type: ['text/plain', 'application/x-www-form-urlencoded', 'application/x-www-form-urlencoded; charset=utf-8'],
|
||||||
|
@ -107,6 +111,16 @@ void container.load().then((container) => {
|
||||||
}] Request body: ${JSON.stringify(request.body)}`,
|
}] Request body: ${JSON.stringify(request.body)}`,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if ('type' in error && error.type === 'entity.too.large') {
|
||||||
|
response.status(413).send({
|
||||||
|
error: {
|
||||||
|
message: 'The request payload is too large.',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
response.status(500).send({
|
response.status(500).send({
|
||||||
error: {
|
error: {
|
||||||
message:
|
message:
|
||||||
|
|
|
@ -24,6 +24,10 @@ void container.load().then((container) => {
|
||||||
const env: Env = new Env()
|
const env: Env = new Env()
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
|
const requestPayloadLimit = env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)
|
||||||
|
? `${+env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)}mb`
|
||||||
|
: '50mb'
|
||||||
|
|
||||||
const server = new InversifyExpressServer(container)
|
const server = new InversifyExpressServer(container)
|
||||||
|
|
||||||
server.setConfig((app) => {
|
server.setConfig((app) => {
|
||||||
|
@ -58,9 +62,9 @@ void container.load().then((container) => {
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
app.use(json({ limit: '50mb' }))
|
app.use(json({ limit: requestPayloadLimit }))
|
||||||
app.use(raw({ limit: '50mb', type: 'application/octet-stream' }))
|
app.use(raw({ limit: requestPayloadLimit, type: 'application/octet-stream' }))
|
||||||
app.use(urlencoded({ extended: true, limit: '50mb' }))
|
app.use(urlencoded({ extended: true, limit: requestPayloadLimit }))
|
||||||
app.use(
|
app.use(
|
||||||
cors({
|
cors({
|
||||||
exposedHeaders: ['Content-Range', 'Accept-Ranges'],
|
exposedHeaders: ['Content-Range', 'Accept-Ranges'],
|
||||||
|
|
|
@ -53,6 +53,10 @@ export class HomeServer implements HomeServerInterface {
|
||||||
const env: Env = new Env(environmentOverrides)
|
const env: Env = new Env(environmentOverrides)
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
|
const requestPayloadLimit = env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)
|
||||||
|
? `${+env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)}mb`
|
||||||
|
: '50mb'
|
||||||
|
|
||||||
this.configureLoggers(env, configuration)
|
this.configureLoggers(env, configuration)
|
||||||
|
|
||||||
const apiGatewayService = new ApiGatewayService(serviceContainer)
|
const apiGatewayService = new ApiGatewayService(serviceContainer)
|
||||||
|
@ -114,8 +118,8 @@ export class HomeServer implements HomeServerInterface {
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
app.use(json({ limit: '50mb' }))
|
app.use(json({ limit: requestPayloadLimit }))
|
||||||
app.use(raw({ limit: '50mb', type: 'application/octet-stream' }))
|
app.use(raw({ limit: requestPayloadLimit, type: 'application/octet-stream' }))
|
||||||
app.use(
|
app.use(
|
||||||
text({
|
text({
|
||||||
type: [
|
type: [
|
||||||
|
@ -160,8 +164,24 @@ export class HomeServer implements HomeServerInterface {
|
||||||
const logger: winston.Logger = winston.loggers.get('home-server')
|
const logger: winston.Logger = winston.loggers.get('home-server')
|
||||||
|
|
||||||
server.setErrorConfig((app) => {
|
server.setErrorConfig((app) => {
|
||||||
app.use((error: Record<string, unknown>, _request: Request, response: Response, _next: NextFunction) => {
|
app.use((error: Record<string, unknown>, request: Request, response: Response, _next: NextFunction) => {
|
||||||
logger.error(error.stack)
|
logger.error(`${error.stack}`, {
|
||||||
|
method: request.method,
|
||||||
|
url: request.url,
|
||||||
|
snjs: request.headers['x-snjs-version'],
|
||||||
|
application: request.headers['x-application-version'],
|
||||||
|
userId: response.locals.user ? response.locals.user.uuid : undefined,
|
||||||
|
})
|
||||||
|
|
||||||
|
if ('type' in error && error.type === 'entity.too.large') {
|
||||||
|
response.status(413).send({
|
||||||
|
error: {
|
||||||
|
message: 'The request payload is too large.',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
response.status(500).send({
|
response.status(500).send({
|
||||||
error: {
|
error: {
|
||||||
|
|
|
@ -32,6 +32,10 @@ void container.load().then((container) => {
|
||||||
const env: Env = new Env()
|
const env: Env = new Env()
|
||||||
env.load()
|
env.load()
|
||||||
|
|
||||||
|
const requestPayloadLimit = env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)
|
||||||
|
? `${+env.get('HTTP_REQUEST_PAYLOAD_LIMIT_MEGABYTES', true)}mb`
|
||||||
|
: '50mb'
|
||||||
|
|
||||||
const server = new InversifyExpressServer(container)
|
const server = new InversifyExpressServer(container)
|
||||||
|
|
||||||
server.setConfig((app) => {
|
server.setConfig((app) => {
|
||||||
|
@ -61,8 +65,8 @@ void container.load().then((container) => {
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
/* eslint-enable */
|
/* eslint-enable */
|
||||||
app.use(json({ limit: '50mb' }))
|
app.use(json({ limit: requestPayloadLimit }))
|
||||||
app.use(urlencoded({ extended: true, limit: '50mb', parameterLimit: 5000 }))
|
app.use(urlencoded({ extended: true, limit: requestPayloadLimit, parameterLimit: 5000 }))
|
||||||
app.use(cors())
|
app.use(cors())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue