From 0cca033154198158bd623459644e1550a629403b Mon Sep 17 00:00:00 2001
From: Dmitry Vorotilin <d.vorotilin@gmail.com>
Date: Tue, 6 Feb 2024 10:05:15 +0300
Subject: [PATCH] fix: Check if exchange exists before manipulating it

---
 lib/ferrum/network.rb | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/lib/ferrum/network.rb b/lib/ferrum/network.rb
index 0301e61d..46845a40 100644
--- a/lib/ferrum/network.rb
+++ b/lib/ferrum/network.rb
@@ -385,19 +385,19 @@ def subscribe_request_will_be_sent
     def subscribe_response_received
       @page.on("Network.responseReceived") do |params|
         exchange = select(params["requestId"]).last
+        next unless exchange
 
-        if exchange
-          response = Network::Response.new(@page, params)
-          exchange.response = response
-        end
+        response = Network::Response.new(@page, params)
+        exchange.response = response
       end
     end
 
     def subscribe_loading_finished
       @page.on("Network.loadingFinished") do |params|
-        response = select(params["requestId"]).last&.response
+        exchange = select(params["requestId"]).last
+        next unless exchange
 
-        if response
+        if (response = exchange.response)
           response.loaded = true
           response.body_size = params["encodedDataLength"]
         end
@@ -407,8 +407,9 @@ def subscribe_loading_finished
     def subscribe_loading_failed
       @page.on("Network.loadingFailed") do |params|
         exchange = select(params["requestId"]).last
-        exchange.error ||= Network::Error.new
+        next unless exchange
 
+        exchange.error ||= Network::Error.new
         exchange.error.id = params["requestId"]
         exchange.error.type = params["type"]
         exchange.error.error_text = params["errorText"]
@@ -422,8 +423,9 @@ def subscribe_log_entry_added
         entry = params["entry"] || {}
         if entry["source"] == "network" && entry["level"] == "error"
           exchange = select(entry["networkRequestId"]).last
-          exchange.error ||= Network::Error.new
+          next unless exchange
 
+          exchange.error ||= Network::Error.new
           exchange.error.id = entry["networkRequestId"]
           exchange.error.url = entry["url"]
           exchange.error.description = entry["text"]