excon 0.62.0 → 0.92.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|