bundler 2.1.0 → 2.2.0.rc.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +832 -738
- data/README.md +6 -8
- data/bundler.gemspec +3 -3
- data/exe/bundle +3 -0
- data/lib/bundler.rb +15 -4
- data/lib/bundler/build_metadata.rb +2 -2
- data/lib/bundler/cli.rb +32 -11
- data/lib/bundler/cli/console.rb +1 -1
- data/lib/bundler/cli/exec.rb +3 -12
- data/lib/bundler/cli/gem.rb +83 -10
- data/lib/bundler/cli/info.rb +13 -3
- data/lib/bundler/cli/init.rb +1 -1
- data/lib/bundler/cli/install.rb +8 -16
- data/lib/bundler/cli/issue.rb +2 -2
- data/lib/bundler/cli/list.rb +11 -9
- data/lib/bundler/cli/outdated.rb +88 -65
- data/lib/bundler/cli/plugin.rb +10 -0
- data/lib/bundler/cli/pristine.rb +5 -0
- data/lib/bundler/definition.rb +32 -32
- data/lib/bundler/dependency.rb +0 -9
- data/lib/bundler/dsl.rb +1 -5
- data/lib/bundler/environment_preserver.rb +26 -2
- data/lib/bundler/errors.rb +1 -0
- data/lib/bundler/feature_flag.rb +0 -2
- data/lib/bundler/fetcher.rb +1 -0
- data/lib/bundler/friendly_errors.rb +4 -10
- data/lib/bundler/gem_helper.rb +18 -12
- data/lib/bundler/gem_version_promoter.rb +1 -1
- data/lib/bundler/injector.rb +14 -3
- data/lib/bundler/inline.rb +2 -2
- data/lib/bundler/installer.rb +29 -28
- data/lib/bundler/installer/gem_installer.rb +2 -2
- data/lib/bundler/installer/parallel_installer.rb +9 -9
- data/lib/bundler/lazy_specification.rb +16 -3
- data/lib/bundler/plugin.rb +26 -0
- data/lib/bundler/plugin/index.rb +9 -0
- data/lib/bundler/psyched_yaml.rb +0 -15
- data/lib/bundler/remote_specification.rb +4 -1
- data/lib/bundler/resolver.rb +31 -8
- data/lib/bundler/resolver/spec_group.rb +26 -5
- data/lib/bundler/rubygems_ext.rb +7 -8
- data/lib/bundler/rubygems_gem_installer.rb +1 -7
- data/lib/bundler/rubygems_integration.rb +13 -48
- data/lib/bundler/runtime.rb +2 -12
- data/lib/bundler/settings.rb +0 -3
- data/lib/bundler/setup.rb +5 -0
- data/lib/bundler/shared_helpers.rb +1 -1
- data/lib/bundler/source/git.rb +4 -4
- data/lib/bundler/source/git/git_proxy.rb +53 -58
- data/lib/bundler/source/path.rb +5 -1
- data/lib/bundler/source/path/installer.rb +7 -9
- data/lib/bundler/source/rubygems.rb +11 -14
- data/lib/bundler/stub_specification.rb +16 -4
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
- data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
- data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
- data/lib/bundler/templates/newgem/bin/console.tt +2 -0
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +2 -0
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +6 -4
- data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -0
- data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
- data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
- data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +72 -208
- data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/version.rb +1 -1
- data/man/bundle-add.1 +1 -1
- data/man/bundle-add.1.txt +15 -15
- data/man/bundle-binstubs.1 +1 -1
- data/man/bundle-binstubs.1.txt +10 -10
- data/man/bundle-cache.1 +1 -1
- data/man/bundle-cache.1.txt +15 -15
- data/man/bundle-check.1 +1 -1
- data/man/bundle-check.1.txt +8 -8
- data/man/bundle-clean.1 +1 -1
- data/man/bundle-clean.1.txt +6 -6
- data/man/bundle-config.1 +3 -9
- data/man/bundle-config.1.txt +271 -272
- data/man/bundle-config.ronn +5 -9
- data/man/bundle-doctor.1 +1 -1
- data/man/bundle-doctor.1.txt +9 -9
- data/man/bundle-exec.1 +1 -1
- data/man/bundle-exec.1.txt +84 -81
- data/man/bundle-gem.1 +25 -3
- data/man/bundle-gem.1.txt +65 -39
- data/man/bundle-gem.ronn +30 -7
- data/man/bundle-info.1 +1 -1
- data/man/bundle-info.1.txt +2 -2
- data/man/bundle-init.1 +1 -1
- data/man/bundle-init.1.txt +9 -9
- data/man/bundle-inject.1 +1 -1
- data/man/bundle-inject.1.txt +4 -4
- data/man/bundle-install.1 +1 -1
- data/man/bundle-install.1.txt +169 -169
- data/man/bundle-list.1 +7 -7
- data/man/bundle-list.1.txt +12 -11
- data/man/bundle-list.ronn +6 -6
- data/man/bundle-lock.1 +1 -1
- data/man/bundle-lock.1.txt +28 -28
- data/man/bundle-open.1 +1 -1
- data/man/bundle-open.1.txt +3 -3
- data/man/bundle-outdated.1 +1 -1
- data/man/bundle-outdated.1.txt +34 -34
- data/man/bundle-platform.1 +1 -1
- data/man/bundle-platform.1.txt +16 -16
- data/man/bundle-pristine.1 +1 -1
- data/man/bundle-pristine.1.txt +8 -8
- data/man/bundle-remove.1 +1 -1
- data/man/bundle-remove.1.txt +9 -9
- data/man/bundle-show.1 +1 -1
- data/man/bundle-show.1.txt +8 -8
- data/man/bundle-update.1 +1 -1
- data/man/bundle-update.1.txt +149 -148
- data/man/bundle-viz.1 +1 -1
- data/man/bundle-viz.1.txt +11 -11
- data/man/bundle.1 +1 -1
- data/man/bundle.1.txt +31 -31
- data/man/gemfile.5 +1 -1
- data/man/gemfile.5.txt +218 -216
- metadata +14 -8
@@ -1,12 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
source "https://rubygems.org"
|
2
4
|
|
3
5
|
# Specify your gem's dependencies in <%= config[:name] %>.gemspec
|
4
6
|
gemspec
|
5
7
|
|
6
|
-
gem "rake", "~>
|
8
|
+
gem "rake", "~> 13.0"
|
7
9
|
<%- if config[:ext] -%>
|
10
|
+
|
8
11
|
gem "rake-compiler"
|
9
12
|
<%- end -%>
|
10
13
|
<%- if config[:test] -%>
|
14
|
+
|
11
15
|
gem "<%= config[:test] %>", "~> <%= config[:test_framework_version] %>"
|
12
16
|
<%- end -%>
|
17
|
+
<%- if config[:rubocop] -%>
|
18
|
+
|
19
|
+
gem "rubocop", "~> 0.80"
|
20
|
+
<%- end -%>
|
@@ -1,5 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "bundler/gem_tasks"
|
2
|
-
<%
|
4
|
+
<% default_task_names = [config[:test_task]].compact -%>
|
5
|
+
<% case config[:test] -%>
|
6
|
+
<% when "minitest", "test-unit" -%>
|
3
7
|
require "rake/testtask"
|
4
8
|
|
5
9
|
Rake::TestTask.new(:test) do |t|
|
@@ -8,22 +12,32 @@ Rake::TestTask.new(:test) do |t|
|
|
8
12
|
t.test_files = FileList["test/**/*_test.rb"]
|
9
13
|
end
|
10
14
|
|
11
|
-
<%
|
15
|
+
<% when "rspec" -%>
|
12
16
|
require "rspec/core/rake_task"
|
13
17
|
|
14
18
|
RSpec::Core::RakeTask.new(:spec)
|
15
19
|
|
20
|
+
<% end -%>
|
21
|
+
<% if config[:rubocop] -%>
|
22
|
+
<% default_task_names << :rubocop -%>
|
23
|
+
require "rubocop/rake_task"
|
24
|
+
|
25
|
+
RuboCop::RakeTask.new
|
26
|
+
|
16
27
|
<% end -%>
|
17
28
|
<% if config[:ext] -%>
|
29
|
+
<% default_task_names.unshift(:clobber, :compile) -%>
|
18
30
|
require "rake/extensiontask"
|
19
31
|
|
20
|
-
task :
|
32
|
+
task build: :compile
|
21
33
|
|
22
34
|
Rake::ExtensionTask.new("<%= config[:underscored_name] %>") do |ext|
|
23
35
|
ext.lib_dir = "lib/<%= config[:namespaced_path] %>"
|
24
36
|
end
|
25
37
|
|
26
|
-
|
38
|
+
<% end -%>
|
39
|
+
<% if default_task_names.size == 1 -%>
|
40
|
+
task default: <%= default_task_names.first.inspect %>
|
27
41
|
<% else -%>
|
28
|
-
task :
|
42
|
+
task default: %i[<%= default_task_names.join(" ") %>]
|
29
43
|
<% end -%>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
name: Ruby
|
2
|
+
|
3
|
+
on: [push,pull_request]
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
build:
|
7
|
+
runs-on: ubuntu-latest
|
8
|
+
steps:
|
9
|
+
- uses: actions/checkout@v2
|
10
|
+
- name: Set up Ruby
|
11
|
+
uses: ruby/setup-ruby@v1
|
12
|
+
with:
|
13
|
+
ruby-version: <%= RUBY_VERSION %>
|
14
|
+
- name: Run the default task
|
15
|
+
run: |
|
16
|
+
gem install bundler -v <%= Bundler::VERSION %>
|
17
|
+
bundle install
|
18
|
+
bundle exec rake
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/<%=config[:namespaced_path]%>/version"
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
4
6
|
spec.name = <%= config[:name].inspect %>
|
@@ -6,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
6
8
|
spec.authors = [<%= config[:author].inspect %>]
|
7
9
|
spec.email = [<%= config[:email].inspect %>]
|
8
10
|
|
9
|
-
spec.summary =
|
10
|
-
spec.description =
|
11
|
+
spec.summary = "TODO: Write a short summary, because RubyGems requires one."
|
12
|
+
spec.description = "TODO: Write a longer description or delete this line."
|
11
13
|
spec.homepage = "TODO: Put your gem's website or public repo URL here."
|
12
14
|
<%- if config[:mit] -%>
|
13
15
|
spec.license = "MIT"
|
@@ -22,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
22
24
|
|
23
25
|
# Specify which files should be added to the gem when it is released.
|
24
26
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
-
spec.files
|
27
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
26
28
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
27
29
|
end
|
28
30
|
spec.bindir = "exe"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
class <%= config[:constant_name] %>Test < Test::Unit::TestCase
|
6
|
+
test "VERSION" do
|
7
|
+
assert do
|
8
|
+
::<%= config[:constant_name] %>.const_defined?(:VERSION)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
test "something useful" do
|
13
|
+
assert_equal("expected", "actual")
|
14
|
+
end
|
15
|
+
end
|
@@ -3,11 +3,6 @@ require_relative '../../../../uri/lib/uri'
|
|
3
3
|
require 'cgi' # for escaping
|
4
4
|
require_relative '../../../../connection_pool/lib/connection_pool'
|
5
5
|
|
6
|
-
begin
|
7
|
-
require 'net/http/pipeline'
|
8
|
-
rescue LoadError
|
9
|
-
end
|
10
|
-
|
11
6
|
autoload :OpenSSL, 'openssl'
|
12
7
|
|
13
8
|
##
|
@@ -17,15 +12,11 @@ autoload :OpenSSL, 'openssl'
|
|
17
12
|
# servers you wish to talk to. For each host:port you communicate with a
|
18
13
|
# single persistent connection is created.
|
19
14
|
#
|
20
|
-
#
|
21
|
-
# connections.
|
22
|
-
#
|
23
|
-
# For each thread you start a new connection will be created. A
|
24
|
-
# Bundler::Persistent::Net::HTTP::Persistent connection will not be shared across threads.
|
15
|
+
# Connections will be shared across threads through a connection pool to
|
16
|
+
# increase reuse of connections.
|
25
17
|
#
|
26
|
-
# You can shut down
|
27
|
-
#
|
28
|
-
# method.
|
18
|
+
# You can shut down any remaining HTTP connections when done by calling
|
19
|
+
# #shutdown.
|
29
20
|
#
|
30
21
|
# Example:
|
31
22
|
#
|
@@ -33,7 +24,7 @@ autoload :OpenSSL, 'openssl'
|
|
33
24
|
#
|
34
25
|
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
35
26
|
#
|
36
|
-
# http = Bundler::Persistent::Net::HTTP::Persistent.new
|
27
|
+
# http = Bundler::Persistent::Net::HTTP::Persistent.new
|
37
28
|
#
|
38
29
|
# # perform a GET
|
39
30
|
# response = http.request uri
|
@@ -55,14 +46,14 @@ autoload :OpenSSL, 'openssl'
|
|
55
46
|
# to use Bundler::URI#request_uri not Bundler::URI#path. The request_uri contains the query
|
56
47
|
# params which are sent in the body for other requests.
|
57
48
|
#
|
58
|
-
# == SSL
|
49
|
+
# == TLS/SSL
|
59
50
|
#
|
60
|
-
#
|
61
|
-
# Bundler::URI.
|
51
|
+
# TLS connections are automatically created depending upon the scheme of the
|
52
|
+
# Bundler::URI. TLS connections are automatically verified against the default
|
62
53
|
# certificate store for your computer. You can override this by changing
|
63
54
|
# verify_mode or by specifying an alternate cert_store.
|
64
55
|
#
|
65
|
-
# Here are the
|
56
|
+
# Here are the TLS settings, see the individual methods for documentation:
|
66
57
|
#
|
67
58
|
# #certificate :: This client's certificate
|
68
59
|
# #ca_file :: The certificate-authorities
|
@@ -72,7 +63,7 @@ autoload :OpenSSL, 'openssl'
|
|
72
63
|
# #private_key :: The client's SSL private key
|
73
64
|
# #reuse_ssl_sessions :: Reuse a previously opened SSL session for a new
|
74
65
|
# connection
|
75
|
-
# #ssl_timeout ::
|
66
|
+
# #ssl_timeout :: Session lifetime
|
76
67
|
# #ssl_version :: Which specific SSL version to use
|
77
68
|
# #verify_callback :: For server certificate verification
|
78
69
|
# #verify_depth :: Depth of certificate verification
|
@@ -101,14 +92,15 @@ autoload :OpenSSL, 'openssl'
|
|
101
92
|
#
|
102
93
|
# === Segregation
|
103
94
|
#
|
104
|
-
#
|
105
|
-
#
|
95
|
+
# Each Bundler::Persistent::Net::HTTP::Persistent instance has its own pool of connections. There
|
96
|
+
# is no sharing with other instances (as was true in earlier versions).
|
106
97
|
#
|
107
98
|
# === Idle Timeout
|
108
99
|
#
|
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.
|
100
|
+
# If a connection hasn't been used for this number of seconds it will
|
101
|
+
# automatically be reset upon the next use to avoid attempting to send to a
|
102
|
+
# closed connection. The default value is 5 seconds. nil means no timeout.
|
103
|
+
# Set through #idle_timeout.
|
112
104
|
#
|
113
105
|
# Reducing this value may help avoid the "too many connection resets" error
|
114
106
|
# when sending non-idempotent requests while increasing this value will cause
|
@@ -123,8 +115,9 @@ autoload :OpenSSL, 'openssl'
|
|
123
115
|
#
|
124
116
|
# The number of requests that should be made before opening a new connection.
|
125
117
|
# 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
|
118
|
+
# 101st request will fail with ECONNRESET. If unset (default), this value has
|
119
|
+
# no effect, if set, connections will be reset on the request after
|
120
|
+
# max_requests.
|
128
121
|
#
|
129
122
|
# === Open Timeout
|
130
123
|
#
|
@@ -136,45 +129,6 @@ autoload :OpenSSL, 'openssl'
|
|
136
129
|
# Socket options may be set on newly-created connections. See #socket_options
|
137
130
|
# for details.
|
138
131
|
#
|
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 'bundler/vendor/net-http-persistent/lib/net/http/persistent'
|
152
|
-
#
|
153
|
-
# uri = Bundler::URI 'http://example.com/awesome/web/service'
|
154
|
-
# post_uri = uri + 'create'
|
155
|
-
#
|
156
|
-
# http = Bundler::Persistent::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 Bundler::Persistent::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
132
|
# === Connection Termination
|
179
133
|
#
|
180
134
|
# If you are done using the Bundler::Persistent::Net::HTTP::Persistent instance you may shut down
|
@@ -200,33 +154,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
200
154
|
HAVE_OPENSSL = defined? OpenSSL::SSL # :nodoc:
|
201
155
|
|
202
156
|
##
|
203
|
-
# The default connection pool size is 1/4 the allowed open files
|
157
|
+
# The default connection pool size is 1/4 the allowed open files
|
158
|
+
# (<code>ulimit -n</code>) or 256 if your OS does not support file handle
|
159
|
+
# limits (typically windows).
|
204
160
|
|
205
|
-
if
|
206
|
-
DEFAULT_POOL_SIZE = 256
|
207
|
-
else
|
161
|
+
if Process.const_defined? :RLIMIT_NOFILE
|
208
162
|
DEFAULT_POOL_SIZE = Process.getrlimit(Process::RLIMIT_NOFILE).first / 4
|
163
|
+
else
|
164
|
+
DEFAULT_POOL_SIZE = 256
|
209
165
|
end
|
210
166
|
|
211
167
|
##
|
212
168
|
# The version of Bundler::Persistent::Net::HTTP::Persistent you are using
|
213
169
|
|
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
|
170
|
+
VERSION = '4.0.0'
|
230
171
|
|
231
172
|
##
|
232
173
|
# Error class for errors raised by Bundler::Persistent::Net::HTTP::Persistent. Various
|
@@ -353,6 +294,13 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
353
294
|
|
354
295
|
attr_accessor :max_requests
|
355
296
|
|
297
|
+
##
|
298
|
+
# Number of retries to perform if a request fails.
|
299
|
+
#
|
300
|
+
# See also #max_retries=, Net::HTTP#max_retries=.
|
301
|
+
|
302
|
+
attr_reader :max_retries
|
303
|
+
|
356
304
|
##
|
357
305
|
# The value sent in the Keep-Alive header. Defaults to 30. Not needed for
|
358
306
|
# HTTP/1.1 servers.
|
@@ -365,8 +313,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
365
313
|
attr_accessor :keep_alive
|
366
314
|
|
367
315
|
##
|
368
|
-
#
|
369
|
-
# from everybody else's.
|
316
|
+
# The name for this collection of persistent connections.
|
370
317
|
|
371
318
|
attr_reader :name
|
372
319
|
|
@@ -495,23 +442,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
495
442
|
|
496
443
|
attr_reader :verify_mode
|
497
444
|
|
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
445
|
##
|
510
446
|
# Creates a new Bundler::Persistent::Net::HTTP::Persistent.
|
511
447
|
#
|
512
|
-
# Set +name+
|
513
|
-
#
|
514
|
-
# good enough. This parameter will be required in a future version.
|
448
|
+
# Set a +name+ for fun. Your library name should be good enough, but this
|
449
|
+
# otherwise has no purpose.
|
515
450
|
#
|
516
451
|
# +proxy+ may be set to a Bundler::URI::HTTP or :ENV to pick up proxy options from
|
517
452
|
# the environment. See proxy_from_env for details.
|
@@ -524,8 +459,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
524
459
|
# proxy.password = 'hunter2'
|
525
460
|
#
|
526
461
|
# Set +pool_size+ to limit the maximum number of connections allowed.
|
527
|
-
# Defaults to 1/4 the number of allowed file handles
|
528
|
-
#
|
462
|
+
# Defaults to 1/4 the number of allowed file handles or 256 if your OS does
|
463
|
+
# not support a limit on allowed file handles. You can have no more than
|
464
|
+
# this many threads with active HTTP transactions.
|
529
465
|
|
530
466
|
def initialize name: nil, proxy: nil, pool_size: DEFAULT_POOL_SIZE
|
531
467
|
@name = name
|
@@ -542,6 +478,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
542
478
|
@write_timeout = nil
|
543
479
|
@idle_timeout = 5
|
544
480
|
@max_requests = nil
|
481
|
+
@max_retries = 1
|
545
482
|
@socket_options = []
|
546
483
|
@ssl_generation = 0 # incremented when SSL session variables change
|
547
484
|
|
@@ -573,8 +510,6 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
573
510
|
@reuse_ssl_sessions = OpenSSL::SSL.const_defined? :Session
|
574
511
|
end
|
575
512
|
|
576
|
-
@retry_change_requests = false
|
577
|
-
|
578
513
|
self.proxy = proxy if proxy
|
579
514
|
end
|
580
515
|
|
@@ -635,7 +570,9 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
635
570
|
|
636
571
|
net_http_args = [uri.hostname, uri.port]
|
637
572
|
|
638
|
-
|
573
|
+
# I'm unsure if uri.host or uri.hostname should be checked against
|
574
|
+
# the proxy bypass list.
|
575
|
+
if @proxy_uri and not proxy_bypass? uri.host, uri.port then
|
639
576
|
net_http_args.concat @proxy_args
|
640
577
|
else
|
641
578
|
net_http_args.concat [nil, nil, nil, nil]
|
@@ -655,9 +592,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
655
592
|
reset connection
|
656
593
|
end
|
657
594
|
|
658
|
-
http.
|
659
|
-
http.
|
660
|
-
http.
|
595
|
+
http.keep_alive_timeout = @idle_timeout if @idle_timeout
|
596
|
+
http.max_retries = @max_retries if http.respond_to?(:max_retries=)
|
597
|
+
http.read_timeout = @read_timeout if @read_timeout
|
598
|
+
http.write_timeout = @write_timeout if
|
599
|
+
@write_timeout && http.respond_to?(:write_timeout=)
|
661
600
|
|
662
601
|
return yield connection
|
663
602
|
rescue Errno::ECONNREFUSED
|
@@ -675,27 +614,14 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
675
614
|
end
|
676
615
|
|
677
616
|
##
|
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
|
-
# Bundler::URI::escape wrapper
|
617
|
+
# CGI::escape wrapper
|
692
618
|
|
693
619
|
def escape str
|
694
620
|
CGI.escape str if str
|
695
621
|
end
|
696
622
|
|
697
623
|
##
|
698
|
-
#
|
624
|
+
# CGI::unescape wrapper
|
699
625
|
|
700
626
|
def unescape str
|
701
627
|
CGI.unescape str if str
|
@@ -738,6 +664,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
738
664
|
def finish connection
|
739
665
|
connection.finish
|
740
666
|
|
667
|
+
connection.http.instance_variable_set :@last_communicated, nil
|
741
668
|
connection.http.instance_variable_set :@ssl_session, nil unless
|
742
669
|
@reuse_ssl_sessions
|
743
670
|
end
|
@@ -746,24 +673,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
746
673
|
# Returns the HTTP protocol version for +uri+
|
747
674
|
|
748
675
|
def http_version uri
|
749
|
-
@http_versions["#{uri.
|
750
|
-
end
|
751
|
-
|
752
|
-
##
|
753
|
-
# Is +req+ idempotent according to RFC 2616?
|
754
|
-
|
755
|
-
def idempotent? req
|
756
|
-
case req.method
|
757
|
-
when 'DELETE', 'GET', 'HEAD', 'OPTIONS', 'PUT', 'TRACE' then
|
758
|
-
true
|
759
|
-
end
|
760
|
-
end
|
761
|
-
|
762
|
-
##
|
763
|
-
# Is the request +req+ idempotent or is retry_change_requests allowed.
|
764
|
-
|
765
|
-
def can_retry? req
|
766
|
-
@retry_change_requests && !idempotent?(req)
|
676
|
+
@http_versions["#{uri.hostname}:#{uri.port}"]
|
767
677
|
end
|
768
678
|
|
769
679
|
##
|
@@ -774,20 +684,20 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
774
684
|
end
|
775
685
|
|
776
686
|
##
|
777
|
-
#
|
778
|
-
# block is given. Returns all responses received.
|
687
|
+
# Set the maximum number of retries for a request.
|
779
688
|
#
|
780
|
-
#
|
781
|
-
# Net::HTTP::Pipeline[http://docs.seattlerb.org/net-http-pipeline/Net/HTTP/Pipeline.html]
|
782
|
-
# for further details.
|
689
|
+
# Defaults to one retry.
|
783
690
|
#
|
784
|
-
#
|
785
|
-
# <tt>net-http-persistent</tt> #pipeline will be present.
|
691
|
+
# Set this to 0 to disable retries.
|
786
692
|
|
787
|
-
def
|
788
|
-
|
789
|
-
|
790
|
-
|
693
|
+
def max_retries= retries
|
694
|
+
retries = retries.to_int
|
695
|
+
|
696
|
+
raise ArgumentError, "max_retries must be positive" if retries < 0
|
697
|
+
|
698
|
+
@max_retries = retries
|
699
|
+
|
700
|
+
reconnect
|
791
701
|
end
|
792
702
|
|
793
703
|
##
|
@@ -828,7 +738,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
828
738
|
|
829
739
|
if @proxy_uri then
|
830
740
|
@proxy_args = [
|
831
|
-
@proxy_uri.
|
741
|
+
@proxy_uri.hostname,
|
832
742
|
@proxy_uri.port,
|
833
743
|
unescape(@proxy_uri.user),
|
834
744
|
unescape(@proxy_uri.password),
|
@@ -903,14 +813,15 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
903
813
|
end
|
904
814
|
|
905
815
|
##
|
906
|
-
# Forces reconnection of HTTP connections
|
816
|
+
# Forces reconnection of all HTTP connections, including TLS/SSL
|
817
|
+
# connections.
|
907
818
|
|
908
819
|
def reconnect
|
909
820
|
@generation += 1
|
910
821
|
end
|
911
822
|
|
912
823
|
##
|
913
|
-
# Forces reconnection of SSL connections.
|
824
|
+
# Forces reconnection of only TLS/SSL connections.
|
914
825
|
|
915
826
|
def reconnect_ssl
|
916
827
|
@ssl_generation += 1
|
@@ -943,14 +854,8 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
943
854
|
# the response will not have been read).
|
944
855
|
#
|
945
856
|
# +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
857
|
|
950
858
|
def request uri, req = nil, &block
|
951
|
-
retried = false
|
952
|
-
bad_response = false
|
953
|
-
|
954
859
|
uri = Bundler::URI uri
|
955
860
|
req = request_setup req || uri
|
956
861
|
response = nil
|
@@ -964,37 +869,12 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
964
869
|
response = http.request req, &block
|
965
870
|
|
966
871
|
if req.connection_close? or
|
967
|
-
|
872
|
+
(response.http_version <= '1.0' and
|
968
873
|
not response.connection_keep_alive?) or
|
969
|
-
|
874
|
+
response.connection_close? then
|
970
875
|
finish connection
|
971
876
|
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
|
877
|
+
rescue Exception # make sure to close the connection when it was interrupted
|
998
878
|
finish connection
|
999
879
|
|
1000
880
|
raise
|
@@ -1003,26 +883,11 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1003
883
|
end
|
1004
884
|
end
|
1005
885
|
|
1006
|
-
@http_versions["#{uri.
|
886
|
+
@http_versions["#{uri.hostname}:#{uri.port}"] ||= response.http_version
|
1007
887
|
|
1008
888
|
response
|
1009
889
|
end
|
1010
890
|
|
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
891
|
##
|
1027
892
|
# Creates a GET request if +req_or_uri+ is a Bundler::URI and adds headers to the
|
1028
893
|
# request.
|
@@ -1030,7 +895,7 @@ class Bundler::Persistent::Net::HTTP::Persistent
|
|
1030
895
|
# Returns the request.
|
1031
896
|
|
1032
897
|
def request_setup req_or_uri # :nodoc:
|
1033
|
-
req = if
|
898
|
+
req = if req_or_uri.respond_to? 'request_uri' then
|
1034
899
|
Net::HTTP::Get.new req_or_uri.request_uri
|
1035
900
|
else
|
1036
901
|
req_or_uri
|
@@ -1194,7 +1059,6 @@ application:
|
|
1194
1059
|
|
1195
1060
|
reconnect_ssl
|
1196
1061
|
end
|
1197
|
-
|
1198
1062
|
end
|
1199
1063
|
|
1200
1064
|
require_relative 'persistent/connection'
|