net-http-persistent 3.1.0 → 4.0.0
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 +4 -4
- checksums.yaml.gz.sig +2 -2
- data.tar.gz.sig +0 -0
- data/.travis.yml +2 -3
- data/History.txt +42 -3
- data/README.rdoc +9 -9
- data/Rakefile +2 -2
- data/lib/net/http/persistent.rb +77 -191
- data/lib/net/http/persistent/pool.rb +1 -1
- data/test/test_net_http_persistent.rb +36 -216
- metadata +26 -24
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 33e30717daf3230e2432295be22f54e49cae5fda06ee56ccff86b97da785a842
|
4
|
+
data.tar.gz: 903437046b46bf3c2b7381abe4ac8b45347ccc732095f620033d860abf48dbf6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f578761fe5a7fb8a5fc7887a4cf798d7ba016bb8d471870d68f0ff6147904c10f9e2bb2f8456c7045a755c8e3168f43bd72cac204c935d2ba78dbc0172b21a17
|
7
|
+
data.tar.gz: a01ef587f907aae73483401ed61a78f30e8ce0da3661a40a39b29924446107d13c3678792c62bc1d5c53196e85345c11728c714d703bfb281bf63c6d4bb14b7a
|
checksums.yaml.gz.sig
CHANGED
@@ -1,2 +1 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
,ar��O�C��3���pu�9�����1���WR���u'ђ�,����-�R����0��м��)AVv�ӧ��8X�n1��?�z��%k�����3��
|
2
|
+
Ϫ+lW2��RN��<D��a�w�惐R:p�*!��U���co��M�8u�(�a������O.K��˝}�>���Q甶+D��v�إB�,�Yq!^^��t�9.Ӽ�O`���.t)\�H9���<�~��'��ڈ����D�*
|
data.tar.gz.sig
CHANGED
Binary file
|
data/.travis.yml
CHANGED
@@ -9,16 +9,15 @@ notifications:
|
|
9
9
|
email:
|
10
10
|
- drbrain@segment7.net
|
11
11
|
rvm:
|
12
|
-
- 2.1
|
13
|
-
- 2.2
|
14
12
|
- 2.3
|
15
13
|
- 2.4
|
16
14
|
- 2.5
|
17
15
|
- 2.6
|
16
|
+
- 2.7
|
18
17
|
script: rake travis
|
19
18
|
install: "" # avoid running default bundler install
|
20
19
|
|
21
20
|
matrix:
|
22
21
|
include:
|
23
|
-
- rvm: "2.
|
22
|
+
- rvm: "2.7"
|
24
23
|
env: TRAVIS_MATRIX=pipeline
|
data/History.txt
CHANGED
@@ -1,4 +1,43 @@
|
|
1
|
-
===
|
1
|
+
=== 4.0.0 / 2020-04-30
|
2
|
+
|
3
|
+
Breaking changes:
|
4
|
+
|
5
|
+
* Removed built-in support for retrying failed requests as Net::HTTP has this
|
6
|
+
built-in for all supported versions. Pull request #100 by Michael Grosser.
|
7
|
+
* Dropped support for EoL ruby versions (< 2.4). Future feature releases may
|
8
|
+
drop support for ruby versions that are at end-of-life or in security-only
|
9
|
+
maintenance mode with any release. Pull request #113 by David Rodríguez
|
10
|
+
|
11
|
+
New features:
|
12
|
+
|
13
|
+
* Added Net::HTTP::Persistent#max_retries= to configure the number of retries
|
14
|
+
performed on a request for ruby versions that support it (2.5+).
|
15
|
+
* URI-ness is determined through #respond_to? to allow compatibility with
|
16
|
+
Addressable::URI. Pull request #67 by Ryan McKern.
|
17
|
+
* Use require_relative to reduce patch burden for vendored versions. Pull
|
18
|
+
Request #106 by David Rodríguez
|
19
|
+
|
20
|
+
Bug fixes:
|
21
|
+
|
22
|
+
* Stop wasting a connection when the keep-alive timeout is less than the idle
|
23
|
+
timeout. Pull request #115 by Yap Sok Ann.
|
24
|
+
* Improved use of URI#hostname for IPv6 connections. Pull request #76 by
|
25
|
+
Tomas Koutsky.
|
26
|
+
* Improved check for Process::RLIMIT_NOFILE support. Pull request #109 by Vít
|
27
|
+
Ondruch.
|
28
|
+
* Fix namespace in comments for escape/unescape wrappers. Pull request #114
|
29
|
+
by David Rodríguez.
|
30
|
+
* Fix History.txt timestamp for 3.0.0 release. Pull request #107 by Joe Van
|
31
|
+
Dyk.
|
32
|
+
* Fix link to PR #98 in 3.1.0 release notes. Pull request #110 by Justin
|
33
|
+
Reid.
|
34
|
+
|
35
|
+
Other:
|
36
|
+
|
37
|
+
* Updated Net::HTTP::Persistent#reconnect documentation to indicate that all
|
38
|
+
connections are reset. Issue #117 by Taisuke Miyazaki.
|
39
|
+
|
40
|
+
=== 3.1.0 / 2019-07-24
|
2
41
|
|
3
42
|
New features:
|
4
43
|
* Support ruby 2.6 Net::HTTP#write_timeout=. Pull request #99 by Víctor
|
@@ -23,7 +62,7 @@ Bug fixes:
|
|
23
62
|
Kauppila.
|
24
63
|
* Fix missing +name:+ argument in documentation. Pull requests #85 by T.J.
|
25
64
|
Schuck, #84 by James White.
|
26
|
-
* Fix memory leak from connection pooling. Pull request #
|
65
|
+
* Fix memory leak from connection pooling. Pull request #98 by Aaron
|
27
66
|
Patterson.
|
28
67
|
* Update tests for minitest assert_equal deprecation. Pull request #92 by
|
29
68
|
Olle Jonsson.
|
@@ -35,7 +74,7 @@ Other:
|
|
35
74
|
* Updated ruby versions in Travis CI. Pull request #93 by Olle Jonsson. Pull
|
36
75
|
request #103 by Michael Grosser.
|
37
76
|
|
38
|
-
=== 3.0 2016-10-05
|
77
|
+
=== 3.0 / 2016-10-05
|
39
78
|
|
40
79
|
Breaking changes:
|
41
80
|
|
data/README.rdoc
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
= net-http-persistent
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
home :: https://github.com/drbrain/net-http-persistent
|
4
|
+
rdoc :: http://docs.seattlerb.org/net-http-persistent
|
5
5
|
|
6
6
|
== DESCRIPTION:
|
7
7
|
|
8
|
-
Manages persistent connections using Net::HTTP
|
9
|
-
|
8
|
+
Manages persistent connections using Net::HTTP including a thread pool for
|
9
|
+
connecting to multiple hosts.
|
10
10
|
|
11
11
|
Using persistent HTTP connections can dramatically increase the speed of HTTP.
|
12
12
|
Creating a new HTTP connection for every request involves an extra TCP
|
13
13
|
round-trip and causes TCP congestion avoidance negotiation to start over.
|
14
14
|
|
15
15
|
Net::HTTP supports persistent connections with some API methods but does not
|
16
|
-
|
17
|
-
and
|
16
|
+
make setting up a single persistent connection or managing multiple
|
17
|
+
connections easy. Net::HTTP::Persistent wraps Net::HTTP and allows you to
|
18
|
+
focus on how to make HTTP requests.
|
18
19
|
|
19
20
|
== FEATURES/PROBLEMS:
|
20
21
|
|
21
|
-
* Supports
|
22
|
+
* Supports TLS with secure defaults
|
22
23
|
* Thread-safe
|
23
24
|
* Pure ruby
|
24
|
-
* Timeout-less speed boost for Ruby 1.8 (by Aaron Patterson)
|
25
25
|
|
26
26
|
== SYNOPSIS
|
27
27
|
|
@@ -60,7 +60,7 @@ including SSL connection verification, header handling and tunable options.
|
|
60
60
|
|
61
61
|
(The MIT License)
|
62
62
|
|
63
|
-
Copyright (c)
|
63
|
+
Copyright (c) Eric Hodel, Aaron Patterson
|
64
64
|
|
65
65
|
Permission is hereby granted, free of charge, to any person obtaining
|
66
66
|
a copy of this software and associated documentation files (the
|
data/Rakefile
CHANGED
@@ -13,12 +13,12 @@ Hoe.spec 'net-http-persistent' do
|
|
13
13
|
self.readme_file = 'README.rdoc'
|
14
14
|
self.extra_rdoc_files += Dir['*.rdoc']
|
15
15
|
|
16
|
-
self.require_ruby_version '~> 2.
|
16
|
+
self.require_ruby_version '~> 2.3'
|
17
17
|
|
18
18
|
license 'MIT'
|
19
19
|
|
20
20
|
rdoc_locations <<
|
21
|
-
'docs.seattlerb.org:/data/www/docs.seattlerb.org/net-http-persistent/'
|
21
|
+
'docs-push.seattlerb.org:/data/www/docs.seattlerb.org/net-http-persistent/'
|
22
22
|
|
23
23
|
dependency 'connection_pool', '~> 2.2'
|
24
24
|
dependency 'minitest', '~> 5.2', :development
|
data/lib/net/http/persistent.rb
CHANGED
@@ -17,15 +17,11 @@ autoload :OpenSSL, 'openssl'
|
|
17
17
|
# servers you wish to talk to. For each host:port you communicate with a
|
18
18
|
# single persistent connection is created.
|
19
19
|
#
|
20
|
-
#
|
21
|
-
# connections.
|
20
|
+
# Connections will be shared across threads through a connection pool to
|
21
|
+
# increase reuse of connections.
|
22
22
|
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
# You can shut down the HTTP connections when done by calling #shutdown. You
|
27
|
-
# should name your Net::HTTP::Persistent object if you intend to call this
|
28
|
-
# method.
|
23
|
+
# You can shut down any remaining HTTP connections when done by calling
|
24
|
+
# #shutdown.
|
29
25
|
#
|
30
26
|
# Example:
|
31
27
|
#
|
@@ -33,7 +29,7 @@ autoload :OpenSSL, 'openssl'
|
|
33
29
|
#
|
34
30
|
# uri = URI 'http://example.com/awesome/web/service'
|
35
31
|
#
|
36
|
-
# http = Net::HTTP::Persistent.new
|
32
|
+
# http = Net::HTTP::Persistent.new
|
37
33
|
#
|
38
34
|
# # perform a GET
|
39
35
|
# response = http.request uri
|
@@ -55,14 +51,14 @@ autoload :OpenSSL, 'openssl'
|
|
55
51
|
# to use URI#request_uri not URI#path. The request_uri contains the query
|
56
52
|
# params which are sent in the body for other requests.
|
57
53
|
#
|
58
|
-
# == SSL
|
54
|
+
# == TLS/SSL
|
59
55
|
#
|
60
|
-
#
|
61
|
-
# URI.
|
56
|
+
# TLS connections are automatically created depending upon the scheme of the
|
57
|
+
# URI. TLS connections are automatically verified against the default
|
62
58
|
# certificate store for your computer. You can override this by changing
|
63
59
|
# verify_mode or by specifying an alternate cert_store.
|
64
60
|
#
|
65
|
-
# Here are the
|
61
|
+
# Here are the TLS settings, see the individual methods for documentation:
|
66
62
|
#
|
67
63
|
# #certificate :: This client's certificate
|
68
64
|
# #ca_file :: The certificate-authorities
|
@@ -72,7 +68,7 @@ autoload :OpenSSL, 'openssl'
|
|
72
68
|
# #private_key :: The client's SSL private key
|
73
69
|
# #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
|
74
70
|
# connection
|
75
|
-
# #ssl_timeout ::
|
71
|
+
# #ssl_timeout :: Session lifetime
|
76
72
|
# #ssl_version :: Which specific SSL version to use
|
77
73
|
# #verify_callback :: For server certificate verification
|
78
74
|
# #verify_depth :: Depth of certificate verification
|
@@ -101,14 +97,15 @@ autoload :OpenSSL, 'openssl'
|
|
101
97
|
#
|
102
98
|
# === Segregation
|
103
99
|
#
|
104
|
-
#
|
105
|
-
#
|
100
|
+
# Each Net::HTTP::Persistent instance has its own pool of connections. There
|
101
|
+
# is no sharing with other instances (as was true in earlier versions).
|
106
102
|
#
|
107
103
|
# === Idle Timeout
|
108
104
|
#
|
109
|
-
# If a connection hasn't been used for this number of seconds it will
|
110
|
-
# reset upon the next use to avoid attempting to send to a
|
111
|
-
# The default value is 5 seconds. nil means no timeout.
|
105
|
+
# If a connection hasn't been used for this number of seconds it will
|
106
|
+
# automatically be reset upon the next use to avoid attempting to send to a
|
107
|
+
# closed connection. The default value is 5 seconds. nil means no timeout.
|
108
|
+
# Set through #idle_timeout.
|
112
109
|
#
|
113
110
|
# Reducing this value may help avoid the "too many connection resets" error
|
114
111
|
# when sending non-idempotent requests while increasing this value will cause
|
@@ -123,8 +120,9 @@ autoload :OpenSSL, 'openssl'
|
|
123
120
|
#
|
124
121
|
# The number of requests that should be made before opening a new connection.
|
125
122
|
# Typically many keep-alive capable servers tune this to 100 or less, so the
|
126
|
-
# 101st request will fail with ECONNRESET. If unset (default), this value has
|
127
|
-
# effect, if set, connections will be reset on the request after
|
123
|
+
# 101st request will fail with ECONNRESET. If unset (default), this value has
|
124
|
+
# no effect, if set, connections will be reset on the request after
|
125
|
+
# max_requests.
|
128
126
|
#
|
129
127
|
# === Open Timeout
|
130
128
|
#
|
@@ -136,45 +134,6 @@ autoload :OpenSSL, 'openssl'
|
|
136
134
|
# Socket options may be set on newly-created connections. See #socket_options
|
137
135
|
# for details.
|
138
136
|
#
|
139
|
-
# === Non-Idempotent Requests
|
140
|
-
#
|
141
|
-
# By default non-idempotent requests will not be retried per RFC 2616. By
|
142
|
-
# setting retry_change_requests to true requests will automatically be retried
|
143
|
-
# once.
|
144
|
-
#
|
145
|
-
# Only do this when you know that retrying a POST or other non-idempotent
|
146
|
-
# request is safe for your application and will not create duplicate
|
147
|
-
# resources.
|
148
|
-
#
|
149
|
-
# The recommended way to handle non-idempotent requests is the following:
|
150
|
-
#
|
151
|
-
# require 'net/http/persistent'
|
152
|
-
#
|
153
|
-
# uri = URI 'http://example.com/awesome/web/service'
|
154
|
-
# post_uri = uri + 'create'
|
155
|
-
#
|
156
|
-
# http = Net::HTTP::Persistent.new name: 'my_app_name'
|
157
|
-
#
|
158
|
-
# post = Net::HTTP::Post.new post_uri.path
|
159
|
-
# # ... fill in POST request
|
160
|
-
#
|
161
|
-
# begin
|
162
|
-
# response = http.request post_uri, post
|
163
|
-
# rescue Net::HTTP::Persistent::Error
|
164
|
-
#
|
165
|
-
# # POST failed, make a new request to verify the server did not process
|
166
|
-
# # the request
|
167
|
-
# exists_uri = uri + '...'
|
168
|
-
# response = http.get exists_uri
|
169
|
-
#
|
170
|
-
# # Retry if it failed
|
171
|
-
# retry if response.code == '404'
|
172
|
-
# end
|
173
|
-
#
|
174
|
-
# The method of determining if the resource was created or not is unique to
|
175
|
-
# the particular service you are using. Of course, you will want to add
|
176
|
-
# protection from infinite looping.
|
177
|
-
#
|
178
137
|
# === Connection Termination
|
179
138
|
#
|
180
139
|
# If you are done using the Net::HTTP::Persistent instance you may shut down
|
@@ -200,33 +159,20 @@ class Net::HTTP::Persistent
|
|
200
159
|
HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
|
201
160
|
|
202
161
|
##
|
203
|
-
# The default connection pool size is 1/4 the allowed open files
|
162
|
+
# The default connection pool size is 1/4 the allowed open files
|
163
|
+
# (<code>ulimit -n</code>) or 256 if your OS does not support file handle
|
164
|
+
# limits (typically windows).
|
204
165
|
|
205
|
-
if
|
206
|
-
DEFAULT_POOL_SIZE = 256
|
207
|
-
else
|
166
|
+
if Process.const_defined? :RLIMIT_NOFILE
|
208
167
|
DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
|
168
|
+
else
|
169
|
+
DEFAULT_POOL_SIZE = 256
|
209
170
|
end
|
210
171
|
|
211
172
|
##
|
212
173
|
# The version of Net::HTTP::Persistent you are using
|
213
174
|
|
214
|
-
VERSION = '
|
215
|
-
|
216
|
-
##
|
217
|
-
# Exceptions rescued for automatic retry on ruby 2.0.0. This overlaps with
|
218
|
-
# the exception list for ruby 1.x.
|
219
|
-
|
220
|
-
RETRIED_EXCEPTIONS = [ # :nodoc:
|
221
|
-
(Net::ReadTimeout if Net.const_defined? :ReadTimeout),
|
222
|
-
IOError,
|
223
|
-
EOFError,
|
224
|
-
Errno::ECONNRESET,
|
225
|
-
Errno::ECONNABORTED,
|
226
|
-
Errno::EPIPE,
|
227
|
-
(OpenSSL::SSL::SSLError if HAVE_OPENSSL),
|
228
|
-
Timeout::Error,
|
229
|
-
].compact
|
175
|
+
VERSION = '4.0.0'
|
230
176
|
|
231
177
|
##
|
232
178
|
# Error class for errors raised by Net::HTTP::Persistent. Various
|
@@ -353,6 +299,13 @@ class Net::HTTP::Persistent
|
|
353
299
|
|
354
300
|
attr_accessor :max_requests
|
355
301
|
|
302
|
+
##
|
303
|
+
# Number of retries to perform if a request fails.
|
304
|
+
#
|
305
|
+
# See also #max_retries=, Net::HTTP#max_retries=.
|
306
|
+
|
307
|
+
attr_reader :max_retries
|
308
|
+
|
356
309
|
##
|
357
310
|
# The value sent in the Keep-Alive header. Defaults to 30. Not needed for
|
358
311
|
# HTTP/1.1 servers.
|
@@ -365,8 +318,7 @@ class Net::HTTP::Persistent
|
|
365
318
|
attr_accessor :keep_alive
|
366
319
|
|
367
320
|
##
|
368
|
-
#
|
369
|
-
# from everybody else's.
|
321
|
+
# The name for this collection of persistent connections.
|
370
322
|
|
371
323
|
attr_reader :name
|
372
324
|
|
@@ -495,23 +447,11 @@ class Net::HTTP::Persistent
|
|
495
447
|
|
496
448
|
attr_reader :verify_mode
|
497
449
|
|
498
|
-
##
|
499
|
-
# Enable retries of non-idempotent requests that change data (e.g. POST
|
500
|
-
# requests) when the server has disconnected.
|
501
|
-
#
|
502
|
-
# This will in the worst case lead to multiple requests with the same data,
|
503
|
-
# but it may be useful for some applications. Take care when enabling
|
504
|
-
# this option to ensure it is safe to POST or perform other non-idempotent
|
505
|
-
# requests to the server.
|
506
|
-
|
507
|
-
attr_accessor :retry_change_requests
|
508
|
-
|
509
450
|
##
|
510
451
|
# Creates a new Net::HTTP::Persistent.
|
511
452
|
#
|
512
|
-
# Set +name+
|
513
|
-
#
|
514
|
-
# good enough. This parameter will be required in a future version.
|
453
|
+
# Set a +name+ for fun. Your library name should be good enough, but this
|
454
|
+
# otherwise has no purpose.
|
515
455
|
#
|
516
456
|
# +proxy+ may be set to a URI::HTTP or :ENV to pick up proxy options from
|
517
457
|
# the environment. See proxy_from_env for details.
|
@@ -524,8 +464,9 @@ class Net::HTTP::Persistent
|
|
524
464
|
# proxy.password = 'hunter2'
|
525
465
|
#
|
526
466
|
# Set +pool_size+ to limit the maximum number of connections allowed.
|
527
|
-
# Defaults to 1/4 the number of allowed file handles
|
528
|
-
#
|
467
|
+
# Defaults to 1/4 the number of allowed file handles or 256 if your OS does
|
468
|
+
# not support a limit on allowed file handles. You can have no more than
|
469
|
+
# this many threads with active HTTP transactions.
|
529
470
|
|
530
471
|
def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
|
531
472
|
@name = name
|
@@ -542,6 +483,7 @@ class Net::HTTP::Persistent
|
|
542
483
|
@write_timeout = nil
|
543
484
|
@idle_timeout = 5
|
544
485
|
@max_requests = nil
|
486
|
+
@max_retries = 1
|
545
487
|
@socket_options = []
|
546
488
|
@ssl_generation = 0 # incremented when SSL session variables change
|
547
489
|
|
@@ -573,8 +515,6 @@ class Net::HTTP::Persistent
|
|
573
515
|
@reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
|
574
516
|
end
|
575
517
|
|
576
|
-
@retry_change_requests = false
|
577
|
-
|
578
518
|
self.proxy = proxy if proxy
|
579
519
|
end
|
580
520
|
|
@@ -635,7 +575,9 @@ class Net::HTTP::Persistent
|
|
635
575
|
|
636
576
|
net_http_args = [uri.hostname, uri.port]
|
637
577
|
|
638
|
-
|
578
|
+
# I'm unsure if uri.host or uri.hostname should be checked against
|
579
|
+
# the proxy bypass list.
|
580
|
+
if @proxy_uri and not proxy_bypass? uri.host, uri.port then
|
639
581
|
net_http_args.concat @proxy_args
|
640
582
|
else
|
641
583
|
net_http_args.concat [nil, nil, nil, nil]
|
@@ -655,9 +597,11 @@ class Net::HTTP::Persistent
|
|
655
597
|
reset connection
|
656
598
|
end
|
657
599
|
|
658
|
-
http.
|
659
|
-
http.
|
660
|
-
http.
|
600
|
+
http.keep_alive_timeout = @idle_timeout if @idle_timeout
|
601
|
+
http.max_retries = @max_retries if http.respond_to?(:max_retries=)
|
602
|
+
http.read_timeout = @read_timeout if @read_timeout
|
603
|
+
http.write_timeout = @write_timeout if
|
604
|
+
@write_timeout && http.respond_to?(:write_timeout=)
|
661
605
|
|
662
606
|
return yield connection
|
663
607
|
rescue Errno::ECONNREFUSED
|
@@ -675,27 +619,14 @@ class Net::HTTP::Persistent
|
|
675
619
|
end
|
676
620
|
|
677
621
|
##
|
678
|
-
#
|
679
|
-
# this connection
|
680
|
-
|
681
|
-
def error_message connection
|
682
|
-
connection.requests -= 1 # fixup
|
683
|
-
|
684
|
-
age = Time.now - connection.last_use
|
685
|
-
|
686
|
-
"after #{connection.requests} requests on #{connection.http.object_id}, " \
|
687
|
-
"last used #{age} seconds ago"
|
688
|
-
end
|
689
|
-
|
690
|
-
##
|
691
|
-
# URI::escape wrapper
|
622
|
+
# CGI::escape wrapper
|
692
623
|
|
693
624
|
def escape str
|
694
625
|
CGI.escape str if str
|
695
626
|
end
|
696
627
|
|
697
628
|
##
|
698
|
-
#
|
629
|
+
# CGI::unescape wrapper
|
699
630
|
|
700
631
|
def unescape str
|
701
632
|
CGI.unescape str if str
|
@@ -738,6 +669,7 @@ class Net::HTTP::Persistent
|
|
738
669
|
def finish connection
|
739
670
|
connection.finish
|
740
671
|
|
672
|
+
connection.http.instance_variable_set :@last_communicated, nil
|
741
673
|
connection.http.instance_variable_set :@ssl_session, nil unless
|
742
674
|
@reuse_ssl_sessions
|
743
675
|
end
|
@@ -746,31 +678,31 @@ class Net::HTTP::Persistent
|
|
746
678
|
# Returns the HTTP protocol version for +uri+
|
747
679
|
|
748
680
|
def http_version uri
|
749
|
-
@http_versions["#{uri.
|
681
|
+
@http_versions["#{uri.hostname}:#{uri.port}"]
|
750
682
|
end
|
751
683
|
|
752
684
|
##
|
753
|
-
#
|
685
|
+
# Adds "http://" to the String +uri+ if it is missing.
|
754
686
|
|
755
|
-
def
|
756
|
-
|
757
|
-
when 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE' then
|
758
|
-
true
|
759
|
-
end
|
687
|
+
def normalize_uri uri
|
688
|
+
(uri =~ /^https?:/) ? uri : "http://#{uri}"
|
760
689
|
end
|
761
690
|
|
762
691
|
##
|
763
|
-
#
|
692
|
+
# Set the maximum number of retries for a request.
|
693
|
+
#
|
694
|
+
# Defaults to one retry.
|
695
|
+
#
|
696
|
+
# Set this to 0 to disable retries.
|
764
697
|
|
765
|
-
def
|
766
|
-
|
767
|
-
end
|
698
|
+
def max_retries= retries
|
699
|
+
retries = retries.to_int
|
768
700
|
|
769
|
-
|
770
|
-
# Adds "http://" to the String +uri+ if it is missing.
|
701
|
+
raise ArgumentError, "max_retries must be positive" if retries < 0
|
771
702
|
|
772
|
-
|
773
|
-
|
703
|
+
@max_retries = retries
|
704
|
+
|
705
|
+
reconnect
|
774
706
|
end
|
775
707
|
|
776
708
|
##
|
@@ -828,7 +760,7 @@ class Net::HTTP::Persistent
|
|
828
760
|
|
829
761
|
if @proxy_uri then
|
830
762
|
@proxy_args = [
|
831
|
-
@proxy_uri.
|
763
|
+
@proxy_uri.hostname,
|
832
764
|
@proxy_uri.port,
|
833
765
|
unescape(@proxy_uri.user),
|
834
766
|
unescape(@proxy_uri.password),
|
@@ -903,14 +835,15 @@ class Net::HTTP::Persistent
|
|
903
835
|
end
|
904
836
|
|
905
837
|
##
|
906
|
-
# Forces reconnection of HTTP connections
|
838
|
+
# Forces reconnection of all HTTP connections, including TLS/SSL
|
839
|
+
# connections.
|
907
840
|
|
908
841
|
def reconnect
|
909
842
|
@generation += 1
|
910
843
|
end
|
911
844
|
|
912
845
|
##
|
913
|
-
# Forces reconnection of SSL connections.
|
846
|
+
# Forces reconnection of only TLS/SSL connections.
|
914
847
|
|
915
848
|
def reconnect_ssl
|
916
849
|
@ssl_generation += 1
|
@@ -943,14 +876,8 @@ class Net::HTTP::Persistent
|
|
943
876
|
# the response will not have been read).
|
944
877
|
#
|
945
878
|
# +req+ must be a Net::HTTPGenericRequest subclass (see Net::HTTP for a list).
|
946
|
-
#
|
947
|
-
# If there is an error and the request is idempotent according to RFC 2616
|
948
|
-
# it will be retried automatically.
|
949
879
|
|
950
880
|
def request uri, req = nil, &block
|
951
|
-
retried = false
|
952
|
-
bad_response = false
|
953
|
-
|
954
881
|
uri = URI uri
|
955
882
|
req = request_setup req || uri
|
956
883
|
response = nil
|
@@ -964,37 +891,12 @@ class Net::HTTP::Persistent
|
|
964
891
|
response = http.request req, &block
|
965
892
|
|
966
893
|
if req.connection_close? or
|
967
|
-
|
894
|
+
(response.http_version <= '1.0' and
|
968
895
|
not response.connection_keep_alive?) or
|
969
|
-
|
896
|
+
response.connection_close? then
|
970
897
|
finish connection
|
971
898
|
end
|
972
|
-
rescue
|
973
|
-
message = error_message connection
|
974
|
-
|
975
|
-
finish connection
|
976
|
-
|
977
|
-
raise Error, "too many bad responses #{message}" if
|
978
|
-
bad_response or not can_retry? req
|
979
|
-
|
980
|
-
bad_response = true
|
981
|
-
retry
|
982
|
-
rescue *RETRIED_EXCEPTIONS => e
|
983
|
-
request_failed e, req, connection if
|
984
|
-
retried or not can_retry? req
|
985
|
-
|
986
|
-
reset connection
|
987
|
-
|
988
|
-
retried = true
|
989
|
-
retry
|
990
|
-
rescue Errno::EINVAL, Errno::ETIMEDOUT => e # not retried on ruby 2
|
991
|
-
request_failed e, req, connection if retried or not can_retry? req
|
992
|
-
|
993
|
-
reset connection
|
994
|
-
|
995
|
-
retried = true
|
996
|
-
retry
|
997
|
-
rescue Exception => e
|
899
|
+
rescue Exception # make sure to close the connection when it was interrupted
|
998
900
|
finish connection
|
999
901
|
|
1000
902
|
raise
|
@@ -1003,26 +905,11 @@ class Net::HTTP::Persistent
|
|
1003
905
|
end
|
1004
906
|
end
|
1005
907
|
|
1006
|
-
@http_versions["#{uri.
|
908
|
+
@http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version
|
1007
909
|
|
1008
910
|
response
|
1009
911
|
end
|
1010
912
|
|
1011
|
-
##
|
1012
|
-
# Raises an Error for +exception+ which resulted from attempting the request
|
1013
|
-
# +req+ on the +connection+.
|
1014
|
-
#
|
1015
|
-
# Finishes the +connection+.
|
1016
|
-
|
1017
|
-
def request_failed exception, req, connection # :nodoc:
|
1018
|
-
due_to = "(due to #{exception.message} - #{exception.class})"
|
1019
|
-
message = "too many connection resets #{due_to} #{error_message connection}"
|
1020
|
-
|
1021
|
-
finish connection
|
1022
|
-
|
1023
|
-
raise Error, message, exception.backtrace
|
1024
|
-
end
|
1025
|
-
|
1026
913
|
##
|
1027
914
|
# Creates a GET request if +req_or_uri+ is a URI and adds headers to the
|
1028
915
|
# request.
|
@@ -1030,7 +917,7 @@ class Net::HTTP::Persistent
|
|
1030
917
|
# Returns the request.
|
1031
918
|
|
1032
919
|
def request_setup req_or_uri # :nodoc:
|
1033
|
-
req = if
|
920
|
+
req = if req_or_uri.respond_to? 'request_uri' then
|
1034
921
|
Net::HTTP::Get.new req_or_uri.request_uri
|
1035
922
|
else
|
1036
923
|
req_or_uri
|
@@ -1194,9 +1081,8 @@ application:
|
|
1194
1081
|
|
1195
1082
|
reconnect_ssl
|
1196
1083
|
end
|
1197
|
-
|
1198
1084
|
end
|
1199
1085
|
|
1200
|
-
|
1201
|
-
|
1086
|
+
require_relative 'persistent/connection'
|
1087
|
+
require_relative 'persistent/pool'
|
1202
1088
|
|
@@ -56,7 +56,8 @@ class TestNetHttpPersistent < Minitest::Test
|
|
56
56
|
def setup
|
57
57
|
@http = Net::HTTP::Persistent.new
|
58
58
|
|
59
|
-
@uri
|
59
|
+
@uri = URI 'http://example.com/path'
|
60
|
+
@uri_v6 = URI 'http://[2001:db8::1]/path'
|
60
61
|
|
61
62
|
ENV.delete 'http_proxy'
|
62
63
|
ENV.delete 'HTTP_PROXY'
|
@@ -120,7 +121,7 @@ class TestNetHttpPersistent < Minitest::Test
|
|
120
121
|
def basic_connection
|
121
122
|
raise "#{@uri} is not HTTP" unless @uri.scheme.downcase == 'http'
|
122
123
|
|
123
|
-
net_http_args = [@uri.
|
124
|
+
net_http_args = [@uri.hostname, @uri.port, nil, nil, nil, nil]
|
124
125
|
|
125
126
|
connection = Net::HTTP::Persistent::Connection.allocate
|
126
127
|
connection.ssl_generation = @http.ssl_generation
|
@@ -132,7 +133,9 @@ class TestNetHttpPersistent < Minitest::Test
|
|
132
133
|
connection
|
133
134
|
end
|
134
135
|
|
135
|
-
def connection
|
136
|
+
def connection uri = @uri
|
137
|
+
@uri = uri
|
138
|
+
|
136
139
|
connection = basic_connection
|
137
140
|
connection.last_use = Time.now
|
138
141
|
|
@@ -152,7 +155,7 @@ class TestNetHttpPersistent < Minitest::Test
|
|
152
155
|
def ssl_connection
|
153
156
|
raise "#{@uri} is not HTTPS" unless @uri.scheme.downcase == 'https'
|
154
157
|
|
155
|
-
net_http_args = [@uri.
|
158
|
+
net_http_args = [@uri.hostname, @uri.port, nil, nil, nil, nil]
|
156
159
|
|
157
160
|
connection = Net::HTTP::Persistent::Connection.allocate
|
158
161
|
connection.ssl_generation = @http.ssl_generation
|
@@ -220,26 +223,6 @@ class TestNetHttpPersistent < Minitest::Test
|
|
220
223
|
assert_equal 1, @http.ssl_generation
|
221
224
|
end
|
222
225
|
|
223
|
-
def test_can_retry_eh_change_requests
|
224
|
-
post = Net::HTTP::Post.new '/'
|
225
|
-
|
226
|
-
refute @http.can_retry? post
|
227
|
-
|
228
|
-
@http.retry_change_requests = true
|
229
|
-
|
230
|
-
assert @http.can_retry? post
|
231
|
-
end
|
232
|
-
|
233
|
-
def test_can_retry_eh_idempotent
|
234
|
-
head = Net::HTTP::Head.new '/'
|
235
|
-
|
236
|
-
refute @http.can_retry? head
|
237
|
-
|
238
|
-
post = Net::HTTP::Post.new '/'
|
239
|
-
|
240
|
-
refute @http.can_retry? post
|
241
|
-
end
|
242
|
-
|
243
226
|
def test_cert_store_equals
|
244
227
|
@http.cert_store = :cert_store
|
245
228
|
|
@@ -265,6 +248,7 @@ class TestNetHttpPersistent < Minitest::Test
|
|
265
248
|
@http.open_timeout = 123
|
266
249
|
@http.read_timeout = 321
|
267
250
|
@http.idle_timeout = 42
|
251
|
+
@http.max_retries = 5
|
268
252
|
|
269
253
|
used = @http.connection_for @uri do |c|
|
270
254
|
assert_kind_of Net::HTTP, c.http
|
@@ -275,6 +259,7 @@ class TestNetHttpPersistent < Minitest::Test
|
|
275
259
|
assert_equal 123, c.http.open_timeout
|
276
260
|
assert_equal 321, c.http.read_timeout
|
277
261
|
assert_equal 42, c.http.keep_alive_timeout
|
262
|
+
assert_equal 5, c.http.max_retries if c.http.respond_to?(:max_retries)
|
278
263
|
|
279
264
|
c
|
280
265
|
end
|
@@ -396,10 +381,8 @@ class TestNetHttpPersistent < Minitest::Test
|
|
396
381
|
end
|
397
382
|
|
398
383
|
def test_connection_for_ipv6
|
399
|
-
|
400
|
-
|
401
|
-
@http.connection_for uri do |c|
|
402
|
-
assert_equal '::1', c.http.address
|
384
|
+
@http.connection_for @uri_v6 do |c|
|
385
|
+
assert_equal '2001:db8::1', c.http.address
|
403
386
|
end
|
404
387
|
end
|
405
388
|
|
@@ -635,16 +618,6 @@ class TestNetHttpPersistent < Minitest::Test
|
|
635
618
|
end
|
636
619
|
end
|
637
620
|
|
638
|
-
def test_error_message
|
639
|
-
c = basic_connection
|
640
|
-
c.last_use = Time.now - 1
|
641
|
-
c.requests = 5
|
642
|
-
|
643
|
-
message = @http.error_message c
|
644
|
-
assert_match %r%after 4 requests on #{c.http.object_id}%, message
|
645
|
-
assert_match %r%, last used [\d.]+ seconds ago%, message
|
646
|
-
end
|
647
|
-
|
648
621
|
def test_escape
|
649
622
|
assert_nil @http.escape nil
|
650
623
|
|
@@ -698,6 +671,7 @@ class TestNetHttpPersistent < Minitest::Test
|
|
698
671
|
def test_finish
|
699
672
|
c = basic_connection
|
700
673
|
c.requests = 5
|
674
|
+
c.http.instance_variable_set(:@last_communicated, Process.clock_gettime(Process::CLOCK_MONOTONIC))
|
701
675
|
|
702
676
|
@http.finish c
|
703
677
|
|
@@ -706,6 +680,7 @@ class TestNetHttpPersistent < Minitest::Test
|
|
706
680
|
|
707
681
|
assert_equal 0, c.requests
|
708
682
|
assert_equal Net::HTTP::Persistent::EPOCH, c.last_use
|
683
|
+
assert_nil c.http.instance_variable_get(:@last_communicated)
|
709
684
|
end
|
710
685
|
|
711
686
|
def test_finish_io_error
|
@@ -743,24 +718,21 @@ class TestNetHttpPersistent < Minitest::Test
|
|
743
718
|
assert_equal '1.1', @http.http_version(@uri)
|
744
719
|
end
|
745
720
|
|
746
|
-
def
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
assert @http.idempotent? Net::HTTP::Options.new '/'
|
751
|
-
assert @http.idempotent? Net::HTTP::Put.new '/'
|
752
|
-
assert @http.idempotent? Net::HTTP::Trace.new '/'
|
721
|
+
def test_http_version_IPv6
|
722
|
+
assert_nil @http.http_version @uri_v6
|
723
|
+
|
724
|
+
connection @uri_v6
|
753
725
|
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
assert @http.idempotent? Net::HTTPGenericRequest.new('PUT', true, true, '/')
|
759
|
-
assert @http.idempotent? Net::HTTPGenericRequest.new('TRACE', false, true, '/')
|
726
|
+
@http.request @uri_v6
|
727
|
+
|
728
|
+
assert_equal '1.1', @http.http_version(@uri_v6)
|
729
|
+
end
|
760
730
|
|
761
|
-
|
731
|
+
def test_max_retries_equals
|
732
|
+
@http.max_retries = 5
|
762
733
|
|
763
|
-
|
734
|
+
assert_equal 5, @http.max_retries
|
735
|
+
assert_equal 1, @http.generation
|
764
736
|
end
|
765
737
|
|
766
738
|
def test_normalize_uri
|
@@ -832,6 +804,14 @@ class TestNetHttpPersistent < Minitest::Test
|
|
832
804
|
assert_equal proxy_uri, @http.proxy_uri
|
833
805
|
end
|
834
806
|
|
807
|
+
def test_proxy_equals_uri_IPv6
|
808
|
+
proxy_uri = @uri_v6
|
809
|
+
|
810
|
+
@http.proxy = proxy_uri
|
811
|
+
|
812
|
+
assert_equal proxy_uri, @http.proxy_uri
|
813
|
+
end
|
814
|
+
|
835
815
|
def test_proxy_from_env
|
836
816
|
ENV['http_proxy'] = 'proxy.example'
|
837
817
|
ENV['http_proxy_user'] = 'johndoe'
|
@@ -977,7 +957,7 @@ class TestNetHttpPersistent < Minitest::Test
|
|
977
957
|
assert_equal Net::HTTP::Persistent::EPOCH, used2.last_use
|
978
958
|
end
|
979
959
|
|
980
|
-
def
|
960
|
+
def test_requestx
|
981
961
|
@http.override_headers['user-agent'] = 'test ua'
|
982
962
|
@http.headers['accept'] = 'text/*'
|
983
963
|
c = connection
|
@@ -1001,62 +981,6 @@ class TestNetHttpPersistent < Minitest::Test
|
|
1001
981
|
assert_equal 1, c.requests
|
1002
982
|
end
|
1003
983
|
|
1004
|
-
def test_request_ETIMEDOUT
|
1005
|
-
c = basic_connection
|
1006
|
-
def (c.http).request(*a) raise Errno::ETIMEDOUT, "timed out" end
|
1007
|
-
|
1008
|
-
e = assert_raises Net::HTTP::Persistent::Error do
|
1009
|
-
@http.request @uri
|
1010
|
-
end
|
1011
|
-
|
1012
|
-
assert_equal 0, c.requests
|
1013
|
-
assert_match %r%too many connection resets%, e.message
|
1014
|
-
end
|
1015
|
-
|
1016
|
-
def test_request_bad_response
|
1017
|
-
c = basic_connection
|
1018
|
-
def (c.http).request(*a) raise Net::HTTPBadResponse end
|
1019
|
-
|
1020
|
-
e = assert_raises Net::HTTP::Persistent::Error do
|
1021
|
-
@http.request @uri
|
1022
|
-
end
|
1023
|
-
|
1024
|
-
assert_equal 0, c.requests
|
1025
|
-
assert_match %r%too many bad responses%, e.message
|
1026
|
-
end
|
1027
|
-
|
1028
|
-
def test_request_bad_response_retry
|
1029
|
-
c = basic_connection
|
1030
|
-
def (c.http).request(*a)
|
1031
|
-
raise Net::HTTPBadResponse
|
1032
|
-
end
|
1033
|
-
|
1034
|
-
assert_raises Net::HTTP::Persistent::Error do
|
1035
|
-
@http.request @uri
|
1036
|
-
end
|
1037
|
-
|
1038
|
-
assert c.http.finished?
|
1039
|
-
end
|
1040
|
-
|
1041
|
-
def test_request_bad_response_unsafe
|
1042
|
-
c = basic_connection
|
1043
|
-
def (c.http).request(*a)
|
1044
|
-
if instance_variable_defined? :@request then
|
1045
|
-
raise 'POST must not be retried'
|
1046
|
-
else
|
1047
|
-
@request = true
|
1048
|
-
raise Net::HTTPBadResponse
|
1049
|
-
end
|
1050
|
-
end
|
1051
|
-
|
1052
|
-
e = assert_raises Net::HTTP::Persistent::Error do
|
1053
|
-
@http.request @uri, Net::HTTP::Post.new(@uri.path)
|
1054
|
-
end
|
1055
|
-
|
1056
|
-
assert_equal 0, c.requests
|
1057
|
-
assert_match %r%too many bad responses%, e.message
|
1058
|
-
end
|
1059
|
-
|
1060
984
|
def test_request_block
|
1061
985
|
@http.headers['user-agent'] = 'test ua'
|
1062
986
|
c = connection
|
@@ -1182,12 +1106,12 @@ class TestNetHttpPersistent < Minitest::Test
|
|
1182
1106
|
c = basic_connection
|
1183
1107
|
def (c.http).request(*a) raise Errno::EINVAL, "write" end
|
1184
1108
|
|
1185
|
-
e = assert_raises
|
1109
|
+
e = assert_raises Errno::EINVAL do
|
1186
1110
|
@http.request @uri
|
1187
1111
|
end
|
1188
1112
|
|
1189
1113
|
assert_equal 0, c.requests
|
1190
|
-
assert_match %r%
|
1114
|
+
assert_match %r%Invalid argument - write%, e.message
|
1191
1115
|
end
|
1192
1116
|
|
1193
1117
|
def test_request_post
|
@@ -1201,69 +1125,6 @@ class TestNetHttpPersistent < Minitest::Test
|
|
1201
1125
|
assert_same post, req
|
1202
1126
|
end
|
1203
1127
|
|
1204
|
-
def test_request_reset
|
1205
|
-
c = basic_connection
|
1206
|
-
def (c.http).request(*a) raise Errno::ECONNRESET end
|
1207
|
-
|
1208
|
-
e = assert_raises Net::HTTP::Persistent::Error do
|
1209
|
-
@http.request @uri
|
1210
|
-
end
|
1211
|
-
|
1212
|
-
assert_equal 0, c.requests
|
1213
|
-
assert_match %r%too many connection resets%, e.message
|
1214
|
-
end
|
1215
|
-
|
1216
|
-
def test_request_reset_retry
|
1217
|
-
c = basic_connection
|
1218
|
-
c.last_use = Time.now
|
1219
|
-
|
1220
|
-
def (c.http).request(*a)
|
1221
|
-
raise Errno::ECONNRESET
|
1222
|
-
end
|
1223
|
-
|
1224
|
-
assert_raises Net::HTTP::Persistent::Error do
|
1225
|
-
@http.request @uri
|
1226
|
-
end
|
1227
|
-
|
1228
|
-
refute (c.http).reset?
|
1229
|
-
assert (c.http).finished?
|
1230
|
-
end
|
1231
|
-
|
1232
|
-
def test_request_reset_unsafe
|
1233
|
-
c = basic_connection
|
1234
|
-
def (c.http).request(*a)
|
1235
|
-
if instance_variable_defined? :@request then
|
1236
|
-
raise 'POST must not be retried'
|
1237
|
-
else
|
1238
|
-
@request = true
|
1239
|
-
raise Errno::ECONNRESET
|
1240
|
-
end
|
1241
|
-
end
|
1242
|
-
|
1243
|
-
e = assert_raises Net::HTTP::Persistent::Error do
|
1244
|
-
@http.request @uri, Net::HTTP::Post.new(@uri.path)
|
1245
|
-
end
|
1246
|
-
|
1247
|
-
assert_equal 0, c.requests
|
1248
|
-
assert_match %r%too many connection resets%, e.message
|
1249
|
-
end
|
1250
|
-
|
1251
|
-
def test_request_ssl_error
|
1252
|
-
skip 'OpenSSL is missing' unless HAVE_OPENSSL
|
1253
|
-
|
1254
|
-
uri = URI.parse 'https://example.com/path'
|
1255
|
-
@http.connection_for uri do |c|
|
1256
|
-
def (c.http).request(*)
|
1257
|
-
raise OpenSSL::SSL::SSLError, "SSL3_WRITE_PENDING:bad write retry"
|
1258
|
-
end
|
1259
|
-
|
1260
|
-
e = assert_raises Net::HTTP::Persistent::Error do
|
1261
|
-
@http.request uri
|
1262
|
-
end
|
1263
|
-
assert_match %r%bad write retry%, e.message
|
1264
|
-
end
|
1265
|
-
end
|
1266
|
-
|
1267
1128
|
def test_request_setup
|
1268
1129
|
@http.override_headers['user-agent'] = 'test ua'
|
1269
1130
|
@http.headers['accept'] = 'text/*'
|
@@ -1307,30 +1168,6 @@ class TestNetHttpPersistent < Minitest::Test
|
|
1307
1168
|
assert_equal '/path?a=b', req.path
|
1308
1169
|
end
|
1309
1170
|
|
1310
|
-
def test_request_failed
|
1311
|
-
c = basic_connection
|
1312
|
-
c.requests = 1
|
1313
|
-
c.last_use = Time.now
|
1314
|
-
|
1315
|
-
original = nil
|
1316
|
-
|
1317
|
-
begin
|
1318
|
-
raise 'original'
|
1319
|
-
rescue => original
|
1320
|
-
end
|
1321
|
-
|
1322
|
-
req = Net::HTTP::Get.new '/'
|
1323
|
-
|
1324
|
-
e = assert_raises Net::HTTP::Persistent::Error do
|
1325
|
-
@http.request_failed original, req, c
|
1326
|
-
end
|
1327
|
-
|
1328
|
-
assert_match "too many connection resets (due to original - RuntimeError)",
|
1329
|
-
e.message
|
1330
|
-
|
1331
|
-
assert_equal original.backtrace, e.backtrace
|
1332
|
-
end
|
1333
|
-
|
1334
1171
|
def test_reset
|
1335
1172
|
c = basic_connection
|
1336
1173
|
c.http.start
|
@@ -1385,23 +1222,6 @@ class TestNetHttpPersistent < Minitest::Test
|
|
1385
1222
|
assert_match __FILE__, e.backtrace.first
|
1386
1223
|
end
|
1387
1224
|
|
1388
|
-
def test_retry_change_requests_equals
|
1389
|
-
get = Net::HTTP::Get.new('/')
|
1390
|
-
post = Net::HTTP::Post.new('/')
|
1391
|
-
|
1392
|
-
refute @http.retry_change_requests
|
1393
|
-
|
1394
|
-
refute @http.can_retry?(get)
|
1395
|
-
refute @http.can_retry?(post)
|
1396
|
-
|
1397
|
-
@http.retry_change_requests = true
|
1398
|
-
|
1399
|
-
assert @http.retry_change_requests
|
1400
|
-
|
1401
|
-
refute @http.can_retry?(get)
|
1402
|
-
assert @http.can_retry?(post)
|
1403
|
-
end
|
1404
|
-
|
1405
1225
|
def test_shutdown
|
1406
1226
|
c = connection
|
1407
1227
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: net-http-persistent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Hodel
|
@@ -10,9 +10,9 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
13
|
+
MIIDNjCCAh6gAwIBAgIBBzANBgkqhkiG9w0BAQsFADBBMRAwDgYDVQQDDAdkcmJy
|
14
14
|
YWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZFgNu
|
15
|
-
|
15
|
+
ZXQwHhcNMjAwNDE0MDQxNjM0WhcNMjEwNDE0MDQxNjM0WjBBMRAwDgYDVQQDDAdk
|
16
16
|
cmJyYWluMRgwFgYKCZImiZPyLGQBGRYIc2VnbWVudDcxEzARBgoJkiaJk/IsZAEZ
|
17
17
|
FgNuZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCbbgLrGLGIDE76
|
18
18
|
LV/cvxdEzCuYuS3oG9PrSZnuDweySUfdp/so0cDq+j8bqy6OzZSw07gdjwFMSd6J
|
@@ -21,15 +21,15 @@ cert_chain:
|
|
21
21
|
mUtgzBwF1V4KIZQ8EuL6I/nHVu07i6IkrpAgxpXUfdJQJi0oZAqXurAV3yTxkFwd
|
22
22
|
g62YrrW26mDe+pZBzR6bpLE+PmXCzz7UxUq3AE0gPHbiMXie3EFE0oxnsU3lIduh
|
23
23
|
sCANiQ8BAgMBAAGjOTA3MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQW
|
24
|
-
BBS5k4Z75VSpdM0AclG2UvzFA/
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
24
|
+
BBS5k4Z75VSpdM0AclG2UvzFA/VW5DANBgkqhkiG9w0BAQsFAAOCAQEAcrJao+AD
|
25
|
+
qFvUtuvzimPGJS1rtKJEvEvDTzEOnd4e+R+mVitEBp3AI8R4OZGf1wnPy7jYYtiL
|
26
|
+
S8FhRBZRyXaQcvcL75eKicfIy8gPSg8d8YTs12BhXrF+ziTR6JJUB3DLkFjE3O84
|
27
|
+
Aid+DdQFk1ERR/GvpA9wQcax8DXzc9ONoN/kGdruXLtXSEwmOGJgmSV9iKK2Ot+x
|
28
|
+
6A1NLSPq5zcsOzbmsaWlZphKnvH6oPqOLzMxwGJOz07/XXxICSYIccrWXdHZ3PPm
|
29
|
+
UpBFtcBdupJTrY8t+BLoVN4zTlNqoDciUJBjHfem/2CiMy6oDqthQva1Kn8fquIf
|
30
|
+
BHDiQW5MD5FN1g==
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date:
|
32
|
+
date: 2020-05-01 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: connection_pool
|
@@ -51,14 +51,14 @@ dependencies:
|
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '5.
|
54
|
+
version: '5.14'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '5.
|
61
|
+
version: '5.14'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: hoe-bundler
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,25 +119,26 @@ dependencies:
|
|
119
119
|
requirements:
|
120
120
|
- - "~>"
|
121
121
|
- !ruby/object:Gem::Version
|
122
|
-
version: '3.
|
122
|
+
version: '3.22'
|
123
123
|
type: :development
|
124
124
|
prerelease: false
|
125
125
|
version_requirements: !ruby/object:Gem::Requirement
|
126
126
|
requirements:
|
127
127
|
- - "~>"
|
128
128
|
- !ruby/object:Gem::Version
|
129
|
-
version: '3.
|
129
|
+
version: '3.22'
|
130
130
|
description: |-
|
131
|
-
Manages persistent connections using Net::HTTP
|
132
|
-
|
131
|
+
Manages persistent connections using Net::HTTP including a thread pool for
|
132
|
+
connecting to multiple hosts.
|
133
133
|
|
134
134
|
Using persistent HTTP connections can dramatically increase the speed of HTTP.
|
135
135
|
Creating a new HTTP connection for every request involves an extra TCP
|
136
136
|
round-trip and causes TCP congestion avoidance negotiation to start over.
|
137
137
|
|
138
138
|
Net::HTTP supports persistent connections with some API methods but does not
|
139
|
-
|
140
|
-
and
|
139
|
+
make setting up a single persistent connection or managing multiple
|
140
|
+
connections easy. Net::HTTP::Persistent wraps Net::HTTP and allows you to
|
141
|
+
focus on how to make HTTP requests.
|
141
142
|
email:
|
142
143
|
- drbrain@segment7.net
|
143
144
|
executables: []
|
@@ -161,10 +162,11 @@ files:
|
|
161
162
|
- lib/net/http/persistent/timed_stack_multi.rb
|
162
163
|
- test/test_net_http_persistent.rb
|
163
164
|
- test/test_net_http_persistent_timed_stack_multi.rb
|
164
|
-
homepage:
|
165
|
+
homepage: https://github.com/drbrain/net-http-persistent
|
165
166
|
licenses:
|
166
167
|
- MIT
|
167
|
-
metadata:
|
168
|
+
metadata:
|
169
|
+
homepage_uri: https://github.com/drbrain/net-http-persistent
|
168
170
|
post_install_message:
|
169
171
|
rdoc_options:
|
170
172
|
- "--main"
|
@@ -175,7 +177,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
175
177
|
requirements:
|
176
178
|
- - "~>"
|
177
179
|
- !ruby/object:Gem::Version
|
178
|
-
version: '2.
|
180
|
+
version: '2.3'
|
179
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
180
182
|
requirements:
|
181
183
|
- - ">="
|
@@ -185,6 +187,6 @@ requirements: []
|
|
185
187
|
rubygems_version: 3.0.3
|
186
188
|
signing_key:
|
187
189
|
specification_version: 4
|
188
|
-
summary: Manages persistent connections using Net::HTTP
|
189
|
-
|
190
|
+
summary: Manages persistent connections using Net::HTTP including a thread pool for
|
191
|
+
connecting to multiple hosts
|
190
192
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|