File tree 3 files changed +39
-0
lines changed
3 files changed +39
-0
lines changed Original file line number Diff line number Diff line change @@ -262,6 +262,11 @@ def request(params={}, &block)
262
262
263
263
datum [ :connection ] = self
264
264
265
+ # cleanup data left behind on persistent connection after interrupt
266
+ if datum [ :persistent ] && !@persistent_socket_reusable
267
+ reset
268
+ end
269
+
265
270
datum [ :stack ] = datum [ :middlewares ] . map do |middleware |
266
271
lambda { |stack | middleware . new ( stack ) }
267
272
end . reverse . inject ( self ) do |middlewares , middleware |
@@ -270,7 +275,9 @@ def request(params={}, &block)
270
275
datum = datum [ :stack ] . request_call ( datum )
271
276
272
277
unless datum [ :pipeline ]
278
+ @persistent_socket_reusable = false
273
279
datum = response ( datum )
280
+ @persistent_socket_reusable = true
274
281
275
282
if datum [ :persistent ]
276
283
if key = datum [ :response ] [ :headers ] . keys . detect { |k | k . casecmp ( 'Connection' ) == 0 }
@@ -344,6 +351,7 @@ def reset
344
351
if old_socket = sockets . delete ( @socket_key )
345
352
old_socket . close rescue nil
346
353
end
354
+ @persistent_socket_reusable = true
347
355
end
348
356
349
357
# Generate HTTP request verb methods
Original file line number Diff line number Diff line change 14
14
connection . send ( :socket ) # creates/connects socket
15
15
connection . data [ :remote_ip ]
16
16
end
17
+
18
+ tests ( "persistent connections" ) do
19
+ connection = Excon . new ( 'http://127.0.0.1:9292' , persistent : true )
20
+
21
+ response_body = connection . request ( path : '/foo' , method : 'get' ) . body
22
+ test ( "successful uninterrupted request" ) do
23
+ connection . request ( path : '/foo' , method : 'get' ) . body == 'foo'
24
+ end
25
+
26
+ begin
27
+ # simulate an interrupted connection which leaves data behind
28
+ Timeout ::timeout ( 0.0000000001 ) do
29
+ connection . request ( path : '/foo' , method : 'get' )
30
+ end
31
+ rescue Timeout ::Error
32
+ nil
33
+ end
34
+
35
+ test ( "resets connection after interrupt" ) do
36
+ response = connection . request ( path : '/bar' , method : 'get' )
37
+ response . body == 'bar'
38
+ end
39
+ end
17
40
end
18
41
19
42
tests ( "inspect redaction" ) do
Original file line number Diff line number Diff line change @@ -32,6 +32,14 @@ class Basic < Sinatra::Base
32
32
echo
33
33
end
34
34
35
+ get ( '/foo' ) do
36
+ 'foo'
37
+ end
38
+
39
+ get ( '/bar' ) do
40
+ 'bar'
41
+ end
42
+
35
43
private
36
44
37
45
def echo
You can’t perform that action at this time.
0 commit comments