[mirotalk] - handle client HTTP parse errors gracefully

This commit is contained in:
Miroslav Pejic
2026-03-04 09:17:06 +01:00
parent 505c7b0cfb
commit 857f21ab4f
7 changed files with 80 additions and 70 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
# ====================================================
# MiroTalk P2P v.1.7.37 - Environment Configuration
# MiroTalk P2P v.1.7.38 - Environment Configuration
# ====================================================
# App environment
+1 -1
View File
@@ -2,7 +2,7 @@
/**
* ==============================================
* MiroTalk P2P v.1.7.37 - Configuration File
* MiroTalk P2P v.1.7.38 - Configuration File
* ==============================================
*
* Branding and customizations require a license:
+11 -1
View File
@@ -45,7 +45,7 @@ dependencies: {
* @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 1.7.37
* @version 1.7.38
*
*/
@@ -111,6 +111,16 @@ const options = {
// Server both http and https
const server = httpolyglot.createServer(options, app);
// Handle client errors (malformed/incomplete HTTP requests) gracefully
server.on('clientError', (err, socket) => {
err.code === 'HPE_HEADER_OVERFLOW' || err.message === 'Parse Error'
? log.warn('Client HTTP parse error', { error: err.message, code: err.code })
: log.warn('Client connection error', { error: err.message, code: err.code });
if (socket && !socket.destroyed) {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
}
});
// Trust Proxy
const trustProxy = !!getEnvBoolean(process.env.TRUST_PROXY);
+60 -60
View File
@@ -1,18 +1,18 @@
{
"name": "mirotalk",
"version": "1.7.37",
"version": "1.7.38",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "mirotalk",
"version": "1.7.37",
"version": "1.7.38",
"license": "AGPL-3.0",
"dependencies": {
"@mattermost/client": "11.3.0",
"@ngrok/ngrok": "1.7.0",
"@sentry/node": "^10.40.0",
"axios": "^1.13.5",
"@sentry/node": "^10.42.0",
"axios": "^1.13.6",
"chokidar": "^5.0.0",
"colors": "^1.4.0",
"compression": "^1.8.1",
@@ -30,7 +30,7 @@
"jsdom": "^28.1.0",
"jsonwebtoken": "^9.0.3",
"nodemailer": "^8.0.1",
"openai": "^6.24.0",
"openai": "^6.25.0",
"qs": "^6.15.0",
"socket.io": "^4.8.3",
"swagger-ui-express": "^5.0.1",
@@ -333,9 +333,9 @@
}
},
"node_modules/@fastify/otel/node_modules/minimatch": {
"version": "10.2.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
"integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
"version": "10.2.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
"integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
"license": "BlueOak-1.0.0",
"dependencies": {
"brace-expansion": "^5.0.2"
@@ -661,9 +661,9 @@
}
},
"node_modules/@opentelemetry/context-async-hooks": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.5.1.tgz",
"integrity": "sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.0.tgz",
"integrity": "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==",
"license": "Apache-2.0",
"engines": {
"node": "^18.19.0 || >=20.6.0"
@@ -1081,12 +1081,12 @@
}
},
"node_modules/@opentelemetry/resources": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.1.tgz",
"integrity": "sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.0.tgz",
"integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "2.5.1",
"@opentelemetry/core": "2.6.0",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
@@ -1097,9 +1097,9 @@
}
},
"node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz",
"integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz",
"integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -1112,13 +1112,13 @@
}
},
"node_modules/@opentelemetry/sdk-trace-base": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.1.tgz",
"integrity": "sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.0.tgz",
"integrity": "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/core": "2.5.1",
"@opentelemetry/resources": "2.5.1",
"@opentelemetry/core": "2.6.0",
"@opentelemetry/resources": "2.6.0",
"@opentelemetry/semantic-conventions": "^1.29.0"
},
"engines": {
@@ -1129,9 +1129,9 @@
}
},
"node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz",
"integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz",
"integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==",
"license": "Apache-2.0",
"dependencies": {
"@opentelemetry/semantic-conventions": "^1.29.0"
@@ -1236,18 +1236,18 @@
"license": "Apache-2.0"
},
"node_modules/@sentry/core": {
"version": "10.40.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.40.0.tgz",
"integrity": "sha512-/wrcHPp9Avmgl6WBimPjS4gj810a1wU5oX9fF1bzJfeIIbF3jTsAbv0oMbgDp0cSDnkwv2+NvcPnn3+c5J6pBA==",
"version": "10.42.0",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.42.0.tgz",
"integrity": "sha512-L4rMrXMqUKBanpjpMT+TuAVk6xAijz6AWM6RiEYpohAr7SGcCEc1/T0+Ep1eLV8+pwWacfU27OvELIyNeOnGzA==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@sentry/node": {
"version": "10.40.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.40.0.tgz",
"integrity": "sha512-HQETLoNZTUUM8PBxFPT4X0qepzk5NcyWg3jyKUmF7Hh/19KSJItBXXZXxx+8l3PC2eASXUn70utXi65PoXEHWA==",
"version": "10.42.0",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.42.0.tgz",
"integrity": "sha512-ZZfU3Fnni7Aj0lTX4e3QpY3UxK4FGuzfM20316UAJycBGnripm+sDHwcekPMGfLnk/FrN9wa1atspVlHvOI0WQ==",
"license": "MIT",
"dependencies": {
"@fastify/otel": "0.16.0",
@@ -1281,9 +1281,9 @@
"@opentelemetry/sdk-trace-base": "^2.5.1",
"@opentelemetry/semantic-conventions": "^1.39.0",
"@prisma/instrumentation": "7.2.0",
"@sentry/core": "10.40.0",
"@sentry/node-core": "10.40.0",
"@sentry/opentelemetry": "10.40.0",
"@sentry/core": "10.42.0",
"@sentry/node-core": "10.42.0",
"@sentry/opentelemetry": "10.42.0",
"import-in-the-middle": "^2.0.6"
},
"engines": {
@@ -1291,13 +1291,13 @@
}
},
"node_modules/@sentry/node-core": {
"version": "10.40.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.40.0.tgz",
"integrity": "sha512-ciZGOF54rJH9Fkg7V3v4gmWVufnJRqQQOrn0KStuo49vfPQAJLGePDx+crQv0iNVoLc6Hmrr6E7ebNHSb4NSAw==",
"version": "10.42.0",
"resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.42.0.tgz",
"integrity": "sha512-9tf3fPV6M071aps72D+PEtdQPTuj+SuqO2+PpTfdPP5ZL4TTKYo3VK0li76SL+5wGdTFGV5qmsokHq9IRBA0iA==",
"license": "MIT",
"dependencies": {
"@sentry/core": "10.40.0",
"@sentry/opentelemetry": "10.40.0",
"@sentry/core": "10.42.0",
"@sentry/opentelemetry": "10.42.0",
"import-in-the-middle": "^2.0.6"
},
"engines": {
@@ -1352,12 +1352,12 @@
}
},
"node_modules/@sentry/opentelemetry": {
"version": "10.40.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.40.0.tgz",
"integrity": "sha512-Zx6T258qlEhQfdghIlazSTbK7uRO0pXWw4/4/VPR8pMOiRPh8dAoJg8AB0L55PYPMpVdXxNf7L9X0EZoDYibJw==",
"version": "10.42.0",
"resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.42.0.tgz",
"integrity": "sha512-5vsYz683iihzlIj3sT1+tEixf0awwXK86a+aYsnMHrTXJDrkBDq4U0ZT+yxdPfJlkaxRtYycFR08SXr2pSm7Eg==",
"license": "MIT",
"dependencies": {
"@sentry/core": "10.40.0"
"@sentry/core": "10.42.0"
},
"engines": {
"node": ">=18"
@@ -1774,9 +1774,9 @@
}
},
"node_modules/axios": {
"version": "1.13.5",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
"integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==",
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz",
"integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.11",
@@ -4703,13 +4703,13 @@
}
},
"node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"version": "9.0.9",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
"brace-expansion": "^2.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -4799,9 +4799,9 @@
}
},
"node_modules/mocha/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"version": "5.1.9",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
"integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -5014,9 +5014,9 @@
}
},
"node_modules/nodemon/node_modules/minimatch": {
"version": "10.2.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
"integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
"version": "10.2.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz",
"integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
@@ -5204,9 +5204,9 @@
}
},
"node_modules/openai": {
"version": "6.24.0",
"resolved": "https://registry.npmjs.org/openai/-/openai-6.24.0.tgz",
"integrity": "sha512-WLR+qki3S4c9ZHilR42GDTxEpTrMFeWfcFNg1RMELW0ZCCBJMDDlqVV+QQEM5KN2hjUyZu45QpgJmln/0ykFRg==",
"version": "6.25.0",
"resolved": "https://registry.npmjs.org/openai/-/openai-6.25.0.tgz",
"integrity": "sha512-mEh6VZ2ds2AGGokWARo18aPISI1OhlgdEIC1ewhkZr8pSIT31dec0ecr9Nhxx0JlybyOgoAT1sWeKtwPZzJyww==",
"license": "Apache-2.0",
"bin": {
"openai": "bin/cli"
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "mirotalk",
"version": "1.7.37",
"version": "1.7.38",
"description": "A free WebRTC browser-based video call",
"main": "server.js",
"scripts": {
@@ -43,8 +43,8 @@
"dependencies": {
"@mattermost/client": "11.3.0",
"@ngrok/ngrok": "1.7.0",
"@sentry/node": "^10.40.0",
"axios": "^1.13.5",
"@sentry/node": "^10.42.0",
"axios": "^1.13.6",
"chokidar": "^5.0.0",
"colors": "^1.4.0",
"compression": "^1.8.1",
@@ -62,7 +62,7 @@
"jsdom": "^28.1.0",
"jsonwebtoken": "^9.0.3",
"nodemailer": "^8.0.1",
"openai": "^6.24.0",
"openai": "^6.25.0",
"qs": "^6.15.0",
"socket.io": "^4.8.3",
"swagger-ui-express": "^5.0.1",
+1 -1
View File
@@ -79,7 +79,7 @@ let brand = {
},
about: {
imageUrl: '../images/mirotalk-logo.gif',
title: 'WebRTC P2P v1.7.37',
title: 'WebRTC P2P v1.7.38',
html: `
<button
id="support-button"
+2 -2
View File
@@ -15,7 +15,7 @@
* @license For commercial use or closed source, contact us at license.mirotalk@gmail.com or purchase directly from CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-p2p-webrtc-realtime-video-conferences/38376661
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
* @version 1.7.37
* @version 1.7.38
*
*/
@@ -13738,7 +13738,7 @@ function showAbout() {
Swal.fire({
background: swBg,
position: 'center',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.7.37',
title: brand.about?.title && brand.about.title.trim() !== '' ? brand.about.title : 'WebRTC P2P v1.7.38',
imageUrl: brand.about?.imageUrl && brand.about.imageUrl.trim() !== '' ? brand.about.imageUrl : images.about,
customClass: { image: 'img-about' },
html: `