diff --git a/internal/playback/handler/handler.go b/internal/playback/handler/handler.go index 382d2016..ba54ef04 100644 --- a/internal/playback/handler/handler.go +++ b/internal/playback/handler/handler.go @@ -8,8 +8,8 @@ import ( "time" "mal/internal/domain" + "mal/internal/playback/proxytarget" "mal/internal/server" - netutil "mal/pkg/net" "github.com/gin-gonic/gin" ) @@ -27,8 +27,8 @@ func NewPlaybackHandler(svc domain.PlaybackService, animeSvc domain.AnimePlaybac return &PlaybackHandler{ svc: svc, animeSvc: animeSvc, - proxyClient: netutil.NewClient(), - streamingClient: netutil.NewStreamingClient(), + proxyClient: proxytarget.NewClient(60 * time.Second), + streamingClient: proxytarget.NewStreamingClient(), subtitleCache: newSubtitleCache(10*time.Minute, 256), } } diff --git a/internal/playback/handler/proxy_request.go b/internal/playback/handler/proxy_request.go index ce004b80..73413cac 100644 --- a/internal/playback/handler/proxy_request.go +++ b/internal/playback/handler/proxy_request.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "mal/internal/observability" + "mal/internal/playback/proxytarget" netutil "mal/pkg/net" "net/http" @@ -11,6 +12,10 @@ import ( ) func newProxyRequest(ctx context.Context, targetURL string, referer string) (*http.Request, error) { + if err := proxytarget.Validate(targetURL); err != nil { + return nil, fmt.Errorf("validate proxy target %q: %w", targetURL, err) + } + req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, nil) if err != nil { return nil, fmt.Errorf("build proxy request for %q: %w", targetURL, err) diff --git a/internal/playback/service.go b/internal/playback/service.go index 65c624d9..1703261b 100644 --- a/internal/playback/service.go +++ b/internal/playback/service.go @@ -7,6 +7,7 @@ import ( "mal/integrations/jikan" "mal/internal/domain" "mal/internal/observability" + "mal/internal/playback/proxytarget" errlog "mal/pkg" netutil "mal/pkg/net" "net/http" @@ -43,6 +44,9 @@ func (s *playbackService) SignProxyToken(targetURL, referer, scope string) (stri if s.proxyTokenKey == "" { return "", nil } + if err := proxytarget.Validate(targetURL); err != nil { + return "", err + } return s.proxyTokens.create(targetURL, referer, scope, 2*time.Hour, time.Now()) }