excon 0.62.0 → 0.79.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.md +1 -1
  3. data/README.md +5 -4
  4. data/data/cacert.pem +769 -1496
  5. data/excon.gemspec +17 -2
  6. data/lib/excon.rb +25 -17
  7. data/lib/excon/connection.rb +193 -119
  8. data/lib/excon/constants.rb +36 -13
  9. data/lib/excon/error.rb +15 -0
  10. data/lib/excon/headers.rb +4 -3
  11. data/lib/excon/instrumentors/logging_instrumentor.rb +4 -15
  12. data/lib/excon/instrumentors/standard_instrumentor.rb +2 -9
  13. data/lib/excon/middlewares/base.rb +6 -0
  14. data/lib/excon/middlewares/capture_cookies.rb +1 -1
  15. data/lib/excon/middlewares/decompress.rb +2 -2
  16. data/lib/excon/middlewares/expects.rb +7 -1
  17. data/lib/excon/middlewares/idempotent.rb +20 -3
  18. data/lib/excon/middlewares/instrumentor.rb +8 -0
  19. data/lib/excon/middlewares/mock.rb +12 -3
  20. data/lib/excon/middlewares/redirect_follower.rb +25 -3
  21. data/lib/excon/middlewares/response_parser.rb +3 -0
  22. data/lib/excon/pretty_printer.rb +1 -8
  23. data/lib/excon/response.rb +12 -9
  24. data/lib/excon/socket.rb +38 -21
  25. data/lib/excon/ssl_socket.rb +24 -13
  26. data/lib/excon/test/plugin/server/exec.rb +2 -2
  27. data/lib/excon/test/server.rb +1 -1
  28. data/lib/excon/unix_socket.rb +1 -0
  29. data/lib/excon/utils.rb +41 -5
  30. data/lib/excon/version.rb +1 -1
  31. metadata +27 -98
  32. data/.document +0 -5
  33. data/.gitignore +0 -13
  34. data/.rspec +0 -3
  35. data/.travis.yml +0 -29
  36. data/Gemfile +0 -19
  37. data/Rakefile +0 -41
  38. data/benchmarks/class_vs_lambda.rb +0 -50
  39. data/benchmarks/concat_vs_insert.rb +0 -21
  40. data/benchmarks/concat_vs_interpolate.rb +0 -22
  41. data/benchmarks/cr_lf.rb +0 -21
  42. data/benchmarks/downcase-eq-eq_vs_casecmp.rb +0 -169
  43. data/benchmarks/excon.rb +0 -69
  44. data/benchmarks/excon_vs.rb +0 -165
  45. data/benchmarks/for_vs_array_each.rb +0 -27
  46. data/benchmarks/for_vs_hash_each.rb +0 -27
  47. data/benchmarks/has_key-vs-lookup.rb +0 -177
  48. data/benchmarks/headers_case_sensitivity.rb +0 -83
  49. data/benchmarks/headers_split_vs_match.rb +0 -34
  50. data/benchmarks/implicit_block-vs-explicit_block.rb +0 -98
  51. data/benchmarks/merging.rb +0 -21
  52. data/benchmarks/single_vs_double_quotes.rb +0 -21
  53. data/benchmarks/string_ranged_index.rb +0 -87
  54. data/benchmarks/strip_newline.rb +0 -115
  55. data/benchmarks/vs_stdlib.rb +0 -82
  56. data/changelog.txt +0 -1083
  57. data/spec/excon/error_spec.rb +0 -139
  58. data/spec/excon/test/server_spec.rb +0 -28
  59. data/spec/excon_spec.rb +0 -7
  60. data/spec/helpers/file_path_helpers.rb +0 -22
  61. data/spec/requests/basic_spec.rb +0 -40
  62. data/spec/requests/eof_requests_spec.rb +0 -36
  63. data/spec/requests/unix_socket_spec.rb +0 -46
  64. data/spec/spec_helper.rb +0 -24
  65. data/spec/support/shared_contexts/test_server_context.rb +0 -83
  66. data/spec/support/shared_examples/shared_example_for_clients.rb +0 -218
  67. data/spec/support/shared_examples/shared_example_for_streaming_clients.rb +0 -20
  68. data/spec/support/shared_examples/shared_example_for_test_servers.rb +0 -16
  69. data/tests/authorization_header_tests.rb +0 -29
  70. data/tests/bad_tests.rb +0 -47
  71. data/tests/basic_tests.rb +0 -351
  72. data/tests/batch_requests.rb +0 -133
  73. data/tests/complete_responses.rb +0 -31
  74. data/tests/data/127.0.0.1.cert.crt +0 -20
  75. data/tests/data/127.0.0.1.cert.key +0 -27
  76. data/tests/data/excon.cert.crt +0 -20
  77. data/tests/data/excon.cert.key +0 -27
  78. data/tests/data/xs +0 -1
  79. data/tests/error_tests.rb +0 -145
  80. data/tests/header_tests.rb +0 -119
  81. data/tests/middlewares/canned_response_tests.rb +0 -34
  82. data/tests/middlewares/capture_cookies_tests.rb +0 -34
  83. data/tests/middlewares/decompress_tests.rb +0 -157
  84. data/tests/middlewares/escape_path_tests.rb +0 -36
  85. data/tests/middlewares/idempotent_tests.rb +0 -206
  86. data/tests/middlewares/instrumentation_tests.rb +0 -315
  87. data/tests/middlewares/mock_tests.rb +0 -304
  88. data/tests/middlewares/redirect_follower_tests.rb +0 -112
  89. data/tests/pipeline_tests.rb +0 -40
  90. data/tests/proxy_tests.rb +0 -306
  91. data/tests/query_string_tests.rb +0 -87
  92. data/tests/rackups/basic.rb +0 -41
  93. data/tests/rackups/basic.ru +0 -3
  94. data/tests/rackups/basic_auth.ru +0 -14
  95. data/tests/rackups/deflater.ru +0 -4
  96. data/tests/rackups/proxy.ru +0 -18
  97. data/tests/rackups/query_string.ru +0 -13
  98. data/tests/rackups/redirecting.ru +0 -23
  99. data/tests/rackups/redirecting_with_cookie.ru +0 -40
  100. data/tests/rackups/request_headers.ru +0 -15
  101. data/tests/rackups/request_methods.ru +0 -21
  102. data/tests/rackups/response_header.ru +0 -18
  103. data/tests/rackups/ssl.ru +0 -16
  104. data/tests/rackups/ssl_mismatched_cn.ru +0 -15
  105. data/tests/rackups/ssl_verify_peer.ru +0 -16
  106. data/tests/rackups/streaming.ru +0 -30
  107. data/tests/rackups/thread_safety.ru +0 -17
  108. data/tests/rackups/timeout.ru +0 -14
  109. data/tests/rackups/webrick_patch.rb +0 -34
  110. data/tests/request_headers_tests.rb +0 -21
  111. data/tests/request_method_tests.rb +0 -47
  112. data/tests/request_tests.rb +0 -59
  113. data/tests/response_tests.rb +0 -197
  114. data/tests/servers/bad.rb +0 -20
  115. data/tests/servers/eof.rb +0 -17
  116. data/tests/servers/error.rb +0 -20
  117. data/tests/servers/good.rb +0 -350
  118. data/tests/test_helper.rb +0 -306
  119. data/tests/thread_safety_tests.rb +0 -39
  120. data/tests/timeout_tests.rb +0 -12
  121. data/tests/utils_tests.rb +0 -81
@@ -6,6 +6,9 @@ module Excon
6
6
  unless datum.has_key?(:response)
7
7
  datum = Excon::Response.parse(datum[:connection].send(:socket), datum)
8
8
  end
9
+ if datum.has_key?(:logger)
10
+ datum[:response][:logger] = datum[:logger]
11
+ end
9
12
  @stack.response_call(datum)
10
13
  end
11
14
  end
@@ -9,14 +9,7 @@ module Excon
9
9
  datum.delete(:connection)
10
10
  datum.delete(:stack)
11
11
 
12
- if datum.has_key?(:headers) && datum[:headers].has_key?('Authorization')
13
- datum[:headers] = datum[:headers].dup
14
- datum[:headers]['Authorization'] = REDACTED
15
- end
16
-
17
- if datum.has_key?(:password)
18
- datum[:password] = REDACTED
19
- end
12
+ datum = Utils.redact(datum)
20
13
  end
21
14
 
22
15
  indent += 2
@@ -59,10 +59,13 @@ module Excon
59
59
 
60
60
  def self.parse(socket, datum)
61
61
  # this will discard any trailing lines from the previous response if any.
62
- begin
62
+ line = nil
63
+ loop do
63
64
  line = socket.readline
64
- end until status = line[9, 3].to_i
65
+ break if line[9,3].to_i != 0
66
+ end
65
67
 
68
+ status = line[9, 3].to_i
66
69
  reason_phrase = line[13..-3] # -3 strips the trailing "\r\n"
67
70
 
68
71
  datum[:response] = {
@@ -90,7 +93,7 @@ module Excon
90
93
 
91
94
  unless (['HEAD', 'CONNECT'].include?(datum[:method].to_s.upcase)) || NO_ENTITY.include?(datum[:response][:status])
92
95
 
93
- if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Transfer-Encoding') == 0 }
96
+ if (key = datum[:response][:headers].keys.detect {|k| k.casecmp('Transfer-Encoding') == 0 })
94
97
  encodings = Utils.split_header_value(datum[:response][:headers][key])
95
98
  if (encoding = encodings.last) && encoding.casecmp('chunked') == 0
96
99
  transfer_encoding_chunked = true
@@ -103,7 +106,7 @@ module Excon
103
106
  end
104
107
 
105
108
  # use :response_block unless :expects would fail
106
- if response_block = datum[:response_block]
109
+ if (response_block = datum[:response_block])
107
110
  if datum[:middlewares].include?(Excon::Middleware::Expects) && datum[:expects] &&
108
111
  !Array(datum[:expects]).include?(datum[:response][:status])
109
112
  response_block = nil
@@ -140,11 +143,11 @@ module Excon
140
143
  end
141
144
  parse_headers(socket, datum) # merge trailers into headers
142
145
  else
143
- if key = datum[:response][:headers].keys.detect {|k| k.casecmp('Content-Length') == 0 }
146
+ if (key = datum[:response][:headers].keys.detect {|k| k.casecmp('Content-Length') == 0 })
144
147
  content_length = datum[:response][:headers][key].to_i
145
148
  end
146
149
 
147
- if remaining = content_length
150
+ if (remaining = content_length)
148
151
  if response_block
149
152
  while remaining > 0
150
153
  chunk = socket.read([datum[:chunk_size], remaining].min) || raise(EOFError)
@@ -160,11 +163,11 @@ module Excon
160
163
  end
161
164
  else
162
165
  if response_block
163
- while chunk = socket.read(datum[:chunk_size])
166
+ while (chunk = socket.read(datum[:chunk_size]))
164
167
  response_block.call(chunk, nil, nil)
165
168
  end
166
169
  else
167
- while chunk = socket.read(datum[:chunk_size])
170
+ while (chunk = socket.read(datum[:chunk_size]))
168
171
  datum[:response][:body] << chunk
169
172
  end
170
173
  end
@@ -222,7 +225,7 @@ module Excon
222
225
  end
223
226
 
224
227
  # Retrieve a specific header value. Header names are treated case-insensitively.
225
- # @param [String] name Header name
228
+ # @param [String] name Header name
226
229
  def get_header(name)
227
230
  headers[name]
228
231
  end
data/lib/excon/socket.rb CHANGED
@@ -7,6 +7,23 @@ module Excon
7
7
 
8
8
  attr_accessor :data
9
9
 
10
+ # read/write drawn from https://github.com/ruby-amqp/bunny/commit/75d9dd79551b31a5dd3d1254c537bad471f108cf
11
+ CONNECT_RETRY_EXCEPTION_CLASSES = if defined?(IO::EINPROGRESSWaitWritable) # Ruby >= 2.1
12
+ [Errno::EINPROGRESS, IO::EINPROGRESSWaitWritable]
13
+ else # Ruby <= 2.0
14
+ [Errno::EINPROGRESS]
15
+ end
16
+ READ_RETRY_EXCEPTION_CLASSES = if defined?(IO::EAGAINWaitReadable) # Ruby >= 2.1
17
+ [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable, IO::EAGAINWaitReadable, IO::EWOULDBLOCKWaitReadable]
18
+ else # Ruby <= 2.0
19
+ [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable]
20
+ end
21
+ WRITE_RETRY_EXCEPTION_CLASSES = if defined?(IO::EAGAINWaitWritable) # Ruby >= 2.1
22
+ [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable, IO::EAGAINWaitWritable, IO::EWOULDBLOCKWaitWritable]
23
+ else # Ruby <= 2.0
24
+ [Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable]
25
+ end
26
+
10
27
  def params
11
28
  Excon.display_warning('Excon::Socket#params is deprecated use Excon::Socket#data instead.')
12
29
  @data
@@ -43,18 +60,8 @@ module Excon
43
60
  def readline
44
61
  return legacy_readline if RUBY_VERSION.to_f <= 1.8_7
45
62
  buffer = String.new
46
- begin
47
- buffer << @socket.read_nonblock(1) while buffer[-1] != "\n"
48
- buffer
49
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
50
- select_with_timeout(@socket, :read) && retry
51
- rescue OpenSSL::SSL::SSLError => error
52
- if error.message == 'read would block'
53
- select_with_timeout(@socket, :read) && retry
54
- else
55
- raise(error)
56
- end
57
- end
63
+ buffer << read_nonblock(1) while buffer[-1] != "\n"
64
+ buffer
58
65
  end
59
66
 
60
67
  def legacy_readline
@@ -106,8 +113,9 @@ module Excon
106
113
  if @socket
107
114
  break
108
115
  end
109
-
116
+
110
117
  @remote_ip = ip
118
+ @data[:remote_ip] = ip
111
119
 
112
120
  # nonblocking connect
113
121
  begin
@@ -128,7 +136,7 @@ module Excon
128
136
  socket.connect(sockaddr)
129
137
  end
130
138
  @socket = socket
131
- rescue Errno::EINPROGRESS
139
+ rescue *CONNECT_RETRY_EXCEPTION_CLASSES
132
140
  select_with_timeout(socket, :connect_write)
133
141
  begin
134
142
  socket.connect_nonblock(sockaddr)
@@ -151,6 +159,17 @@ module Excon
151
159
  ::Socket::TCP_NODELAY,
152
160
  true)
153
161
  end
162
+
163
+ if @data[:keepalive]
164
+ if [:SOL_SOCKET, :SO_KEEPALIVE, :SOL_TCP, :TCP_KEEPIDLE, :TCP_KEEPINTVL, :TCP_KEEPCNT].all?{|c| ::Socket.const_defined? c}
165
+ @socket.setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_KEEPALIVE, true)
166
+ @socket.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPIDLE, @data[:keepalive][:time])
167
+ @socket.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPINTVL, @data[:keepalive][:intvl])
168
+ @socket.setsockopt(::Socket::SOL_TCP, ::Socket::TCP_KEEPCNT, @data[:keepalive][:probes])
169
+ else
170
+ Excon.display_warning('Excon::Socket keepalive was set, but is not supported by Ruby version.')
171
+ end
172
+ end
154
173
  end
155
174
 
156
175
  def read_nonblock(max_length)
@@ -170,7 +189,7 @@ module Excon
170
189
  else
171
190
  raise(error)
172
191
  end
173
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
192
+ rescue *READ_RETRY_EXCEPTION_CLASSES
174
193
  if @read_buffer.empty?
175
194
  # if we didn't read anything, try again...
176
195
  select_with_timeout(@socket, :read) && retry
@@ -199,7 +218,7 @@ module Excon
199
218
  else
200
219
  raise(error)
201
220
  end
202
- rescue Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitReadable
221
+ rescue *READ_RETRY_EXCEPTION_CLASSES
203
222
  if @read_buffer.empty?
204
223
  select_with_timeout(@socket, :read) && retry
205
224
  end
@@ -208,9 +227,7 @@ module Excon
208
227
  end
209
228
 
210
229
  def write_nonblock(data)
211
- if FORCE_ENC
212
- data.force_encoding('BINARY')
213
- end
230
+ data = binary_encode(data)
214
231
  loop do
215
232
  written = nil
216
233
  begin
@@ -225,7 +242,7 @@ module Excon
225
242
  else
226
243
  raise error
227
244
  end
228
- rescue OpenSSL::SSL::SSLError, Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable => error
245
+ rescue OpenSSL::SSL::SSLError, *WRITE_RETRY_EXCEPTION_CLASSES => error
229
246
  if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
230
247
  raise error
231
248
  else
@@ -246,7 +263,7 @@ module Excon
246
263
 
247
264
  def write_block(data)
248
265
  @socket.write(data)
249
- rescue OpenSSL::SSL::SSLError, Errno::EAGAIN, Errno::EWOULDBLOCK, IO::WaitWritable => error
266
+ rescue OpenSSL::SSL::SSLError, *WRITE_RETRY_EXCEPTION_CLASSES => error
250
267
  if error.is_a?(OpenSSL::SSL::SSLError) && error.message != 'write would block'
251
268
  raise error
252
269
  else
@@ -27,18 +27,25 @@ module Excon
27
27
  if @data[:ssl_version]
28
28
  ssl_context.ssl_version = @data[:ssl_version]
29
29
  end
30
+ if @data[:ssl_min_version]
31
+ ssl_context.min_version = @data[:ssl_min_version]
32
+ end
33
+ if @data[:ssl_max_version]
34
+ ssl_context.max_version = @data[:ssl_max_version]
35
+ end
36
+
30
37
 
31
38
  if @data[:ssl_verify_peer]
32
39
  # turn verification on
33
40
  ssl_context.verify_mode = OpenSSL::SSL::VERIFY_PEER
34
41
 
35
- if ca_file = @data[:ssl_ca_file] || ENV['SSL_CERT_FILE']
42
+ if (ca_file = @data[:ssl_ca_file] || ENV['SSL_CERT_FILE'])
36
43
  ssl_context.ca_file = ca_file
37
44
  end
38
- if ca_path = @data[:ssl_ca_path] || ENV['SSL_CERT_DIR']
45
+ if (ca_path = @data[:ssl_ca_path] || ENV['SSL_CERT_DIR'])
39
46
  ssl_context.ca_path = ca_path
40
47
  end
41
- if cert_store = @data[:ssl_cert_store]
48
+ if (cert_store = @data[:ssl_cert_store])
42
49
  ssl_context.cert_store = cert_store
43
50
  end
44
51
 
@@ -58,7 +65,7 @@ module Excon
58
65
  end
59
66
  end
60
67
 
61
- if verify_callback = @data[:ssl_verify_callback]
68
+ if (verify_callback = @data[:ssl_verify_callback])
62
69
  ssl_context.verify_callback = verify_callback
63
70
  end
64
71
  else
@@ -66,6 +73,9 @@ module Excon
66
73
  ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
67
74
  end
68
75
 
76
+ # Verify certificate hostname if supported (ruby >= 2.4.0)
77
+ ssl_context.verify_hostname = @data[:ssl_verify_hostname] if ssl_context.respond_to?(:verify_hostname=)
78
+
69
79
  if client_cert_data && client_key_data
70
80
  ssl_context.cert = OpenSSL::X509::Certificate.new client_cert_data
71
81
  if OpenSSL::PKey.respond_to? :read
@@ -100,7 +110,10 @@ module Excon
100
110
  @socket.write(request)
101
111
 
102
112
  # eat the proxy's connection response
103
- Excon::Response.parse(self, :expects => 200, :method => 'CONNECT')
113
+ response = Excon::Response.parse(self, :expects => 200, :method => 'CONNECT')
114
+ if response[:response][:status] != 200
115
+ raise(Excon::Errors::ProxyConnectionError.new("proxy connection could not be established", request, response))
116
+ end
104
117
  end
105
118
 
106
119
  # convert Socket to OpenSSL::SSL::SSLSocket
@@ -132,18 +145,16 @@ module Excon
132
145
  if @data[:ssl_verify_peer]
133
146
  @socket.post_connection_check(@data[:ssl_verify_peer_host] || @data[:host])
134
147
  end
135
-
136
- @socket
137
148
  end
138
149
 
139
150
  private
140
151
 
141
152
  def client_cert_data
142
- @client_cert_data ||= if ccd = @data[:client_cert_data]
153
+ @client_cert_data ||= if (ccd = @data[:client_cert_data])
143
154
  ccd
144
- elsif path = @data[:client_cert]
155
+ elsif (path = @data[:client_cert])
145
156
  File.read path
146
- elsif path = @data[:certificate_path]
157
+ elsif (path = @data[:certificate_path])
147
158
  warn ":certificate_path is no longer supported and will be deprecated. Please use :client_cert or :client_cert_data"
148
159
  File.read path
149
160
  end
@@ -156,11 +167,11 @@ module Excon
156
167
  end
157
168
 
158
169
  def client_key_data
159
- @client_key_data ||= if ckd = @data[:client_key_data]
170
+ @client_key_data ||= if (ckd = @data[:client_key_data])
160
171
  ckd
161
- elsif path = @data[:client_key]
172
+ elsif (path = @data[:client_key])
162
173
  File.read path
163
- elsif path = @data[:private_key_path]
174
+ elsif (path = @data[:private_key_path])
164
175
  warn ":private_key_path is no longer supported and will be deprecated. Please use :client_key or :client_key_data"
165
176
  File.read path
166
177
  end
@@ -5,12 +5,12 @@ module Excon
5
5
  module Exec
6
6
  def start(app_str = app)
7
7
  line = ''
8
- open_process(app)
8
+ open_process(app_str)
9
9
  until line =~ /\Aready\Z/
10
10
  line = error.gets
11
11
  fatal_time = elapsed_time > timeout
12
12
  if fatal_time
13
- msg = "executable #{app} has taken too long to start"
13
+ msg = "executable #{app_str} has taken too long to start"
14
14
  raise msg
15
15
  end
16
16
  end
@@ -72,7 +72,7 @@ module Excon
72
72
  end
73
73
  def dump_errors
74
74
  lines = error.read.split($/)
75
- while line = lines.shift
75
+ while (line = lines.shift)
76
76
  case line
77
77
  when /(ERROR|Error)/
78
78
  unless line =~ /(null cert chain|did not return a certificate|SSL_read:: internal error)/
@@ -20,6 +20,7 @@ module Excon
20
20
  begin
21
21
  @socket.connect_nonblock(sockaddr)
22
22
  rescue Errno::EISCONN
23
+ 0 # same return as connect_nonblock success
23
24
  end
24
25
  end
25
26
  else
data/lib/excon/utils.rb CHANGED
@@ -10,6 +10,18 @@ module Excon
10
10
  UNESCAPED = /([#{ Regexp.escape(CONTROL + ' ' + DELIMS + UNWISE + NONASCII) }])/
11
11
  ESCAPED = /%([0-9a-fA-F]{2})/
12
12
 
13
+ def binary_encode(string)
14
+ if FORCE_ENC && string.encoding != Encoding::ASCII_8BIT
15
+ if string.frozen?
16
+ string.dup.force_encoding('BINARY')
17
+ else
18
+ string.force_encoding('BINARY')
19
+ end
20
+ else
21
+ string
22
+ end
23
+ end
24
+
13
25
  def connection_uri(datum = @data)
14
26
  unless datum
15
27
  raise ArgumentError, '`datum` must be given unless called on a Connection'
@@ -21,6 +33,30 @@ module Excon
21
33
  end
22
34
  end
23
35
 
36
+ # Redact sensitive info from provided data
37
+ def redact(datum)
38
+ datum = datum.dup
39
+ if datum.has_key?(:headers)
40
+ if datum[:headers].has_key?('Authorization') || datum[:headers].has_key?('Proxy-Authorization')
41
+ datum[:headers] = datum[:headers].dup
42
+ end
43
+ if datum[:headers].has_key?('Authorization')
44
+ datum[:headers]['Authorization'] = REDACTED
45
+ end
46
+ if datum[:headers].has_key?('Proxy-Authorization')
47
+ datum[:headers]['Proxy-Authorization'] = REDACTED
48
+ end
49
+ end
50
+ if datum.has_key?(:password)
51
+ datum[:password] = REDACTED
52
+ end
53
+ if datum.has_key?(:proxy) && datum[:proxy].has_key?(:password)
54
+ datum[:proxy] = datum[:proxy].dup
55
+ datum[:proxy][:password] = REDACTED
56
+ end
57
+ datum
58
+ end
59
+
24
60
  def request_uri(datum)
25
61
  connection_uri(datum) + datum[:path] + query_string(datum)
26
62
  end
@@ -59,29 +95,29 @@ module Excon
59
95
  def split_header_value(str)
60
96
  return [] if str.nil?
61
97
  str = str.dup.strip
62
- str.force_encoding('BINARY') if FORCE_ENC
63
- str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+)
98
+ str = binary_encode(str)
99
+ str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",])+)
64
100
  (?:,\s*|\Z)'xn).flatten
65
101
  end
66
102
 
67
103
  # Escapes HTTP reserved and unwise characters in +str+
68
104
  def escape_uri(str)
69
105
  str = str.dup
70
- str.force_encoding('BINARY') if FORCE_ENC
106
+ str = binary_encode(str)
71
107
  str.gsub(UNESCAPED) { "%%%02X" % $1[0].ord }
72
108
  end
73
109
 
74
110
  # Unescapes HTTP reserved and unwise characters in +str+
75
111
  def unescape_uri(str)
76
112
  str = str.dup
77
- str.force_encoding('BINARY') if FORCE_ENC
113
+ str = binary_encode(str)
78
114
  str.gsub(ESCAPED) { $1.hex.chr }
79
115
  end
80
116
 
81
117
  # Unescape form encoded values in +str+
82
118
  def unescape_form(str)
83
119
  str = str.dup
84
- str.force_encoding('BINARY') if FORCE_ENC
120
+ str = binary_encode(str)
85
121
  str.gsub!(/\+/, ' ')
86
122
  str.gsub(ESCAPED) { $1.hex.chr }
87
123
  end
data/lib/excon/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Excon
3
- VERSION = '0.62.0'
3
+ VERSION = '0.79.0'
4
4
  end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.62.0
4
+ version: 0.79.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dpiddy (Dan Peterson)
8
8
  - geemus (Wesley Beary)
9
9
  - nextmat (Matt Sanders)
10
- autorequire:
10
+ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2018-03-27 00:00:00.000000000 Z
13
+ date: 2021-02-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec
@@ -180,6 +180,20 @@ dependencies:
180
180
  - - ">="
181
181
  - !ruby/object:Gem::Version
182
182
  version: '0'
183
+ - !ruby/object:Gem::Dependency
184
+ name: webrick
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ">="
188
+ - !ruby/object:Gem::Version
189
+ version: '0'
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ">="
195
+ - !ruby/object:Gem::Version
196
+ version: '0'
183
197
  description: EXtended http(s) CONnections
184
198
  email: geemus@gmail.com
185
199
  executables: []
@@ -189,35 +203,10 @@ extra_rdoc_files:
189
203
  - CONTRIBUTORS.md
190
204
  - CONTRIBUTING.md
191
205
  files:
192
- - ".document"
193
- - ".gitignore"
194
- - ".rspec"
195
- - ".travis.yml"
196
206
  - CONTRIBUTING.md
197
207
  - CONTRIBUTORS.md
198
- - Gemfile
199
208
  - LICENSE.md
200
209
  - README.md
201
- - Rakefile
202
- - benchmarks/class_vs_lambda.rb
203
- - benchmarks/concat_vs_insert.rb
204
- - benchmarks/concat_vs_interpolate.rb
205
- - benchmarks/cr_lf.rb
206
- - benchmarks/downcase-eq-eq_vs_casecmp.rb
207
- - benchmarks/excon.rb
208
- - benchmarks/excon_vs.rb
209
- - benchmarks/for_vs_array_each.rb
210
- - benchmarks/for_vs_hash_each.rb
211
- - benchmarks/has_key-vs-lookup.rb
212
- - benchmarks/headers_case_sensitivity.rb
213
- - benchmarks/headers_split_vs_match.rb
214
- - benchmarks/implicit_block-vs-explicit_block.rb
215
- - benchmarks/merging.rb
216
- - benchmarks/single_vs_double_quotes.rb
217
- - benchmarks/string_ranged_index.rb
218
- - benchmarks/strip_newline.rb
219
- - benchmarks/vs_stdlib.rb
220
- - changelog.txt
221
210
  - data/cacert.pem
222
211
  - excon.gemspec
223
212
  - lib/excon.rb
@@ -250,76 +239,17 @@ files:
250
239
  - lib/excon/unix_socket.rb
251
240
  - lib/excon/utils.rb
252
241
  - lib/excon/version.rb
253
- - spec/excon/error_spec.rb
254
- - spec/excon/test/server_spec.rb
255
- - spec/excon_spec.rb
256
- - spec/helpers/file_path_helpers.rb
257
- - spec/requests/basic_spec.rb
258
- - spec/requests/eof_requests_spec.rb
259
- - spec/requests/unix_socket_spec.rb
260
- - spec/spec_helper.rb
261
- - spec/support/shared_contexts/test_server_context.rb
262
- - spec/support/shared_examples/shared_example_for_clients.rb
263
- - spec/support/shared_examples/shared_example_for_streaming_clients.rb
264
- - spec/support/shared_examples/shared_example_for_test_servers.rb
265
- - tests/authorization_header_tests.rb
266
- - tests/bad_tests.rb
267
- - tests/basic_tests.rb
268
- - tests/batch_requests.rb
269
- - tests/complete_responses.rb
270
- - tests/data/127.0.0.1.cert.crt
271
- - tests/data/127.0.0.1.cert.key
272
- - tests/data/excon.cert.crt
273
- - tests/data/excon.cert.key
274
- - tests/data/xs
275
- - tests/error_tests.rb
276
- - tests/header_tests.rb
277
- - tests/middlewares/canned_response_tests.rb
278
- - tests/middlewares/capture_cookies_tests.rb
279
- - tests/middlewares/decompress_tests.rb
280
- - tests/middlewares/escape_path_tests.rb
281
- - tests/middlewares/idempotent_tests.rb
282
- - tests/middlewares/instrumentation_tests.rb
283
- - tests/middlewares/mock_tests.rb
284
- - tests/middlewares/redirect_follower_tests.rb
285
- - tests/pipeline_tests.rb
286
- - tests/proxy_tests.rb
287
- - tests/query_string_tests.rb
288
- - tests/rackups/basic.rb
289
- - tests/rackups/basic.ru
290
- - tests/rackups/basic_auth.ru
291
- - tests/rackups/deflater.ru
292
- - tests/rackups/proxy.ru
293
- - tests/rackups/query_string.ru
294
- - tests/rackups/redirecting.ru
295
- - tests/rackups/redirecting_with_cookie.ru
296
- - tests/rackups/request_headers.ru
297
- - tests/rackups/request_methods.ru
298
- - tests/rackups/response_header.ru
299
- - tests/rackups/ssl.ru
300
- - tests/rackups/ssl_mismatched_cn.ru
301
- - tests/rackups/ssl_verify_peer.ru
302
- - tests/rackups/streaming.ru
303
- - tests/rackups/thread_safety.ru
304
- - tests/rackups/timeout.ru
305
- - tests/rackups/webrick_patch.rb
306
- - tests/request_headers_tests.rb
307
- - tests/request_method_tests.rb
308
- - tests/request_tests.rb
309
- - tests/response_tests.rb
310
- - tests/servers/bad.rb
311
- - tests/servers/eof.rb
312
- - tests/servers/error.rb
313
- - tests/servers/good.rb
314
- - tests/test_helper.rb
315
- - tests/thread_safety_tests.rb
316
- - tests/timeout_tests.rb
317
- - tests/utils_tests.rb
318
242
  homepage: https://github.com/excon/excon
319
243
  licenses:
320
244
  - MIT
321
- metadata: {}
322
- post_install_message:
245
+ metadata:
246
+ homepage_uri: https://github.com/excon/excon
247
+ bug_tracker_uri: https://github.com/excon/excon/issues
248
+ changelog_uri: https://github.com/excon/excon/blob/master/changelog.txt
249
+ documentation_uri: https://github.com/excon/excon/blob/master/README.md
250
+ source_code_uri: https://github.com/excon/excon
251
+ wiki_uri: https://github.com/excon/excon/wiki
252
+ post_install_message:
323
253
  rdoc_options:
324
254
  - "--charset=UTF-8"
325
255
  require_paths:
@@ -335,9 +265,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
335
265
  - !ruby/object:Gem::Version
336
266
  version: '0'
337
267
  requirements: []
338
- rubyforge_project:
339
- rubygems_version: 2.6.13
340
- signing_key:
268
+ rubygems_version: 3.1.2
269
+ signing_key:
341
270
  specification_version: 4
342
271
  summary: speed, persistence, http(s)
343
272
  test_files: []