httpi 4.0.3 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/httpi/version.rb +1 -1
  4. metadata +2 -50
  5. data/.devcontainer/devcontainer.json +0 -22
  6. data/.github/workflows/development.yml +0 -49
  7. data/.gitignore +0 -11
  8. data/.rspec +0 -1
  9. data/Gemfile +0 -22
  10. data/Rakefile +0 -18
  11. data/httpi.gemspec +0 -40
  12. data/spec/fixtures/attachment.gif +0 -0
  13. data/spec/fixtures/client_cert.pem +0 -20
  14. data/spec/fixtures/client_key.pem +0 -27
  15. data/spec/fixtures/xml.gz +0 -0
  16. data/spec/fixtures/xml.xml +0 -10
  17. data/spec/fixtures/xml_dime.dime +0 -0
  18. data/spec/fixtures/xml_dime.xml +0 -1
  19. data/spec/httpi/adapter/base_spec.rb +0 -23
  20. data/spec/httpi/adapter/curb_spec.rb +0 -351
  21. data/spec/httpi/adapter/em_http_spec.rb +0 -180
  22. data/spec/httpi/adapter/excon_spec.rb +0 -34
  23. data/spec/httpi/adapter/http_spec.rb +0 -28
  24. data/spec/httpi/adapter/httpclient_spec.rb +0 -238
  25. data/spec/httpi/adapter/net_http_persistent_spec.rb +0 -46
  26. data/spec/httpi/adapter/net_http_spec.rb +0 -54
  27. data/spec/httpi/adapter/rack_spec.rb +0 -109
  28. data/spec/httpi/adapter_spec.rb +0 -68
  29. data/spec/httpi/auth/config_spec.rb +0 -163
  30. data/spec/httpi/auth/ssl_spec.rb +0 -216
  31. data/spec/httpi/cookie_spec.rb +0 -36
  32. data/spec/httpi/cookie_store_spec.rb +0 -26
  33. data/spec/httpi/error_spec.rb +0 -43
  34. data/spec/httpi/httpi_spec.rb +0 -382
  35. data/spec/httpi/request_spec.rb +0 -290
  36. data/spec/httpi/response_spec.rb +0 -146
  37. data/spec/integration/curb_spec.rb +0 -140
  38. data/spec/integration/em_http_spec.rb +0 -108
  39. data/spec/integration/excon_spec.rb +0 -174
  40. data/spec/integration/fixtures/ca_all.pem +0 -19
  41. data/spec/integration/fixtures/server.cert +0 -19
  42. data/spec/integration/fixtures/server.key +0 -27
  43. data/spec/integration/http_spec.rb +0 -156
  44. data/spec/integration/httpclient_spec.rb +0 -137
  45. data/spec/integration/net_http_persistent_spec.rb +0 -171
  46. data/spec/integration/net_http_spec.rb +0 -282
  47. data/spec/integration/support/application.rb +0 -88
  48. data/spec/integration/support/server.rb +0 -83
  49. data/spec/spec_helper.rb +0 -23
  50. data/spec/support/error_helper.rb +0 -26
  51. data/spec/support/fixture.rb +0 -27
  52. data/spec/support/matchers.rb +0 -19
@@ -1,216 +0,0 @@
1
- require "spec_helper"
2
- require "httpi/auth/ssl"
3
-
4
- describe HTTPI::Auth::SSL do
5
- before(:all) do
6
- @ssl_versions = HTTPI::Auth::SSL::SSL_VERSIONS
7
- @min_max_versions = HTTPI::Auth::SSL::MIN_MAX_VERSIONS
8
- end
9
-
10
- describe "VERIFY_MODES" do
11
- it "contains the supported SSL verify modes" do
12
- expect(HTTPI::Auth::SSL::VERIFY_MODES).to eq([:none, :peer, :fail_if_no_peer_cert, :client_once])
13
- end
14
- end
15
-
16
- describe "#present?" do
17
- it "defaults to return false" do
18
- ssl = HTTPI::Auth::SSL.new
19
- expect(ssl).not_to be_present
20
- end
21
-
22
- it "returns false if only a client key was specified" do
23
- ssl = HTTPI::Auth::SSL.new
24
- ssl.cert_key_file = "spec/fixtures/client_key.pem"
25
-
26
- expect(ssl).not_to be_present
27
- end
28
-
29
- it "returns false if only a client key was specified" do
30
- ssl = HTTPI::Auth::SSL.new
31
- ssl.cert_file = "spec/fixtures/client_cert.pem"
32
-
33
- expect(ssl).not_to be_present
34
- end
35
-
36
- it "returns true if both client key and cert are present" do
37
- expect(ssl).to be_present
38
- end
39
-
40
- it "returns true of the verify_mode is :none" do
41
- ssl = HTTPI::Auth::SSL.new
42
- ssl.verify_mode = :none
43
- expect(ssl).to be_present
44
- end
45
- end
46
-
47
- describe "#verify_mode" do
48
- it "defaults to return :peer" do
49
- expect(ssl.verify_mode).to eq(:peer)
50
- end
51
-
52
- it "sets the verify mode to use" do
53
- ssl = HTTPI::Auth::SSL.new
54
-
55
- ssl.verify_mode = :none
56
- expect(ssl.verify_mode).to eq(:none)
57
- end
58
-
59
- it "raises an ArgumentError if the given mode is not supported" do
60
- expect { ssl.verify_mode = :invalid }.
61
- to raise_error(ArgumentError, "Invalid SSL verify mode :invalid\n" +
62
- "Please specify one of [:none, :peer, :fail_if_no_peer_cert, :client_once]")
63
- end
64
- end
65
-
66
- describe "#cert" do
67
- it "returns an OpenSSL::X509::Certificate for the given cert_file" do
68
- expect(ssl.cert).to be_a(OpenSSL::X509::Certificate)
69
- end
70
-
71
- it "returns nil if no cert_file was given" do
72
- ssl = HTTPI::Auth::SSL.new
73
- expect(ssl.cert).to be_nil
74
- end
75
-
76
- it "returns the explicitly given certificate if set" do
77
- ssl = HTTPI::Auth::SSL.new
78
- cert = OpenSSL::X509::Certificate.new
79
- ssl.cert = cert
80
- expect(ssl.cert).to eq(cert)
81
- end
82
- end
83
-
84
- describe "#cert_key" do
85
- it "returns a OpenSSL::PKey::RSA for the given cert_key" do
86
- expect(ssl.cert_key).to be_a(OpenSSL::PKey::RSA)
87
- end
88
-
89
- it "returns nil if no cert_key_file was given" do
90
- ssl = HTTPI::Auth::SSL.new
91
- expect(ssl.cert_key).to be_nil
92
- end
93
-
94
- it "returns the explicitly given key if set" do
95
- ssl = HTTPI::Auth::SSL.new
96
- key = OpenSSL::PKey::RSA.new
97
- ssl.cert_key = key
98
- expect(ssl.cert_key).to eq(key)
99
- end
100
- end
101
-
102
- describe "#ca_cert" do
103
- it "returns an OpenSSL::X509::Certificate for the given ca_cert_file" do
104
- ssl = HTTPI::Auth::SSL.new
105
-
106
- ssl.ca_cert_file = "spec/fixtures/client_cert.pem"
107
- expect(ssl.ca_cert).to be_a(OpenSSL::X509::Certificate)
108
- end
109
- end
110
-
111
- describe "#openssl_verify_mode" do
112
- it "returns the OpenSSL verify mode for :none" do
113
- ssl = HTTPI::Auth::SSL.new
114
-
115
- ssl.verify_mode = :none
116
- expect(ssl.openssl_verify_mode).to eq(OpenSSL::SSL::VERIFY_NONE)
117
- end
118
-
119
- it "returns the OpenSSL verify mode for :peer" do
120
- ssl = HTTPI::Auth::SSL.new
121
-
122
- ssl.verify_mode = :peer
123
- expect(ssl.openssl_verify_mode).to eq(OpenSSL::SSL::VERIFY_PEER)
124
- end
125
-
126
- it "returns the OpenSSL verify mode for :fail_if_no_peer_cert" do
127
- ssl = HTTPI::Auth::SSL.new
128
-
129
- ssl.verify_mode = :fail_if_no_peer_cert
130
- expect(ssl.openssl_verify_mode).to eq(OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT)
131
- end
132
-
133
- it "returns the OpenSSL verify mode for :client_once" do
134
- ssl = HTTPI::Auth::SSL.new
135
-
136
- ssl.verify_mode = :client_once
137
- expect(ssl.openssl_verify_mode).to eq(OpenSSL::SSL::VERIFY_CLIENT_ONCE)
138
- end
139
- end
140
-
141
- describe "SSL_VERSIONS" do
142
- it "contains the supported SSL versions" do
143
- expect(HTTPI::Auth::SSL::SSL_VERSIONS).to eq(@ssl_versions)
144
- end
145
- end
146
-
147
- describe "#ssl_version" do
148
- subject { HTTPI::Auth::SSL.new }
149
-
150
- it "returns the SSL version" do
151
- subject.ssl_version = @ssl_versions.first
152
- expect(subject.ssl_version).to eq(@ssl_versions.first)
153
- end
154
-
155
- it 'raises ArgumentError if the version is unsupported' do
156
- expect { ssl.ssl_version = :ssl_fail }.
157
- to raise_error(ArgumentError, "Invalid SSL version :ssl_fail\n" +
158
- "Please specify one of #{@ssl_versions}")
159
- end
160
- end
161
-
162
- describe "#min_version" do
163
- subject { HTTPI::Auth::SSL.new }
164
-
165
- it "returns the min_version" do
166
- subject.min_version = @min_max_versions.first
167
- expect(subject.min_version).to eq(@min_max_versions.first)
168
- end
169
-
170
- it 'raises ArgumentError if the version is unsupported' do
171
- expect { ssl.min_version = :ssl_fail }.
172
- to raise_error(ArgumentError, "Invalid SSL min_version :ssl_fail\n" +
173
- "Please specify one of #{@min_max_versions}")
174
- end
175
- end
176
-
177
- describe "#max_version" do
178
- subject { HTTPI::Auth::SSL.new }
179
-
180
- it "returns the SSL version" do
181
- subject.max_version = @min_max_versions.first
182
- expect(subject.max_version).to eq(@min_max_versions.first)
183
- end
184
-
185
- it 'raises ArgumentError if the version is unsupported' do
186
- expect { ssl.max_version = :ssl_fail }.
187
- to raise_error(ArgumentError, "Invalid SSL max_version :ssl_fail\n" +
188
- "Please specify one of #{@min_max_versions}")
189
- end
190
- end
191
-
192
- describe '#ciphers' do
193
- subject { ssl.ciphers }
194
- let(:ssl) { HTTPI::Auth::SSL.new }
195
-
196
- context 'without ciphers' do
197
- before { ssl.ciphers = nil }
198
-
199
- it { is_expected.to eq(nil) }
200
- end
201
-
202
- context 'with ciphers' do
203
- before { ssl.ciphers = OpenSSL::SSL::SSLContext.new.ciphers }
204
-
205
- it { is_expected.to be_any.and(all(be_an_instance_of(String))) }
206
- end
207
- end
208
-
209
- def ssl
210
- ssl = HTTPI::Auth::SSL.new
211
- ssl.cert_key_file = "spec/fixtures/client_key.pem"
212
- ssl.cert_file = "spec/fixtures/client_cert.pem"
213
- ssl
214
- end
215
-
216
- end
@@ -1,36 +0,0 @@
1
- require "spec_helper"
2
- require "httpi"
3
-
4
- describe HTTPI::Cookie do
5
-
6
- let(:cookie) { HTTPI::Cookie.new("token=choc-choc-chip; Path=/; HttpOnly") }
7
-
8
- describe ".list_from_headers" do
9
- it "returns a list of cookies from a Hash of headers" do
10
- headers = { "Set-Cookie" => "token=strawberry; Path=/; HttpOnly" }
11
- cookies = HTTPI::Cookie.list_from_headers(headers)
12
-
13
- expect(cookies.size).to eq(1)
14
- expect(cookies.first).to be_a(HTTPI::Cookie)
15
- end
16
-
17
- it "handles multiple cookies" do
18
- headers = { "Set-Cookie" => ["user=chucknorris; Path=/; HttpOnly", "token=strawberry; Path=/; HttpOnly"] }
19
- cookies = HTTPI::Cookie.list_from_headers(headers)
20
- expect(cookies.size).to eq(2)
21
- end
22
- end
23
-
24
- describe "#name" do
25
- it "returns the name of the cookie" do
26
- expect(cookie.name).to eq("token")
27
- end
28
- end
29
-
30
- describe "#name_and_value" do
31
- it "returns the name and value of the cookie" do
32
- expect(cookie.name_and_value).to eq("token=choc-choc-chip")
33
- end
34
- end
35
-
36
- end
@@ -1,26 +0,0 @@
1
- require "spec_helper"
2
- require "httpi"
3
-
4
- describe HTTPI::CookieStore do
5
-
6
- let(:user_cookie) { some_cookie(:user, "chucknorris") }
7
- let(:token_cookie) { some_cookie(:token, "strawberry") }
8
-
9
- it "stores a set of cookies" do
10
- cookie_store = HTTPI::CookieStore.new
11
- cookie_store.add(user_cookie, token_cookie)
12
- expect(cookie_store.fetch).to include("user=chucknorris", "token=strawberry")
13
-
14
- # add a new token cookie with a different value
15
- token_cookie = some_cookie(:token, "choc-choc-chip")
16
- cookie_store.add(token_cookie)
17
-
18
- expect(cookie_store.fetch).to include("token=choc-choc-chip")
19
- expect(cookie_store.fetch).not_to include("token=strawberry")
20
- end
21
-
22
- def some_cookie(name, value)
23
- HTTPI::Cookie.new("#{name}=#{value}; Path=/; HttpOnly")
24
- end
25
-
26
- end
@@ -1,43 +0,0 @@
1
- require "spec_helper"
2
- require "support/error_helper"
3
-
4
- describe HTTPI do
5
- include ErrorHelper
6
-
7
- context "with :httpclient" do
8
- it "tags Errno::ECONNREFUSED with HTTPI::ConnectionError" do
9
- expect_error(Errno::ECONNREFUSED, "Connection refused - connect(2)").to be_tagged_with(HTTPI::ConnectionError)
10
- end
11
-
12
- def fake_error(error, message)
13
- request(:httpclient) { |client| client.expects(:request).raises(error, message) }
14
- end
15
- end
16
-
17
- unless RUBY_PLATFORM =~ /java/
18
- context "with :curb" do
19
- it "tags Curl::Err::ConnectionFailedError with HTTPI::ConnectionError" do
20
- expect_error(Curl::Err::ConnectionFailedError, "Curl::Err::ConnectionFailedError").to be_tagged_with(HTTPI::ConnectionError)
21
- end
22
-
23
- def fake_error(error, message)
24
- request(:curb) { |client| client.expects(:send).raises(error, message) }
25
- end
26
- end
27
- end
28
-
29
- context "with :net_http" do
30
- it "tags Errno::ECONNREFUSED with HTTPI::ConnectionError" do
31
- expect_error(Errno::ECONNREFUSED, "Connection refused - connect(2)").to be_tagged_with(HTTPI::ConnectionError)
32
- end
33
-
34
- def fake_error(error, message)
35
- request(:net_http) { |client| client.expects(:start).raises(error, message) }
36
- end
37
- end
38
-
39
- def request(adapter)
40
- HTTPI.get("http://example.com", adapter) { |client| yield client }
41
- end
42
-
43
- end
@@ -1,382 +0,0 @@
1
- require "spec_helper"
2
- require "integration/support/server"
3
-
4
- # find out why httpi doesn't load these automatically. [dh, 2012-12-15]
5
- require "excon"
6
- require "net/http/persistent"
7
- require "http"
8
-
9
- unless RUBY_PLATFORM =~ /java/
10
- require "em-synchrony"
11
- require "em-http-request"
12
- require "curb"
13
- end
14
-
15
- describe HTTPI do
16
- let(:client) { HTTPI }
17
- let(:httpclient) { HTTPI::Adapter.load(:httpclient) }
18
- let(:net_http) { HTTPI::Adapter.load(:net_http) }
19
- let(:net_http_persistent) { HTTPI::Adapter.load(:net_http_persistent) }
20
-
21
- before(:all) do
22
- HTTPI::Adapter::Rack.mount('example.com', IntegrationServer::Application)
23
- end
24
-
25
- after(:all) do
26
- HTTPI::Adapter::Rack.unmount('example.com')
27
- end
28
-
29
- describe ".adapter=" do
30
- it "sets the default adapter to use" do
31
- HTTPI::Adapter.expects(:use=).with(:net_http)
32
- HTTPI.adapter = :net_http
33
- end
34
- end
35
-
36
- describe ".adapter_client_setup=" do
37
- after do
38
- HTTPI.adapter_client_setup = nil
39
- end
40
-
41
- it "sets the adapter client setup block" do
42
- block = proc { }
43
- HTTPI.adapter_client_setup = block
44
- expect(HTTPI::Adapter.client_setup_block).to eq(block)
45
- end
46
- end
47
-
48
- describe ".query_builder" do
49
- it "gets flat builder by default" do
50
- expect(client.query_builder).to eq(HTTPI::QueryBuilder::Flat)
51
- end
52
- context "setter" do
53
- after { client.query_builder = HTTPI::QueryBuilder::Flat }
54
- it "looks up for class if symbol" do
55
- client.query_builder = :nested
56
- expect(client.query_builder).to eq(HTTPI::QueryBuilder::Nested)
57
- end
58
- it "validates if symbol is a valid option" do
59
- expect do
60
- client.query_builder = :xxx
61
- end.to raise_error(ArgumentError)
62
- end
63
- it "validates if value respond to build" do
64
- expect do
65
- client.query_builder = nil
66
- end.to raise_error(ArgumentError)
67
- end
68
- it "accepts valid class" do
69
- client.query_builder = HTTPI::QueryBuilder::Nested
70
- expect(client.query_builder).to eq(HTTPI::QueryBuilder::Nested)
71
- end
72
- end
73
- end
74
-
75
- describe ".get(request)" do
76
- it "executes a GET request using the default adapter" do
77
- request = HTTPI::Request.new("http://example.com")
78
- httpclient.any_instance.expects(:request).with(:get)
79
-
80
- client.get(request)
81
- end
82
- end
83
-
84
- describe ".get(request, adapter)" do
85
- it "executes a GET request using the given adapter" do
86
- request = HTTPI::Request.new("http://example.com")
87
- net_http.any_instance.expects(:request).with(:get)
88
-
89
- client.get(request, :net_http)
90
- end
91
- end
92
-
93
- describe ".get(url)" do
94
- it "executes a GET request using the default adapter" do
95
- httpclient.any_instance.expects(:request).with(:get)
96
- client.get("http://example.com")
97
- end
98
- end
99
-
100
- describe ".get(url, adapter)" do
101
- it "executes a GET request using the given adapter" do
102
- net_http.any_instance.expects(:request).with(:get)
103
- client.get("http://example.com", :net_http)
104
- end
105
- end
106
-
107
- describe ".post(request)" do
108
- it "executes a POST request using the default adapter" do
109
- request = HTTPI::Request.new("http://example.com")
110
- httpclient.any_instance.expects(:request).with(:post)
111
-
112
- client.post(request)
113
- end
114
- end
115
-
116
- describe ".post(request, adapter)" do
117
- it "executes a POST request using the given adapter" do
118
- request = HTTPI::Request.new("http://example.com")
119
- net_http.any_instance.expects(:request).with(:post, anything)
120
-
121
- client.post(request, :net_http)
122
- end
123
- end
124
-
125
- describe ".post(url, body)" do
126
- it "executes a POST request using the default adapter" do
127
- httpclient.any_instance.expects(:request).with(:post)
128
- client.post("http://example.com", "<some>xml</some>")
129
- end
130
- end
131
-
132
- describe ".post(url, body, adapter)" do
133
- it "executes a POST request using the given adapter" do
134
- net_http.any_instance.expects(:request).with(:post)
135
- client.post("http://example.com", "<some>xml</some>", :net_http)
136
- end
137
- end
138
-
139
- describe ".head(request)" do
140
- it "executes a HEAD request using the default adapter" do
141
- request = HTTPI::Request.new("http://example.com")
142
- httpclient.any_instance.expects(:request).with(:head, anything)
143
-
144
- client.head(request)
145
- end
146
- end
147
-
148
- describe ".head(request, adapter)" do
149
- it "executes a HEAD request using the given adapter" do
150
- request = HTTPI::Request.new("http://example.com")
151
- net_http.any_instance.expects(:request).with(:head, anything)
152
-
153
- client.head(request, :net_http)
154
- end
155
- end
156
-
157
- describe ".head(url)" do
158
- it "executes a HEAD request using the default adapter" do
159
- httpclient.any_instance.expects(:request).with(:head)
160
- client.head("http://example.com")
161
- end
162
- end
163
-
164
- describe ".head(url, adapter)" do
165
- it "executes a HEAD request using the given adapter" do
166
- net_http.any_instance.expects(:request).with(:head)
167
- client.head("http://example.com", :net_http)
168
- end
169
- end
170
-
171
- describe ".put(request)" do
172
- it "executes a PUT request using the default adapter" do
173
- request = HTTPI::Request.new("http://example.com")
174
- httpclient.any_instance.expects(:request).with(:put, anything)
175
-
176
- client.put(request)
177
- end
178
- end
179
-
180
- describe ".put(request, adapter)" do
181
- it "executes a PUT request using the given adapter" do
182
- request = HTTPI::Request.new("http://example.com")
183
- net_http.any_instance.expects(:request).with(:put, anything)
184
-
185
- client.put(request, :net_http)
186
- end
187
- end
188
-
189
- describe ".put(url, body)" do
190
- it "executes a PUT request using the default adapter" do
191
- httpclient.any_instance.expects(:request).with(:put)
192
- client.put("http://example.com", "<some>xml</some>")
193
- end
194
- end
195
-
196
- describe ".put(url, body, adapter)" do
197
- it "executes a PUT request using the given adapter" do
198
- net_http.any_instance.expects(:request).with(:put)
199
- client.put("http://example.com", "<some>xml</some>", :net_http)
200
- end
201
- end
202
-
203
- describe ".delete(request)" do
204
- it "executes a DELETE request using the default adapter" do
205
- request = HTTPI::Request.new("http://example.com")
206
- httpclient.any_instance.expects(:request).with(:delete, anything)
207
-
208
- client.delete(request)
209
- end
210
- end
211
-
212
- describe ".delete(request, adapter)" do
213
- it "executes a DELETE request using the given adapter" do
214
- request = HTTPI::Request.new("http://example.com")
215
- net_http.any_instance.expects(:request).with(:delete, anything)
216
-
217
- client.delete(request, :net_http)
218
- end
219
- end
220
-
221
- describe ".delete(url)" do
222
- it "executes a DELETE request using the default adapter" do
223
- httpclient.any_instance.expects(:request).with(:delete)
224
- client.delete("http://example.com")
225
- end
226
- end
227
-
228
- describe ".delete(url, adapter)" do
229
- it "executes a DELETE request using the given adapter" do
230
- net_http.any_instance.expects(:request).with(:delete)
231
- client.delete("http://example.com", :net_http)
232
- end
233
- end
234
-
235
- describe ".request" do
236
- let(:request) { HTTPI::Request.new('http://example.com/foo/') }
237
-
238
- it "allows custom HTTP methods" do
239
- httpclient.any_instance.expects(:request).with(:custom)
240
-
241
- client.request(:custom, request, :httpclient)
242
- end
243
-
244
- it 'follows redirects' do
245
- request.follow_redirect = true
246
- redirect_location = 'http://foo.bar'
247
-
248
- redirect = HTTPI::Response.new(302, {'location' => redirect_location}, 'Moved')
249
- response = HTTPI::Response.new(200, {}, 'success')
250
-
251
- httpclient.any_instance.expects(:request).twice.with(:custom).returns(redirect, response)
252
- request.expects(:url=).with(URI.parse(redirect_location))
253
-
254
- client.request(:custom, request, :httpclient)
255
- end
256
-
257
- it 'follows redirects with absolute path' do
258
- request.follow_redirect = true
259
- redirect_location = '/bar/foo'
260
-
261
- redirect = HTTPI::Response.new(302, {'location' => redirect_location}, 'Moved')
262
- response = HTTPI::Response.new(200, {}, 'success')
263
-
264
- httpclient.any_instance.expects(:request).twice.with(:custom).returns(redirect, response)
265
- request.expects(:url=).with(URI.parse('http://example.com/bar/foo'))
266
-
267
- client.request(:custom, request, :httpclient)
268
- end
269
-
270
- it 'follows redirects with relative path' do
271
- request.follow_redirect = true
272
- redirect_location = 'bar/foo'
273
-
274
- redirect = HTTPI::Response.new(302, {'location' => redirect_location}, 'Moved')
275
- response = HTTPI::Response.new(200, {}, 'success')
276
-
277
- httpclient.any_instance.expects(:request).twice.with(:custom).returns(redirect, response)
278
- request.expects(:url=).with(URI.parse('http://example.com/foo/bar/foo'))
279
-
280
- client.request(:custom, request, :httpclient)
281
- end
282
-
283
- it 'follows redirects at maximum of the redirect limit' do
284
- request.follow_redirect = true
285
- request.redirect_limit = 2
286
- redirect_location = 'http://foo.bar'
287
-
288
- redirect = HTTPI::Response.new(302, {'location' => redirect_location}, 'Moved')
289
- response = HTTPI::Response.new(200, {}, 'success')
290
-
291
- httpclient.any_instance.expects(:request).times(2).with(:custom).returns(redirect, response)
292
- request.expects(:url=).with(URI.parse(redirect_location))
293
-
294
- client.request(:custom, request, :httpclient)
295
- end
296
-
297
- describe "client setup block present" do
298
- around do |example|
299
- HTTPI::Adapter.client_setup_block = proc { |client| client.base_url = 'https://google.com' }
300
- example.run
301
- HTTPI::Adapter.client_setup_block = nil
302
- end
303
-
304
- it 'calls client setup block' do
305
- client.request(:get, request, :httpclient) { |client| expect(client.base_url).to eq('https://google.com') }
306
- end
307
- end
308
- end
309
-
310
- HTTPI::REQUEST_METHODS.each do |method|
311
- describe ".#{method}" do
312
- let(:request) { HTTPI::Request.new("http://example.com") }
313
-
314
- it "raises an ArgumentError in case of an invalid adapter" do
315
- expect { client.request method, request, :invalid }.to raise_error(ArgumentError)
316
- end
317
-
318
- HTTPI::Adapter::ADAPTERS.each do |adapter, opts|
319
- unless (adapter == :em_http || adapter == :curb) && RUBY_PLATFORM =~ /java/
320
- client_class = {
321
- :httpclient => lambda { HTTPClient },
322
- :curb => lambda { Curl::Easy },
323
- :net_http => lambda { Net::HTTP },
324
- :net_http_persistent => lambda { Net::HTTP::Persistent },
325
- :em_http => lambda { EventMachine::HttpConnection },
326
- :rack => lambda { Rack::MockRequest },
327
- :excon => lambda { Excon::Connection },
328
- :http => lambda { ::HTTP::Client }
329
- }
330
-
331
- context "using #{adapter}" do
332
- before { opts[:class].any_instance.expects(:request).with(method) }
333
-
334
- it "#request yields the HTTP client instance" do
335
- expect { |b| client.request(method, request, adapter, &b) }.to yield_with_args(client_class[adapter].call)
336
- end
337
-
338
- it "##{method} yields the HTTP client instance" do
339
- expect { |b| client.send(method, request, adapter, &b) }.to yield_with_args(client_class[adapter].call)
340
- end
341
- end
342
- end
343
- end
344
- end
345
- end
346
-
347
- context "(with reset)" do
348
- before { HTTPI.reset_config! }
349
-
350
- after do
351
- HTTPI.reset_config!
352
- HTTPI.log = false # disable for specs
353
- end
354
-
355
- describe ".log" do
356
- it "defaults to true" do
357
- expect(HTTPI.log?).to be_truthy
358
- end
359
- end
360
-
361
- describe ".logger" do
362
- it "defaults to Logger writing to STDOUT" do
363
- expect(HTTPI.logger).to be_a(Logger)
364
- end
365
- end
366
-
367
- describe ".log_level" do
368
- it "defaults to :debug" do
369
- expect(HTTPI.log_level).to eq(:debug)
370
- end
371
- end
372
-
373
- describe ".log" do
374
- it "logs the given messages" do
375
- HTTPI.log_level = :info
376
- HTTPI.logger.expects(:info).with("Log this")
377
- HTTPI.log "Log this"
378
- end
379
- end
380
- end
381
-
382
- end