From 4d760fab55214d209e5dbca497f4cbac175f86ce Mon Sep 17 00:00:00 2001 From: Rustem Kamalov Date: Wed, 29 Apr 2026 05:03:30 +0300 Subject: [PATCH] fix: browser request blocking cleanup panic --- core/browser.go | 24 ++++++++++++++++++++++-- core/browser_resource_blocking_test.go | 19 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/core/browser.go b/core/browser.go index 83ffbfa..7b73deb 100644 --- a/core/browser.go +++ b/core/browser.go @@ -153,6 +153,21 @@ func blockedResourceTypeSet(types []proto.NetworkResourceType) map[proto.Network return out } +func proxyAuthFetchPatterns() []*proto.FetchRequestPattern { + return []*proto.FetchRequestPattern{ + { + URLPattern: "http://*/*", + ResourceType: proto.NetworkResourceTypeDocument, + RequestStage: proto.FetchRequestStageRequest, + }, + { + URLPattern: "https://*/*", + ResourceType: proto.NetworkResourceTypeDocument, + RequestStage: proto.FetchRequestStageRequest, + }, + } +} + func (b *Browser) configureRequestBlocking(ctx context.Context, page *rod.Page) error { if !b.BlockTrackers && len(b.BlockResourceTypes) == 0 { return nil @@ -198,7 +213,9 @@ func (b *Browser) configureRequestBlocking(ctx context.Context, page *rod.Page) // Stop the router when the page context is done to avoid goroutine leak. go func() { <-ctx.Done() - router.MustStop() + if err := router.Stop(); err != nil && !errors.Is(err, context.Canceled) && !isBrowserClosedError(err) { + WithRequest(ctx).WithError(err).Debug("Stop request-blocking router failed") + } }() return nil @@ -491,7 +508,10 @@ func (b *Browser) startProxyAuthListener(browser *rod.Browser) error { }() <-started - if err := (proto.FetchEnable{HandleAuthRequests: true}).Call(browser); err != nil { + if err := (proto.FetchEnable{ + Patterns: proxyAuthFetchPatterns(), + HandleAuthRequests: true, + }).Call(browser); err != nil { cancel() <-stopped state.authCancel = nil diff --git a/core/browser_resource_blocking_test.go b/core/browser_resource_blocking_test.go index 9c82419..2674bee 100644 --- a/core/browser_resource_blocking_test.go +++ b/core/browser_resource_blocking_test.go @@ -51,6 +51,25 @@ func TestShouldBlockResourceType(t *testing.T) { } } +func TestProxyAuthFetchPatternsOnlyInterceptDocuments(t *testing.T) { + patterns := proxyAuthFetchPatterns() + if len(patterns) != 2 { + t.Fatalf("expected 2 proxy auth fetch patterns, got %d", len(patterns)) + } + + for _, pattern := range patterns { + if pattern.URLPattern != "http://*/*" && pattern.URLPattern != "https://*/*" { + t.Fatalf("unexpected proxy auth URL pattern: %q", pattern.URLPattern) + } + if pattern.ResourceType != proto.NetworkResourceTypeDocument { + t.Fatalf("expected document-only proxy auth interception, got %s", pattern.ResourceType) + } + if pattern.RequestStage != proto.FetchRequestStageRequest { + t.Fatalf("expected request-stage proxy auth interception, got %s", pattern.RequestStage) + } + } +} + func TestParseBlockedResourceTypes(t *testing.T) { got, err := ParseBlockedResourceTypes("image,font,css,js,media") if err != nil {