File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11# frozen_string_literal: true
22
33require "forwardable"
4-
54require "http/headers"
65
76module HTTP
@@ -46,6 +45,9 @@ def initialize(req, options)
4645 reset_timer
4746 rescue IOError , SocketError , SystemCallError => e
4847 raise ConnectionError , "failed to connect: #{ e } " , e . backtrace
48+ rescue TimeoutError
49+ close
50+ raise
4951 end
5052
5153 # @see (HTTP::Response::Parser#status_code)
@@ -126,7 +128,7 @@ def finish_response
126128 # Close the connection
127129 # @return [void]
128130 def close
129- @socket . close unless @socket . closed?
131+ @socket . close unless @socket & .closed?
130132
131133 @pending_response = false
132134 @pending_request = false
Original file line number Diff line number Diff line change 66module HTTP
77 module Timeout
88 class Null
9- extend Forwardable
10-
11- def_delegators :@socket , :close , :closed?
12-
139 attr_reader :options , :socket
1410
1511 def initialize ( options = { } )
@@ -27,6 +23,14 @@ def connect_ssl
2723 @socket . connect
2824 end
2925
26+ def close
27+ @socket &.close
28+ end
29+
30+ def closed?
31+ @socket &.closed?
32+ end
33+
3034 # Configures the SSL connection and starts the connection
3135 def start_tls ( host , ssl_socket_class , ssl_context )
3236 @socket = ssl_socket_class . new ( socket , ssl_context )
Original file line number Diff line number Diff line change 88 :headers => { }
99 )
1010 end
11- let ( :socket ) { double ( :connect => nil ) }
11+ let ( :socket ) { double ( :connect => nil , :close => nil ) }
1212 let ( :timeout_class ) { double ( :new => socket ) }
1313 let ( :opts ) { HTTP ::Options . new ( :timeout_class => timeout_class ) }
1414 let ( :connection ) { HTTP ::Connection . new ( req , opts ) }
1515
16+ describe "#initialize times out" do
17+ let ( :req ) do
18+ HTTP ::Request . new (
19+ :verb => :get ,
20+ :uri => "https://example.com/" ,
21+ :headers => { }
22+ )
23+ end
24+
25+ before do
26+ expect ( socket ) . to receive ( :start_tls ) . and_raise ( HTTP ::TimeoutError )
27+ expect ( socket ) . to receive ( :closed? ) { false }
28+ expect ( socket ) . to receive ( :close )
29+ end
30+
31+ it "closes the connection" do
32+ expect { connection } . to raise_error ( HTTP ::TimeoutError )
33+ end
34+ end
35+
1636 describe "#read_headers!" do
1737 before do
1838 connection . instance_variable_set ( :@pending_response , true )
You can’t perform that action at this time.
0 commit comments