diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 788cfddc..c17b917c 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -31,6 +31,11 @@ jobs: with: chrome-version: stable + - name: Fix GA Chrome Permissions + run: | + sudo chown root:root /opt/hostedtoolcache/setup-chrome/chromium/stable/x64/chrome-sandbox + sudo chmod 4755 /opt/hostedtoolcache/setup-chrome/chromium/stable/x64/chrome-sandbox + - name: Run tests run: | mkdir -p /tmp/ferrum diff --git a/CHANGELOG.md b/CHANGELOG.md index f4738e1f..7a392784 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ### Added +`Ferrum::Network::Request#headers` are enhanced and supplemented with `Network.requestWillBeSentExtraInfo` [#506] + ### Changed ### Fixed diff --git a/lib/ferrum/network.rb b/lib/ferrum/network.rb index 6d8c2c31..005f2097 100644 --- a/lib/ferrum/network.rb +++ b/lib/ferrum/network.rb @@ -380,16 +380,24 @@ def subscribe_request_will_be_sent # We can build exchange in two places, here on the event or when request # is interrupted. So we have to be careful when to create new one. We - # create new exchange only if there's no with such id or there's but + # create new exchange only if there's no with such id or there's, but # it's filled with request which means this one is new but has response # for a redirect. So we assign response from the params to previous # exchange and build new exchange to assign this request to it. exchange = select(request.id).last - exchange = build_exchange(request.id) unless exchange&.blank? + exchange = build_exchange(request.id) if exchange.nil? || !exchange.blank? + request.headers.merge!(Hash(exchange.request_extra_info&.dig("headers"))) exchange.request = request @exchange = exchange if exchange.navigation_request?(@page.main_frame.id) end + + @page.on("Network.requestWillBeSentExtraInfo") do |params| + exchange = select(params["requestId"]).last + exchange ||= build_exchange(params["requestId"]) + exchange.request_extra_info = params + exchange.request&.headers&.merge!(params["headers"]) + end end def subscribe_response_received diff --git a/lib/ferrum/network/exchange.rb b/lib/ferrum/network/exchange.rb index eef99d8f..f3f261be 100644 --- a/lib/ferrum/network/exchange.rb +++ b/lib/ferrum/network/exchange.rb @@ -28,6 +28,9 @@ class Exchange # @return [Error, nil] attr_accessor :error + # @api private + attr_accessor :request_extra_info + # # Initializes the network exchange. # @@ -40,6 +43,7 @@ def initialize(page, id) @page = page @intercepted_request = nil @request = @response = @error = nil + @request_extra_info = nil end # diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 9f94527b..4c944a29 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -46,7 +46,7 @@ end config.after(:all) do - @browser.quit + @browser&.quit end config.before(:each) do