From e0f7e6f2a82580fafc77bfd07529909a05a3ea97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Guillot?= Date: Sun, 15 Jun 2025 14:12:39 -0700 Subject: [PATCH] feat(config)!: remove `SERVER_TIMING_HEADER` config option BREAKING CHANGE: This option is not really useful and it's used only on the unread page. --- internal/config/options.go | 8 -------- internal/config/parser.go | 2 -- internal/ui/unread_entries.go | 25 +------------------------ miniflux.1 | 5 ----- 4 files changed, 1 insertion(+), 39 deletions(-) diff --git a/internal/config/options.go b/internal/config/options.go index 5adb65fb..23491a3f 100644 --- a/internal/config/options.go +++ b/internal/config/options.go @@ -111,7 +111,6 @@ type Options struct { hsts bool httpService bool schedulerService bool - serverTimingHeader bool baseURL string rootURL string basePath string @@ -195,7 +194,6 @@ func NewOptions() *Options { hsts: defaultHSTS, httpService: defaultHTTPService, schedulerService: defaultSchedulerService, - serverTimingHeader: defaultTiming, baseURL: defaultBaseURL, rootURL: defaultRootURL, basePath: defaultBasePath, @@ -300,11 +298,6 @@ func (o *Options) MaintenanceMessage() string { return o.maintenanceMessage } -// HasServerTimingHeader returns true if server-timing headers enabled. -func (o *Options) HasServerTimingHeader() bool { - return o.serverTimingHeader -} - // BaseURL returns the application base URL with path. func (o *Options) BaseURL() string { return o.baseURL @@ -784,7 +777,6 @@ func (o *Options) SortedOptions(redactSecret bool) []*Option { "SCHEDULER_ROUND_ROBIN_MIN_INTERVAL": o.schedulerRoundRobinMinInterval, "SCHEDULER_ROUND_ROBIN_MAX_INTERVAL": o.schedulerRoundRobinMaxInterval, "SCHEDULER_SERVICE": o.schedulerService, - "SERVER_TIMING_HEADER": o.serverTimingHeader, "WATCHDOG": o.watchdog, "WORKER_POOL_SIZE": o.workerPoolSize, "YOUTUBE_API_KEY": redactSecretValue(o.youTubeApiKey, redactSecret), diff --git a/internal/config/parser.go b/internal/config/parser.go index 51412fc6..9fbb2df5 100644 --- a/internal/config/parser.go +++ b/internal/config/parser.go @@ -93,8 +93,6 @@ func (p *Parser) parseLines(lines []string) (err error) { if parsedValue { p.opts.logLevel = "debug" } - case "SERVER_TIMING_HEADER": - p.opts.serverTimingHeader = parseBool(value, defaultTiming) case "BASE_URL": p.opts.baseURL, p.opts.rootURL, p.opts.basePath, err = parseBaseURL(value) if err != nil { diff --git a/internal/ui/unread_entries.go b/internal/ui/unread_entries.go index f7f8ce90..0c5fca5d 100644 --- a/internal/ui/unread_entries.go +++ b/internal/ui/unread_entries.go @@ -4,11 +4,8 @@ package ui // import "miniflux.app/v2/internal/ui" import ( - "fmt" "net/http" - "time" - "miniflux.app/v2/internal/config" "miniflux.app/v2/internal/http/request" "miniflux.app/v2/internal/http/response/html" "miniflux.app/v2/internal/http/route" @@ -18,14 +15,12 @@ import ( ) func (h *handler) showUnreadPage(w http.ResponseWriter, r *http.Request) { - beginPreProcessing := time.Now() user, err := h.store.UserByID(request.UserID(r)) if err != nil { html.ServerError(w, r, err) return } - beginSqlCountUnreadEntries := time.Now() offset := request.QueryIntParam(r, "offset", 0) builder := h.store.NewEntryQueryBuilder(user.ID) builder.WithStatus(model.EntryStatusUnread) @@ -35,13 +30,11 @@ func (h *handler) showUnreadPage(w http.ResponseWriter, r *http.Request) { html.ServerError(w, r, err) return } - finishSqlCountUnreadEntries := time.Now() if offset >= countUnread { offset = 0 } - beginSqlFetchUnreadEntries := time.Now() builder = h.store.NewEntryQueryBuilder(user.ID) builder.WithStatus(model.EntryStatusUnread) builder.WithSorting(user.EntryOrder, user.EntryDirection) @@ -54,7 +47,6 @@ func (h *handler) showUnreadPage(w http.ResponseWriter, r *http.Request) { html.ServerError(w, r, err) return } - finishSqlFetchUnreadEntries := time.Now() sess := session.New(h.store, request.SessionID(r)) view := view.New(h.tpl, r, sess) @@ -66,20 +58,5 @@ func (h *handler) showUnreadPage(w http.ResponseWriter, r *http.Request) { view.Set("countErrorFeeds", h.store.CountUserFeedsWithErrors(user.ID)) view.Set("hasSaveEntry", h.store.HasSaveEntry(user.ID)) - finishPreProcessing := time.Now() - - beginTemplateRendering := time.Now() - render := view.Render("unread_entries") - finishTemplateRendering := time.Now() - - if config.Opts.HasServerTimingHeader() { - w.Header().Set("Server-Timing", fmt.Sprintf("pre_processing;dur=%d,sql_count_unread_entries;dur=%d,sql_fetch_unread_entries;dur=%d,template_rendering;dur=%d", - finishPreProcessing.Sub(beginPreProcessing).Milliseconds(), - finishSqlCountUnreadEntries.Sub(beginSqlCountUnreadEntries).Milliseconds(), - finishSqlFetchUnreadEntries.Sub(beginSqlFetchUnreadEntries).Milliseconds(), - finishTemplateRendering.Sub(beginTemplateRendering).Milliseconds(), - )) - } - - html.OK(w, r, render) + html.OK(w, r, view.Render("unread_entries")) } diff --git a/miniflux.1 b/miniflux.1 index c18b0174..940adbd5 100644 --- a/miniflux.1 +++ b/miniflux.1 @@ -539,11 +539,6 @@ Minimum interval in minutes for the round robin scheduler\&. .br Default is 60 minutes\&. .TP -.B SERVER_TIMING_HEADER -Set the value to 1 to enable server-timing headers\&. -.br -Disabled by default\&. -.TP .B WATCHDOG Enable or disable Systemd watchdog\&. .br