excon 0.61.0 → 0.63.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of excon might be problematic. Click here for more details.

Files changed (54) hide show
  1. checksums.yaml +5 -5
  2. data/.github/stale.yml +17 -0
  3. data/.travis.yml +7 -19
  4. data/LICENSE.md +1 -1
  5. data/README.md +5 -4
  6. data/changelog.txt +30 -0
  7. data/data/cacert.pem +440 -994
  8. data/excon.gemspec +9 -0
  9. data/lib/excon/connection.rb +53 -36
  10. data/lib/excon/constants.rb +33 -13
  11. data/lib/excon/error.rb +3 -0
  12. data/lib/excon/instrumentors/logging_instrumentor.rb +3 -14
  13. data/lib/excon/instrumentors/standard_instrumentor.rb +1 -8
  14. data/lib/excon/middlewares/base.rb +6 -0
  15. data/lib/excon/middlewares/expects.rb +6 -0
  16. data/lib/excon/middlewares/idempotent.rb +20 -3
  17. data/lib/excon/middlewares/instrumentor.rb +8 -0
  18. data/lib/excon/middlewares/mock.rb +8 -0
  19. data/lib/excon/middlewares/response_parser.rb +3 -0
  20. data/lib/excon/pretty_printer.rb +1 -8
  21. data/lib/excon/socket.rb +36 -10
  22. data/lib/excon/ssl_socket.rb +7 -0
  23. data/lib/excon/utils.rb +23 -4
  24. data/lib/excon/version.rb +1 -1
  25. data/lib/excon.rb +9 -1
  26. data/spec/excon/test/server_spec.rb +2 -2
  27. data/spec/helpers/warning_helpers.rb +9 -0
  28. data/spec/requests/unix_socket_spec.rb +2 -10
  29. data/spec/requests/validation_spec.rb +80 -0
  30. data/spec/spec_helper.rb +2 -0
  31. data/spec/support/shared_contexts/test_stub_context.rb +11 -0
  32. data/spec/support/shared_examples/shared_example_for_clients.rb +13 -2
  33. data/tests/authorization_header_tests.rb +19 -21
  34. data/tests/bad_tests.rb +22 -0
  35. data/tests/batch_requests.rb +1 -1
  36. data/tests/complete_responses.rb +1 -1
  37. data/tests/data/127.0.0.1.cert.crt +15 -18
  38. data/tests/data/127.0.0.1.cert.key +28 -27
  39. data/tests/data/excon.cert.crt +15 -18
  40. data/tests/data/excon.cert.key +28 -27
  41. data/tests/error_tests.rb +1 -1
  42. data/tests/instrumentors/logging_instrumentor_tests.rb +28 -0
  43. data/tests/middlewares/decompress_tests.rb +1 -1
  44. data/tests/middlewares/idempotent_tests.rb +56 -17
  45. data/tests/middlewares/mock_tests.rb +2 -2
  46. data/tests/pipeline_tests.rb +1 -1
  47. data/tests/request_tests.rb +5 -6
  48. data/tests/response_tests.rb +1 -1
  49. data/tests/servers/bad.rb +5 -0
  50. data/tests/servers/good.rb +0 -8
  51. data/tests/servers/good_ipv4.rb +8 -0
  52. data/tests/servers/good_ipv6.rb +8 -0
  53. data/tests/test_helper.rb +27 -36
  54. metadata +17 -5
data/lib/excon/utils.rb CHANGED
@@ -10,6 +10,12 @@ 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
+ string.force_encoding('BINARY')
16
+ end
17
+ end
18
+
13
19
  def connection_uri(datum = @data)
14
20
  unless datum
15
21
  raise ArgumentError, '`datum` must be given unless called on a Connection'
@@ -21,6 +27,19 @@ module Excon
21
27
  end
22
28
  end
23
29
 
30
+ # Redact sensitive info from provided data
31
+ def redact(datum)
32
+ datum = datum.dup
33
+ if datum.has_key?(:headers) && datum[:headers].has_key?('Authorization')
34
+ datum[:headers] = datum[:headers].dup
35
+ datum[:headers]['Authorization'] = REDACTED
36
+ end
37
+ if datum.has_key?(:password)
38
+ datum[:password] = REDACTED
39
+ end
40
+ datum
41
+ end
42
+
24
43
  def request_uri(datum)
25
44
  connection_uri(datum) + datum[:path] + query_string(datum)
26
45
  end
@@ -59,7 +78,7 @@ module Excon
59
78
  def split_header_value(str)
60
79
  return [] if str.nil?
61
80
  str = str.dup.strip
62
- str.force_encoding('BINARY') if FORCE_ENC
81
+ binary_encode(str)
63
82
  str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+)
64
83
  (?:,\s*|\Z)'xn).flatten
65
84
  end
@@ -67,21 +86,21 @@ module Excon
67
86
  # Escapes HTTP reserved and unwise characters in +str+
68
87
  def escape_uri(str)
69
88
  str = str.dup
70
- str.force_encoding('BINARY') if FORCE_ENC
89
+ binary_encode(str)
71
90
  str.gsub(UNESCAPED) { "%%%02X" % $1[0].ord }
72
91
  end
73
92
 
74
93
  # Unescapes HTTP reserved and unwise characters in +str+
75
94
  def unescape_uri(str)
76
95
  str = str.dup
77
- str.force_encoding('BINARY') if FORCE_ENC
96
+ binary_encode(str)
78
97
  str.gsub(ESCAPED) { $1.hex.chr }
79
98
  end
80
99
 
81
100
  # Unescape form encoded values in +str+
82
101
  def unescape_form(str)
83
102
  str = str.dup
84
- str.force_encoding('BINARY') if FORCE_ENC
103
+ binary_encode(str)
85
104
  str.gsub!(/\+/, ' ')
86
105
  str.gsub(ESCAPED) { $1.hex.chr }
87
106
  end
data/lib/excon/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Excon
3
- VERSION = '0.61.0'
3
+ VERSION = '0.63.0'
4
4
  end
data/lib/excon.rb CHANGED
@@ -23,11 +23,11 @@ require 'excon/middlewares/instrumentor'
23
23
  require 'excon/middlewares/mock'
24
24
  require 'excon/middlewares/response_parser'
25
25
 
26
+ require 'excon/error'
26
27
  require 'excon/constants'
27
28
  require 'excon/utils'
28
29
 
29
30
  require 'excon/connection'
30
- require 'excon/error'
31
31
  require 'excon/headers'
32
32
  require 'excon/response'
33
33
  require 'excon/middlewares/decompress'
@@ -61,6 +61,14 @@ module Excon
61
61
  if $VERBOSE || ENV['EXCON_DEBUG']
62
62
  $stderr.puts "[excon][WARNING] #{warning}\n#{ caller.join("\n") }"
63
63
  end
64
+
65
+ if @raise_on_warnings
66
+ raise Error::Warning.new(warning)
67
+ end
68
+ end
69
+
70
+ def set_raise_on_warnings!(should_raise)
71
+ @raise_on_warnings = should_raise
64
72
  end
65
73
 
66
74
  # Status of mocking
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Excon::Test::Server do
4
-
4
+
5
5
  context 'when the web server is webrick' do
6
6
  it_should_behave_like "a excon test server", :webrick, 'basic.ru'
7
7
  end
@@ -23,6 +23,6 @@ describe Excon::Test::Server do
23
23
  end
24
24
 
25
25
  context 'when the web server is a executable' do
26
- it_should_behave_like "a excon test server", :exec, 'good.rb'
26
+ it_should_behave_like "a excon test server", :exec, 'good_ipv4.rb'
27
27
  end
28
28
  end
@@ -0,0 +1,9 @@
1
+ def silence_warnings
2
+ orig_verbose = $VERBOSE
3
+ $VERBOSE = nil
4
+ Excon.set_raise_on_warnings!(false)
5
+ yield
6
+ ensure
7
+ $VERBOSE = orig_verbose
8
+ Excon.set_raise_on_warnings!(true)
9
+ end
@@ -1,25 +1,17 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Excon::Connection do
4
+ include_context('stubs')
4
5
  context "when speaking to a UNIX socket" do
5
6
  context "Host header handling" do
6
7
  before do
7
- responder = ->(req) do
8
+ Excon.stub do |req|
8
9
  {
9
10
  body: req[:headers].to_json,
10
11
  status: 200,
11
12
  }
12
13
  end
13
-
14
- @original_mock = Excon.defaults[:mock]
15
- Excon.defaults[:mock] = true
16
- Excon.stub({}, responder)
17
- end
18
-
19
- after do
20
- Excon.defaults[:mock] = @original_mock
21
14
  end
22
-
23
15
  it "sends an empty Host= by default" do
24
16
  conn = Excon::Connection.new(
25
17
  scheme: "unix",
@@ -0,0 +1,80 @@
1
+ describe Excon::Connection do
2
+ include_context('stubs')
3
+ describe 'validating parameters' do
4
+ class FooMiddleware < Excon::Middleware::Base
5
+ def self.valid_parameter_keys
6
+ [:foo]
7
+ end
8
+ end
9
+
10
+ let(:foo_stack) do
11
+ Excon.defaults[:middlewares] + [FooMiddleware]
12
+ end
13
+
14
+ def expect_parameter_warning(validation, key)
15
+ expect { yield }.to raise_error(Excon::Error::Warning, "Invalid Excon #{validation} keys: #{key.inspect}")
16
+ end
17
+
18
+ context 'with default middleware' do
19
+ it 'Connection.new warns on invalid parameter keys' do
20
+ expect_parameter_warning('connection', :foo) do
21
+ Excon.new('http://foo', :foo => :bar)
22
+ end
23
+ end
24
+
25
+ it 'Connection#request warns on invalid parameter keys' do
26
+ conn = Excon.new('http://foo')
27
+ expect_parameter_warning('request', :foo) do
28
+ conn.request(:foo => :bar)
29
+ end
30
+ end
31
+ end
32
+
33
+ context 'with custom middleware at instantiation' do
34
+ it 'Connection.new accepts parameters that are valid for the provided middleware' do
35
+ Excon.new('http://foo', :foo => :bar, :middlewares => foo_stack)
36
+ end
37
+
38
+ it 'Connection.new warns on parameters that are not valid for the provided middleware' do
39
+ expect_parameter_warning('connection', :bar) do
40
+ Excon.new('http://foo', :bar => :baz, :middlewares => foo_stack)
41
+ end
42
+ end
43
+
44
+ it 'Connection#request accepts parameters that are valid for the provided middleware' do
45
+ Excon.stub({}, {})
46
+ conn = Excon.new('http://foo', :middlewares => foo_stack)
47
+ conn.request(:foo => :bar)
48
+ end
49
+
50
+ it 'Connection#request warns on parameters that are not valid for the provided middleware' do
51
+ conn = Excon.new('http://foo', :middlewares => foo_stack)
52
+ expect_parameter_warning('request', :bar) do
53
+ conn.request(:bar => :baz)
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'with custom middleware at request time' do
59
+ it 'Connection#request accepts parameters that are valid for the provided middleware' do
60
+ Excon.stub({}, {})
61
+ conn = Excon.new('http://foo')
62
+ conn.request(:foo => :bar, :middlewares => foo_stack)
63
+ end
64
+
65
+ it 'Connection#request warns on parameters that are not valid for the request middleware' do
66
+ conn = Excon.new('http://foo')
67
+ expect_parameter_warning('request', :bar) do
68
+ conn.request(:bar => :baz, :middlewares => foo_stack)
69
+ end
70
+ end
71
+
72
+ it 'Connection#request warns on parameters from instantiation that are not valid for the request middleware' do
73
+ conn = Excon.new('http://foo', :foo => :bar, :middlewares => foo_stack)
74
+ expect_parameter_warning('connection', :foo) do
75
+ conn.request(:middlewares => Excon.defaults[:middlewares])
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
data/spec/spec_helper.rb CHANGED
@@ -15,6 +15,8 @@ RSpec.configure do |config|
15
15
  if config.files_to_run.one?
16
16
  config.default_formatter = 'doc'
17
17
  end
18
+
19
+ Excon.set_raise_on_warnings!(true)
18
20
  end
19
21
 
20
22
  # Load helpers
@@ -0,0 +1,11 @@
1
+ shared_context "stubs" do
2
+ before do
3
+ @original_mock = Excon.defaults[:mock]
4
+ Excon.defaults[:mock] = true
5
+ end
6
+
7
+ after do
8
+ Excon.defaults[:mock] = @original_mock
9
+ Excon.stubs.clear
10
+ end
11
+ end
@@ -91,8 +91,10 @@ shared_examples_for 'a basic client' do |url = 'http://127.0.0.1:9292', opts = {
91
91
  data = []
92
92
  it 'yields with a chunk, remaining length, and total length' do
93
93
  expect do
94
- conn.request(method: :get, path: '/content-length/100') do |chunk, remaining_length, total_length|
95
- data = [chunk, remaining_length, total_length]
94
+ silence_warnings do
95
+ conn.request(method: :get, path: '/content-length/100') do |chunk, remaining_length, total_length|
96
+ data = [chunk, remaining_length, total_length]
97
+ end
96
98
  end
97
99
  end.to_not raise_error
98
100
  end
@@ -163,6 +165,15 @@ shared_examples_for 'a basic client' do |url = 'http://127.0.0.1:9292', opts = {
163
165
  end
164
166
 
165
167
  context 'when a string is the body paramter' do
168
+ it 'does not change the enconding of the body' do
169
+ skip unless RUBY_VERSION >= '2.0'
170
+
171
+ string_body = '¥£€'
172
+ expect do
173
+ conn.request(method: :post, path: '/echo', body: string_body)
174
+ end.to_not change { string_body.encoding }
175
+ end
176
+
166
177
  context 'without request_block' do
167
178
  describe Excon::Response do
168
179
  it "#body equals 'x' * 100)" do
@@ -1,29 +1,27 @@
1
1
  Shindo.tests('Excon basics (Authorization data redacted)') do
2
- with_rackup('basic_auth.ru') do
3
- cases = [
4
- ['user & pass', 'http://user1:pass1@foo.com/', 'Basic dXNlcjE6cGFzczE='],
5
- ['email & pass', 'http://foo%40bar.com:pass1@foo.com/', 'Basic Zm9vQGJhci5jb206cGFzczE='],
6
- ['user no pass', 'http://three_user@foo.com/', 'Basic dGhyZWVfdXNlcjo='],
7
- ['pass no user', 'http://:derppass@foo.com/', 'Basic OmRlcnBwYXNz']
8
- ]
9
- cases.each do |desc,url,auth_header|
10
- conn = nil
2
+ cases = [
3
+ ['user & pass', 'http://user1:pass1@foo.com/', 'Basic dXNlcjE6cGFzczE='],
4
+ ['email & pass', 'http://foo%40bar.com:pass1@foo.com/', 'Basic Zm9vQGJhci5jb206cGFzczE='],
5
+ ['user no pass', 'http://three_user@foo.com/', 'Basic dGhyZWVfdXNlcjo='],
6
+ ['pass no user', 'http://:derppass@foo.com/', 'Basic OmRlcnBwYXNz']
7
+ ]
8
+ cases.each do |desc,url,auth_header|
9
+ conn = nil
11
10
 
12
- test("authorization header concealed for #{desc}") do
13
- conn = Excon.new(url)
14
- !conn.inspect.include?(auth_header)
15
- end
16
-
17
- if conn.data[:password]
18
- test("password param concealed for #{desc}") do
19
- !conn.inspect.include?(conn.data[:password])
20
- end
21
- end
11
+ test("authorization header concealed for #{desc}") do
12
+ conn = Excon.new(url)
13
+ !conn.inspect.include?(auth_header)
14
+ end
22
15
 
23
- test("password param remains correct for #{desc}") do
24
- conn.data[:password] == URI.parse(url).password
16
+ if conn.data[:password]
17
+ test("password param concealed for #{desc}") do
18
+ !conn.inspect.include?(conn.data[:password])
25
19
  end
20
+ end
26
21
 
22
+ test("password param remains correct for #{desc}") do
23
+ conn.data[:password] == URI.parse(url).password
27
24
  end
25
+
28
26
  end
29
27
  end
data/tests/bad_tests.rb CHANGED
@@ -2,6 +2,28 @@ Shindo.tests('Excon bad server interaction') do
2
2
 
3
3
  with_server('bad') do
4
4
 
5
+ tests('header splitting') do
6
+
7
+ tests('prevents key splitting').raises(Excon::Errors::InvalidHeaderKey) do
8
+ connection = Excon.new('http://127.0.0.1:9292')
9
+ connection.request(
10
+ headers: { "Foo\r\nBar" => "baz" },
11
+ method: :get,
12
+ path: '/echo'
13
+ )
14
+ end
15
+
16
+ tests('prevents value splitting').raises(Excon::Errors::InvalidHeaderValue) do
17
+ connection = Excon.new('http://127.0.0.1:9292')
18
+ connection.request(
19
+ headers: { Foo: "bar\r\nBaz: qux" },
20
+ method: :get,
21
+ path: '/echo'
22
+ )
23
+ end
24
+
25
+ end
26
+
5
27
  tests('bad server: causes EOFError') do
6
28
 
7
29
  tests('with no content length and no chunking') do
@@ -1,7 +1,7 @@
1
1
  require 'shindo'
2
2
 
3
3
  Shindo.tests('Batch Requests') do
4
- with_server('good') do
4
+ with_server('good_ipv4') do
5
5
  tests('with batch request size 2') do
6
6
  returns(%w{ 1 2 1 2 }, 'batch request size 2') do
7
7
  connection = Excon.new('http://127.0.0.1:9292')
@@ -1,7 +1,7 @@
1
1
  Shindo.tests('Excon Response Validation') do
2
2
  env_init
3
3
 
4
- with_server('good') do
4
+ with_server('good_ipv4') do
5
5
  tests('good responses with complete headers') do
6
6
  100.times do
7
7
  res = Excon.get('http://127.0.0.1:9292/chunked/simple')
@@ -1,20 +1,17 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
20
17
  -----END CERTIFICATE-----
@@ -1,27 +1,28 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEpgIBAAKCAQEA/PbsbAxwowMioOR4UGR/tDF4ul6TZSKtiYxYqe+xEhlgLzS7
3
- /9mQibkJAz2EKNNd+DR8XnkvB84WNWyLDNeq1de3vZCgmN9W1oddoxbhNGKLSN6K
4
- mBxANaJzpbYHBHKJhErqGYeBoBf135UF2hVh7oU9n4P5ozdnjpx3IlNh6coDwNmu
5
- GkpfGftL2UbOZOBuXM7E0mtOlTUTg3OFtvITBcXf1iFNcLI9KrtEkvVsC3iHEis8
6
- 3y0V4sPSPxl+UYJI44XowjIQ9hxs2616GvITep2m/ydTnjwu/wn5OSnyNNRV+jEY
7
- zDfCSQ7MZxoLDm05RVRZJY1hJwizaP7Na2pNuQIDAQABAoIBAQCFqd+Q1B3sNKrm
8
- gvKD4CaOSxm0uGZ/qQwzQuJSoOFaY+gr6VxxOz+hVhFKEgY0IENl9C3HKZdNM3sO
9
- rZTnq0mMhtiCpNoHDPPwlURH+b3zlSJt1ZE8AKl47abX58/bbL33FjKOXMiElESJ
10
- 6E9YRbYid2rxT6XntU3V0B0vGQoConvcGN+6jtTvZInTLU+tuQTfw/GpB7AJcTej
11
- I2/gWx1lQurfv5iGcOqwPOoLN7qMWGsXbFxEFgmD1VN3AiCPV/A+gq8xf2wccws9
12
- dNwqz1sbphbR1nl0gUwWP3PRQa31RqgOsGLj2EFtBqZio8zzyNN6WLbVSMZfiDUi
13
- NIplFH6BAoGBAP/S5VKYkHCBJ+2QC9v42Bb8Ip6QC1oh+Sdm5geZuB72+xIWa6+1
14
- 7Vw6DW+wDvEEDRICcl38iI60hq+H3TZRa35daDlUXEy66HNWwCxA//l+48Jvcx0x
15
- 03qQDeB3PZqewsbey+aL23Tli8Kl2g9njzjUgi7tSbTEwWTlmNdElTnRAoGBAP0j
16
- hguvZNitFd0ScyHUr2VduWEPgsYVHcvzbUZ+UGga0zr2gfYwkVBiF7MZ2BqGWg0/
17
- ZNzmmlgLyk2sBhqN5B/8qjyJ3uvolstkj6vuwIyXa9Z4tAhy4SBtvwaLT19ZS+Y6
18
- EGnC1vdsyBypwxoet+uVs5KkFOUt6YD8upSq6udpAoGBAPLKPqYy8PI1QaWuzfKI
19
- qty1kk2WO4/hKkuA1tNjymBo2kOCT9VE/e5HkjTrjGKlC5qKA+y7HQcCwciZUxKY
20
- F0Kod5/hNnAD+1Rrgpr9XXJ2QMZpa4DLpv9s9B6STD8QaZ7AGBfHqBG7QPcM3HU+
21
- Pakb1imfPhJ3oWuWk4XKKy3hAoGBAOh7YJeIvOiWhhbj4+M1LuS8oA15LlR3fkca
22
- SMjOJ1CFGmvzi0YsMrkNbdCqMqOhskCqcRrDmwqzwVd2XqCyocmSxlIVGSu2EA+6
23
- SozQF/zG8F4nushroUCkKiV7eikKnL9TolFPhRf1yw8wBiQOBEIT2bkagqo8cVBq
24
- S31QP67JAoGBALWqrYJlU4SPW0uKAjRxHguUIyK1G1ezQjHq6kPaC2pnUkcReABZ
25
- KHKx+ZKkdO+y0itpTcxx1wKq7Uf8NH2rc2QWXNGeJajgt6V10dZbz6K6cVxeP+KV
26
- XqAxKDMfbUjqZqCBsEY+FOKoIMiCTqjvy9NIFDuvXT7Bs24FlQkjQPG8
27
- -----END RSA PRIVATE KEY-----
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCcxLPBrn4oOjnQ
3
+ QGinoreRpzlxU4q23C44Un8qMHUxQmPgUWIYq3M/CE03+oT6siiF1eiwktv0hx1I
4
+ ocEunwe7v2YZnAZFgu5pBZFoKuNS3Dy7HAJ9GjqtvwICB2FBBYOrL0m/h+KFmSIK
5
+ YGjRi/9AUeTySmZA7TTiC/355AjL9k089XZyu57uM/F2f4j1xNBaJNtK+ymtY/Gx
6
+ ILFH3wFpQEAEftEnxxpK/7hRQN680Ymo0liPjnAmJXKME1noTTUZS7ZDHFnt3XJ0
7
+ Pjma2iaHuz4MhkOnvnS5CwEZ/Y4oZisy50K1n9lQQIn5J5jA6CuYr/Nc+syTp1Ka
8
+ 7gl0QV3dAgMBAAECggEAfTtBIaqDyxzgTDT3pVp97BO69oW3HOZ84a89OHWnWKdh
9
+ Y7N/epeTo7m8/cfZbO7fIjLEBDH9FbTNttTInraZleiK5lBWTjcOvsSc6KrCF9Ip
10
+ jYsNjeRjFaKtNvOwRCHkkd5fumoRkYnHwKRNd3+vczE4hDjcwGb9RMoxo+r+//bM
11
+ eESn+D6edk7ZgcE28fRbMpvDrFJ/dXd21JJKXsu2yIHntUPbmsQ7Ya0KPcwoOwfm
12
+ uQNwDsNqsaFLGgpfO4vTEpuWsAeex/u+0YsDHoRH6TqIDkpXFYfVaqSRPnkS6jsL
13
+ OK+/PGhfABZJU743u4GFeMIzEJxxpIA9vjypcHUDYQKBgQDOywWK8PBeRUMU+Hyc
14
+ gJ+vbb3MLnyr0nekYRgGnq8ph+739aGcP1oADJwfs25tSg4t1srLluwuxCtvP3im
15
+ SF9U6znJMiyrFbvKkCpBTkHdzJyiUrSbCUv2P/IktNYaehn9WA6mXYaz7uaxZ/ED
16
+ /WtHJYqZHA/thdi1f7df9YqvmQKBgQDCEmIlfKCavd94CVNVmBiwIPMOEwCDwKZs
17
+ lA+xlaRA/fHEL9f0oJq5ca1NP+Fs9V3ISIe1kOhFea7NjEruglNY9nvGn69hyBrQ
18
+ 22E2T2KREIEoWFZVgZjrQsQFot4lUGl7YqDn0tdRAWy7ykaFEYY1LOyF8NLXV8Wi
19
+ elqedTra5QKBgHOWV4rKEhEfddeK7VwtKRTNqoEumtEP24AuJVfN6uqz6IcA7UyA
20
+ vLW6VqoBiX/dHP/SR5h0y594Vy7fs3h+i4rT0ID9Yqpeg5E98+B89aQccpDo2bqu
21
+ /56tL5QE4If8J/rL9aRYMqrwplITX0xzojsqaMYcQWrqna8VrFIe1V5BAoGALuBt
22
+ 4Iwn5vix/7aQ8H3aiMCMtPuWBj0EdfmViNmSYTh1q2O7EBWzCdQRfjVN6BmkW3pZ
23
+ fVvRHubzeCbI+q90Hmr7HtD3dfD1uTkkVA/8yPlpmSstP14cZ8cqvgnHCtBPikQa
24
+ haSB6ckkUH/dZMsE1ddSElBHPUiwLjzLorbCTpkCgYAZcGUbVGUBHYtNEf1vhY75
25
+ 7qeuDbxlwxEX8D6HEJ0L6GpFgp6e/2IhzfgGJCW7gcbQHDwBixPva/ybvAsR64jG
26
+ c5n/TNguSv+JjpLZVl7MKmh4JssnEefBXT/LiSsz7LHeRm+SxxQptmsTYR5ODA8w
27
+ E1w/yHz1wrIocfCyb1J5+w==
28
+ -----END PRIVATE KEY-----
@@ -1,20 +1,17 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIDRTCCAi2gAwIBAgIJAMaDk10V/YquMA0GCSqGSIb3DQEBCwUAMCAxDjAMBgNV
3
- BAMTBWV4Y29uMQ4wDAYDVQQKEwVleGNvbjAeFw0xNzA5MDUxOTQzMzBaFw0xODA5
4
- MDUxOTQzMzBaMCAxDjAMBgNVBAMTBWV4Y29uMQ4wDAYDVQQKEwVleGNvbjCCASIw
5
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMWedu1HHibgTE5vxcA826vtlgDM
6
- KEYN7NPSkhH+ZjDz/nWZ7Y7DcDcNIsW3Nd53PsUGwva6FnBk0j/2GAwm+QO4bjHo
7
- UzB2O4rkePsrhrAOtGq9uINKmcAS0y9Ptl/ZTv1QsKUi4lKjDoalyHV8mEohpWNl
8
- 9uWO0aN+Q2KNd4p0SHmlNGAZk9BiiRvPJJqenZ2D51MbJdH5O3N9FhLnwIK6eVaU
9
- R/a3lf5hdkyGYi39zpGx47VG/6q9is1t+WXBWaaLdU0omDhlH281kq+HaV3akG6k
10
- Kh70xFGXU9Ya7qwR+PA+WkGJO6z88qwESRpGZfSSBklpM0+qIbYOP7Zb9PMCAwEA
11
- AaOBgTB/MB0GA1UdDgQWBBTMRFBCu23CeR4YBGR9+2h2b6xqODBQBgNVHSMESTBH
12
- gBTMRFBCu23CeR4YBGR9+2h2b6xqOKEkpCIwIDEOMAwGA1UEAxMFZXhjb24xDjAM
13
- BgNVBAoTBWV4Y29uggkAxoOTXRX9iq4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B
14
- AQsFAAOCAQEAWU6Q11wZFK6GhYK85IkW90FHug8/13DRJ3Q041ttQEpR48DW1lgj
15
- 5861hzKkYfyudJhk97WEnx2pzsZSogbiGv/jMT1otKk8RqQG/sQy/bqoTVZEg7I2
16
- FyPCMV4fPFCm2dL7NTh51q0xeb9QFkxNFQ7YGtAvPSxs+GM/8gLxs4pSPMLSCNxX
17
- 0r6Lvook0ur+WXalGLu8110bCa4k+00SlZg0qZISlfrZyF5ofybylMjyy/qArgUy
18
- 8eltHfWbPhJEqf1yDPz2xCYGGCSplJMpvAhvSf4GSM55B27AoPlYlaS5wEaJf8Ft
19
- g72ESuzICOQ617jOTeasIkkkoINIdnW1oA==
2
+ MIICvDCCAaQCCQCS1Yn8FMcKlzANBgkqhkiG9w0BAQsFADAgMQ4wDAYDVQQDDAVl
3
+ eGNvbjEOMAwGA1UECgwFZXhjb24wHhcNMTkwNDEyMTQzMTU2WhcNMjAwNDExMTQz
4
+ MTU2WjAgMQ4wDAYDVQQDDAVleGNvbjEOMAwGA1UECgwFZXhjb24wggEiMA0GCSqG
5
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCycrlh3FfPSv8kDJrvnRJwdFPUp+23juTD
6
+ Pb8A7YBM1rw/z5WKJGhmdYAnhyhSO5KWuKH4dUTykNn0uFz0J5bXKclU6kjatM58
7
+ IF96tc7kugDXCy+IBnmf2pM2fDrmji0c50abcHu70HQvxC+BQS9Id0iZ2G12q539
8
+ lgxvSAquyh9NBhHhxW7aNUvPuueUVlfIKshd50aHtxWlMxr9hvOZzldj9C38du0Y
9
+ uY+klTReMY2UCK2cm9S31QSP4gSeepGeaw6buV5pGNhiK9UR6dVVF4qFu21ZE0aN
10
+ pNlCaBK8zCT5toxkgca096cKFOY6nfrhzhDdd2ULlRc/zpAkYuVRAgMBAAEwDQYJ
11
+ KoZIhvcNAQELBQADggEBAIaZW9JnfhFhnq6bu0qo0HFrfEnpOhiMHIp2nyAoXdQI
12
+ k/3Dxfd17LmfonQDkwo0D+tp3yu7xL2+qVIPElyWmKnhF13U4lhiGhAbMopV1dSH
13
+ oUU5uk3DHfeWcTurC9PMX5MnozIaogmffkTEhXBOdaNI6vfk2Gs0tqYMGyIV2VNp
14
+ KMegKCP2gX+PbqzXq6DzVCxbeDGdjKxpFQqas1W+soL/I9Hg7w/S8W9SpNP0tsfd
15
+ JB7Xl2urXNK8HnsRt9uhwP6ZSIdtVqr62CqM2z0SvuTTdPTDn2TMGd0nHacpmqN0
16
+ vUHeoZheUD+w8SikrQnr4/Ft3JrH0SKY0FlgVIGcaPg=
20
17
  -----END CERTIFICATE-----
@@ -1,27 +1,28 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEowIBAAKCAQEAxZ527UceJuBMTm/FwDzbq+2WAMwoRg3s09KSEf5mMPP+dZnt
3
- jsNwNw0ixbc13nc+xQbC9roWcGTSP/YYDCb5A7huMehTMHY7iuR4+yuGsA60ar24
4
- g0qZwBLTL0+2X9lO/VCwpSLiUqMOhqXIdXyYSiGlY2X25Y7Ro35DYo13inRIeaU0
5
- YBmT0GKJG88kmp6dnYPnUxsl0fk7c30WEufAgrp5VpRH9reV/mF2TIZiLf3OkbHj
6
- tUb/qr2KzW35ZcFZpot1TSiYOGUfbzWSr4dpXdqQbqQqHvTEUZdT1hrurBH48D5a
7
- QYk7rPzyrARJGkZl9JIGSWkzT6ohtg4/tlv08wIDAQABAoIBABpFHnocYh2442vp
8
- 39fWPz1zr+UbPp9RapIeA9zwfJU1WjY36CR6RoiK7nxqBnc0UtvOMkyqICGAxZJL
9
- HJdA9wlPkxZ/U8+1Z+Tmyk5ZUuZEjidCYSzS1e16kyhO6GeFc8Ko31KUeJGTq3Kq
10
- xyMXFQeFwX6dJ10Mx0F8n2iSdbmpz6Sfz+L8RwUjlbi3m1iveeMqTk0V8ChTDluC
11
- RWLoUUAqOaV3YpaV4pHmpRJ9uMLbyC72t6JnbLdi5d/EY5vGmMDgsKg/pqW8omFO
12
- 8kWo5riLncUyvEwSPoUyY12WWc3CnroacEJ7GoibuZYZwntwot+cWOkIZmnCbj+H
13
- OiBcDoECgYEA8ZgQmdlxQ5Fwe9sadDA3SYi2V/6bQNQkw54xkfsWd/PijIunVJI8
14
- cj/hVnbZL487DnJAXsLLygw048fSGwFZXmNbQUiXZaEIpa4t9DkgouGPvvuBp6TI
15
- uIjUF4aRKA4a3+MT4SNm74qXx8co5YXnE09KIMswZQ1YHjwIzV0ggJsCgYEA0Wce
16
- 7poL7Xiyu1G1vr8vEbYtqelqHP28SzXkwrTqyOV8MPlw0/OhMDWmPLdE9mxSDwdD
17
- QAlPvvCWXhHEM/St5tN72mzuyodHjNsVnlPAckj6ADTTAmUO0fixHjivZ/6v+PEo
18
- SbjzmsbEExjyLKdScW8ALq3nfCdC9+Z3aTFShokCgYBbmz9gNtT9u94c+J11RPsR
19
- xObvQrl3wXkXO5qsMbr5TN6wUBvos3J8F8DH2lTL9dF8ztGdnNtNB4feftwqJT7P
20
- zXjCrlXJ0V/IAt2l5yt613B8CD3HZXI+lpNlQD82IvMJxb659YSIe9LFi7z0Guvd
21
- pIkFGkaFaqPpAvaLeC5k1QKBgGTqrZ2P3++yG3DrEAu9V5HRmnAobVtLbVNRxc2Q
22
- IxZugkuX6yg6YZQ6RsM8D6Ay09kqRt61nhkHGXB8X3IqmSSFB0tc9DfmujTH4MNM
23
- 2ZI6WUGAM7ETwvCuSa2m4+HafDQdBK2C1OPiptwNSaj7el/wfsYASW8r/Lo795Ba
24
- lMsBAoGBAO8fKeu1cSrgNBG5Bafa5P2uPK1X9GASA1zgG6ay3FGH9m/vt36/DcRq
25
- LQQP1WJUH8AR9/jlUgpS134Ww0AFVVh/ZHZTFnVkS8mn6wzFehxt49uVVcJncRzB
26
- Vnes1S/Zky0RgvfR4rWy9NCYkIkqYAQPacfElxpGItV7V2INKFol
27
- -----END RSA PRIVATE KEY-----
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCycrlh3FfPSv8k
3
+ DJrvnRJwdFPUp+23juTDPb8A7YBM1rw/z5WKJGhmdYAnhyhSO5KWuKH4dUTykNn0
4
+ uFz0J5bXKclU6kjatM58IF96tc7kugDXCy+IBnmf2pM2fDrmji0c50abcHu70HQv
5
+ xC+BQS9Id0iZ2G12q539lgxvSAquyh9NBhHhxW7aNUvPuueUVlfIKshd50aHtxWl
6
+ Mxr9hvOZzldj9C38du0YuY+klTReMY2UCK2cm9S31QSP4gSeepGeaw6buV5pGNhi
7
+ K9UR6dVVF4qFu21ZE0aNpNlCaBK8zCT5toxkgca096cKFOY6nfrhzhDdd2ULlRc/
8
+ zpAkYuVRAgMBAAECggEAcuhPGYYCgThAzRzU1ADn88Pki2ZLO8zm4BYtnVJSMKiB
9
+ 9fEc0SSamYeGK23r9+/md+mSWuRgrnW588yYBpxLlGeS/nwSx8pvwBw0f1b9T+m6
10
+ Sr8oL0ZEITxlWUtrvjTFNfxzSfqHoqwbdPq2wFuSL+6nsHFeI3FlPfrWLP5N6rin
11
+ TlUglesEiaPDu7mN+E7jM94MyXkMkiPPpxd8m04YULZNTj5OAk9HEWnRr0L1GaCr
12
+ oc9n1k47sMzepiD6oKQRud4xijnVcI49L2hgSWSOm3dYREK7auCwCIcMx9m9Aa3N
13
+ 1NpnHAfIJP++HHSi4JRB3HegLHOOMG2B5mTOzfQPlQKBgQDbULpJtyDU6og5HkVC
14
+ ViBkjIYGjfHeVeJxAEBCPyVszfUuGMImisYWiTAkC5bWiAsyyRoEpn1ro3e9pT/O
15
+ N5LORuaMpwOP/WMbG/ShNmOg2v3nW2EWuiWOjf+Rpr+lxgKGI9Gpe7TcIGgR+Vsl
16
+ /dCKEOjnFJzAVFt1A9zPdqpUkwKBgQDQTAcSCmKidhnz/scWDp272AwMaVA2OFfq
17
+ yEup8CZiIh/LzdoMog+bsjMlZ7IbJznfx3yGxiWUq83HNfQ0cFcR1TjXY8rT6IYp
18
+ 5d5lKLMQiNdgt/ZhoJWCtKeYWx3LpJE+fPAUKIVC4BLd0O9U6z9iudKKyfEKwvWC
19
+ G64SHm6RCwKBgDDifaOQvjC3VkXlCWsP54iCCh3L5e25FxA5Dhm2GZF3Fv9/ZUdS
20
+ B3VefuyJ6MVI7bYUPUhsE+i6NyZ+fwpoOMDh7OHNGG4v/Lc+M/j7NpnUNmQraii2
21
+ tUhhPmYo1O8Og+GCemlcuaOXVZssCbUeLi2YN1HKtmXoZ7pdcgqMWMshAoGAFZCZ
22
+ dsuudIVnoHQzJlxzBhyS+sH4dPSWXY9JDhn3z1cbFZ2FQqOQnBzx4KCAtwDzo/Bi
23
+ Ow3OnDrBPiue0cMDsKvzi5EgUZoUMchDoxN4nnCcY74H+wmGERck9sgQKKIsC10h
24
+ +eRMD6VlLqPP82m7kTwNySKpGuUeR88X0XZnGgsCgYB26Hpm7rUJY/sUCyEQxqW+
25
+ Opt8vOBV0ipapFD7O7VKImz7wALKBs6oiQGr+AoN/YavIYbubnmzP8jSUoqeWzFR
26
+ c4s3/sozur+1sbFqk/lJeSdvogY2CT4qgQx9OrZBynSWYldHig9HEeU5a56oh9vv
27
+ Vns6XV2XQMGmvjg9yetRig==
28
+ -----END PRIVATE KEY-----
data/tests/error_tests.rb CHANGED
@@ -35,7 +35,7 @@ Shindo.tests('HTTPStatusError request/response debugging') do
35
35
  Excon.new('http://localhost', path: "foo\r\nbar: baz")
36
36
  false
37
37
  rescue => err
38
- err.to_s.include? "foo\r\nbar: baz"
38
+ err.to_s.include?(RUBY_VERSION >= '2.6.0' ? 'foo\r\nbar: baz' : "foo\r\nbar: baz")
39
39
  end
40
40
  end
41
41
 
@@ -0,0 +1,28 @@
1
+ require 'logger'
2
+
3
+ Shindo.tests('logging instrumentor') do
4
+ env_init
5
+
6
+ tests("connection logger").returns(true) do
7
+ Excon.stub({:method => :get}, {body: 'body', status: 200})
8
+
9
+ log_path = "/tmp/excon_#{Time.now.to_i}.txt"
10
+ logger = Logger.new(log_path)
11
+ # omit datetime to simplify test matcher
12
+ logger.formatter = proc do |severity, datetime, progname, msg|
13
+ "#{msg}\n"
14
+ end
15
+
16
+ connection = Excon.new(
17
+ 'http://127.0.0.1:9292',
18
+ instrumentor: Excon::LoggingInstrumentor,
19
+ logger: logger,
20
+ mock: true
21
+ )
22
+ response = connection.request(method: :get, path: '/logger')
23
+ File.readlines(log_path)[1..2] == [
24
+ "request: http://127.0.0.1/logger\n",
25
+ "response: body\n"
26
+ ]
27
+ end
28
+ end
@@ -1,7 +1,7 @@
1
1
  Shindo.tests('Excon Decompress Middleware') do
2
2
  env_init
3
3
 
4
- with_server('good') do
4
+ with_server('good_ipv4') do
5
5
 
6
6
  before do
7
7
  @connection ||= Excon.new(