net-http-persistent 2.8 → 2.9
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +1 -1
- data/.autotest +3 -1
- data/History.txt +22 -0
- data/lib/net/http/persistent.rb +138 -36
- data/test/test_net_http_persistent.rb +279 -70
- data/test/test_net_http_persistent_ssl_reuse.rb +11 -5
- metadata +39 -62
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: ea7002c40a540ea921855f2b04c1862c0e501bb9
|
|
4
|
+
data.tar.gz: 2e542b3cbdc4752799409f8dd1ecbbbb1ee84f0a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 591fb46b7ac365d1268935f44a449cdd4cfc56c64398d3e258baf7cd5e215fd213e42f5f9fcc5fdc032daae2dc93a34404833dd3a9afc6dc0ed4828547709f11
|
|
7
|
+
data.tar.gz: 3865436c02a8efecc81c335bb603d1ca2b540a3dde995df17f7dc844e38d0715279a02d4cf77128bff9f837380530e3d3487e3a396e05a6e1fa4936b904ea7cf
|
checksums.yaml.gz.sig
ADDED
|
Binary file
|
data.tar.gz.sig
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
��iB�����<WȌ���Kz�|t�*��{Ѳȇ��*M���T�M�BM�����VU�bMorv�#�D��m;7�%�7A��g���O��q.S+�����W��"/���Q�a��\�TK��Lя�V��Q��wcy��L[�S���Ӽ'��]��Ap��KS}��/ ��,�Lz��I�R�}��y1�v$?$^*CH��B�h�Ú��E�O�qǥۉ6C�|g"�NJA��g��G(
|
data/.autotest
CHANGED
data/History.txt
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
=== 2.9 / 2013-07-24
|
|
2
|
+
|
|
3
|
+
* Minor enhancement
|
|
4
|
+
* Added max_requests to avoid ECONNRESET for a server that allows a limited
|
|
5
|
+
number of requests on a connection. Pull request #42 by James Tucker.
|
|
6
|
+
* Request failures are now raised with the backtrace of the original
|
|
7
|
+
exception. This gives better insight into the reason for the failure.
|
|
8
|
+
See #41 by Andrew Cholakian.
|
|
9
|
+
* OpenSSL is no longer required. If OpenSSL is not available an exception
|
|
10
|
+
will be raised when attempting to access HTTPS resources. Feature request
|
|
11
|
+
by André Arko
|
|
12
|
+
|
|
13
|
+
* Bug fixes
|
|
14
|
+
* Explain the proper way of sending parameters depending upon the request
|
|
15
|
+
method. Issue #35 by André Arko.
|
|
16
|
+
* Handle Errno::ETIMEDOUT by retrying the request. Issue #36 by André Arko.
|
|
17
|
+
* Requests retried by ruby 2.x are no longer retried by net-http-persistent.
|
|
18
|
+
* Finish the connection if an otherwise unhandled exception happens during a
|
|
19
|
+
request. Bug #46 by Mark Oude Veldhuis.
|
|
20
|
+
* detect_idle_timeout now assumes a StandardError indicates the idle timeout
|
|
21
|
+
has been found. Bug #43 by James Tucker.
|
|
22
|
+
|
|
1
23
|
=== 2.8 / 2012-10-17
|
|
2
24
|
|
|
3
25
|
* Minor enhancements
|
data/lib/net/http/persistent.rb
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
require 'net/http'
|
|
2
|
-
|
|
2
|
+
begin
|
|
3
|
+
require 'net/https'
|
|
4
|
+
rescue LoadError
|
|
5
|
+
# net/https or openssl
|
|
6
|
+
end if RUBY_VERSION < '1.9' # but only for 1.8
|
|
3
7
|
require 'net/http/faster'
|
|
4
8
|
require 'uri'
|
|
5
9
|
require 'cgi' # for escaping
|
|
@@ -9,6 +13,8 @@ begin
|
|
|
9
13
|
rescue LoadError
|
|
10
14
|
end
|
|
11
15
|
|
|
16
|
+
autoload :OpenSSL, 'openssl'
|
|
17
|
+
|
|
12
18
|
##
|
|
13
19
|
# Persistent connections for Net::HTTP
|
|
14
20
|
#
|
|
@@ -37,6 +43,11 @@ end
|
|
|
37
43
|
# # perform a GET
|
|
38
44
|
# response = http.request uri
|
|
39
45
|
#
|
|
46
|
+
# # or
|
|
47
|
+
#
|
|
48
|
+
# get = Net::HTTP::Get.new uri.request_uri
|
|
49
|
+
# response = http.request get
|
|
50
|
+
#
|
|
40
51
|
# # create a POST
|
|
41
52
|
# post_uri = uri + 'create'
|
|
42
53
|
# post = Net::HTTP::Post.new post_uri.path
|
|
@@ -45,6 +56,10 @@ end
|
|
|
45
56
|
# # perform the POST, the URI is always required
|
|
46
57
|
# response http.request post_uri, post
|
|
47
58
|
#
|
|
59
|
+
# Note that for GET, HEAD and other requests that do not have a body you want
|
|
60
|
+
# to use URI#request_uri not URI#path. The request_uri contains the query
|
|
61
|
+
# params which are sent in the body for other requests.
|
|
62
|
+
#
|
|
48
63
|
# == SSL
|
|
49
64
|
#
|
|
50
65
|
# SSL connections are automatically created depending upon the scheme of the
|
|
@@ -105,6 +120,13 @@ end
|
|
|
105
120
|
# The amount of time allowed between reading two chunks from the socket. Set
|
|
106
121
|
# through #read_timeout
|
|
107
122
|
#
|
|
123
|
+
# === Max Requests
|
|
124
|
+
#
|
|
125
|
+
# The number of requests that should be made before opening a new connection.
|
|
126
|
+
# Typically many keep-alive capable servers tune this to 100 or less, so the
|
|
127
|
+
# 101st request will fail with ECONNRESET. If unset (default), this value has no
|
|
128
|
+
# effect, if set, connections will be reset on the request after max_requests.
|
|
129
|
+
#
|
|
108
130
|
# === Open Timeout
|
|
109
131
|
#
|
|
110
132
|
# The amount of time to wait for a connection to be opened. Set through
|
|
@@ -173,10 +195,30 @@ class Net::HTTP::Persistent
|
|
|
173
195
|
|
|
174
196
|
EPOCH = Time.at 0 # :nodoc:
|
|
175
197
|
|
|
198
|
+
##
|
|
199
|
+
# Is OpenSSL available? This test works with autoload
|
|
200
|
+
|
|
201
|
+
HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
|
|
202
|
+
|
|
176
203
|
##
|
|
177
204
|
# The version of Net::HTTP::Persistent you are using
|
|
178
205
|
|
|
179
|
-
VERSION = '2.
|
|
206
|
+
VERSION = '2.9'
|
|
207
|
+
|
|
208
|
+
##
|
|
209
|
+
# Exceptions rescued for automatic retry on ruby 2.0.0. This overlaps with
|
|
210
|
+
# the exception list for ruby 1.x.
|
|
211
|
+
|
|
212
|
+
RETRIED_EXCEPTIONS = [ # :nodoc:
|
|
213
|
+
(Net::ReadTimeout if Net.const_defined? :ReadTimeout),
|
|
214
|
+
IOError,
|
|
215
|
+
EOFError,
|
|
216
|
+
Errno::ECONNRESET,
|
|
217
|
+
Errno::ECONNABORTED,
|
|
218
|
+
Errno::EPIPE,
|
|
219
|
+
(OpenSSL::SSL::SSLError if HAVE_OPENSSL),
|
|
220
|
+
Timeout::Error,
|
|
221
|
+
].compact
|
|
180
222
|
|
|
181
223
|
##
|
|
182
224
|
# Error class for errors raised by Net::HTTP::Persistent. Various
|
|
@@ -226,6 +268,8 @@ class Net::HTTP::Persistent
|
|
|
226
268
|
$stderr.puts "sleeping #{sleep_time}" if $DEBUG
|
|
227
269
|
sleep sleep_time
|
|
228
270
|
end
|
|
271
|
+
rescue
|
|
272
|
+
# ignore StandardErrors, we've probably found the idle timeout.
|
|
229
273
|
ensure
|
|
230
274
|
http.shutdown
|
|
231
275
|
|
|
@@ -287,6 +331,12 @@ class Net::HTTP::Persistent
|
|
|
287
331
|
|
|
288
332
|
attr_accessor :idle_timeout
|
|
289
333
|
|
|
334
|
+
##
|
|
335
|
+
# Maximum number of requests on a connection before it is considered expired
|
|
336
|
+
# and automatically closed.
|
|
337
|
+
|
|
338
|
+
attr_accessor :max_requests
|
|
339
|
+
|
|
290
340
|
##
|
|
291
341
|
# The value sent in the Keep-Alive header. Defaults to 30. Not needed for
|
|
292
342
|
# HTTP/1.1 servers.
|
|
@@ -442,6 +492,7 @@ class Net::HTTP::Persistent
|
|
|
442
492
|
@open_timeout = nil
|
|
443
493
|
@read_timeout = nil
|
|
444
494
|
@idle_timeout = 5
|
|
495
|
+
@max_requests = nil
|
|
445
496
|
@socket_options = []
|
|
446
497
|
|
|
447
498
|
@socket_options << [Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1] if
|
|
@@ -458,15 +509,22 @@ class Net::HTTP::Persistent
|
|
|
458
509
|
@private_key = nil
|
|
459
510
|
@ssl_version = nil
|
|
460
511
|
@verify_callback = nil
|
|
461
|
-
@verify_mode =
|
|
512
|
+
@verify_mode = nil
|
|
462
513
|
@cert_store = nil
|
|
463
514
|
|
|
464
515
|
@generation = 0 # incremented when proxy URI changes
|
|
465
516
|
@ssl_generation = 0 # incremented when SSL session variables change
|
|
466
|
-
|
|
517
|
+
|
|
518
|
+
if HAVE_OPENSSL then
|
|
519
|
+
@verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
520
|
+
@reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
|
|
521
|
+
end
|
|
467
522
|
|
|
468
523
|
@retry_change_requests = false
|
|
469
524
|
|
|
525
|
+
@ruby_1 = RUBY_VERSION < '2'
|
|
526
|
+
@retried_on_ruby_2 = !@ruby_1
|
|
527
|
+
|
|
470
528
|
self.proxy = proxy if proxy
|
|
471
529
|
end
|
|
472
530
|
|
|
@@ -536,6 +594,9 @@ class Net::HTTP::Persistent
|
|
|
536
594
|
use_ssl = uri.scheme.downcase == 'https'
|
|
537
595
|
|
|
538
596
|
if use_ssl then
|
|
597
|
+
raise Net::HTTP::Persistent::Error, 'OpenSSL is not available' unless
|
|
598
|
+
HAVE_OPENSSL
|
|
599
|
+
|
|
539
600
|
ssl_generation = @ssl_generation
|
|
540
601
|
|
|
541
602
|
ssl_cleanup ssl_generation
|
|
@@ -606,10 +667,12 @@ class Net::HTTP::Persistent
|
|
|
606
667
|
end
|
|
607
668
|
|
|
608
669
|
##
|
|
609
|
-
# Returns true if the connection should be reset due to an idle timeout,
|
|
610
|
-
# false otherwise.
|
|
670
|
+
# Returns true if the connection should be reset due to an idle timeout, or
|
|
671
|
+
# maximum request count, false otherwise.
|
|
611
672
|
|
|
612
673
|
def expired? connection
|
|
674
|
+
requests = Thread.current[@request_key][connection.object_id]
|
|
675
|
+
return true if @max_requests && requests >= @max_requests
|
|
613
676
|
return false unless @idle_timeout
|
|
614
677
|
return true if @idle_timeout.zero?
|
|
615
678
|
|
|
@@ -679,10 +742,15 @@ class Net::HTTP::Persistent
|
|
|
679
742
|
end
|
|
680
743
|
|
|
681
744
|
##
|
|
682
|
-
# Is the request idempotent or is retry_change_requests allowed
|
|
745
|
+
# Is the request +req+ idempotent or is retry_change_requests allowed.
|
|
746
|
+
#
|
|
747
|
+
# If +retried_on_ruby_2+ is true, true will be returned if we are on ruby,
|
|
748
|
+
# retry_change_requests is allowed and the request is not idempotent.
|
|
683
749
|
|
|
684
|
-
def can_retry? req
|
|
685
|
-
retry_change_requests
|
|
750
|
+
def can_retry? req, retried_on_ruby_2 = false
|
|
751
|
+
return @retry_change_requests && !idempotent?(req) if retried_on_ruby_2
|
|
752
|
+
|
|
753
|
+
@retry_change_requests || idempotent?(req)
|
|
686
754
|
end
|
|
687
755
|
|
|
688
756
|
if RUBY_VERSION > '1.9' then
|
|
@@ -833,11 +901,11 @@ class Net::HTTP::Persistent
|
|
|
833
901
|
env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
|
|
834
902
|
|
|
835
903
|
# '*' is special case for always bypass
|
|
836
|
-
return nil if env_no_proxy == '*'
|
|
904
|
+
return nil if env_no_proxy == '*'
|
|
837
905
|
|
|
838
906
|
if env_no_proxy then
|
|
839
907
|
uri.query = "no_proxy=#{escape(env_no_proxy)}"
|
|
840
|
-
end
|
|
908
|
+
end
|
|
841
909
|
|
|
842
910
|
unless uri.user or uri.password then
|
|
843
911
|
uri.user = escape ENV['http_proxy_user'] || ENV['HTTP_PROXY_USER']
|
|
@@ -901,27 +969,14 @@ class Net::HTTP::Persistent
|
|
|
901
969
|
#
|
|
902
970
|
# +req+ must be a Net::HTTPRequest subclass (see Net::HTTP for a list).
|
|
903
971
|
#
|
|
904
|
-
# If there is an error and the request is
|
|
972
|
+
# If there is an error and the request is idempotent according to RFC 2616
|
|
905
973
|
# it will be retried automatically.
|
|
906
974
|
|
|
907
975
|
def request uri, req = nil, &block
|
|
908
976
|
retried = false
|
|
909
977
|
bad_response = false
|
|
910
978
|
|
|
911
|
-
req =
|
|
912
|
-
|
|
913
|
-
@headers.each do |pair|
|
|
914
|
-
req.add_field(*pair)
|
|
915
|
-
end
|
|
916
|
-
|
|
917
|
-
@override_headers.each do |name, value|
|
|
918
|
-
req[name] = value
|
|
919
|
-
end
|
|
920
|
-
|
|
921
|
-
unless req['Connection'] then
|
|
922
|
-
req.add_field 'Connection', 'keep-alive'
|
|
923
|
-
req.add_field 'Keep-Alive', @keep_alive
|
|
924
|
-
end
|
|
979
|
+
req = request_setup req || uri
|
|
925
980
|
|
|
926
981
|
connection = connection_for uri
|
|
927
982
|
connection_id = connection.object_id
|
|
@@ -946,23 +1001,25 @@ class Net::HTTP::Persistent
|
|
|
946
1001
|
|
|
947
1002
|
bad_response = true
|
|
948
1003
|
retry
|
|
949
|
-
rescue
|
|
950
|
-
|
|
951
|
-
|
|
1004
|
+
rescue *RETRIED_EXCEPTIONS => e # retried on ruby 2
|
|
1005
|
+
request_failed e, req, connection if
|
|
1006
|
+
retried or not can_retry? req, @retried_on_ruby_2
|
|
952
1007
|
|
|
953
|
-
|
|
954
|
-
due_to = "(due to #{e.message} - #{e.class})"
|
|
955
|
-
message = error_message connection
|
|
956
|
-
|
|
957
|
-
finish connection
|
|
1008
|
+
reset connection
|
|
958
1009
|
|
|
959
|
-
|
|
960
|
-
|
|
1010
|
+
retried = true
|
|
1011
|
+
retry
|
|
1012
|
+
rescue Errno::EINVAL, Errno::ETIMEDOUT => e # not retried on ruby 2
|
|
1013
|
+
request_failed e, req, connection if retried or not can_retry? req
|
|
961
1014
|
|
|
962
1015
|
reset connection
|
|
963
1016
|
|
|
964
1017
|
retried = true
|
|
965
1018
|
retry
|
|
1019
|
+
rescue Exception => e
|
|
1020
|
+
finish connection
|
|
1021
|
+
|
|
1022
|
+
raise
|
|
966
1023
|
ensure
|
|
967
1024
|
Thread.current[@timeout_key][connection_id] = Time.now
|
|
968
1025
|
end
|
|
@@ -972,6 +1029,51 @@ class Net::HTTP::Persistent
|
|
|
972
1029
|
response
|
|
973
1030
|
end
|
|
974
1031
|
|
|
1032
|
+
##
|
|
1033
|
+
# Raises an Error for +exception+ which resulted from attempting the request
|
|
1034
|
+
# +req+ on the +connection+.
|
|
1035
|
+
#
|
|
1036
|
+
# Finishes the +connection+.
|
|
1037
|
+
|
|
1038
|
+
def request_failed exception, req, connection # :nodoc:
|
|
1039
|
+
due_to = "(due to #{exception.message} - #{exception.class})"
|
|
1040
|
+
message = "too many connection resets #{due_to} #{error_message connection}"
|
|
1041
|
+
|
|
1042
|
+
finish connection
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
raise Error, message, exception.backtrace
|
|
1046
|
+
end
|
|
1047
|
+
|
|
1048
|
+
##
|
|
1049
|
+
# Creates a GET request if +req_or_uri+ is a URI and adds headers to the
|
|
1050
|
+
# request.
|
|
1051
|
+
#
|
|
1052
|
+
# Returns the request.
|
|
1053
|
+
|
|
1054
|
+
def request_setup req_or_uri # :nodoc:
|
|
1055
|
+
req = if URI === req_or_uri then
|
|
1056
|
+
Net::HTTP::Get.new req_or_uri.request_uri
|
|
1057
|
+
else
|
|
1058
|
+
req_or_uri
|
|
1059
|
+
end
|
|
1060
|
+
|
|
1061
|
+
@headers.each do |pair|
|
|
1062
|
+
req.add_field(*pair)
|
|
1063
|
+
end
|
|
1064
|
+
|
|
1065
|
+
@override_headers.each do |name, value|
|
|
1066
|
+
req[name] = value
|
|
1067
|
+
end
|
|
1068
|
+
|
|
1069
|
+
unless req['Connection'] then
|
|
1070
|
+
req.add_field 'Connection', 'keep-alive'
|
|
1071
|
+
req.add_field 'Keep-Alive', @keep_alive
|
|
1072
|
+
end
|
|
1073
|
+
|
|
1074
|
+
req
|
|
1075
|
+
end
|
|
1076
|
+
|
|
975
1077
|
##
|
|
976
1078
|
# Shuts down all connections for +thread+.
|
|
977
1079
|
#
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
require 'minitest/autorun'
|
|
3
3
|
require 'net/http/persistent'
|
|
4
|
-
require 'openssl'
|
|
5
4
|
require 'stringio'
|
|
6
5
|
|
|
6
|
+
HAVE_OPENSSL = defined?(OpenSSL::SSL)
|
|
7
|
+
|
|
7
8
|
module Net::HTTP::Persistent::TestConnect
|
|
8
9
|
def self.included mod
|
|
9
10
|
mod.send :alias_method, :orig_connect, :connect
|
|
@@ -54,13 +55,15 @@ class Net::HTTP::Persistent::SSLReuse
|
|
|
54
55
|
include Net::HTTP::Persistent::TestConnect
|
|
55
56
|
end
|
|
56
57
|
|
|
57
|
-
class TestNetHttpPersistent <
|
|
58
|
+
class TestNetHttpPersistent < Minitest::Test
|
|
59
|
+
|
|
60
|
+
RUBY_1 = RUBY_VERSION < '2'
|
|
58
61
|
|
|
59
62
|
def setup
|
|
60
|
-
@http_class = if
|
|
61
|
-
Net::HTTP
|
|
62
|
-
else
|
|
63
|
+
@http_class = if RUBY_1 and HAVE_OPENSSL then
|
|
63
64
|
Net::HTTP::Persistent::SSLReuse
|
|
65
|
+
else
|
|
66
|
+
Net::HTTP
|
|
64
67
|
end
|
|
65
68
|
|
|
66
69
|
@http = Net::HTTP::Persistent.new
|
|
@@ -177,6 +180,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
177
180
|
|
|
178
181
|
assert_empty @http.no_proxy
|
|
179
182
|
|
|
183
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
184
|
+
|
|
180
185
|
ssl_session_exists = OpenSSL::SSL.const_defined? :Session
|
|
181
186
|
|
|
182
187
|
assert_equal ssl_session_exists, @http.reuse_ssl_sessions
|
|
@@ -188,6 +193,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
188
193
|
end
|
|
189
194
|
|
|
190
195
|
def test_initialize_no_ssl_session
|
|
196
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
197
|
+
|
|
191
198
|
skip "OpenSSL::SSL::Session does not exist on #{RUBY_PLATFORM}" unless
|
|
192
199
|
OpenSSL::SSL.const_defined? :Session
|
|
193
200
|
|
|
@@ -217,6 +224,39 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
217
224
|
assert_equal 1, @http.ssl_generation
|
|
218
225
|
end
|
|
219
226
|
|
|
227
|
+
def test_can_retry_eh_change_requests
|
|
228
|
+
post = Net::HTTP::Post.new '/'
|
|
229
|
+
|
|
230
|
+
refute @http.can_retry? post
|
|
231
|
+
|
|
232
|
+
@http.retry_change_requests = true
|
|
233
|
+
|
|
234
|
+
assert @http.can_retry? post
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
if RUBY_1 then
|
|
238
|
+
def test_can_retry_eh_idempotent
|
|
239
|
+
head = Net::HTTP::Head.new '/'
|
|
240
|
+
|
|
241
|
+
assert @http.can_retry? head
|
|
242
|
+
|
|
243
|
+
post = Net::HTTP::Post.new '/'
|
|
244
|
+
|
|
245
|
+
refute @http.can_retry? post
|
|
246
|
+
end
|
|
247
|
+
else
|
|
248
|
+
def test_can_retry_eh_idempotent
|
|
249
|
+
head = Net::HTTP::Head.new '/'
|
|
250
|
+
|
|
251
|
+
assert @http.can_retry? head
|
|
252
|
+
refute @http.can_retry? head, true
|
|
253
|
+
|
|
254
|
+
post = Net::HTTP::Post.new '/'
|
|
255
|
+
|
|
256
|
+
refute @http.can_retry? post
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
220
260
|
def test_cert_store_equals
|
|
221
261
|
@http.cert_store = :cert_store
|
|
222
262
|
|
|
@@ -366,6 +406,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
366
406
|
end
|
|
367
407
|
|
|
368
408
|
def test_connection_for_finished_ssl
|
|
409
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
410
|
+
|
|
369
411
|
uri = URI.parse 'https://example.com/path'
|
|
370
412
|
c = @http.connection_for uri
|
|
371
413
|
|
|
@@ -526,6 +568,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
526
568
|
end
|
|
527
569
|
|
|
528
570
|
def test_connection_for_ssl
|
|
571
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
572
|
+
|
|
529
573
|
uri = URI.parse 'https://example.com/path'
|
|
530
574
|
c = @http.connection_for uri
|
|
531
575
|
|
|
@@ -534,6 +578,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
534
578
|
end
|
|
535
579
|
|
|
536
580
|
def test_connection_for_ssl_cached
|
|
581
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
582
|
+
|
|
537
583
|
@uri = URI.parse 'https://example.com/path'
|
|
538
584
|
|
|
539
585
|
cached = ssl_connection 0
|
|
@@ -544,6 +590,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
544
590
|
end
|
|
545
591
|
|
|
546
592
|
def test_connection_for_ssl_cached_reconnect
|
|
593
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
594
|
+
|
|
547
595
|
@uri = URI.parse 'https://example.com/path'
|
|
548
596
|
|
|
549
597
|
cached = ssl_connection
|
|
@@ -556,6 +604,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
556
604
|
end
|
|
557
605
|
|
|
558
606
|
def test_connection_for_ssl_case
|
|
607
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
608
|
+
|
|
559
609
|
uri = URI.parse 'HTTPS://example.com/path'
|
|
560
610
|
c = @http.connection_for uri
|
|
561
611
|
|
|
@@ -596,6 +646,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
596
646
|
|
|
597
647
|
def test_expired_eh
|
|
598
648
|
c = basic_connection
|
|
649
|
+
reqs[c.object_id] = 0
|
|
599
650
|
touts[c.object_id] = Time.now - 11
|
|
600
651
|
|
|
601
652
|
@http.idle_timeout = 0
|
|
@@ -614,6 +665,23 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
614
665
|
refute @http.expired? c
|
|
615
666
|
end
|
|
616
667
|
|
|
668
|
+
def test_expired_due_to_max_requests
|
|
669
|
+
c = basic_connection
|
|
670
|
+
reqs[c.object_id] = 0
|
|
671
|
+
touts[c.object_id] = Time.now
|
|
672
|
+
|
|
673
|
+
refute @http.expired? c
|
|
674
|
+
|
|
675
|
+
reqs[c.object_id] = 10
|
|
676
|
+
refute @http.expired? c
|
|
677
|
+
|
|
678
|
+
@http.max_requests = 10
|
|
679
|
+
assert @http.expired? c
|
|
680
|
+
|
|
681
|
+
reqs[c.object_id] = 9
|
|
682
|
+
refute @http.expired? c
|
|
683
|
+
end
|
|
684
|
+
|
|
617
685
|
def test_finish
|
|
618
686
|
c = basic_connection
|
|
619
687
|
reqs[c.object_id] = 5
|
|
@@ -708,7 +776,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
708
776
|
end
|
|
709
777
|
|
|
710
778
|
def test_proxy_equals_env
|
|
711
|
-
ENV['
|
|
779
|
+
ENV['http_proxy'] = 'proxy.example'
|
|
712
780
|
|
|
713
781
|
@http.proxy = :ENV
|
|
714
782
|
|
|
@@ -727,9 +795,9 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
727
795
|
end
|
|
728
796
|
|
|
729
797
|
def test_proxy_from_env
|
|
730
|
-
ENV['
|
|
731
|
-
ENV['
|
|
732
|
-
ENV['
|
|
798
|
+
ENV['http_proxy'] = 'proxy.example'
|
|
799
|
+
ENV['http_proxy_user'] = 'johndoe'
|
|
800
|
+
ENV['http_proxy_pass'] = 'muffins'
|
|
733
801
|
ENV['NO_PROXY'] = 'localhost,example.com'
|
|
734
802
|
|
|
735
803
|
uri = @http.proxy_from_env
|
|
@@ -763,7 +831,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
763
831
|
|
|
764
832
|
assert_nil uri
|
|
765
833
|
|
|
766
|
-
ENV['
|
|
834
|
+
ENV['http_proxy'] = ''
|
|
767
835
|
|
|
768
836
|
uri = @http.proxy_from_env
|
|
769
837
|
|
|
@@ -775,8 +843,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
775
843
|
|
|
776
844
|
assert_nil uri
|
|
777
845
|
|
|
778
|
-
ENV['
|
|
779
|
-
ENV['
|
|
846
|
+
ENV['http_proxy'] = 'proxy.example'
|
|
847
|
+
ENV['no_proxy'] = '*'
|
|
780
848
|
|
|
781
849
|
uri = @http.proxy_from_env
|
|
782
850
|
|
|
@@ -784,8 +852,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
784
852
|
end
|
|
785
853
|
|
|
786
854
|
def test_proxy_bypass
|
|
787
|
-
ENV['
|
|
788
|
-
ENV['
|
|
855
|
+
ENV['http_proxy'] = 'proxy.example'
|
|
856
|
+
ENV['no_proxy'] = 'localhost,example.com:80'
|
|
789
857
|
|
|
790
858
|
@http.proxy = :ENV
|
|
791
859
|
|
|
@@ -801,8 +869,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
801
869
|
end
|
|
802
870
|
|
|
803
871
|
def test_proxy_bypass_space
|
|
804
|
-
ENV['
|
|
805
|
-
ENV['
|
|
872
|
+
ENV['http_proxy'] = 'proxy.example'
|
|
873
|
+
ENV['no_proxy'] = 'localhost, example.com'
|
|
806
874
|
|
|
807
875
|
@http.proxy = :ENV
|
|
808
876
|
|
|
@@ -811,8 +879,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
811
879
|
end
|
|
812
880
|
|
|
813
881
|
def test_proxy_bypass_trailing
|
|
814
|
-
ENV['
|
|
815
|
-
ENV['
|
|
882
|
+
ENV['http_proxy'] = 'proxy.example'
|
|
883
|
+
ENV['no_proxy'] = 'localhost,example.com,'
|
|
816
884
|
|
|
817
885
|
@http.proxy = :ENV
|
|
818
886
|
|
|
@@ -821,8 +889,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
821
889
|
end
|
|
822
890
|
|
|
823
891
|
def test_proxy_bypass_double_comma
|
|
824
|
-
ENV['
|
|
825
|
-
ENV['
|
|
892
|
+
ENV['http_proxy'] = 'proxy.example'
|
|
893
|
+
ENV['no_proxy'] = 'localhost,,example.com'
|
|
826
894
|
|
|
827
895
|
@http.proxy = :ENV
|
|
828
896
|
|
|
@@ -866,6 +934,18 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
866
934
|
assert_equal 1, reqs[c.object_id]
|
|
867
935
|
end
|
|
868
936
|
|
|
937
|
+
def test_request_ETIMEDOUT
|
|
938
|
+
c = basic_connection
|
|
939
|
+
def c.request(*a) raise Errno::ETIMEDOUT, "timed out" end
|
|
940
|
+
|
|
941
|
+
e = assert_raises Net::HTTP::Persistent::Error do
|
|
942
|
+
@http.request @uri
|
|
943
|
+
end
|
|
944
|
+
|
|
945
|
+
assert_equal 0, reqs[c.object_id]
|
|
946
|
+
assert_match %r%too many connection resets%, e.message
|
|
947
|
+
end
|
|
948
|
+
|
|
869
949
|
def test_request_bad_response
|
|
870
950
|
c = basic_connection
|
|
871
951
|
def c.request(*a) raise Net::HTTPBadResponse end
|
|
@@ -878,23 +958,38 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
878
958
|
assert_match %r%too many bad responses%, e.message
|
|
879
959
|
end
|
|
880
960
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
961
|
+
if RUBY_1 then
|
|
962
|
+
def test_request_bad_response_retry
|
|
963
|
+
c = basic_connection
|
|
964
|
+
def c.request(*a)
|
|
965
|
+
if defined? @called then
|
|
966
|
+
r = Net::HTTPResponse.allocate
|
|
967
|
+
r.instance_variable_set :@header, {}
|
|
968
|
+
def r.http_version() '1.1' end
|
|
969
|
+
r
|
|
970
|
+
else
|
|
971
|
+
@called = true
|
|
972
|
+
raise Net::HTTPBadResponse
|
|
973
|
+
end
|
|
892
974
|
end
|
|
975
|
+
|
|
976
|
+
@http.request @uri
|
|
977
|
+
|
|
978
|
+
assert c.finished?
|
|
893
979
|
end
|
|
980
|
+
else
|
|
981
|
+
def test_request_bad_response_retry
|
|
982
|
+
c = basic_connection
|
|
983
|
+
def c.request(*a)
|
|
984
|
+
raise Net::HTTPBadResponse
|
|
985
|
+
end
|
|
894
986
|
|
|
895
|
-
|
|
987
|
+
assert_raises Net::HTTP::Persistent::Error do
|
|
988
|
+
@http.request @uri
|
|
989
|
+
end
|
|
896
990
|
|
|
897
|
-
|
|
991
|
+
assert c.finished?
|
|
992
|
+
end
|
|
898
993
|
end
|
|
899
994
|
|
|
900
995
|
def test_request_bad_response_unsafe
|
|
@@ -1023,6 +1118,18 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1023
1118
|
assert c.finished?
|
|
1024
1119
|
end
|
|
1025
1120
|
|
|
1121
|
+
def test_request_exception
|
|
1122
|
+
c = basic_connection
|
|
1123
|
+
def c.request(*a) raise Exception, "very bad things happened" end
|
|
1124
|
+
|
|
1125
|
+
assert_raises Exception do
|
|
1126
|
+
@http.request @uri
|
|
1127
|
+
end
|
|
1128
|
+
|
|
1129
|
+
assert_equal 0, reqs[c.object_id]
|
|
1130
|
+
assert c.finished?
|
|
1131
|
+
end
|
|
1132
|
+
|
|
1026
1133
|
def test_request_invalid
|
|
1027
1134
|
c = basic_connection
|
|
1028
1135
|
def c.request(*a) raise Errno::EINVAL, "write" end
|
|
@@ -1080,25 +1187,43 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1080
1187
|
assert_match %r%too many connection resets%, e.message
|
|
1081
1188
|
end
|
|
1082
1189
|
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1190
|
+
if RUBY_1 then
|
|
1191
|
+
def test_request_reset_retry
|
|
1192
|
+
c = basic_connection
|
|
1193
|
+
touts[c.object_id] = Time.now
|
|
1194
|
+
def c.request(*a)
|
|
1195
|
+
if defined? @called then
|
|
1196
|
+
r = Net::HTTPResponse.allocate
|
|
1197
|
+
r.instance_variable_set :@header, {}
|
|
1198
|
+
def r.http_version() '1.1' end
|
|
1199
|
+
r
|
|
1200
|
+
else
|
|
1201
|
+
@called = true
|
|
1202
|
+
raise Errno::ECONNRESET
|
|
1203
|
+
end
|
|
1095
1204
|
end
|
|
1205
|
+
|
|
1206
|
+
@http.request @uri
|
|
1207
|
+
|
|
1208
|
+
assert c.reset?
|
|
1209
|
+
assert c.finished?
|
|
1096
1210
|
end
|
|
1211
|
+
else
|
|
1212
|
+
def test_request_reset_retry
|
|
1213
|
+
c = basic_connection
|
|
1214
|
+
touts[c.object_id] = Time.now
|
|
1097
1215
|
|
|
1098
|
-
|
|
1216
|
+
def c.request(*a)
|
|
1217
|
+
raise Errno::ECONNRESET
|
|
1218
|
+
end
|
|
1099
1219
|
|
|
1100
|
-
|
|
1101
|
-
|
|
1220
|
+
assert_raises Net::HTTP::Persistent::Error do
|
|
1221
|
+
@http.request @uri
|
|
1222
|
+
end
|
|
1223
|
+
|
|
1224
|
+
refute c.reset?
|
|
1225
|
+
assert c.finished?
|
|
1226
|
+
end
|
|
1102
1227
|
end
|
|
1103
1228
|
|
|
1104
1229
|
def test_request_reset_unsafe
|
|
@@ -1121,6 +1246,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1121
1246
|
end
|
|
1122
1247
|
|
|
1123
1248
|
def test_request_ssl_error
|
|
1249
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1250
|
+
|
|
1124
1251
|
uri = URI.parse 'https://example.com/path'
|
|
1125
1252
|
c = @http.connection_for uri
|
|
1126
1253
|
def c.request(*)
|
|
@@ -1133,6 +1260,57 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1133
1260
|
assert_match %r%bad write retry%, e.message
|
|
1134
1261
|
end
|
|
1135
1262
|
|
|
1263
|
+
def test_request_setup
|
|
1264
|
+
@http.override_headers['user-agent'] = 'test ua'
|
|
1265
|
+
@http.headers['accept'] = 'text/*'
|
|
1266
|
+
|
|
1267
|
+
input = Net::HTTP::Post.new '/path'
|
|
1268
|
+
|
|
1269
|
+
req = @http.request_setup input
|
|
1270
|
+
|
|
1271
|
+
assert_same input, req
|
|
1272
|
+
assert_equal '/path', req.path
|
|
1273
|
+
|
|
1274
|
+
assert_equal 'test ua', req['user-agent']
|
|
1275
|
+
assert_match %r%text/\*%, req['accept']
|
|
1276
|
+
|
|
1277
|
+
assert_equal 'keep-alive', req['connection']
|
|
1278
|
+
assert_equal '30', req['keep-alive']
|
|
1279
|
+
end
|
|
1280
|
+
|
|
1281
|
+
def test_request_setup_uri
|
|
1282
|
+
uri = @uri + '?a=b'
|
|
1283
|
+
|
|
1284
|
+
req = @http.request_setup uri
|
|
1285
|
+
|
|
1286
|
+
assert_kind_of Net::HTTP::Get, req
|
|
1287
|
+
assert_equal '/path?a=b', req.path
|
|
1288
|
+
end
|
|
1289
|
+
|
|
1290
|
+
def test_request_failed
|
|
1291
|
+
c = basic_connection
|
|
1292
|
+
reqs[c.object_id] = 1
|
|
1293
|
+
touts[c.object_id] = Time.now
|
|
1294
|
+
|
|
1295
|
+
original = nil
|
|
1296
|
+
|
|
1297
|
+
begin
|
|
1298
|
+
raise 'original'
|
|
1299
|
+
rescue => original
|
|
1300
|
+
end
|
|
1301
|
+
|
|
1302
|
+
req = Net::HTTP::Get.new '/'
|
|
1303
|
+
|
|
1304
|
+
e = assert_raises Net::HTTP::Persistent::Error do
|
|
1305
|
+
@http.request_failed original, req, c
|
|
1306
|
+
end
|
|
1307
|
+
|
|
1308
|
+
assert_match "too many connection resets (due to original - RuntimeError)",
|
|
1309
|
+
e.message
|
|
1310
|
+
|
|
1311
|
+
assert_equal original.backtrace, e.backtrace
|
|
1312
|
+
end
|
|
1313
|
+
|
|
1136
1314
|
def test_reset
|
|
1137
1315
|
c = basic_connection
|
|
1138
1316
|
c.start
|
|
@@ -1191,14 +1369,25 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1191
1369
|
|
|
1192
1370
|
refute @http.retry_change_requests
|
|
1193
1371
|
|
|
1194
|
-
|
|
1372
|
+
if RUBY_1 then
|
|
1373
|
+
assert @http.can_retry?(get)
|
|
1374
|
+
else
|
|
1375
|
+
assert @http.can_retry?(get)
|
|
1376
|
+
end
|
|
1377
|
+
refute @http.can_retry?(get, true)
|
|
1195
1378
|
refute @http.can_retry?(post)
|
|
1196
1379
|
|
|
1197
1380
|
@http.retry_change_requests = true
|
|
1198
1381
|
|
|
1199
1382
|
assert @http.retry_change_requests
|
|
1200
1383
|
|
|
1201
|
-
|
|
1384
|
+
if RUBY_1 then
|
|
1385
|
+
assert @http.can_retry?(get)
|
|
1386
|
+
else
|
|
1387
|
+
assert @http.can_retry?(get)
|
|
1388
|
+
refute @http.can_retry?(get, true)
|
|
1389
|
+
end
|
|
1390
|
+
|
|
1202
1391
|
assert @http.can_retry?(post)
|
|
1203
1392
|
end
|
|
1204
1393
|
|
|
@@ -1292,6 +1481,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1292
1481
|
end
|
|
1293
1482
|
|
|
1294
1483
|
def test_shutdown_ssl
|
|
1484
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1485
|
+
|
|
1295
1486
|
@uri = URI 'https://example'
|
|
1296
1487
|
|
|
1297
1488
|
@http.connection_for @uri
|
|
@@ -1331,6 +1522,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1331
1522
|
end
|
|
1332
1523
|
|
|
1333
1524
|
def test_ssl
|
|
1525
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1526
|
+
|
|
1334
1527
|
@http.verify_callback = :callback
|
|
1335
1528
|
c = Net::HTTP.new 'localhost', 80
|
|
1336
1529
|
|
|
@@ -1343,6 +1536,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1343
1536
|
end
|
|
1344
1537
|
|
|
1345
1538
|
def test_ssl_ca_file
|
|
1539
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1540
|
+
|
|
1346
1541
|
@http.ca_file = 'ca_file'
|
|
1347
1542
|
@http.verify_callback = :callback
|
|
1348
1543
|
c = Net::HTTP.new 'localhost', 80
|
|
@@ -1355,6 +1550,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1355
1550
|
end
|
|
1356
1551
|
|
|
1357
1552
|
def test_ssl_cert_store
|
|
1553
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1554
|
+
|
|
1358
1555
|
store = OpenSSL::X509::Store.new
|
|
1359
1556
|
@http.cert_store = store
|
|
1360
1557
|
|
|
@@ -1367,6 +1564,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1367
1564
|
end
|
|
1368
1565
|
|
|
1369
1566
|
def test_ssl_cert_store_default
|
|
1567
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1568
|
+
|
|
1370
1569
|
@http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
|
1371
1570
|
|
|
1372
1571
|
c = Net::HTTP.new 'localhost', 80
|
|
@@ -1378,6 +1577,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1378
1577
|
end
|
|
1379
1578
|
|
|
1380
1579
|
def test_ssl_certificate
|
|
1580
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1581
|
+
|
|
1381
1582
|
@http.certificate = :cert
|
|
1382
1583
|
@http.private_key = :key
|
|
1383
1584
|
c = Net::HTTP.new 'localhost', 80
|
|
@@ -1390,6 +1591,8 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1390
1591
|
end
|
|
1391
1592
|
|
|
1392
1593
|
def test_ssl_verify_mode
|
|
1594
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1595
|
+
|
|
1393
1596
|
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
1394
1597
|
c = Net::HTTP.new 'localhost', 80
|
|
1395
1598
|
|
|
@@ -1400,35 +1603,41 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1400
1603
|
end
|
|
1401
1604
|
|
|
1402
1605
|
def test_ssl_warning
|
|
1403
|
-
|
|
1404
|
-
OpenSSL::SSL.send :remove_const, :VERIFY_PEER
|
|
1405
|
-
OpenSSL::SSL.send :const_set, :VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE
|
|
1606
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1406
1607
|
|
|
1407
|
-
|
|
1608
|
+
begin
|
|
1609
|
+
orig_verify_peer = OpenSSL::SSL::VERIFY_PEER
|
|
1610
|
+
OpenSSL::SSL.send :remove_const, :VERIFY_PEER
|
|
1611
|
+
OpenSSL::SSL.send :const_set, :VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE
|
|
1408
1612
|
|
|
1409
|
-
|
|
1410
|
-
@http.ssl c
|
|
1411
|
-
end
|
|
1613
|
+
c = Net::HTTP.new 'localhost', 80
|
|
1412
1614
|
|
|
1413
|
-
|
|
1615
|
+
out, err = capture_io do
|
|
1616
|
+
@http.ssl c
|
|
1617
|
+
end
|
|
1414
1618
|
|
|
1415
|
-
|
|
1416
|
-
assert_match %r%I_KNOW_THAT_OPENSSL%, err
|
|
1619
|
+
assert_empty out
|
|
1417
1620
|
|
|
1418
|
-
|
|
1621
|
+
assert_match %r%localhost:80%, err
|
|
1622
|
+
assert_match %r%I_KNOW_THAT_OPENSSL%, err
|
|
1419
1623
|
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1624
|
+
Object.send :const_set, :I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG, nil
|
|
1625
|
+
|
|
1626
|
+
assert_silent do
|
|
1627
|
+
@http.ssl c
|
|
1628
|
+
end
|
|
1629
|
+
ensure
|
|
1630
|
+
OpenSSL::SSL.send :remove_const, :VERIFY_PEER
|
|
1631
|
+
OpenSSL::SSL.send :const_set, :VERIFY_PEER, orig_verify_peer
|
|
1632
|
+
if Object.const_defined?(:I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG) then
|
|
1633
|
+
Object.send :remove_const, :I_KNOW_THAT_OPENSSL_VERIFY_PEER_EQUALS_VERIFY_NONE_IS_WRONG
|
|
1634
|
+
end
|
|
1428
1635
|
end
|
|
1429
1636
|
end
|
|
1430
1637
|
|
|
1431
1638
|
def test_ssl_cleanup
|
|
1639
|
+
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
|
1640
|
+
|
|
1432
1641
|
uri1 = URI.parse 'https://one.example'
|
|
1433
1642
|
|
|
1434
1643
|
c1 = @http.connection_for uri1
|
|
@@ -1450,7 +1659,7 @@ class TestNetHttpPersistent < MiniTest::Unit::TestCase
|
|
|
1450
1659
|
|
|
1451
1660
|
assert_equal :ssl_version, @http.ssl_version
|
|
1452
1661
|
assert_equal 1, @http.ssl_generation
|
|
1453
|
-
end
|
|
1662
|
+
end unless RUBY_1
|
|
1454
1663
|
|
|
1455
1664
|
def test_start
|
|
1456
1665
|
c = basic_connection
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
require 'minitest/autorun'
|
|
3
3
|
require 'net/http/persistent'
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
require '
|
|
4
|
+
have_ssl =
|
|
5
|
+
begin
|
|
6
|
+
require 'openssl'
|
|
7
|
+
require 'webrick'
|
|
8
|
+
require 'webrick/ssl'
|
|
9
|
+
true
|
|
10
|
+
rescue LoadError
|
|
11
|
+
false
|
|
12
|
+
end
|
|
7
13
|
|
|
8
14
|
##
|
|
9
15
|
# This test is based on (and contains verbatim code from) the Net::HTTP tests
|
|
10
16
|
# in ruby
|
|
11
17
|
|
|
12
|
-
class TestNetHttpPersistentSSLReuse <
|
|
18
|
+
class TestNetHttpPersistentSSLReuse < Minitest::Test
|
|
13
19
|
|
|
14
20
|
class NullWriter
|
|
15
21
|
def <<(s) end
|
|
@@ -102,5 +108,5 @@ class TestNetHttpPersistentSSLReuse < MiniTest::Unit::TestCase
|
|
|
102
108
|
assert ssl_socket.session_reused?
|
|
103
109
|
end
|
|
104
110
|
|
|
105
|
-
end
|
|
111
|
+
end if have_ssl
|
|
106
112
|
|
metadata
CHANGED
|
@@ -1,112 +1,90 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: net-http-persistent
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: '2.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: '2.9'
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Eric Hodel
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain:
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
YkEwV05haURsWDVqClUyYUkrWkdTYmxxdkhVQ3hLQkhSMXM3VU1Ic2J6MXNh
|
|
36
|
-
T21nZFJUeVB4MGp1SnM2OG9jYlVUZVlCTFd1OVY0S1AKemRHQUcySlhPMmdP
|
|
37
|
-
TmczYjR0WUR2cEJMYnJ5K0tPWDI3aUFKdWxVYUg5VGlUT1VMTDRJVEpWRnNL
|
|
38
|
-
MG1ZVnFtUgpROFRubzlTM2U0WEdHUDFaV2ZMclRXRUpiYXZGZmhHSHV0MmlN
|
|
39
|
-
UndmQzdzL1lJTEFITkFUb3BhSmRIOUROcGQxClU4MXpHSE1VQk92ei9WR1Q2
|
|
40
|
-
d0p3WUozZW1TMm5mQTJOT0hGZmdBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUt
|
|
41
|
-
LS0tLQo=
|
|
42
|
-
date: 2012-10-18 00:00:00.000000000 Z
|
|
11
|
+
- |
|
|
12
|
+
-----BEGIN CERTIFICATE-----
|
|
13
|
+
MIIDeDCCAmCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBBMRAwDgYDVQQDDAdkcmJy
|
|
14
|
+
YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
|
|
15
|
+
ZXQwHhcNMTMwMjI4MDUyMjA4WhcNMTQwMjI4MDUyMjA4WjBBMRAwDgYDVQQDDAdk
|
|
16
|
+
cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
|
|
17
|
+
FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
|
|
18
|
+
LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
|
|
19
|
+
U5ddZCVywn5nnAQ+Ui7jMW54CYt5/H6f2US6U0hQOjJR6cpfiymgxGdfyTiVcvTm
|
|
20
|
+
Gj/okWrQl0NjYOYBpDi+9PPmaH2RmLJu0dB/NylsDnW5j6yN1BEI8MfJRR+HRKZY
|
|
21
|
+
mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
|
|
22
|
+
g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
|
|
23
|
+
sCANiQ8BAgMBAAGjezB5MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
|
24
|
+
BBS5k4Z75VSpdM0AclG2UvzFA/VW5DAfBgNVHREEGDAWgRRkcmJyYWluQHNlZ21l
|
|
25
|
+
bnQ3Lm5ldDAfBgNVHRIEGDAWgRRkcmJyYWluQHNlZ21lbnQ3Lm5ldDANBgkqhkiG
|
|
26
|
+
9w0BAQUFAAOCAQEAOflo4Md5aJF//EetzXIGZ2EI5PzKWX/mMpp7cxFyDcVPtTv0
|
|
27
|
+
js/6zWrWSbd60W9Kn4ch3nYiATFKhisgeYotDDz2/pb/x1ivJn4vEvs9kYKVvbF8
|
|
28
|
+
V7MV/O5HDW8Q0pA1SljI6GzcOgejtUMxZCyyyDdbUpyAMdt9UpqTZkZ5z1sicgQk
|
|
29
|
+
5o2XJ+OhceOIUVqVh1r6DNY5tLVaGJabtBmJAYFVznDcHiSFybGKBa5n25Egql1t
|
|
30
|
+
KDyY1VIazVgoC8XvR4h/95/iScPiuglzA+DBG1hip1xScAtw05BrXyUNrc9CEMYU
|
|
31
|
+
wgF94UVoHRp6ywo8I7NP3HcwFQDFNEZPNGXsng==
|
|
32
|
+
-----END CERTIFICATE-----
|
|
33
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
|
43
34
|
dependencies:
|
|
44
35
|
- !ruby/object:Gem::Dependency
|
|
45
36
|
name: minitest
|
|
46
37
|
requirement: !ruby/object:Gem::Requirement
|
|
47
|
-
none: false
|
|
48
38
|
requirements:
|
|
49
39
|
- - ~>
|
|
50
40
|
- !ruby/object:Gem::Version
|
|
51
|
-
version: '
|
|
41
|
+
version: '5.0'
|
|
52
42
|
type: :development
|
|
53
43
|
prerelease: false
|
|
54
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
55
|
-
none: false
|
|
56
45
|
requirements:
|
|
57
46
|
- - ~>
|
|
58
47
|
- !ruby/object:Gem::Version
|
|
59
|
-
version: '
|
|
48
|
+
version: '5.0'
|
|
60
49
|
- !ruby/object:Gem::Dependency
|
|
61
50
|
name: rdoc
|
|
62
51
|
requirement: !ruby/object:Gem::Requirement
|
|
63
|
-
none: false
|
|
64
52
|
requirements:
|
|
65
53
|
- - ~>
|
|
66
54
|
- !ruby/object:Gem::Version
|
|
67
|
-
version: '
|
|
55
|
+
version: '4.0'
|
|
68
56
|
type: :development
|
|
69
57
|
prerelease: false
|
|
70
58
|
version_requirements: !ruby/object:Gem::Requirement
|
|
71
|
-
none: false
|
|
72
59
|
requirements:
|
|
73
60
|
- - ~>
|
|
74
61
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '
|
|
62
|
+
version: '4.0'
|
|
76
63
|
- !ruby/object:Gem::Dependency
|
|
77
64
|
name: hoe
|
|
78
65
|
requirement: !ruby/object:Gem::Requirement
|
|
79
|
-
none: false
|
|
80
66
|
requirements:
|
|
81
67
|
- - ~>
|
|
82
68
|
- !ruby/object:Gem::Version
|
|
83
|
-
version: '3.
|
|
69
|
+
version: '3.6'
|
|
84
70
|
type: :development
|
|
85
71
|
prerelease: false
|
|
86
72
|
version_requirements: !ruby/object:Gem::Requirement
|
|
87
|
-
none: false
|
|
88
73
|
requirements:
|
|
89
74
|
- - ~>
|
|
90
75
|
- !ruby/object:Gem::Version
|
|
91
|
-
version: '3.
|
|
92
|
-
description:
|
|
93
|
-
Ruby 1.8.
|
|
94
|
-
|
|
95
|
-
It''s thread-safe too!
|
|
96
|
-
|
|
76
|
+
version: '3.6'
|
|
77
|
+
description: |-
|
|
78
|
+
Manages persistent connections using Net::HTTP plus a speed fix for Ruby 1.8.
|
|
79
|
+
It's thread-safe too!
|
|
97
80
|
|
|
98
81
|
Using persistent HTTP connections can dramatically increase the speed of HTTP.
|
|
99
|
-
|
|
100
82
|
Creating a new HTTP connection for every request involves an extra TCP
|
|
101
|
-
|
|
102
83
|
round-trip and causes TCP congestion avoidance negotiation to start over.
|
|
103
84
|
|
|
104
|
-
|
|
105
85
|
Net::HTTP supports persistent connections with some API methods but does not
|
|
106
|
-
|
|
107
86
|
handle reconnection gracefully. Net::HTTP::Persistent supports reconnection
|
|
108
|
-
|
|
109
|
-
and retry according to RFC 2616.'
|
|
87
|
+
and retry according to RFC 2616.
|
|
110
88
|
email:
|
|
111
89
|
- drbrain@segment7.net
|
|
112
90
|
executables: []
|
|
@@ -129,6 +107,7 @@ files:
|
|
|
129
107
|
- test/test_net_http_persistent_ssl_reuse.rb
|
|
130
108
|
homepage: http://docs.seattlerb.org/net-http-persistent
|
|
131
109
|
licenses: []
|
|
110
|
+
metadata: {}
|
|
132
111
|
post_install_message:
|
|
133
112
|
rdoc_options:
|
|
134
113
|
- --main
|
|
@@ -136,22 +115,20 @@ rdoc_options:
|
|
|
136
115
|
require_paths:
|
|
137
116
|
- lib
|
|
138
117
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
139
|
-
none: false
|
|
140
118
|
requirements:
|
|
141
|
-
- -
|
|
119
|
+
- - '>='
|
|
142
120
|
- !ruby/object:Gem::Version
|
|
143
121
|
version: '0'
|
|
144
122
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
|
-
none: false
|
|
146
123
|
requirements:
|
|
147
|
-
- -
|
|
124
|
+
- - '>='
|
|
148
125
|
- !ruby/object:Gem::Version
|
|
149
126
|
version: '0'
|
|
150
127
|
requirements: []
|
|
151
128
|
rubyforge_project: net-http-persistent
|
|
152
|
-
rubygems_version:
|
|
129
|
+
rubygems_version: 2.0.4
|
|
153
130
|
signing_key:
|
|
154
|
-
specification_version:
|
|
131
|
+
specification_version: 4
|
|
155
132
|
summary: Manages persistent connections using Net::HTTP plus a speed fix for Ruby
|
|
156
133
|
1.8
|
|
157
134
|
test_files:
|
metadata.gz.sig
CHANGED
|
Binary file
|