net-http-persistent 2.4.1 → 2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/History.txt +19 -2
- data/README.rdoc +6 -6
- data/lib/net/http/faster.rb +1 -1
- data/lib/net/http/persistent.rb +169 -69
- data/test/test_net_http_persistent.rb +91 -36
- metadata +4 -5
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
Binary file
|
data/History.txt
CHANGED
@@ -1,6 +1,23 @@
|
|
1
|
+
=== 2.5 / 2012-02-07
|
2
|
+
|
3
|
+
* Minor enhancements
|
4
|
+
* The proxy may be changed at any time.
|
5
|
+
* The allowed SSL version may now be set via #ssl_version.
|
6
|
+
Issue #16 by astera
|
7
|
+
* Added Net::HTTP::Persistent#override_headers which allows overriding
|
8
|
+
* Net::HTTP default headers like User-Agent. See
|
9
|
+
Net::HTTP::Persistent@Headers for details. Issue #17 by andkerosine
|
10
|
+
|
11
|
+
* Bug fixes
|
12
|
+
* The ruby 1.8 speed monkeypatch now handles EAGAIN for windows users.
|
13
|
+
Issue #12 by Alwyn Schoeman
|
14
|
+
* Fixed POST example in README. Submitted by injekt.
|
15
|
+
* Fixed various bugs in the shutdown of connections especially cross-thread
|
16
|
+
(which you shouldn't be doing anyways).
|
17
|
+
|
1
18
|
=== 2.4.1 / 2012-02-03
|
2
19
|
|
3
|
-
* Bug
|
20
|
+
* Bug fixes
|
4
21
|
* When FakeWeb or WebMock are loaded SSL sessions will not be reused to
|
5
22
|
prevent breakage of testing frameworks. Issue #13 by Matt Brictson, pull
|
6
23
|
request #14 by Zachary Scott
|
@@ -10,7 +27,7 @@
|
|
10
27
|
|
11
28
|
=== 2.4 / 2012-01-31
|
12
29
|
|
13
|
-
* Minor
|
30
|
+
* Minor enhancement
|
14
31
|
* net-http-persistent now complains if OpenSSL::SSL::VERIFY_PEER is equal to
|
15
32
|
OpenSSL::SSL::VERIFY_NONE. If you have a platform that is broken this way
|
16
33
|
you must define the constant:
|
data/README.rdoc
CHANGED
@@ -29,21 +29,21 @@ The following example will make two requests to the same server. The
|
|
29
29
|
connection is kept alive between requests:
|
30
30
|
|
31
31
|
require 'net/http/persistent'
|
32
|
-
|
32
|
+
|
33
33
|
uri = URI 'http://example.com/awesome/web/service'
|
34
|
-
|
34
|
+
|
35
35
|
http = Net::HTTP::Persistent.new 'my_app_name'
|
36
|
-
|
36
|
+
|
37
37
|
# perform a GET
|
38
38
|
response = http.request uri
|
39
|
-
|
39
|
+
|
40
40
|
# create a POST
|
41
41
|
post_uri = uri + 'create'
|
42
42
|
post = Net::HTTP::Post.new post_uri.path
|
43
43
|
post.set_form_data 'some' => 'cool data'
|
44
|
-
|
44
|
+
|
45
45
|
# perform the POST, the URI is always required
|
46
|
-
response http.request post_uri, post
|
46
|
+
response = http.request post_uri, post
|
47
47
|
|
48
48
|
Please see the documentation for +Net::HTTP::Persistent+ for more information,
|
49
49
|
including how to handle SSL connections.
|
data/lib/net/http/faster.rb
CHANGED
@@ -13,7 +13,7 @@ class Net::BufferedIO #:nodoc:
|
|
13
13
|
if @io.respond_to? :read_nonblock then
|
14
14
|
begin
|
15
15
|
@rbuf << @io.read_nonblock(65536)
|
16
|
-
rescue Errno::EWOULDBLOCK => e
|
16
|
+
rescue Errno::EWOULDBLOCK, Errno::EAGAIN => e
|
17
17
|
retry if IO.select [@io], nil, nil, @read_timeout
|
18
18
|
raise Timeout::Error, e.message
|
19
19
|
end
|
data/lib/net/http/persistent.rb
CHANGED
@@ -60,14 +60,28 @@ end
|
|
60
60
|
# #private_key :: The client's SSL private key
|
61
61
|
# #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
|
62
62
|
# connection
|
63
|
+
# #ssl_version :: Which specific SSL version to use
|
63
64
|
# #verify_callback :: For server certificate verification
|
64
65
|
# #verify_mode :: How connections should be verified
|
65
66
|
#
|
66
67
|
# == Proxies
|
67
68
|
#
|
68
|
-
# A proxy can be
|
69
|
-
# ::new
|
70
|
-
# consult environment variables.
|
69
|
+
# A proxy can be set through #proxy= or at initialization time by providing a
|
70
|
+
# second argument to ::new. The proxy may be the URI of the proxy server or
|
71
|
+
# <code>:ENV</code> which will consult environment variables.
|
72
|
+
#
|
73
|
+
# See #proxy= and #proxy_from_env for details.
|
74
|
+
#
|
75
|
+
# == Headers
|
76
|
+
#
|
77
|
+
# Headers may be specified for use in every request. #headers are appended to
|
78
|
+
# any headers on the request. #override_headers replace existing headers on
|
79
|
+
# the request.
|
80
|
+
#
|
81
|
+
# The difference between the two can be seen in setting the User-Agent. Using
|
82
|
+
# <code>http.headers['User-Agent'] = 'MyUserAgent'</code> will send "Ruby,
|
83
|
+
# MyUserAgent" while <code>http.override_headers['User-Agent'] =
|
84
|
+
# 'MyUserAgent'</code> will send "MyUserAgent".
|
71
85
|
#
|
72
86
|
# == Tuning
|
73
87
|
#
|
@@ -96,6 +110,14 @@ end
|
|
96
110
|
# The amount of time to wait for a connection to be opened. Set through
|
97
111
|
# #open_timeout.
|
98
112
|
#
|
113
|
+
# === Idle Timeout
|
114
|
+
#
|
115
|
+
# If a connection has not been used in this many seconds it will be reset when
|
116
|
+
# a request would use the connection. The default idle timeout is unlimited.
|
117
|
+
# If you know the server's idle timeout setting this value will eliminate
|
118
|
+
# failures from attempting non-idempotent requests on closed connections. Set
|
119
|
+
# through #idle_timeout.
|
120
|
+
#
|
99
121
|
# === Socket Options
|
100
122
|
#
|
101
123
|
# Socket options may be set on newly-created connections. See #socket_options
|
@@ -107,8 +129,9 @@ end
|
|
107
129
|
# setting retry_change_requests to true requests will automatically be retried
|
108
130
|
# once.
|
109
131
|
#
|
110
|
-
# Only do this when you know that retrying a POST
|
111
|
-
# application and will not create duplicate
|
132
|
+
# Only do this when you know that retrying a POST or other non-idempotent
|
133
|
+
# request is safe for your application and will not create duplicate
|
134
|
+
# resources.
|
112
135
|
#
|
113
136
|
# The recommended way to handle non-idempotent requests is the following:
|
114
137
|
#
|
@@ -149,7 +172,7 @@ class Net::HTTP::Persistent
|
|
149
172
|
##
|
150
173
|
# The version of Net::HTTP::Persistent you are using
|
151
174
|
|
152
|
-
VERSION = '2.
|
175
|
+
VERSION = '2.5'
|
153
176
|
|
154
177
|
##
|
155
178
|
# Error class for errors raised by Net::HTTP::Persistent. Various
|
@@ -175,11 +198,6 @@ class Net::HTTP::Persistent
|
|
175
198
|
|
176
199
|
attr_reader :cert_store
|
177
200
|
|
178
|
-
##
|
179
|
-
# Where this instance's connections live in the thread local variables
|
180
|
-
|
181
|
-
attr_reader :connection_key # :nodoc:
|
182
|
-
|
183
201
|
##
|
184
202
|
# Sends debug_output to this IO via Net::HTTP#set_debug_output.
|
185
203
|
#
|
@@ -189,7 +207,17 @@ class Net::HTTP::Persistent
|
|
189
207
|
attr_accessor :debug_output
|
190
208
|
|
191
209
|
##
|
192
|
-
#
|
210
|
+
# Current connection generation
|
211
|
+
|
212
|
+
attr_reader :generation # :nodoc:
|
213
|
+
|
214
|
+
##
|
215
|
+
# Where this instance's connections live in the thread local variables
|
216
|
+
|
217
|
+
attr_reader :generation_key # :nodoc:
|
218
|
+
|
219
|
+
##
|
220
|
+
# Headers that are added to every request using Net::HTTP#add_field
|
193
221
|
|
194
222
|
attr_reader :headers
|
195
223
|
|
@@ -227,6 +255,11 @@ class Net::HTTP::Persistent
|
|
227
255
|
|
228
256
|
attr_accessor :open_timeout
|
229
257
|
|
258
|
+
##
|
259
|
+
# Headers that are added to every request using Net::HTTP#[]=
|
260
|
+
|
261
|
+
attr_reader :override_headers
|
262
|
+
|
230
263
|
##
|
231
264
|
# This client's SSL private key
|
232
265
|
|
@@ -267,11 +300,24 @@ class Net::HTTP::Persistent
|
|
267
300
|
|
268
301
|
attr_reader :socket_options
|
269
302
|
|
303
|
+
##
|
304
|
+
# Current SSL connection generation
|
305
|
+
|
306
|
+
attr_reader :ssl_generation # :nodoc:
|
307
|
+
|
270
308
|
##
|
271
309
|
# Where this instance's SSL connections live in the thread local variables
|
272
310
|
|
273
311
|
attr_reader :ssl_generation_key # :nodoc:
|
274
312
|
|
313
|
+
##
|
314
|
+
# SSL version to use.
|
315
|
+
#
|
316
|
+
# By default, the version will be negotiated automatically between client
|
317
|
+
# and server. Ruby 1.9 and newer only.
|
318
|
+
|
319
|
+
attr_reader :ssl_version if RUBY_VERSION > '1.9'
|
320
|
+
|
275
321
|
##
|
276
322
|
# Where this instance's last-use times live in the thread local variables
|
277
323
|
|
@@ -304,8 +350,6 @@ class Net::HTTP::Persistent
|
|
304
350
|
|
305
351
|
attr_accessor :retry_change_requests
|
306
352
|
|
307
|
-
attr_reader :ssl_generation # :nodoc:
|
308
|
-
|
309
353
|
##
|
310
354
|
# Creates a new Net::HTTP::Persistent.
|
311
355
|
#
|
@@ -326,38 +370,22 @@ class Net::HTTP::Persistent
|
|
326
370
|
def initialize name = nil, proxy = nil
|
327
371
|
@name = name
|
328
372
|
|
329
|
-
@
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
@proxy_uri.port,
|
340
|
-
@proxy_uri.user,
|
341
|
-
@proxy_uri.password,
|
342
|
-
]
|
343
|
-
|
344
|
-
@proxy_connection_id = [nil, *@proxy_args].join ':'
|
345
|
-
end
|
346
|
-
|
347
|
-
@debug_output = nil
|
348
|
-
@headers = {}
|
349
|
-
@http_versions = {}
|
350
|
-
@keep_alive = 30
|
351
|
-
@open_timeout = nil
|
352
|
-
@read_timeout = nil
|
353
|
-
@idle_timeout = 5
|
354
|
-
@socket_options = []
|
373
|
+
@debug_output = nil
|
374
|
+
@proxy_uri = nil
|
375
|
+
@headers = {}
|
376
|
+
@override_headers = {}
|
377
|
+
@http_versions = {}
|
378
|
+
@keep_alive = 30
|
379
|
+
@open_timeout = nil
|
380
|
+
@read_timeout = nil
|
381
|
+
@idle_timeout = 5
|
382
|
+
@socket_options = []
|
355
383
|
|
356
384
|
@socket_options << [Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1] if
|
357
385
|
Socket.const_defined? :TCP_NODELAY
|
358
386
|
|
359
387
|
key = ['net_http_persistent', name].compact
|
360
|
-
@
|
388
|
+
@generation_key = [key, 'generations' ].join('_').intern
|
361
389
|
@ssl_generation_key = [key, 'ssl_generations'].join('_').intern
|
362
390
|
@request_key = [key, 'requests' ].join('_').intern
|
363
391
|
@timeout_key = [key, 'timeouts' ].join('_').intern
|
@@ -365,14 +393,18 @@ class Net::HTTP::Persistent
|
|
365
393
|
@certificate = nil
|
366
394
|
@ca_file = nil
|
367
395
|
@private_key = nil
|
396
|
+
@ssl_version = nil
|
368
397
|
@verify_callback = nil
|
369
398
|
@verify_mode = OpenSSL::SSL::VERIFY_PEER
|
370
399
|
@cert_store = nil
|
371
400
|
|
401
|
+
@generation = 0 # incremented when proxy URI changes
|
372
402
|
@ssl_generation = 0 # incremented when SSL session variables change
|
373
403
|
@reuse_ssl_sessions = true
|
374
404
|
|
375
405
|
@retry_change_requests = false
|
406
|
+
|
407
|
+
self.proxy = proxy if proxy
|
376
408
|
end
|
377
409
|
|
378
410
|
##
|
@@ -403,12 +435,33 @@ class Net::HTTP::Persistent
|
|
403
435
|
reconnect_ssl
|
404
436
|
end
|
405
437
|
|
438
|
+
##
|
439
|
+
# Finishes all connections on the given +thread+ that were created before
|
440
|
+
# the given +generation+ in the threads +generation_key+ list.
|
441
|
+
#
|
442
|
+
# See #shutdown for a bunch of scary warning about misusing this method.
|
443
|
+
|
444
|
+
def cleanup(generation, thread = Thread.current,
|
445
|
+
generation_key = @generation_key) # :nodoc:
|
446
|
+
timeouts = thread[@timeout_key]
|
447
|
+
|
448
|
+
(0...generation).each do |generation|
|
449
|
+
conns = thread[generation_key].delete generation
|
450
|
+
|
451
|
+
conns.each_value do |conn|
|
452
|
+
finish conn, thread
|
453
|
+
|
454
|
+
timeouts.delete conn.object_id if timeouts
|
455
|
+
end if conns
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
406
459
|
##
|
407
460
|
# Creates a new connection for +uri+
|
408
461
|
|
409
462
|
def connection_for uri
|
463
|
+
Thread.current[@generation_key] ||= Hash.new { |h,k| h[k] = {} }
|
410
464
|
Thread.current[@ssl_generation_key] ||= Hash.new { |h,k| h[k] = {} }
|
411
|
-
Thread.current[@connection_key] ||= {}
|
412
465
|
Thread.current[@request_key] ||= Hash.new 0
|
413
466
|
Thread.current[@timeout_key] ||= Hash.new EPOCH
|
414
467
|
|
@@ -421,7 +474,11 @@ class Net::HTTP::Persistent
|
|
421
474
|
|
422
475
|
connections = Thread.current[@ssl_generation_key][ssl_generation]
|
423
476
|
else
|
424
|
-
|
477
|
+
generation = @generation
|
478
|
+
|
479
|
+
cleanup generation
|
480
|
+
|
481
|
+
connections = Thread.current[@generation_key][generation]
|
425
482
|
end
|
426
483
|
|
427
484
|
net_http_args = [uri.host, uri.port]
|
@@ -490,8 +547,10 @@ class Net::HTTP::Persistent
|
|
490
547
|
##
|
491
548
|
# Finishes the Net::HTTP +connection+
|
492
549
|
|
493
|
-
def finish connection
|
494
|
-
|
550
|
+
def finish connection, thread = Thread.current
|
551
|
+
if requests = thread[@request_key] then
|
552
|
+
requests.delete connection.object_id
|
553
|
+
end
|
495
554
|
|
496
555
|
connection.finish
|
497
556
|
rescue IOError
|
@@ -603,6 +662,41 @@ class Net::HTTP::Persistent
|
|
603
662
|
reconnect_ssl
|
604
663
|
end
|
605
664
|
|
665
|
+
##
|
666
|
+
# Sets the proxy server. The +proxy+ may be the URI of the proxy server,
|
667
|
+
# the symbol +:ENV+ which will read the proxy from the environment or nil to
|
668
|
+
# disable use of a proxy. See #proxy_from_env for details on setting the
|
669
|
+
# proxy from the environment.
|
670
|
+
#
|
671
|
+
# If the proxy URI is set after requests have been made, the next request
|
672
|
+
# will shut-down and re-open all connections.
|
673
|
+
#
|
674
|
+
# If you are making some requests through a proxy and others without a proxy
|
675
|
+
# use separate Net::Http::Persistent instances.
|
676
|
+
|
677
|
+
def proxy= proxy
|
678
|
+
@proxy_uri = case proxy
|
679
|
+
when :ENV then proxy_from_env
|
680
|
+
when URI::HTTP then proxy
|
681
|
+
when nil then # ignore
|
682
|
+
else raise ArgumentError, 'proxy must be :ENV or a URI::HTTP'
|
683
|
+
end
|
684
|
+
|
685
|
+
if @proxy_uri then
|
686
|
+
@proxy_args = [
|
687
|
+
@proxy_uri.host,
|
688
|
+
@proxy_uri.port,
|
689
|
+
@proxy_uri.user,
|
690
|
+
@proxy_uri.password,
|
691
|
+
]
|
692
|
+
|
693
|
+
@proxy_connection_id = [nil, *@proxy_args].join ':'
|
694
|
+
end
|
695
|
+
|
696
|
+
reconnect
|
697
|
+
reconnect_ssl
|
698
|
+
end
|
699
|
+
|
606
700
|
##
|
607
701
|
# Creates a URI for an HTTP proxy server from ENV variables.
|
608
702
|
#
|
@@ -612,7 +706,7 @@ class Net::HTTP::Persistent
|
|
612
706
|
# indicated user and password unless HTTP_PROXY contains either of these in
|
613
707
|
# the URI.
|
614
708
|
#
|
615
|
-
# For Windows users lowercase ENV variables are preferred over uppercase ENV
|
709
|
+
# For Windows users, lowercase ENV variables are preferred over uppercase ENV
|
616
710
|
# variables.
|
617
711
|
|
618
712
|
def proxy_from_env
|
@@ -630,6 +724,13 @@ class Net::HTTP::Persistent
|
|
630
724
|
uri
|
631
725
|
end
|
632
726
|
|
727
|
+
##
|
728
|
+
# Forces reconnection of HTTP connections.
|
729
|
+
|
730
|
+
def reconnect
|
731
|
+
@generation += 1
|
732
|
+
end
|
733
|
+
|
633
734
|
##
|
634
735
|
# Forces reconnection of SSL connections.
|
635
736
|
|
@@ -671,10 +772,14 @@ class Net::HTTP::Persistent
|
|
671
772
|
|
672
773
|
req = Net::HTTP::Get.new uri.request_uri unless req
|
673
774
|
|
674
|
-
headers.each do |pair|
|
775
|
+
@headers.each do |pair|
|
675
776
|
req.add_field(*pair)
|
676
777
|
end
|
677
778
|
|
779
|
+
@override_headers.each do |name, value|
|
780
|
+
req[name] = value
|
781
|
+
end
|
782
|
+
|
678
783
|
unless req['Connection'] then
|
679
784
|
req.add_field 'Connection', 'keep-alive'
|
680
785
|
req.add_field 'Keep-Alive', @keep_alive
|
@@ -743,22 +848,14 @@ class Net::HTTP::Persistent
|
|
743
848
|
# best to call #shutdown in the thread at the appropriate time instead!
|
744
849
|
|
745
850
|
def shutdown thread = Thread.current
|
746
|
-
|
747
|
-
|
748
|
-
connections.each do |_, connection|
|
749
|
-
begin
|
750
|
-
connection.finish
|
751
|
-
rescue IOError
|
752
|
-
end
|
753
|
-
end if connections
|
851
|
+
generation = reconnect
|
852
|
+
cleanup generation, thread, @generation_key
|
754
853
|
|
755
854
|
ssl_generation = reconnect_ssl
|
855
|
+
cleanup ssl_generation, thread, @ssl_generation_key
|
756
856
|
|
757
|
-
|
758
|
-
|
759
|
-
thread[@connection_key] = nil
|
760
|
-
thread[@request_key] = nil
|
761
|
-
thread[@timeout_key] = nil
|
857
|
+
thread[@request_key] = nil
|
858
|
+
thread[@timeout_key] = nil
|
762
859
|
end
|
763
860
|
|
764
861
|
##
|
@@ -785,6 +882,8 @@ class Net::HTTP::Persistent
|
|
785
882
|
def ssl connection
|
786
883
|
connection.use_ssl = true
|
787
884
|
|
885
|
+
connection.ssl_version = @ssl_version if @ssl_version
|
886
|
+
|
788
887
|
connection.verify_mode = @verify_mode
|
789
888
|
|
790
889
|
if OpenSSL::SSL::VERIFY_PEER == OpenSSL::SSL::VERIFY_NONE and
|
@@ -838,17 +937,18 @@ application:
|
|
838
937
|
# Finishes all connections that existed before the given SSL parameter
|
839
938
|
# +generation+.
|
840
939
|
|
841
|
-
def ssl_cleanup generation
|
842
|
-
|
843
|
-
|
940
|
+
def ssl_cleanup generation # :nodoc:
|
941
|
+
cleanup generation, Thread.current, @ssl_generation_key
|
942
|
+
end
|
844
943
|
|
845
|
-
|
846
|
-
|
944
|
+
##
|
945
|
+
# SSL version to use
|
847
946
|
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
947
|
+
def ssl_version= ssl_version
|
948
|
+
@ssl_version = ssl_version
|
949
|
+
|
950
|
+
reconnect_ssl
|
951
|
+
end if RUBY_VERSION > '1.9'
|
852
952
|
|
853
953
|
##
|
854
954
|
# Sets the HTTPS verify mode. Defaults to OpenSSL::SSL::VERIFY_PEER.
|
@@ -95,7 +95,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
95
95
|
raise "#{@uri} is not HTTP" unless @uri.scheme.downcase == 'http'
|
96
96
|
|
97
97
|
c = BasicConnection.new
|
98
|
-
conns["#{@uri.host}:#{@uri.port}"] = c
|
98
|
+
conns[0]["#{@uri.host}:#{@uri.port}"] = c
|
99
99
|
c
|
100
100
|
end
|
101
101
|
|
@@ -117,7 +117,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def conns
|
120
|
-
Thread.current[@http.
|
120
|
+
Thread.current[@http.generation_key] ||= Hash.new { |h,k| h[k] = {} }
|
121
121
|
end
|
122
122
|
|
123
123
|
def reqs
|
@@ -148,14 +148,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
148
148
|
assert_equal 'name', http.name
|
149
149
|
end
|
150
150
|
|
151
|
-
def
|
152
|
-
ENV['HTTP_PROXY'] = 'proxy.example'
|
153
|
-
http = Net::HTTP::Persistent.new nil, :ENV
|
154
|
-
|
155
|
-
assert_equal URI.parse('http://proxy.example'), http.proxy_uri
|
156
|
-
end
|
157
|
-
|
158
|
-
def test_initialize_uri
|
151
|
+
def test_initialize_proxy
|
159
152
|
proxy_uri = URI.parse 'http://proxy.example'
|
160
153
|
|
161
154
|
http = Net::HTTP::Persistent.new nil, proxy_uri
|
@@ -197,8 +190,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
197
190
|
assert_equal 123, c.open_timeout
|
198
191
|
assert_equal 321, c.read_timeout
|
199
192
|
|
200
|
-
assert_includes conns.keys, 'example.com:80'
|
201
|
-
assert_same c, conns['example.com:80']
|
193
|
+
assert_includes conns[0].keys, 'example.com:80'
|
194
|
+
assert_same c, conns[0]['example.com:80']
|
202
195
|
|
203
196
|
socket = c.instance_variable_get :@socket
|
204
197
|
expected = if Socket.const_defined? :TCP_NODELAY then
|
@@ -213,7 +206,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
213
206
|
def test_connection_for_cached
|
214
207
|
cached = basic_connection
|
215
208
|
cached.start
|
216
|
-
conns['example.com:80'] = cached
|
209
|
+
conns[0]['example.com:80'] = cached
|
217
210
|
|
218
211
|
c = @http.connection_for @uri
|
219
212
|
|
@@ -237,7 +230,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
237
230
|
assert c.started?
|
238
231
|
|
239
232
|
assert_includes conns.keys, 'example.com:80'
|
240
|
-
assert_same c, conns['example.com:80']
|
233
|
+
assert_same c, conns[0]['example.com:80']
|
241
234
|
|
242
235
|
socket = c.instance_variable_get :@socket
|
243
236
|
|
@@ -254,8 +247,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
254
247
|
assert c.started?
|
255
248
|
assert_equal io, c.instance_variable_get(:@debug_output)
|
256
249
|
|
257
|
-
assert_includes conns.keys, 'example.com:80'
|
258
|
-
assert_same c, conns['example.com:80']
|
250
|
+
assert_includes conns[0].keys, 'example.com:80'
|
251
|
+
assert_same c, conns[0]['example.com:80']
|
259
252
|
end
|
260
253
|
|
261
254
|
def test_connection_for_finished_ssl
|
@@ -278,7 +271,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
278
271
|
cached = basic_connection
|
279
272
|
def cached.start; raise Errno::EHOSTDOWN end
|
280
273
|
def cached.started?; false end
|
281
|
-
conns['example.com:80'] = cached
|
274
|
+
conns[0]['example.com:80'] = cached
|
282
275
|
|
283
276
|
e = assert_raises Net::HTTP::Persistent::Error do
|
284
277
|
@http.connection_for @uri
|
@@ -339,16 +332,16 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
339
332
|
assert c.started?
|
340
333
|
assert c.proxy?
|
341
334
|
|
342
|
-
assert_includes conns.keys,
|
335
|
+
assert_includes conns[1].keys,
|
343
336
|
'example.com:80:proxy.example:80:johndoe:muffins'
|
344
|
-
assert_same c, conns['example.com:80:proxy.example:80:johndoe:muffins']
|
337
|
+
assert_same c, conns[1]['example.com:80:proxy.example:80:johndoe:muffins']
|
345
338
|
end
|
346
339
|
|
347
340
|
def test_connection_for_refused
|
348
341
|
cached = basic_connection
|
349
342
|
def cached.start; raise Errno::ECONNREFUSED end
|
350
343
|
def cached.started?; false end
|
351
|
-
conns['example.com:80'] = cached
|
344
|
+
conns[0]['example.com:80'] = cached
|
352
345
|
|
353
346
|
e = assert_raises Net::HTTP::Persistent::Error do
|
354
347
|
@http.connection_for @uri
|
@@ -414,7 +407,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
414
407
|
cached.start
|
415
408
|
reqs[cached.object_id] = 10
|
416
409
|
touts[cached.object_id] = Time.now - 6
|
417
|
-
conns['example.com:80'] = cached
|
410
|
+
conns[0]['example.com:80'] = cached
|
418
411
|
|
419
412
|
c = @http.connection_for @uri
|
420
413
|
|
@@ -493,6 +486,16 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
493
486
|
assert_equal 'https://example', @http.normalize_uri('https://example')
|
494
487
|
end
|
495
488
|
|
489
|
+
def test_override_haeders
|
490
|
+
assert_empty @http.override_headers
|
491
|
+
|
492
|
+
@http.override_headers['User-Agent'] = 'MyCustomAgent'
|
493
|
+
|
494
|
+
expected = { 'User-Agent' => 'MyCustomAgent' }
|
495
|
+
|
496
|
+
assert_equal expected, @http.override_headers
|
497
|
+
end
|
498
|
+
|
496
499
|
def test_pipeline
|
497
500
|
skip 'net-http-pipeline not installed' unless defined?(Net::HTTP::Pipeline)
|
498
501
|
|
@@ -519,6 +522,25 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
519
522
|
assert_equal 1, @http.ssl_generation
|
520
523
|
end
|
521
524
|
|
525
|
+
def test_proxy_equals_env
|
526
|
+
ENV['HTTP_PROXY'] = 'proxy.example'
|
527
|
+
|
528
|
+
@http.proxy = :ENV
|
529
|
+
|
530
|
+
assert_equal URI.parse('http://proxy.example'), @http.proxy_uri
|
531
|
+
|
532
|
+
assert_equal 1, @http.generation, 'generation'
|
533
|
+
assert_equal 1, @http.ssl_generation, 'ssl_generation'
|
534
|
+
end
|
535
|
+
|
536
|
+
def test_proxy_equals_uri
|
537
|
+
proxy_uri = URI.parse 'http://proxy.example'
|
538
|
+
|
539
|
+
@http.proxy = proxy_uri
|
540
|
+
|
541
|
+
assert_equal proxy_uri, @http.proxy_uri
|
542
|
+
end
|
543
|
+
|
522
544
|
def test_proxy_from_env
|
523
545
|
ENV['HTTP_PROXY'] = 'proxy.example'
|
524
546
|
ENV['HTTP_PROXY_USER'] = 'johndoe'
|
@@ -559,6 +581,12 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
559
581
|
assert_nil uri
|
560
582
|
end
|
561
583
|
|
584
|
+
def test_reconnect
|
585
|
+
result = @http.reconnect
|
586
|
+
|
587
|
+
assert_equal 1, result
|
588
|
+
end
|
589
|
+
|
562
590
|
def test_reconnect_ssl
|
563
591
|
result = @http.reconnect_ssl
|
564
592
|
|
@@ -566,7 +594,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
566
594
|
end
|
567
595
|
|
568
596
|
def test_request
|
569
|
-
@http.
|
597
|
+
@http.override_headers['user-agent'] = 'test ua'
|
598
|
+
@http.headers['accept'] = 'text/*'
|
570
599
|
c = connection
|
571
600
|
|
572
601
|
res = @http.request @uri
|
@@ -576,9 +605,12 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
576
605
|
|
577
606
|
assert_kind_of Net::HTTP::Get, req
|
578
607
|
assert_equal '/path', req.path
|
608
|
+
|
609
|
+
assert_equal 'test ua', req['user-agent']
|
610
|
+
assert_match %r%text/\*%, req['accept']
|
611
|
+
|
579
612
|
assert_equal 'keep-alive', req['connection']
|
580
613
|
assert_equal '30', req['keep-alive']
|
581
|
-
assert_match %r%test ua%, req['user-agent']
|
582
614
|
|
583
615
|
assert_in_delta Time.now, touts[c.object_id]
|
584
616
|
|
@@ -928,18 +960,21 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
928
960
|
|
929
961
|
@http = orig
|
930
962
|
|
931
|
-
assert c.finished
|
932
|
-
refute c2.finished
|
963
|
+
assert c.finished?, 'last-generation connection must be finished'
|
964
|
+
refute c2.finished?, 'present generation connection must not be finished'
|
933
965
|
|
934
|
-
refute_same cs, conns
|
935
966
|
refute_same rs, reqs
|
936
967
|
refute_same ts, touts
|
937
968
|
|
969
|
+
assert_empty conns
|
970
|
+
assert_empty ssl_conns
|
971
|
+
|
938
972
|
assert_empty reqs
|
939
973
|
assert_empty touts
|
940
974
|
end
|
941
975
|
|
942
976
|
def test_shutdown_in_all_threads
|
977
|
+
conns
|
943
978
|
ssl_conns
|
944
979
|
|
945
980
|
t = Thread.new do
|
@@ -959,23 +994,31 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
959
994
|
|
960
995
|
assert_nil @http.shutdown_in_all_threads
|
961
996
|
|
962
|
-
assert c.finished
|
963
|
-
|
997
|
+
assert c.finished?, 'connection in same thread must be finished'
|
998
|
+
|
999
|
+
assert_empty Thread.current[@http.generation_key]
|
1000
|
+
|
964
1001
|
assert_nil Thread.current[@http.request_key]
|
965
1002
|
|
966
1003
|
t.run
|
967
|
-
assert t.value.finished
|
968
|
-
|
1004
|
+
assert t.value.finished?, 'connection in other thread must be finished'
|
1005
|
+
|
1006
|
+
assert_empty t[@http.generation_key]
|
1007
|
+
|
969
1008
|
assert_nil t[@http.request_key]
|
970
1009
|
end
|
971
1010
|
|
972
1011
|
def test_shutdown_no_connections
|
1012
|
+
conns
|
973
1013
|
ssl_conns
|
974
1014
|
|
975
1015
|
@http.shutdown
|
976
1016
|
|
977
|
-
|
1017
|
+
assert_empty Thread.current[@http.generation_key]
|
1018
|
+
assert_empty Thread.current[@http.ssl_generation_key]
|
1019
|
+
|
978
1020
|
assert_nil Thread.current[@http.request_key]
|
1021
|
+
assert_nil Thread.current[@http.timeout_key]
|
979
1022
|
end
|
980
1023
|
|
981
1024
|
def test_shutdown_not_started
|
@@ -984,12 +1027,15 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
984
1027
|
c = basic_connection
|
985
1028
|
def c.finish() raise IOError end
|
986
1029
|
|
987
|
-
conns["#{@uri.host}:#{@uri.port}"] = c
|
1030
|
+
conns[0]["#{@uri.host}:#{@uri.port}"] = c
|
988
1031
|
|
989
1032
|
@http.shutdown
|
990
1033
|
|
991
|
-
|
1034
|
+
assert_empty Thread.current[@http.generation_key]
|
1035
|
+
assert_empty Thread.current[@http.ssl_generation_key]
|
1036
|
+
|
992
1037
|
assert_nil Thread.current[@http.request_key]
|
1038
|
+
assert_nil Thread.current[@http.timeout_key]
|
993
1039
|
end
|
994
1040
|
|
995
1041
|
def test_shutdown_ssl
|
@@ -1003,11 +1049,11 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
1003
1049
|
end
|
1004
1050
|
|
1005
1051
|
def test_shutdown_thread
|
1006
|
-
ssl_conns
|
1007
|
-
|
1008
1052
|
t = Thread.new do
|
1009
1053
|
c = connection
|
1010
1054
|
conns
|
1055
|
+
ssl_conns
|
1056
|
+
|
1011
1057
|
reqs
|
1012
1058
|
|
1013
1059
|
Thread.stop
|
@@ -1025,8 +1071,10 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
1025
1071
|
|
1026
1072
|
t.run
|
1027
1073
|
assert t.value.finished?
|
1028
|
-
|
1074
|
+
assert_empty t[@http.generation_key]
|
1075
|
+
assert_empty t[@http.ssl_generation_key]
|
1029
1076
|
assert_nil t[@http.request_key]
|
1077
|
+
assert_nil t[@http.timeout_key]
|
1030
1078
|
end
|
1031
1079
|
|
1032
1080
|
def test_ssl
|
@@ -1145,6 +1193,13 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
1145
1193
|
assert_empty reqs # sanity check, performed by #finish
|
1146
1194
|
end
|
1147
1195
|
|
1196
|
+
def test_ssl_version_equals
|
1197
|
+
@http.ssl_version = :ssl_version
|
1198
|
+
|
1199
|
+
assert_equal :ssl_version, @http.ssl_version
|
1200
|
+
assert_equal 1, @http.ssl_generation
|
1201
|
+
end if RUBY_VERSION > '1.9'
|
1202
|
+
|
1148
1203
|
def test_verify_callback_equals
|
1149
1204
|
@http.verify_callback = :verify_callback
|
1150
1205
|
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-http-persistent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 2.4.1
|
8
|
+
- 5
|
9
|
+
version: "2.5"
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Eric Hodel
|
@@ -36,7 +35,7 @@ cert_chain:
|
|
36
35
|
YJY7T/W2n+eWy8WuPhzVUkyzguj0bQe27NDeabgCh2mHd4Hynk2AkYh8MQ==
|
37
36
|
-----END CERTIFICATE-----
|
38
37
|
|
39
|
-
date: 2012-02-
|
38
|
+
date: 2012-02-07 00:00:00 Z
|
40
39
|
dependencies:
|
41
40
|
- !ruby/object:Gem::Dependency
|
42
41
|
name: minitest
|
metadata.gz.sig
CHANGED
Binary file
|