From c91a4f161c788700825406c1799d918bc7e62a3f Mon Sep 17 00:00:00 2001 From: "Ken C. Demanawa" Date: Tue, 14 Jul 2026 09:37:56 +0800 Subject: [PATCH] Fix intercepted request string matching - Use Ruby case matching semantics for intercepted request URL patterns so exact string patterns are compared literally instead of being treated as regexps. - This preserves regexps matching while fixing blacklist and whitelist patterns containing regex metacharacters such as query string question marks. --- lib/ferrum/network/intercepted_request.rb | 9 +++++++-- spec/network/intercepted_request_spec.rb | 24 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/ferrum/network/intercepted_request.rb b/lib/ferrum/network/intercepted_request.rb index 7dda9e65..47c2e9f0 100644 --- a/lib/ferrum/network/intercepted_request.rb +++ b/lib/ferrum/network/intercepted_request.rb @@ -29,8 +29,13 @@ def navigation_request? @params["isNavigationRequest"] end - def match?(regexp) - !!url.match(regexp) + def match?(pattern) + case url + when pattern + true + else + false + end end def respond(**options) diff --git a/spec/network/intercepted_request_spec.rb b/spec/network/intercepted_request_spec.rb index 97f31e18..6db53045 100644 --- a/spec/network/intercepted_request_spec.rb +++ b/spec/network/intercepted_request_spec.rb @@ -1,5 +1,27 @@ # frozen_string_literal: true describe Ferrum::Network::InterceptedRequest do - skip + subject(:request) { described_class.new(nil, params) } + + let(:url) { "https://example.com/img/pattern.svg?1" } + let(:params) do + { + "requestId" => "interception-id", + "request" => { "url" => url } + } + end + + describe "#match?" do + it "matches regular expressions" do + expect(request.match?(/pattern\.svg\?\d/)).to be(true) + end + + it "matches exact strings" do + expect(request.match?("https://example.com/img/pattern.svg?1")).to be(true) + end + + it "does not treat string patterns as regular expressions" do + expect(request.match?("pattern.svg?1")).to be(false) + end + end end