From 9a27923d69307d16b7712c887bec1c30aa75912e Mon Sep 17 00:00:00 2001 From: ZuoZuo <68836346+Mrz-sakura@users.noreply.github.com> Date: Thu, 23 Jul 2026 04:42:48 +0800 Subject: [PATCH] fix: proxy transparent MP4 effect ranges --- .../transport/http/appapi/media_proxy_handler.go | 14 +++++++++++++- .../http/appapi/media_proxy_handler_test.go | 5 +++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/services/gateway-service/internal/transport/http/appapi/media_proxy_handler.go b/services/gateway-service/internal/transport/http/appapi/media_proxy_handler.go index d5237b45..528f08f0 100644 --- a/services/gateway-service/internal/transport/http/appapi/media_proxy_handler.go +++ b/services/gateway-service/internal/transport/http/appapi/media_proxy_handler.go @@ -20,6 +20,7 @@ var ( "media.haiyihy.com": {}, } effectMediaProxyExtensions = map[string]string{ + ".mp4": "video/mp4", ".pag": "application/octet-stream", ".svga": "application/octet-stream", } @@ -42,6 +43,11 @@ func (h *Handler) proxyEffectMedia(writer http.ResponseWriter, request *http.Req } upstreamRequest.Header.Set("Accept", "application/octet-stream,*/*") upstreamRequest.Header.Set("User-Agent", "hyapp-gateway-effect-media-proxy/1.0") + // 透明 MP4 的浏览器播放器需要 seek 多个采样帧来拆分 RGB/Alpha 通道;透传 Range + // 才能让 video 元素按需取片段,而不是每次检测都重新下载整段动效。 + if value := strings.TrimSpace(request.Header.Get("Range")); value != "" { + upstreamRequest.Header.Set("Range", value) + } upstream, err := effectMediaProxyHTTPClient.Do(upstreamRequest) if err != nil { @@ -66,11 +72,17 @@ func (h *Handler) proxyEffectMedia(writer http.ResponseWriter, request *http.Req header.Set("Content-Type", contentType) header.Set("Cache-Control", "public, max-age=86400") header.Set("X-Content-Type-Options", "nosniff") + if value := strings.TrimSpace(upstream.Header.Get("Accept-Ranges")); value != "" { + header.Set("Accept-Ranges", value) + } + if value := strings.TrimSpace(upstream.Header.Get("Content-Range")); value != "" { + header.Set("Content-Range", value) + } if upstream.ContentLength >= 0 { header.Set("Content-Length", strconv.FormatInt(upstream.ContentLength, 10)) } - writer.WriteHeader(http.StatusOK) + writer.WriteHeader(upstream.StatusCode) _, _ = io.Copy(writer, io.LimitReader(upstream.Body, effectMediaProxyMaxBytes+1)) } diff --git a/services/gateway-service/internal/transport/http/appapi/media_proxy_handler_test.go b/services/gateway-service/internal/transport/http/appapi/media_proxy_handler_test.go index 04d51007..e21b0b62 100644 --- a/services/gateway-service/internal/transport/http/appapi/media_proxy_handler_test.go +++ b/services/gateway-service/internal/transport/http/appapi/media_proxy_handler_test.go @@ -8,6 +8,11 @@ func TestValidateEffectMediaProxyURL(t *testing.T) { url string ok bool }{ + { + name: "mp4 media host", + url: "https://media.haiyihy.com/admin/files/1/20260602/file.mp4?sign=1", + ok: true, + }, { name: "svga media host", url: "https://media.haiyihy.com/admin/files/1/20260602/file.svga",