excon 0.62.0 → 0.92.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CONTRIBUTING.md +0 -1
- data/LICENSE.md +1 -1
- data/README.md +7 -6
- data/data/cacert.pem +1220 -1828
- data/excon.gemspec +19 -3
- data/lib/excon/connection.rb +216 -139
- data/lib/excon/constants.rb +38 -13
- data/lib/excon/error.rb +15 -0
- data/lib/excon/headers.rb +4 -3
- data/lib/excon/instrumentors/logging_instrumentor.rb +5 -16
- data/lib/excon/instrumentors/standard_instrumentor.rb +2 -9
- data/lib/excon/middlewares/base.rb +6 -0
- data/lib/excon/middlewares/capture_cookies.rb +1 -1
- data/lib/excon/middlewares/decompress.rb +11 -4
- data/lib/excon/middlewares/expects.rb +7 -1
- data/lib/excon/middlewares/idempotent.rb +20 -3
- data/lib/excon/middlewares/instrumentor.rb +8 -0
- data/lib/excon/middlewares/mock.rb +12 -3
- data/lib/excon/middlewares/redirect_follower.rb +25 -3
- data/lib/excon/middlewares/response_parser.rb +3 -0
- data/lib/excon/pretty_printer.rb +1 -8
- data/lib/excon/response.rb +12 -9
- data/lib/excon/socket.rb +59 -42
- data/lib/excon/ssl_socket.rb +37 -15
- data/lib/excon/test/plugin/server/exec.rb +5 -2
- data/lib/excon/test/plugin/server/puma.rb +4 -1
- data/lib/excon/test/plugin/server/unicorn.rb +5 -0
- data/lib/excon/test/plugin/server/webrick.rb +4 -1
- data/lib/excon/test/server.rb +1 -1
- data/lib/excon/unix_socket.rb +1 -0
- data/lib/excon/utils.rb +59 -5
- data/lib/excon/version.rb +1 -1
- data/lib/excon.rb +25 -17
- metadata +27 -98
- data/.document +0 -5
- data/.gitignore +0 -13
- data/.rspec +0 -3
- data/.travis.yml +0 -29
- data/Gemfile +0 -19
- data/Rakefile +0 -41
- data/benchmarks/class_vs_lambda.rb +0 -50
- data/benchmarks/concat_vs_insert.rb +0 -21
- data/benchmarks/concat_vs_interpolate.rb +0 -22
- data/benchmarks/cr_lf.rb +0 -21
- data/benchmarks/downcase-eq-eq_vs_casecmp.rb +0 -169
- data/benchmarks/excon.rb +0 -69
- data/benchmarks/excon_vs.rb +0 -165
- data/benchmarks/for_vs_array_each.rb +0 -27
- data/benchmarks/for_vs_hash_each.rb +0 -27
- data/benchmarks/has_key-vs-lookup.rb +0 -177
- data/benchmarks/headers_case_sensitivity.rb +0 -83
- data/benchmarks/headers_split_vs_match.rb +0 -34
- data/benchmarks/implicit_block-vs-explicit_block.rb +0 -98
- data/benchmarks/merging.rb +0 -21
- data/benchmarks/single_vs_double_quotes.rb +0 -21
- data/benchmarks/string_ranged_index.rb +0 -87
- data/benchmarks/strip_newline.rb +0 -115
- data/benchmarks/vs_stdlib.rb +0 -82
- data/changelog.txt +0 -1083
- data/spec/excon/error_spec.rb +0 -139
- data/spec/excon/test/server_spec.rb +0 -28
- data/spec/excon_spec.rb +0 -7
- data/spec/helpers/file_path_helpers.rb +0 -22
- data/spec/requests/basic_spec.rb +0 -40
- data/spec/requests/eof_requests_spec.rb +0 -36
- data/spec/requests/unix_socket_spec.rb +0 -46
- data/spec/spec_helper.rb +0 -24
- data/spec/support/shared_contexts/test_server_context.rb +0 -83
- data/spec/support/shared_examples/shared_example_for_clients.rb +0 -218
- data/spec/support/shared_examples/shared_example_for_streaming_clients.rb +0 -20
- data/spec/support/shared_examples/shared_example_for_test_servers.rb +0 -16
- data/tests/authorization_header_tests.rb +0 -29
- data/tests/bad_tests.rb +0 -47
- data/tests/basic_tests.rb +0 -351
- data/tests/batch_requests.rb +0 -133
- data/tests/complete_responses.rb +0 -31
- data/tests/data/127.0.0.1.cert.crt +0 -20
- data/tests/data/127.0.0.1.cert.key +0 -27
- data/tests/data/excon.cert.crt +0 -20
- data/tests/data/excon.cert.key +0 -27
- data/tests/data/xs +0 -1
- data/tests/error_tests.rb +0 -145
- data/tests/header_tests.rb +0 -119
- data/tests/middlewares/canned_response_tests.rb +0 -34
- data/tests/middlewares/capture_cookies_tests.rb +0 -34
- data/tests/middlewares/decompress_tests.rb +0 -157
- data/tests/middlewares/escape_path_tests.rb +0 -36
- data/tests/middlewares/idempotent_tests.rb +0 -206
- data/tests/middlewares/instrumentation_tests.rb +0 -315
- data/tests/middlewares/mock_tests.rb +0 -304
- data/tests/middlewares/redirect_follower_tests.rb +0 -112
- data/tests/pipeline_tests.rb +0 -40
- data/tests/proxy_tests.rb +0 -306
- data/tests/query_string_tests.rb +0 -87
- data/tests/rackups/basic.rb +0 -41
- data/tests/rackups/basic.ru +0 -3
- data/tests/rackups/basic_auth.ru +0 -14
- data/tests/rackups/deflater.ru +0 -4
- data/tests/rackups/proxy.ru +0 -18
- data/tests/rackups/query_string.ru +0 -13
- data/tests/rackups/redirecting.ru +0 -23
- data/tests/rackups/redirecting_with_cookie.ru +0 -40
- data/tests/rackups/request_headers.ru +0 -15
- data/tests/rackups/request_methods.ru +0 -21
- data/tests/rackups/response_header.ru +0 -18
- data/tests/rackups/ssl.ru +0 -16
- data/tests/rackups/ssl_mismatched_cn.ru +0 -15
- data/tests/rackups/ssl_verify_peer.ru +0 -16
- data/tests/rackups/streaming.ru +0 -30
- data/tests/rackups/thread_safety.ru +0 -17
- data/tests/rackups/timeout.ru +0 -14
- data/tests/rackups/webrick_patch.rb +0 -34
- data/tests/request_headers_tests.rb +0 -21
- data/tests/request_method_tests.rb +0 -47
- data/tests/request_tests.rb +0 -59
- data/tests/response_tests.rb +0 -197
- data/tests/servers/bad.rb +0 -20
- data/tests/servers/eof.rb +0 -17
- data/tests/servers/error.rb +0 -20
- data/tests/servers/good.rb +0 -350
- data/tests/test_helper.rb +0 -306
- data/tests/thread_safety_tests.rb +0 -39
- data/tests/timeout_tests.rb +0 -12
- data/tests/utils_tests.rb +0 -81
data/spec/excon/error_spec.rb
DELETED
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Excon::Error do
|
|
4
|
-
# Regression against e300458f2d9330cb265baeb8973120d08c665d9
|
|
5
|
-
describe '#status_errors' do
|
|
6
|
-
describe '.keys ' do
|
|
7
|
-
expected = [
|
|
8
|
-
100,
|
|
9
|
-
101,
|
|
10
|
-
(200..206).to_a,
|
|
11
|
-
(300..307).to_a,
|
|
12
|
-
(400..417).to_a,
|
|
13
|
-
422,
|
|
14
|
-
429,
|
|
15
|
-
(500..504).to_a
|
|
16
|
-
].flatten
|
|
17
|
-
|
|
18
|
-
it('returns the pertinent HTTP error numbers') do
|
|
19
|
-
expected.flatten == Excon::Error.status_errors.keys
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
describe '#new' do
|
|
25
|
-
it('returns an Excon::Error') do
|
|
26
|
-
expect(Excon::Error.new('bar').class == Excon::Error).to be true
|
|
27
|
-
end
|
|
28
|
-
it('raises errors for bad URIs') do
|
|
29
|
-
expect { Excon.new('foo') }.to raise_error(ArgumentError)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it('raises errors for bad paths') do
|
|
33
|
-
expect { Excon.new('http://localhost', path: "foo\r\nbar: baz") }.to raise_error(URI::InvalidURIError)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
context 'when remaining backwards compatible' do
|
|
38
|
-
describe '#new' do
|
|
39
|
-
it 'should raise standard error and catch standard error' do
|
|
40
|
-
expect { raise Excon::Error::Client, 'foo' }.to raise_error(Excon::Error)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it 'should raise legacy errors and catch legacy errors' do
|
|
44
|
-
expect do
|
|
45
|
-
raise Excon::Errors::Error, 'bar'
|
|
46
|
-
end.to raise_error(Excon::Errors::Error)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
it 'should raise standard error and catch legacy errors' do
|
|
50
|
-
expect do
|
|
51
|
-
raise Excon::Error::NotFound, 'bar'
|
|
52
|
-
end.to raise_error(Excon::Errors::Error)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
describe '#status_error' do
|
|
57
|
-
it 'should raise with status_error() and catch with standard error' do
|
|
58
|
-
expect do
|
|
59
|
-
raise Excon::Error.status_error({ expects: 200 }, status: 400)
|
|
60
|
-
end.to raise_error(Excon::Error)
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
it 'should raise with status_error() and catch with legacy error' do
|
|
64
|
-
expect do
|
|
65
|
-
raise Excon::Error.status_error({ expects: 200 }, status: 400)
|
|
66
|
-
end.to raise_error(Excon::Errors::BadRequest)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it 'should raise with legacy status_error() and catch with standard' do
|
|
70
|
-
expect do
|
|
71
|
-
raise Excon::Errors.status_error({ expects: 200 }, status: 400)
|
|
72
|
-
end.to raise_error(Excon::Error)
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
context 'when exceptions are rescued' do
|
|
78
|
-
include_context("test server", :exec, 'error.rb', :before => :start, :after => :stop )
|
|
79
|
-
|
|
80
|
-
context 'when :debug_request and :debug_response are switched off' do
|
|
81
|
-
it('exception message does not include response or response info') do
|
|
82
|
-
begin
|
|
83
|
-
Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200)
|
|
84
|
-
rescue Excon::Errors::HTTPStatusError => err
|
|
85
|
-
truth =
|
|
86
|
-
err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
|
|
87
|
-
!err.message.include?('excon.error.request') &&
|
|
88
|
-
!err.message.include?('excon.error.response')
|
|
89
|
-
expect(truth).to be true
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
context 'when :debug_request and :debug_response are switched on' do
|
|
95
|
-
it 'exception message includes request and response info' do
|
|
96
|
-
begin
|
|
97
|
-
Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200,
|
|
98
|
-
debug_request: true, debug_response: true)
|
|
99
|
-
rescue Excon::Errors::HTTPStatusError => err
|
|
100
|
-
truth =
|
|
101
|
-
err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
|
|
102
|
-
err.message.include?('excon.error.request') &&
|
|
103
|
-
err.message.include?('excon.error.response')
|
|
104
|
-
expect(truth).to be true
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
context 'when only :debug_request is turned on' do
|
|
110
|
-
it('exception message includes only request info') do
|
|
111
|
-
begin
|
|
112
|
-
Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200,
|
|
113
|
-
debug_request: true)
|
|
114
|
-
rescue Excon::Errors::HTTPStatusError => err
|
|
115
|
-
truth =
|
|
116
|
-
err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
|
|
117
|
-
err.message.include?('excon.error.request') &&
|
|
118
|
-
!err.message.include?('excon.error.response')
|
|
119
|
-
expect(truth).to be true
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
context 'when only :debug_response is turned on ' do
|
|
125
|
-
it('exception message includes only response info') do
|
|
126
|
-
begin
|
|
127
|
-
Excon.get('http://127.0.0.1:9292/error/not_found', expects: 200,
|
|
128
|
-
debug_response: true)
|
|
129
|
-
rescue Excon::Errors::HTTPStatusError => err
|
|
130
|
-
truth =
|
|
131
|
-
err.message.include?('Expected(200) <=> Actual(404 Not Found)') &&
|
|
132
|
-
!err.message.include?('excon.error.request') &&
|
|
133
|
-
err.message.include?('excon.error.response')
|
|
134
|
-
expect(truth).to be true
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
end
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Excon::Test::Server do
|
|
4
|
-
|
|
5
|
-
context 'when the web server is webrick' do
|
|
6
|
-
it_should_behave_like "a excon test server", :webrick, 'basic.ru'
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
context 'when the web server is unicorn' do
|
|
11
|
-
context 'bound to a tcp socket' do
|
|
12
|
-
it_should_behave_like "a excon test server", :unicorn, 'streaming.ru'
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
context "bound to a unix socket" do
|
|
16
|
-
socket_uri = 'unix:///tmp/unicorn.socket'
|
|
17
|
-
it_should_behave_like "a excon test server", :unicorn, 'streaming.ru', socket_uri
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
context 'when the web server is puma' do
|
|
22
|
-
it_should_behave_like "a excon test server", :puma, 'streaming.ru'
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
context 'when the web server is a executable' do
|
|
26
|
-
it_should_behave_like "a excon test server", :exec, 'good.rb'
|
|
27
|
-
end
|
|
28
|
-
end
|
data/spec/excon_spec.rb
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Todo: s/tests/specs when migration is complete
|
|
2
|
-
def get_abs_path(*parts)
|
|
3
|
-
File.join(File.expand_path('../../..', __FILE__), 'tests', *parts)
|
|
4
|
-
end
|
|
5
|
-
|
|
6
|
-
def data_path(*parts)
|
|
7
|
-
get_abs_path('data', *parts)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def rackup_path(*parts)
|
|
11
|
-
get_abs_path('rackups', *parts)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def webrick_path(*parts) rackup_path(*parts); end
|
|
15
|
-
|
|
16
|
-
def unicorn_path(*parts) rackup_path(*parts); end
|
|
17
|
-
|
|
18
|
-
def puma_path(*parts) rackup_path(*parts); end
|
|
19
|
-
|
|
20
|
-
def exec_path(*parts)
|
|
21
|
-
get_abs_path('servers', *parts)
|
|
22
|
-
end
|
data/spec/requests/basic_spec.rb
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Excon::Connection do
|
|
4
|
-
include_context('test server', :webrick, 'basic.ru', before: :start, after: :stop)
|
|
5
|
-
context 'when an explicit uri is passed' do
|
|
6
|
-
let(:conn) do
|
|
7
|
-
Excon::Connection.new(host: '127.0.0.1',
|
|
8
|
-
hostname: '127.0.0.1',
|
|
9
|
-
nonblock: false,
|
|
10
|
-
port: 9292,
|
|
11
|
-
scheme: 'http',
|
|
12
|
-
ssl_verify_peer: false)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
describe '.new' do
|
|
16
|
-
it 'returns an instance' do
|
|
17
|
-
expect(conn).to be_instance_of Excon::Connection
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
context "when :method is :get and :path is /content-length/100" do
|
|
22
|
-
describe "#request" do
|
|
23
|
-
let(:response) do
|
|
24
|
-
response = conn.request(method: :get, path: '/content-length/100')
|
|
25
|
-
end
|
|
26
|
-
it 'returns an Excon::Response' do
|
|
27
|
-
expect(response).to be_instance_of Excon::Response
|
|
28
|
-
end
|
|
29
|
-
describe Excon::Response do
|
|
30
|
-
describe '#status' do
|
|
31
|
-
it 'returns 200' do
|
|
32
|
-
expect(response.status).to eq 200
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
include_examples 'a basic client'
|
|
39
|
-
end
|
|
40
|
-
end
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe Excon do
|
|
4
|
-
context "when dispatching requests" do
|
|
5
|
-
context('to a server that does not supply response headers') do
|
|
6
|
-
include_context("test server", :exec, 'bad.rb', :before => :start, :after => :stop )
|
|
7
|
-
before(:all) do
|
|
8
|
-
@conn = Excon.new('http://127.0.0.1:9292')
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
context('when no block is given') do
|
|
12
|
-
it 'should rescue from an EOFError and return response' do
|
|
13
|
-
body = @conn.request(:method => :get, :path => '/eof/no_content_length_and_no_chunking').body
|
|
14
|
-
expect(body).to eq 'hello'
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
context('when a block is given') do
|
|
19
|
-
it 'should rescue from EOFError and return response' do
|
|
20
|
-
body = ""
|
|
21
|
-
response_block = lambda {|chunk, remaining, total| body << chunk }
|
|
22
|
-
@conn.request(:method => :get, :path => '/eof/no_content_length_and_no_chunking', :response_block => response_block)
|
|
23
|
-
expect(body).to eq 'hello'
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
context('to a server that prematurely aborts the request with no response') do
|
|
29
|
-
include_context("test server", :exec, 'eof.rb', :before => :start, :after => :stop )
|
|
30
|
-
|
|
31
|
-
it 'should raise an EOFError' do
|
|
32
|
-
expect { Excon.get('http://127.0.0.1:9292/eof') }.to raise_error(Excon::Errors::SocketError)
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
describe Excon::Connection do
|
|
4
|
-
context "when speaking to a UNIX socket" do
|
|
5
|
-
context "Host header handling" do
|
|
6
|
-
before do
|
|
7
|
-
responder = ->(req) do
|
|
8
|
-
{
|
|
9
|
-
body: req[:headers].to_json,
|
|
10
|
-
status: 200,
|
|
11
|
-
}
|
|
12
|
-
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
|
-
end
|
|
22
|
-
|
|
23
|
-
it "sends an empty Host= by default" do
|
|
24
|
-
conn = Excon::Connection.new(
|
|
25
|
-
scheme: "unix",
|
|
26
|
-
socket: "/tmp/x.sock",
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
headers = JSON.parse(conn.get(path: "/path").body)
|
|
30
|
-
|
|
31
|
-
expect(headers["Host"]).to eq("")
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "doesn't overwrite an explicit Host header" do
|
|
35
|
-
conn = Excon::Connection.new(
|
|
36
|
-
scheme: "unix",
|
|
37
|
-
socket: "/tmp/x.sock",
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
headers = JSON.parse(conn.get(path: "/path", headers: { "Host" => "localhost" }).body)
|
|
41
|
-
|
|
42
|
-
expect(headers["Host"]).to eq("localhost")
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
data/spec/spec_helper.rb
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
require 'excon'
|
|
2
|
-
require 'excon/test/server'
|
|
3
|
-
require 'json'
|
|
4
|
-
|
|
5
|
-
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
|
6
|
-
RSpec.configure do |config|
|
|
7
|
-
config.expect_with :rspec do |expectations|
|
|
8
|
-
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
config.mock_with :rspec do |mocks|
|
|
12
|
-
mocks.verify_partial_doubles = true
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
if config.files_to_run.one?
|
|
16
|
-
config.default_formatter = 'doc'
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
# Load helpers
|
|
21
|
-
Dir["./spec/helpers/**/*.rb"].sort.each { |f| require f}
|
|
22
|
-
|
|
23
|
-
# Load shared examples and contexts
|
|
24
|
-
Dir["./spec/support/**/*.rb"].sort.each { |f| require f}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# TODO: Clean up this doc and dry up the conditionals
|
|
2
|
-
#
|
|
3
|
-
# Required params:
|
|
4
|
-
# plugin (e.g., webrick, unicorn, etc)
|
|
5
|
-
# file (e.g. a rackup )
|
|
6
|
-
#
|
|
7
|
-
# Optional params:
|
|
8
|
-
# optional paramters may given as a hash
|
|
9
|
-
# opts may contain a bind argument
|
|
10
|
-
# opts may also contain before and after options
|
|
11
|
-
#
|
|
12
|
-
# In its simplest form:
|
|
13
|
-
# { :before => :start, :after => :stop }
|
|
14
|
-
#
|
|
15
|
-
# With lambdas, which recieve @server as an argument
|
|
16
|
-
# { before: lambda {|s| s.start }, after: lambda { |s| s.stop} }
|
|
17
|
-
#
|
|
18
|
-
# In both the cases above, before defaults to before(:all)
|
|
19
|
-
# This can be circumvented with a Hash
|
|
20
|
-
# { before: { :context => :start }, after: { :context => :stop } }
|
|
21
|
-
# or
|
|
22
|
-
# { before: { context: lambda { |s| s.start } }, after: { context: lambda { |s| s.stop } } }
|
|
23
|
-
|
|
24
|
-
shared_context "test server" do |plugin, file, opts = {}|
|
|
25
|
-
plugin = plugin.to_sym unless plugin.is_a? Symbol
|
|
26
|
-
if plugin == :unicorn && RUBY_PLATFORM == "java"
|
|
27
|
-
before { skip("until unicorn supports jruby") }
|
|
28
|
-
end
|
|
29
|
-
abs_file = Object.send("#{plugin}_path", file)
|
|
30
|
-
args = { plugin => abs_file}
|
|
31
|
-
args[:bind] = opts[:bind] if opts.key? :bind
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
before_hook = opts.key?(:before) && (opts[:before].is_a?(Symbol) || opts[:before].is_a?(Proc) || opts[:before].is_a?(Hash))
|
|
35
|
-
|
|
36
|
-
if before_hook && opts[:before].is_a?(Hash)
|
|
37
|
-
event = opts[:before].keys.first
|
|
38
|
-
before(event) {
|
|
39
|
-
@server = Excon::Test::Server.new(args)
|
|
40
|
-
if opts[:before][event].is_a? Symbol
|
|
41
|
-
@server.send(opts[:before][event])
|
|
42
|
-
else
|
|
43
|
-
opts[:before][event].call(@server)
|
|
44
|
-
end
|
|
45
|
-
}
|
|
46
|
-
elsif
|
|
47
|
-
before(:all) {
|
|
48
|
-
@server = Excon::Test::Server.new(args)
|
|
49
|
-
before_hook = opts.key?(:before) && (opts[:before].is_a?(Symbol) || opts[:before].is_a?(Proc) || opts[:before].is_a?(Hash))
|
|
50
|
-
|
|
51
|
-
if before_hook
|
|
52
|
-
if opts[:before].is_a? Symbol
|
|
53
|
-
@server.send(opts[:before])
|
|
54
|
-
else
|
|
55
|
-
opts[:before].call(@server)
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
}
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
after_hook = opts.key?(:after) && (opts[:after].is_a?(Symbol) || opts[:after].is_a?(Proc) || opts[:after].is_a?(Hash))
|
|
62
|
-
|
|
63
|
-
if after_hook && opts[:after].is_a?(Hash)
|
|
64
|
-
event = opts[:after].keys.first
|
|
65
|
-
after(event) {
|
|
66
|
-
if opts[:after][event].is_a? Symbol
|
|
67
|
-
@server.send(opts[:after][event])
|
|
68
|
-
else
|
|
69
|
-
opts[:after][event].call(@server)
|
|
70
|
-
end
|
|
71
|
-
}
|
|
72
|
-
elsif after_hook
|
|
73
|
-
after(:all) {
|
|
74
|
-
if opts[:after].is_a? Symbol
|
|
75
|
-
@server.send(opts[:after])
|
|
76
|
-
elsif opts[:after].is_a? Hash
|
|
77
|
-
|
|
78
|
-
else
|
|
79
|
-
opts[:after].call(@server)
|
|
80
|
-
end
|
|
81
|
-
}
|
|
82
|
-
end
|
|
83
|
-
end
|
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
require 'time'
|
|
2
|
-
|
|
3
|
-
shared_examples_for 'a basic client' do |url = 'http://127.0.0.1:9292', opts = {}|
|
|
4
|
-
# TODO: Ditch iterator and manually write a context for each set of options
|
|
5
|
-
([true, false] * 2).combination(2).to_a.uniq.each do |nonblock, persistent|
|
|
6
|
-
context "when nonblock is #{nonblock} and persistent is #{persistent}" do
|
|
7
|
-
opts = opts.merge(ssl_verify_peer: false, nonblock: nonblock, persistent: persistent)
|
|
8
|
-
|
|
9
|
-
let(:conn) { Excon.new(url, opts) }
|
|
10
|
-
|
|
11
|
-
context 'when :method is get and :path is /content-length/100' do
|
|
12
|
-
describe '#request' do
|
|
13
|
-
let(:response) do
|
|
14
|
-
conn.request(method: :get, path: '/content-length/100')
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it 'returns an Excon::Response' do
|
|
18
|
-
expect(response).to be_instance_of Excon::Response
|
|
19
|
-
end
|
|
20
|
-
describe Excon::Response do
|
|
21
|
-
describe '#status' do
|
|
22
|
-
it 'returns 200' do
|
|
23
|
-
expect(response.status).to eq 200
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it '#status returns 200' do
|
|
27
|
-
expect(response[:status]).to eq 200
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
describe '#headers' do
|
|
31
|
-
it '["Content-Length"] returns 100' do
|
|
32
|
-
expect(response.headers['Content-Length']).to eq '100'
|
|
33
|
-
end
|
|
34
|
-
it '["Content-Type"] returns "text/html;charset=utf-8"' do
|
|
35
|
-
expect(response.headers['Content-Type']).to eq 'text/html;charset=utf-8'
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "['Date'] returns a valid date" do
|
|
39
|
-
if RUBY_PLATFORM == 'java' && conn.data[:scheme] == Excon::UNIX
|
|
40
|
-
skip('until puma responds with a date header')
|
|
41
|
-
else
|
|
42
|
-
time = Time.parse(response.headers['Date'])
|
|
43
|
-
expect(time.is_a?(Time)).to be true
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
it "['Server'] matches /^WEBrick/" do
|
|
48
|
-
pending('until unix_socket response has server header') if conn.data[:scheme] == Excon::UNIX
|
|
49
|
-
expect(!!(response.headers['Server'] =~ /^WEBrick/)).to be true
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it "['Custom'] returns Foo: bar" do
|
|
53
|
-
expect(response.headers['Custom']).to eq 'Foo: bar'
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
describe '#remote_ip' do
|
|
57
|
-
it 'returns 127.0.0.1' do
|
|
58
|
-
pending('until pigs can fly') if conn.data[:scheme] == Excon::UNIX
|
|
59
|
-
expect(response.remote_ip).to eq '127.0.0.1'
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
context('when tcp_nodelay is true') do
|
|
65
|
-
describe '#request' do
|
|
66
|
-
response = nil
|
|
67
|
-
options = opts.merge(ssl_verify_peer: false, nonblock: nonblock, tcp_nodelay: true)
|
|
68
|
-
connection = Excon.new(url, options)
|
|
69
|
-
|
|
70
|
-
it 'returns an Excon::Response' do
|
|
71
|
-
expect do
|
|
72
|
-
response = connection.request(method: :get, path: '/content-length/100')
|
|
73
|
-
end.to_not raise_error
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
describe Excon::Response do
|
|
77
|
-
describe '#body' do
|
|
78
|
-
describe '.status' do
|
|
79
|
-
it '#returns 200' do
|
|
80
|
-
expect(response.status).to eq 200
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
context 'when utilizing deprecated block usage' do
|
|
90
|
-
describe '#request' do
|
|
91
|
-
data = []
|
|
92
|
-
it 'yields with a chunk, remaining length, and total length' do
|
|
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]
|
|
96
|
-
end
|
|
97
|
-
end.to_not raise_error
|
|
98
|
-
end
|
|
99
|
-
it 'completes with expected data' do
|
|
100
|
-
expect(data).to eq ['x' * 100, 0, 100]
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
context 'when utilizing response_block usage' do
|
|
106
|
-
describe '#request' do
|
|
107
|
-
data = []
|
|
108
|
-
it 'yields a chunk, remaining length, and total_length' do
|
|
109
|
-
response_block = lambda do |chunk, remaining_length, total_length|
|
|
110
|
-
data = [chunk, remaining_length, total_length]
|
|
111
|
-
end
|
|
112
|
-
expect do
|
|
113
|
-
conn.request(method: :get, path: '/content-length/100', response_block: response_block)
|
|
114
|
-
end.to_not raise_error
|
|
115
|
-
end
|
|
116
|
-
it 'completes with expected data' do
|
|
117
|
-
expect(data).to eq ['x' * 100, 0, 100]
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
context 'when method is :post' do
|
|
122
|
-
context 'when :path is /body-sink' do
|
|
123
|
-
context 'when a body parameter is supplied' do
|
|
124
|
-
response = nil
|
|
125
|
-
it 'returns an Excon::Response' do
|
|
126
|
-
response = conn.request(method: :post, path: '/body-sink', headers: { 'Content-Type' => 'text/plain' }, body: 'x' * 5_000_000)
|
|
127
|
-
expect(response).to be_instance_of Excon::Response
|
|
128
|
-
end
|
|
129
|
-
describe Excon::Response do
|
|
130
|
-
describe '#body' do
|
|
131
|
-
it 'equals "5000000"' do
|
|
132
|
-
expect(response.body).to eq '5000000'
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
context 'when the body parameter is an empty string' do
|
|
138
|
-
response = nil
|
|
139
|
-
|
|
140
|
-
it 'returns an Excon::Response' do
|
|
141
|
-
response = conn.request(method: :post, path: '/body-sink', headers: { 'Content-Type' => 'text/plain' }, body: '')
|
|
142
|
-
expect(response).to be_instance_of Excon::Response
|
|
143
|
-
end
|
|
144
|
-
describe Excon::Response do
|
|
145
|
-
describe '#body' do
|
|
146
|
-
it 'equals "0"' do
|
|
147
|
-
expect(response.body).to eq '0'
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
context 'when :path is /echo' do
|
|
155
|
-
context('when a file handle is the body paramter') do
|
|
156
|
-
describe Excon::Response do
|
|
157
|
-
it '#body equals "x" * 100 + "\n"' do
|
|
158
|
-
file_path = data_path('xs')
|
|
159
|
-
response = conn.request(method: :post, path: '/echo', body: File.open(file_path))
|
|
160
|
-
expect(response.body).to eq 'x' * 100 + "\n"
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
context 'when a string is the body paramter' do
|
|
166
|
-
it 'does not change the econding of the body' do
|
|
167
|
-
skip unless RUBY_VERSION >= '1.9'
|
|
168
|
-
|
|
169
|
-
string_body = '¥£€'
|
|
170
|
-
expect do
|
|
171
|
-
conn.request(method: :post, path: '/echo', body: string_body)
|
|
172
|
-
end.to_not change { string_body.encoding }
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
context 'without request_block' do
|
|
176
|
-
describe Excon::Response do
|
|
177
|
-
it "#body equals 'x' * 100)" do
|
|
178
|
-
response = conn.request(method: :post, path: '/echo', body: 'x' * 100)
|
|
179
|
-
expect(response.body).to eq 'x' * 100
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
context 'when a request_block paramter is supplied' do
|
|
185
|
-
describe Excon::Response do
|
|
186
|
-
it "#body equals'x' * 100" do
|
|
187
|
-
data = ['x'] * 100
|
|
188
|
-
request_block = lambda do
|
|
189
|
-
data.shift.to_s
|
|
190
|
-
end
|
|
191
|
-
response = conn.request(method: :post, path: '/echo', request_block: request_block)
|
|
192
|
-
expect(response.body).to eq 'x' * 100
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
context('when a multi-byte string is the body paramter') do
|
|
198
|
-
body = "\xC3\xBC" * 100
|
|
199
|
-
headers = { 'Custom' => body.dup }
|
|
200
|
-
if RUBY_VERSION >= '1.9'
|
|
201
|
-
body.force_encoding('BINARY')
|
|
202
|
-
headers['Custom'].force_encoding('UTF-8')
|
|
203
|
-
end
|
|
204
|
-
describe Excon::Response do
|
|
205
|
-
it '#body properly concatenates request+headers and body' do
|
|
206
|
-
response = conn.request(method: :post, path: '/echo',
|
|
207
|
-
headers: headers, body: body)
|
|
208
|
-
expect(response.body).to eq body
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
shared_examples_for 'a streaming client' do |endpoint, timeout|
|
|
2
|
-
ret = []
|
|
3
|
-
timing = 'response times ok'
|
|
4
|
-
start = Time.now
|
|
5
|
-
block = lambda do |c,r,t|
|
|
6
|
-
# add the response
|
|
7
|
-
ret.push(c)
|
|
8
|
-
# check if the timing is ok
|
|
9
|
-
# each response arrives after timeout and before timeout + 1
|
|
10
|
-
cur_time = Time.now - start
|
|
11
|
-
if cur_time < ret.length * timeout or cur_time > (ret.length+1) * timeout
|
|
12
|
-
timing = 'response time not ok!'
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
it "gets a response in less than or equal to #{(timeout*3).round(2)} seconds" do
|
|
16
|
-
Excon.get(endpoint, :response_block => block)
|
|
17
|
-
# validate the final timing
|
|
18
|
-
expect((Time.now - start <= timeout*3) == true && timing == 'response times not ok!').to be false
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
shared_examples_for "a excon test server" do |plugin, file|
|
|
2
|
-
|
|
3
|
-
include_context("test server", plugin, file)
|
|
4
|
-
|
|
5
|
-
it "returns an instance" do
|
|
6
|
-
expect(@server).to be_instance_of Excon::Test::Server
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
it 'starts the server' do
|
|
10
|
-
expect(@server.start).to be true
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it 'stops the server' do
|
|
14
|
-
expect(@server.stop).to be true
|
|
15
|
-
end
|
|
16
|
-
end
|