From d7b2d373eaa3d6e80f772dd38a35d4a494be2caf Mon Sep 17 00:00:00 2001 From: kuekhaoyang Date: Sat, 29 Nov 2025 16:19:48 +0800 Subject: [PATCH] feat: Enhance proxy to forward client headers and control caching, and simplify video player's source handling by removing internal proxy URL construction. --- app/api/proxy/route.ts | 12 +++++++++++- components/player/MobileVideoPlayer.tsx | 14 ++++---------- components/player/hooks/useHlsPlayer.ts | 11 +++-------- lib/utils/fetch-with-retry.ts | 10 +++++----- 4 files changed, 23 insertions(+), 24 deletions(-) diff --git a/app/api/proxy/route.ts b/app/api/proxy/route.ts index 77582ea..a20bd57 100644 --- a/app/api/proxy/route.ts +++ b/app/api/proxy/route.ts @@ -15,7 +15,16 @@ export async function GET(request: NextRequest) { } try { - const response = await fetchWithRetry({ url, request }); + // Extract headers to forward (Cookies, Accept-Language, etc.) + const requestHeaders: Record = {}; + const forwardHeaders = ['cookie', 'accept', 'accept-language']; + + forwardHeaders.forEach(key => { + const value = request.headers.get(key); + if (value) requestHeaders[key] = value; + }); + + const response = await fetchWithRetry({ url, request, headers: requestHeaders }); const contentType = response.headers.get('Content-Type'); @@ -68,6 +77,7 @@ export async function GET(request: NextRequest) { headers.set('Access-Control-Allow-Origin', '*'); headers.set('Access-Control-Allow-Methods', 'GET, OPTIONS'); headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + headers.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate'); return new NextResponse(response.body, { status: response.status, diff --git a/components/player/MobileVideoPlayer.tsx b/components/player/MobileVideoPlayer.tsx index e54746c..5076eab 100644 --- a/components/player/MobileVideoPlayer.tsx +++ b/components/player/MobileVideoPlayer.tsx @@ -30,14 +30,8 @@ export function MobileVideoPlayer({ const { refs, state } = useMobilePlayerState(); const { currentTime } = state; - // Ensure src goes through proxy to avoid CORS/IP issues on Vercel - // But don't double-proxy if already proxied - const proxySrc = src.includes('/api/proxy') - ? src - : `${typeof window !== 'undefined' ? window.location.origin : ''}/api/proxy?url=${encodeURIComponent(src)}`; - // Preload HLS segments - useHLSPreloader({ src: proxySrc, currentTime, videoRef: refs.videoRef, isLoading: state.isLoading }); + useHLSPreloader({ src, currentTime, videoRef: refs.videoRef, isLoading: state.isLoading }); const { videoRef, @@ -60,7 +54,7 @@ export function MobileVideoPlayer({ } = state; const logic = useMobilePlayerLogic({ - src: proxySrc, + src, initialTime, shouldAutoPlay, onError, @@ -104,7 +98,7 @@ export function MobileVideoPlayer({