sealights-rspec-agent 2.0.4 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/agent/config.rb +6 -6
  3. data/agent/dependencies/faraday-0.17.0/LICENSE.md +20 -0
  4. data/agent/dependencies/faraday-0.17.0/README.md +384 -0
  5. data/agent/dependencies/faraday-0.17.0/lib/faraday.rb +248 -0
  6. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter.rb +55 -0
  7. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/em_http.rb +243 -0
  8. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/em_synchrony.rb +106 -0
  9. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/em_synchrony/parallel_manager.rb +66 -0
  10. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/excon.rb +82 -0
  11. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/httpclient.rb +128 -0
  12. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/net_http.rb +152 -0
  13. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/net_http_persistent.rb +68 -0
  14. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/patron.rb +95 -0
  15. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/rack.rb +58 -0
  16. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/sl_em_http_ssl_patch.rb +56 -0
  17. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/test.rb +213 -0
  18. data/agent/dependencies/faraday-0.17.0/lib/faraday/adapter/typhoeus.rb +12 -0
  19. data/agent/dependencies/faraday-0.17.0/lib/faraday/autoload.rb +84 -0
  20. data/agent/dependencies/faraday-0.17.0/lib/faraday/connection.rb +484 -0
  21. data/agent/dependencies/faraday-0.17.0/lib/faraday/error.rb +66 -0
  22. data/agent/dependencies/faraday-0.17.0/lib/faraday/middleware.rb +37 -0
  23. data/agent/dependencies/faraday-0.17.0/lib/faraday/options.rb +373 -0
  24. data/agent/dependencies/faraday-0.17.0/lib/faraday/parameters.rb +198 -0
  25. data/agent/dependencies/faraday-0.17.0/lib/faraday/rack_builder.rb +237 -0
  26. data/agent/dependencies/faraday-0.17.0/lib/faraday/request.rb +114 -0
  27. data/agent/dependencies/faraday-0.17.0/lib/faraday/request/authorization.rb +41 -0
  28. data/agent/dependencies/faraday-0.17.0/lib/faraday/request/basic_authentication.rb +13 -0
  29. data/agent/dependencies/faraday-0.17.0/lib/faraday/request/instrumentation.rb +36 -0
  30. data/agent/dependencies/faraday-0.17.0/lib/faraday/request/multipart.rb +68 -0
  31. data/agent/dependencies/faraday-0.17.0/lib/faraday/request/retry.rb +212 -0
  32. data/agent/dependencies/faraday-0.17.0/lib/faraday/request/token_authentication.rb +15 -0
  33. data/agent/dependencies/faraday-0.17.0/lib/faraday/request/url_encoded.rb +36 -0
  34. data/agent/dependencies/faraday-0.17.0/lib/faraday/response.rb +97 -0
  35. data/agent/dependencies/faraday-0.17.0/lib/faraday/response/logger.rb +80 -0
  36. data/agent/dependencies/faraday-0.17.0/lib/faraday/response/raise_error.rb +21 -0
  37. data/agent/dependencies/faraday-0.17.0/lib/faraday/upload_io.rb +67 -0
  38. data/agent/dependencies/faraday-0.17.0/lib/faraday/utils.rb +326 -0
  39. data/agent/dependencies/jwt-2.2.1/AUTHORS +84 -0
  40. data/agent/dependencies/jwt-2.2.1/Appraisals +14 -0
  41. data/agent/dependencies/jwt-2.2.1/CHANGELOG.md +570 -0
  42. data/agent/dependencies/jwt-2.2.1/Gemfile +3 -0
  43. data/agent/dependencies/jwt-2.2.1/LICENSE +7 -0
  44. data/agent/dependencies/jwt-2.2.1/README.md +489 -0
  45. data/agent/dependencies/jwt-2.2.1/Rakefile +11 -0
  46. data/agent/dependencies/jwt-2.2.1/lib/jwt.rb +30 -0
  47. data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/ecdsa.rb +35 -0
  48. data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/eddsa.rb +23 -0
  49. data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/hmac.rb +33 -0
  50. data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/ps.rb +43 -0
  51. data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/rsa.rb +19 -0
  52. data/agent/dependencies/jwt-2.2.1/lib/jwt/algos/unsupported.rb +16 -0
  53. data/agent/dependencies/jwt-2.2.1/lib/jwt/base64.rb +19 -0
  54. data/agent/dependencies/jwt-2.2.1/lib/jwt/claims_validator.rb +33 -0
  55. data/agent/dependencies/jwt-2.2.1/lib/jwt/decode.rb +100 -0
  56. data/agent/dependencies/jwt-2.2.1/lib/jwt/default_options.rb +15 -0
  57. data/agent/dependencies/jwt-2.2.1/lib/jwt/encode.rb +68 -0
  58. data/agent/dependencies/jwt-2.2.1/lib/jwt/error.rb +20 -0
  59. data/agent/dependencies/jwt-2.2.1/lib/jwt/json.rb +18 -0
  60. data/agent/dependencies/jwt-2.2.1/lib/jwt/jwk.rb +31 -0
  61. data/agent/dependencies/jwt-2.2.1/lib/jwt/jwk/key_finder.rb +57 -0
  62. data/agent/dependencies/jwt-2.2.1/lib/jwt/jwk/rsa.rb +47 -0
  63. data/agent/dependencies/jwt-2.2.1/lib/jwt/security_utils.rb +57 -0
  64. data/agent/dependencies/jwt-2.2.1/lib/jwt/signature.rb +52 -0
  65. data/agent/dependencies/jwt-2.2.1/lib/jwt/verify.rb +98 -0
  66. data/agent/dependencies/jwt-2.2.1/lib/jwt/version.rb +24 -0
  67. data/agent/dependencies/jwt-2.2.1/ruby-jwt.gemspec +34 -0
  68. data/agent/dependencies/multipart-post-2.1.1/Gemfile +6 -0
  69. data/agent/dependencies/multipart-post-2.1.1/History.txt +64 -0
  70. data/agent/dependencies/multipart-post-2.1.1/LICENSE +21 -0
  71. data/agent/dependencies/multipart-post-2.1.1/Manifest.txt +9 -0
  72. data/agent/dependencies/multipart-post-2.1.1/README.md +127 -0
  73. data/agent/dependencies/multipart-post-2.1.1/Rakefile +6 -0
  74. data/agent/dependencies/multipart-post-2.1.1/lib/composite_io.rb +108 -0
  75. data/agent/dependencies/multipart-post-2.1.1/lib/multipart_post.rb +9 -0
  76. data/agent/dependencies/multipart-post-2.1.1/lib/multipartable.rb +48 -0
  77. data/agent/dependencies/multipart-post-2.1.1/lib/net/http/post/multipart.rb +28 -0
  78. data/agent/dependencies/multipart-post-2.1.1/lib/parts.rb +126 -0
  79. data/agent/dependencies/multipart-post-2.1.1/multipart-post.gemspec +23 -0
  80. data/agent/http_client.rb +46 -0
  81. data/agent/listener.rb +1 -1
  82. data/agent/sealights-rspec-agent.rb +2 -2
  83. data/agent/tia.rb +5 -1
  84. metadata +80 -3
  85. data/agent/rest-client-wrapper.rb +0 -27
@@ -0,0 +1,106 @@
1
+ require 'uri'
2
+
3
+ module SLFaraday
4
+ class Adapter
5
+ class EMSynchrony < SLFaraday::Adapter
6
+ include EMHttp::Options
7
+
8
+ dependency do
9
+ require 'em-synchrony/em-http'
10
+ require 'em-synchrony/em-multi'
11
+ require 'fiber'
12
+ end
13
+
14
+ self.supports_parallel = true
15
+
16
+ def self.setup_parallel_manager(options = {})
17
+ ParallelManager.new
18
+ end
19
+
20
+ def call(env)
21
+ super
22
+ request = create_request(env)
23
+
24
+ http_method = env[:method].to_s.downcase.to_sym
25
+
26
+ # Queue requests for parallel execution.
27
+ if env[:parallel_manager]
28
+ env[:parallel_manager].add(request, http_method, request_config(env)) do |resp|
29
+ save_response(env, resp.response_header.status, resp.response) do |resp_headers|
30
+ resp.response_header.each do |name, value|
31
+ resp_headers[name.to_sym] = value
32
+ end
33
+ end
34
+
35
+ # Finalize the response object with values from `env`.
36
+ env[:response].finish(env)
37
+ end
38
+
39
+ # Execute single request.
40
+ else
41
+ client = nil
42
+ block = lambda { request.send(http_method, request_config(env)) }
43
+
44
+ if !EM.reactor_running?
45
+ EM.run do
46
+ Fiber.new {
47
+ client = block.call
48
+ EM.stop
49
+ }.resume
50
+ end
51
+ else
52
+ client = block.call
53
+ end
54
+
55
+ raise client.error if client.error
56
+
57
+ status = client.response_header.status
58
+ reason = client.response_header.http_reason
59
+ save_response(env, status, client.response, nil, reason) do |resp_headers|
60
+ client.response_header.each do |name, value|
61
+ resp_headers[name.to_sym] = value
62
+ end
63
+ end
64
+ end
65
+
66
+ @app.call env
67
+ rescue Errno::ECONNREFUSED
68
+ raise Error::ConnectionFailed, $!
69
+ rescue EventMachine::Connectify::CONNECTError => err
70
+ if err.message.include?("Proxy Authentication Required")
71
+ raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
72
+ else
73
+ raise Error::ConnectionFailed, err
74
+ end
75
+ rescue Errno::ETIMEDOUT => err
76
+ raise Error::TimeoutError, err
77
+ rescue RuntimeError => err
78
+ if err.message == "connection closed by server"
79
+ raise Error::ConnectionFailed, err
80
+ else
81
+ raise
82
+ end
83
+ rescue => err
84
+ if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
85
+ raise SLFaraday::SSLError, err
86
+ else
87
+ raise
88
+ end
89
+ end
90
+
91
+ def create_request(env)
92
+ EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env).merge(@connection_options))
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ require 'faraday/adapter/em_synchrony/parallel_manager'
99
+
100
+ begin
101
+ require 'openssl'
102
+ rescue LoadError
103
+ warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
104
+ else
105
+ require 'faraday/adapter/em_http_ssl_patch'
106
+ end if SLFaraday::Adapter::EMSynchrony.loaded?
@@ -0,0 +1,66 @@
1
+ module SLFaraday
2
+ class Adapter
3
+ class EMSynchrony < SLFaraday::Adapter
4
+ class ParallelManager
5
+
6
+ # Add requests to queue. The `request` argument should be a
7
+ # `EM::HttpRequest` object.
8
+ def add(request, method, *args, &block)
9
+ queue << {
10
+ :request => request,
11
+ :method => method,
12
+ :args => args,
13
+ :block => block
14
+ }
15
+ end
16
+
17
+ # Run all requests on queue with `EM::Synchrony::Multi`, wrapping
18
+ # it in a reactor and fiber if needed.
19
+ def run
20
+ result = nil
21
+ if !EM.reactor_running?
22
+ EM.run {
23
+ Fiber.new do
24
+ result = perform
25
+ EM.stop
26
+ end.resume
27
+ }
28
+ else
29
+ result = perform
30
+ end
31
+ result
32
+ end
33
+
34
+
35
+ private
36
+
37
+ # The request queue.
38
+ def queue
39
+ @queue ||= []
40
+ end
41
+
42
+ # Main `EM::Synchrony::Multi` performer.
43
+ def perform
44
+ multi = ::EM::Synchrony::Multi.new
45
+
46
+ queue.each do |item|
47
+ method = "a#{item[:method]}".to_sym
48
+
49
+ req = item[:request].send(method, *item[:args])
50
+ req.callback(&item[:block])
51
+
52
+ req_name = "req_#{multi.requests.size}".to_sym
53
+ multi.add(req_name, req)
54
+ end
55
+
56
+ # Clear the queue, so parallel manager objects can be reused.
57
+ @queue = []
58
+
59
+ # Block fiber until all requests have returned.
60
+ multi.perform
61
+ end
62
+
63
+ end # ParallelManager
64
+ end # EMSynchrony
65
+ end # Adapter
66
+ end # Faraday
@@ -0,0 +1,82 @@
1
+ module SLFaraday
2
+ class Adapter
3
+ class Excon < SLFaraday::Adapter
4
+ dependency 'excon'
5
+
6
+ def call(env)
7
+ super
8
+
9
+ opts = {}
10
+ if env[:url].scheme == 'https' && ssl = env[:ssl]
11
+ opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true)
12
+ opts[:ssl_ca_path] = ssl[:ca_path] if ssl[:ca_path]
13
+ opts[:ssl_ca_file] = ssl[:ca_file] if ssl[:ca_file]
14
+ opts[:client_cert] = ssl[:client_cert] if ssl[:client_cert]
15
+ opts[:client_key] = ssl[:client_key] if ssl[:client_key]
16
+ opts[:certificate] = ssl[:certificate] if ssl[:certificate]
17
+ opts[:private_key] = ssl[:private_key] if ssl[:private_key]
18
+ opts[:ssl_version] = ssl[:version] if ssl[:version]
19
+ opts[:ssl_min_version] = ssl[:min_version] if ssl[:min_version]
20
+ opts[:ssl_max_version] = ssl[:max_version] if ssl[:max_version]
21
+
22
+ # https://github.com/geemus/excon/issues/106
23
+ # https://github.com/jruby/jruby-ossl/issues/19
24
+ opts[:nonblock] = false
25
+ end
26
+
27
+ if ( req = env[:request] )
28
+ if req[:timeout]
29
+ opts[:read_timeout] = req[:timeout]
30
+ opts[:connect_timeout] = req[:timeout]
31
+ opts[:write_timeout] = req[:timeout]
32
+ end
33
+
34
+ if req[:open_timeout]
35
+ opts[:connect_timeout] = req[:open_timeout]
36
+ end
37
+
38
+ if req[:proxy]
39
+ opts[:proxy] = {
40
+ :host => req[:proxy][:uri].host,
41
+ :hostname => req[:proxy][:uri].hostname,
42
+ :port => req[:proxy][:uri].port,
43
+ :scheme => req[:proxy][:uri].scheme,
44
+ :user => req[:proxy][:user],
45
+ :password => req[:proxy][:password]
46
+ }
47
+ end
48
+ end
49
+
50
+ conn = create_connection(env, opts)
51
+
52
+ resp = conn.request \
53
+ :method => env[:method].to_s.upcase,
54
+ :headers => env[:request_headers],
55
+ :body => read_body(env)
56
+
57
+ save_response(env, resp.status.to_i, resp.body, resp.headers, resp.reason_phrase)
58
+
59
+ @app.call env
60
+ rescue ::Excon::Errors::SocketError => err
61
+ if err.message =~ /\btimeout\b/
62
+ raise Error::TimeoutError, err
63
+ elsif err.message =~ /\bcertificate\b/
64
+ raise SLFaraday::SSLError, err
65
+ else
66
+ raise Error::ConnectionFailed, err
67
+ end
68
+ rescue ::Excon::Errors::Timeout => err
69
+ raise Error::TimeoutError, err
70
+ end
71
+
72
+ def create_connection(env, opts)
73
+ ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
74
+ end
75
+
76
+ # TODO: support streaming requests
77
+ def read_body(env)
78
+ env[:body].respond_to?(:read) ? env[:body].read : env[:body]
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,128 @@
1
+ module SLFaraday
2
+ class Adapter
3
+ class HTTPClient < SLFaraday::Adapter
4
+ dependency 'httpclient'
5
+
6
+ def client
7
+ @client ||= ::HTTPClient.new
8
+ end
9
+
10
+ def call(env)
11
+ super
12
+
13
+ # enable compression
14
+ client.transparent_gzip_decompression = true
15
+
16
+ if req = env[:request]
17
+ if proxy = req[:proxy]
18
+ configure_proxy proxy
19
+ end
20
+
21
+ if bind = req[:bind]
22
+ configure_socket bind
23
+ end
24
+
25
+ configure_timeouts req
26
+ end
27
+
28
+ if env[:url].scheme == 'https' && ssl = env[:ssl]
29
+ configure_ssl ssl
30
+ end
31
+
32
+ configure_client
33
+
34
+ # TODO Don't stream yet.
35
+ # https://github.com/nahi/httpclient/pull/90
36
+ env[:body] = env[:body].read if env[:body].respond_to? :read
37
+
38
+ resp = client.request env[:method], env[:url],
39
+ :body => env[:body],
40
+ :header => env[:request_headers]
41
+
42
+ save_response env, resp.status, resp.body, resp.headers, resp.reason
43
+
44
+ @app.call env
45
+ rescue ::HTTPClient::TimeoutError, Errno::ETIMEDOUT
46
+ raise SLFaraday::Error::TimeoutError, $!
47
+ rescue ::HTTPClient::BadResponseError => err
48
+ if err.message.include?('status 407')
49
+ raise SLFaraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
50
+ else
51
+ raise SLFaraday::Error::ClientError, $!
52
+ end
53
+ rescue Errno::ECONNREFUSED, IOError, SocketError
54
+ raise SLFaraday::Error::ConnectionFailed, $!
55
+ rescue => err
56
+ if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
57
+ raise SLFaraday::SSLError, err
58
+ else
59
+ raise
60
+ end
61
+ end
62
+
63
+ def configure_socket(bind)
64
+ client.socket_local.host = bind[:host]
65
+ client.socket_local.port = bind[:port]
66
+ end
67
+
68
+ def configure_proxy(proxy)
69
+ client.proxy = proxy[:uri]
70
+ if proxy[:user] && proxy[:password]
71
+ client.set_proxy_auth proxy[:user], proxy[:password]
72
+ end
73
+ end
74
+
75
+ def configure_ssl(ssl)
76
+ ssl_config = client.ssl_config
77
+ ssl_config.verify_mode = ssl_verify_mode(ssl)
78
+ ssl_config.cert_store = ssl_cert_store(ssl)
79
+
80
+ ssl_config.add_trust_ca ssl[:ca_file] if ssl[:ca_file]
81
+ ssl_config.add_trust_ca ssl[:ca_path] if ssl[:ca_path]
82
+ ssl_config.client_cert = ssl[:client_cert] if ssl[:client_cert]
83
+ ssl_config.client_key = ssl[:client_key] if ssl[:client_key]
84
+ ssl_config.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
85
+ end
86
+
87
+ def configure_timeouts(req)
88
+ if req[:timeout]
89
+ client.connect_timeout = req[:timeout]
90
+ client.receive_timeout = req[:timeout]
91
+ client.send_timeout = req[:timeout]
92
+ end
93
+
94
+ if req[:open_timeout]
95
+ client.connect_timeout = req[:open_timeout]
96
+ client.send_timeout = req[:open_timeout]
97
+ end
98
+ end
99
+
100
+ def configure_client
101
+ @config_block.call(client) if @config_block
102
+ end
103
+
104
+ def ssl_cert_store(ssl)
105
+ return ssl[:cert_store] if ssl[:cert_store]
106
+ # Memoize the cert store so that the same one is passed to
107
+ # HTTPClient each time, to avoid resyncing SSL sesions when
108
+ # it's changed
109
+ @cert_store ||= begin
110
+ # Use the default cert store by default, i.e. system ca certs
111
+ cert_store = OpenSSL::X509::Store.new
112
+ cert_store.set_default_paths
113
+ cert_store
114
+ end
115
+ end
116
+
117
+ def ssl_verify_mode(ssl)
118
+ ssl[:verify_mode] || begin
119
+ if ssl.fetch(:verify, true)
120
+ OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
121
+ else
122
+ OpenSSL::SSL::VERIFY_NONE
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,152 @@
1
+ begin
2
+ require 'net/https'
3
+ rescue LoadError
4
+ warn "Warning: no such file to load -- net/https. Make sure openssl is installed if you want ssl support"
5
+ require 'net/http'
6
+ end
7
+ require 'zlib'
8
+
9
+ module SLFaraday
10
+ class Adapter
11
+ class NetHttp < SLFaraday::Adapter
12
+ NET_HTTP_EXCEPTIONS = [
13
+ IOError,
14
+ Errno::ECONNABORTED,
15
+ Errno::ECONNREFUSED,
16
+ Errno::ECONNRESET,
17
+ Errno::EHOSTUNREACH,
18
+ Errno::EINVAL,
19
+ Errno::ENETUNREACH,
20
+ Errno::EPIPE,
21
+ Net::HTTPBadResponse,
22
+ Net::HTTPHeaderSyntaxError,
23
+ Net::ProtocolError,
24
+ SocketError,
25
+ Zlib::GzipFile::Error,
26
+ ]
27
+
28
+ NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
29
+ NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout)
30
+
31
+ def initialize(app = nil, opts = {}, &block)
32
+ @cert_store = nil
33
+ super(app, opts, &block)
34
+ end
35
+
36
+ def call(env)
37
+ super
38
+ with_net_http_connection(env) do |http|
39
+ configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
40
+ configure_request(http, env[:request])
41
+
42
+ begin
43
+ http_response = perform_request(http, env)
44
+ rescue *NET_HTTP_EXCEPTIONS => err
45
+ if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
46
+ raise SLFaraday::SSLError, err
47
+ else
48
+ raise Error::ConnectionFailed, err
49
+ end
50
+ end
51
+
52
+ save_response(env, http_response.code.to_i, http_response.body || '', nil, http_response.message) do |response_headers|
53
+ http_response.each_header do |key, value|
54
+ response_headers[key] = value
55
+ end
56
+ end
57
+ end
58
+
59
+ @app.call env
60
+ rescue Timeout::Error, Errno::ETIMEDOUT => err
61
+ raise SLFaraday::Error::TimeoutError, err
62
+ end
63
+
64
+ private
65
+
66
+ def create_request(env)
67
+ request = Net::HTTPGenericRequest.new \
68
+ env[:method].to_s.upcase, # request method
69
+ !!env[:body], # is there request body
70
+ :head != env[:method], # is there response body
71
+ env[:url].request_uri, # request uri path
72
+ env[:request_headers] # request headers
73
+
74
+ if env[:body].respond_to?(:read)
75
+ request.body_stream = env[:body]
76
+ else
77
+ request.body = env[:body]
78
+ end
79
+ request
80
+ end
81
+
82
+ def perform_request(http, env)
83
+ if :get == env[:method] and !env[:body]
84
+ # prefer `get` to `request` because the former handles gzip (ruby 1.9)
85
+ http.get env[:url].request_uri, env[:request_headers]
86
+ else
87
+ http.request create_request(env)
88
+ end
89
+ end
90
+
91
+ def with_net_http_connection(env)
92
+ yield net_http_connection(env)
93
+ end
94
+
95
+ def net_http_connection(env)
96
+ if proxy = env[:request][:proxy]
97
+ Net::HTTP::Proxy(proxy[:uri].hostname, proxy[:uri].port, proxy[:user], proxy[:password])
98
+ else
99
+ Net::HTTP
100
+ end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == 'https' ? 443 : 80))
101
+ end
102
+
103
+ def configure_ssl(http, ssl)
104
+ http.use_ssl = true
105
+ http.verify_mode = ssl_verify_mode(ssl)
106
+ http.cert_store = ssl_cert_store(ssl)
107
+
108
+ http.cert = ssl[:client_cert] if ssl[:client_cert]
109
+ http.key = ssl[:client_key] if ssl[:client_key]
110
+ http.ca_file = ssl[:ca_file] if ssl[:ca_file]
111
+ http.ca_path = ssl[:ca_path] if ssl[:ca_path]
112
+ http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
113
+ http.ssl_version = ssl[:version] if ssl[:version]
114
+ http.min_version = ssl[:min_version] if ssl[:min_version]
115
+ http.max_version = ssl[:max_version] if ssl[:max_version]
116
+ end
117
+
118
+ def configure_request(http, req)
119
+ if req[:timeout]
120
+ http.read_timeout = req[:timeout]
121
+ http.open_timeout = req[:timeout]
122
+ http.write_timeout = req[:timeout] if http.respond_to?(:write_timeout=)
123
+ end
124
+ http.open_timeout = req[:open_timeout] if req[:open_timeout]
125
+ http.write_timeout = req[:write_timeout] if req[:write_timeout] && http.respond_to?(:write_timeout=)
126
+ # Only set if Net::Http supports it, since Ruby 2.5.
127
+ http.max_retries = 0 if http.respond_to?(:max_retries=)
128
+
129
+ @config_block.call(http) if @config_block
130
+ end
131
+
132
+ def ssl_cert_store(ssl)
133
+ return ssl[:cert_store] if ssl[:cert_store]
134
+ return @cert_store if @cert_store
135
+ # Use the default cert store by default, i.e. system ca certs
136
+ @cert_store = OpenSSL::X509::Store.new
137
+ @cert_store.set_default_paths
138
+ @cert_store
139
+ end
140
+
141
+ def ssl_verify_mode(ssl)
142
+ ssl[:verify_mode] || begin
143
+ if ssl.fetch(:verify, true)
144
+ OpenSSL::SSL::VERIFY_PEER
145
+ else
146
+ OpenSSL::SSL::VERIFY_NONE
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end