From cf866675fe9c70120d362ddd0e0999e5afc5de61 Mon Sep 17 00:00:00 2001 From: Murat Tasarsu <1642706+tasarsu@users.noreply.github.com> Date: Sun, 27 Nov 2022 16:18:41 +0300 Subject: [PATCH] multiple rules --- source/image-handler/image-request.ts | 35 +++++++++++++++++++------- source/image-handler/thumbor-mapper.ts | 33 ++++++++++++++++++------ 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/source/image-handler/image-request.ts b/source/image-handler/image-request.ts index bcceca878..1175010b8 100644 --- a/source/image-handler/image-request.ts +++ b/source/image-handler/image-request.ts @@ -278,15 +278,18 @@ export class ImageRequest { if (requestType === RequestTypes.CUSTOM) { const { REWRITE_MATCH_PATTERN, REWRITE_SUBSTITUTION } = process.env; - if (typeof REWRITE_MATCH_PATTERN === "string") { - const patternStrings = REWRITE_MATCH_PATTERN.split("/"); - const flags = patternStrings.pop(); - const parsedPatternString = REWRITE_MATCH_PATTERN.slice(1, REWRITE_MATCH_PATTERN.length - 1 - flags.length); - const regExp = new RegExp(parsedPatternString, flags); - - path = path.replace(regExp, REWRITE_SUBSTITUTION); - } else { - path = path.replace(REWRITE_MATCH_PATTERN, REWRITE_SUBSTITUTION); + const REWRITE_MATCH_PATTERNS = this.parseJson(REWRITE_MATCH_PATTERN); + const REWRITE_SUBSTITUTIONS = this.parseJson(REWRITE_SUBSTITUTION); + + for (let k = 0; k < REWRITE_MATCH_PATTERNS.length; k++) { + let matchPattern = REWRITE_MATCH_PATTERNS[k] + if (typeof (matchPattern) === 'string') { + let regExp = this.generateRegExp(matchPattern); + path = path.replace(regExp, REWRITE_SUBSTITUTIONS[k]); + if (this.generateRegExp(matchPattern).test(path)) break; + } else { + path = path.replace(matchPattern, REWRITE_SUBSTITUTIONS[k]); + } } } @@ -303,6 +306,20 @@ export class ImageRequest { ); } + parseJson(str) { + try { + return JSON.parse(str); + } catch (e) { + return [str]; + } + } + + generateRegExp(matchPattern) { + const patternStrings = matchPattern.split('/'); + const flags = patternStrings.pop(); + const parsedPatternString = matchPattern.slice(1, matchPattern.length - 1 - flags.length); + return new RegExp(parsedPatternString, flags); + } /** * Determines how to handle the request being made based on the URL path prefix to the image request. * Categorizes a request as either "image" (uses the Sharp library), "thumbor" (uses Thumbor mapping), or "custom" (uses the rewrite function). diff --git a/source/image-handler/thumbor-mapper.ts b/source/image-handler/thumbor-mapper.ts index 5543930f4..11e76a6a0 100644 --- a/source/image-handler/thumbor-mapper.ts +++ b/source/image-handler/thumbor-mapper.ts @@ -54,20 +54,37 @@ export class ThumborMapper { } else { let parsedPath = ""; - if (typeof REWRITE_MATCH_PATTERN === "string") { - const patternStrings = REWRITE_MATCH_PATTERN.split("/"); - const flags = patternStrings.pop(); - const parsedPatternString = REWRITE_MATCH_PATTERN.slice(1, REWRITE_MATCH_PATTERN.length - 1 - flags.length); - const regExp = new RegExp(parsedPatternString, flags); - parsedPath = path.replace(regExp, REWRITE_SUBSTITUTION); - } else { - parsedPath = path.replace(REWRITE_MATCH_PATTERN, REWRITE_SUBSTITUTION); + const REWRITE_MATCH_PATTERNS = this.parseJson(REWRITE_MATCH_PATTERN); + const REWRITE_SUBSTITUTIONS = this.parseJson(REWRITE_SUBSTITUTION); + + for (let k = 0; k < REWRITE_MATCH_PATTERNS.length; k++) { + let matchPattern = REWRITE_MATCH_PATTERNS[k] + if (typeof (matchPattern) === 'string') { + let regExp = this.generateRegExp(matchPattern); + parsedPath = path.replace(regExp, REWRITE_SUBSTITUTIONS[k]); + if (this.generateRegExp(matchPattern).test(path)) break; + } else { + parsedPath = path.replace(matchPattern, REWRITE_SUBSTITUTIONS[k]); + } } return parsedPath; } } + parseJson(str) { + try { + return JSON.parse(str); + } catch (e) { + return [str]; + } + } + generateRegExp(matchPattern) { + const patternStrings = matchPattern.split('/'); + const flags = patternStrings.pop(); + const parsedPatternString = matchPattern.slice(1, matchPattern.length - 1 - flags.length); + return new RegExp(parsedPatternString, flags); + } /** * Maps background color the current edits object * @param filterValue The specified color value