From f455c18c667b6b5f8422a3a59090ed9a7f6b929a Mon Sep 17 00:00:00 2001 From: jvoisin Date: Fri, 11 Jul 2025 00:59:35 +0200 Subject: [PATCH] perf(rewrite): anchor the rewrite regex There is no need to try to match the regexp over the whole input, having it anchored is enough. If we feel extra-lenient, we might strip spaces in front/tail, but I don't think it's necessary. This commit also invert a condition to reduce the level of nested indentation, and make a condition stricter. --- internal/reader/rewrite/url_rewrite.go | 54 +++++++++++++------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/internal/reader/rewrite/url_rewrite.go b/internal/reader/rewrite/url_rewrite.go index 05c01eb2..5876d28f 100644 --- a/internal/reader/rewrite/url_rewrite.go +++ b/internal/reader/rewrite/url_rewrite.go @@ -10,38 +10,40 @@ import ( "miniflux.app/v2/internal/model" ) -var customReplaceRuleRegex = regexp.MustCompile(`rewrite\("([^"]+)"\|"([^"]+)"\)`) +var customReplaceRuleRegex = regexp.MustCompile(`^rewrite\("([^"]+)"\|"([^"]+)"\)$`) func RewriteEntryURL(feed *model.Feed, entry *model.Entry) string { - var rewrittenURL = entry.URL - if feed.UrlRewriteRules != "" { - parts := customReplaceRuleRegex.FindStringSubmatch(feed.UrlRewriteRules) + if feed.UrlRewriteRules == "" { + return entry.URL + } - if len(parts) >= 3 { - re, err := regexp.Compile(parts[1]) - if err != nil { - slog.Error("Failed on regexp compilation", - slog.String("url_rewrite_rules", feed.UrlRewriteRules), - slog.Any("error", err), - ) - return rewrittenURL - } - rewrittenURL = re.ReplaceAllString(entry.URL, parts[2]) - slog.Debug("Rewriting entry URL", - slog.String("original_entry_url", entry.URL), - slog.String("rewritten_entry_url", rewrittenURL), - slog.Int64("feed_id", feed.ID), - slog.String("feed_url", feed.FeedURL), - ) - } else { - slog.Debug("Cannot find search and replace terms for replace rule", - slog.String("original_entry_url", entry.URL), - slog.String("rewritten_entry_url", rewrittenURL), - slog.Int64("feed_id", feed.ID), - slog.String("feed_url", feed.FeedURL), + var rewrittenURL = entry.URL + parts := customReplaceRuleRegex.FindStringSubmatch(feed.UrlRewriteRules) + + if len(parts) == 3 { + re, err := regexp.Compile(parts[1]) + if err != nil { + slog.Error("Failed on regexp compilation", slog.String("url_rewrite_rules", feed.UrlRewriteRules), + slog.Any("error", err), ) + return rewrittenURL } + rewrittenURL = re.ReplaceAllString(entry.URL, parts[2]) + slog.Debug("Rewriting entry URL", + slog.String("original_entry_url", entry.URL), + slog.String("rewritten_entry_url", rewrittenURL), + slog.Int64("feed_id", feed.ID), + slog.String("feed_url", feed.FeedURL), + ) + } else { + slog.Debug("Cannot find search and replace terms for replace rule", + slog.String("original_entry_url", entry.URL), + slog.String("rewritten_entry_url", rewrittenURL), + slog.Int64("feed_id", feed.ID), + slog.String("feed_url", feed.FeedURL), + slog.String("url_rewrite_rules", feed.UrlRewriteRules), + ) } return rewrittenURL