From b32cba35c646cb4500de1f7ce894751a565c924d Mon Sep 17 00:00:00 2001 From: Steven Date: Thu, 29 Jan 2026 21:32:54 +0800 Subject: [PATCH] fix: add nil check for AnyResponse in WrapUnary method to prevent caching issues --- server/router/api/v1/connect_interceptors.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/router/api/v1/connect_interceptors.go b/server/router/api/v1/connect_interceptors.go index e4c263929..dab7150d9 100644 --- a/server/router/api/v1/connect_interceptors.go +++ b/server/router/api/v1/connect_interceptors.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "log/slog" + "reflect" "runtime/debug" "connectrpc.com/connect" @@ -56,7 +57,7 @@ func (*MetadataInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc // Prevent browser caching of API responses to avoid stale data issues // See: https://github.com/usememos/memos/issues/5470 - if resp != nil && resp.Header() != nil { + if !isNilAnyResponse(resp) && resp.Header() != nil { resp.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") resp.Header().Set("Pragma", "no-cache") resp.Header().Set("Expires", "0") @@ -66,6 +67,14 @@ func (*MetadataInterceptor) WrapUnary(next connect.UnaryFunc) connect.UnaryFunc } } +func isNilAnyResponse(resp connect.AnyResponse) bool { + if resp == nil { + return true + } + val := reflect.ValueOf(resp) + return val.Kind() == reflect.Ptr && val.IsNil() +} + func (*MetadataInterceptor) WrapStreamingClient(next connect.StreamingClientFunc) connect.StreamingClientFunc { return next }