@@ -9,6 +9,7 @@ module NetHttp2
99 PROXY_SETTINGS_KEYS = [ :proxy_addr , :proxy_port , :proxy_user , :proxy_pass ]
1010
1111 AsyncRequestTimeout = Class . new ( StandardError )
12+ SocketClosedError = Class . new ( StandardError )
1213
1314 class Client
1415
@@ -39,8 +40,7 @@ def call(method, path, options={})
3940
4041 def call_async ( request )
4142 ensure_open
42- stream = new_monitored_stream_for request
43- stream . async_call_with request
43+ new_stream . async_call_with request
4444 end
4545
4646 def prepare_request ( method , path , options = { } )
@@ -53,6 +53,7 @@ def ssl?
5353
5454 def close
5555 exit_thread ( @socket_thread )
56+ @socket_error = SocketClosedError . new
5657 init_vars
5758 end
5859
@@ -74,10 +75,14 @@ def stream_count
7475
7576 private
7677
77- def init_vars
78+ def init_vars ( error : nil )
7879 @mutex . synchronize do
7980 @socket . close if @socket && !@socket . closed?
8081
82+ ( @streams || { } ) . each do |k , v |
83+ v . force_close ( @socket_error )
84+ end
85+
8186 @h2 = nil
8287 @socket = nil
8388 @socket_thread = nil
@@ -86,20 +91,16 @@ def init_vars
8691 end
8792 end
8893
89- def new_stream
90- @mutex . synchronize { NetHttp2 ::Stream . new ( h2_stream : h2 . new_stream ) }
91- rescue StandardError => e
92- close
93- raise e
94- end
95-
96- def new_monitored_stream_for ( request )
97- stream = new_stream
94+ def new_stream ( )
95+ stream = @mutex . synchronize { NetHttp2 ::Stream . new ( h2_stream : h2 . new_stream ) }
9896
99- @streams [ stream . id ] = true
100- request . on ( :close ) { @streams . delete ( stream . id ) }
97+ @streams [ stream . id ] = stream
98+ stream . on ( :close ) { @streams . delete ( stream . id ) }
10199
102100 stream
101+ rescue StandardError => e
102+ close
103+ raise e
103104 end
104105
105106 def ensure_open
@@ -115,13 +116,15 @@ def ensure_open
115116
116117 rescue EOFError
117118 # socket closed
119+ @socket_error = SocketError . new ( 'Socket was remotely closed' )
118120 init_vars
119- callback_or_raise SocketError . new ( 'Socket was remotely closed' )
121+ callback_or_raise @socket_error
120122
121123 rescue Exception => e
122124 # error on socket
125+ @socket_error = e
123126 init_vars
124- callback_or_raise e
127+ callback_or_raise @socket_error
125128 end
126129 end . tap { |t | t . abort_on_exception = true }
127130 end
0 commit comments