From e6f67820428af08aa2b8d366b507c8b9cd57f759 Mon Sep 17 00:00:00 2001 From: Simon Cheng Date: Thu, 8 Sep 2022 04:29:02 +0000 Subject: [PATCH] v1.2.4 --- CHANGELOG.md | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- src/classes/RammerheadSessionFileCache.js | 18 +++++++++++++++++- src/config.js | 4 +++- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0f1c26d..17634da7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## v1.2.4 + +- fix crashes from corrupted sessions + ## v1.2.3 - fix memory usage issues when downloading huge files diff --git a/package-lock.json b/package-lock.json index d450e6c1..5a3c74e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rammerhead", - "version": "1.2.2", + "version": "1.2.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rammerhead", - "version": "1.2.2", + "version": "1.2.4", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index c8bd1799..0392ef70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rammerhead", - "version": "1.2.3", + "version": "1.2.4", "description": "User friendly web proxy powered by testcafe-hammerhead", "main": "src/index.js", "scripts": { diff --git a/src/classes/RammerheadSessionFileCache.js b/src/classes/RammerheadSessionFileCache.js index 0ad6923b..e88200b2 100644 --- a/src/classes/RammerheadSessionFileCache.js +++ b/src/classes/RammerheadSessionFileCache.js @@ -17,6 +17,8 @@ class RammerheadSessionFileCache extends RammerheadSessionAbstractStore { * @param {number} options.cacheTimeout - timeout before saving cache to disk and deleting it from the cache * @param {number} options.cacheCheckInterval * @param {boolean} options.deleteUnused - (default: true) if set to true, it deletes unused sessions when saving cache to disk + * @param {boolean} options.deleteCorruptedSessions - (default: true) if set to true, auto-deletes session files that + * give a parse error (happens when nodejs exits abruptly while serializing session to disk) * @param {object|null} options.staleCleanupOptions - set to null to disable cleaning up stale sessions * @param {number|null} options.staleCleanupOptions.staleTimeout - stale sessions that are inside saveDirectory that go over * this timeout will be deleted. Set to null to disable. @@ -30,6 +32,7 @@ class RammerheadSessionFileCache extends RammerheadSessionAbstractStore { cacheTimeout = 1000 * 60 * 20, // 20 minutes cacheCheckInterval = 1000 * 60 * 10, // 10 minutes, deleteUnused = true, + deleteCorruptedSessions = true, staleCleanupOptions = { staleTimeout: 1000 * 60 * 60 * 24 * 1, // 1 day maxToLive: 1000 * 60 * 60 * 24 * 4, // four days @@ -41,6 +44,7 @@ class RammerheadSessionFileCache extends RammerheadSessionAbstractStore { this.logger = logger; this.deleteUnused = deleteUnused; this.cacheTimeout = cacheTimeout; + this.deleteCorruptedSessions = deleteCorruptedSessions; /** * @type {Map.} */ @@ -95,7 +99,19 @@ class RammerheadSessionFileCache extends RammerheadSessionAbstractStore { return this.cachedSessions.get(id); } - const session = RammerheadSession.DeserializeSession(id, fs.readFileSync(this._getSessionFilePath(id))); + let session; + try { + session = RammerheadSession.DeserializeSession(id, fs.readFileSync(this._getSessionFilePath(id))); + } catch (e) { + if (e.name === 'SyntaxError' && e.message.includes('JSON')) { + this.logger.warn(`(FileCache.get) ${id} bad JSON`); + if (this.deleteCorruptedSessions) { + this.delete(id); + this.logger.warn(`(FileCache.get) ${id} deleted because of bad JSON`); + } + return; + } + } if (updateActiveTimestamp) { this.logger.debug(`(FileCache.get) ${id} update active timestamp`); diff --git a/src/config.js b/src/config.js index 1cd587ef..4da68547 100644 --- a/src/config.js +++ b/src/config.js @@ -65,7 +65,9 @@ module.exports = { staleTimeout: 1000 * 60 * 60 * 24 * 3, // 3 days maxToLive: null, staleCheckInterval: 1000 * 60 * 60 * 6 // 6 hours - } + }, + // corrupted session files happens when nodejs exits abruptly while serializing the JSON sessions to disk + deleteCorruptedSessions: true, }, //// LOGGING CONFIGURATION ////