Commit 5e327cc
Changed files (5)
lib/net/hippie/client.rb
@@ -12,18 +12,20 @@ module Net
attr_accessor :mapper, :read_timeout, :open_timeout, :logger
attr_accessor :follow_redirects
-
- def initialize(certificate: nil, headers: DEFAULT_HEADERS,
- key: nil, passphrase: nil, verify_mode: Net::Hippie.verify_mode)
- @certificate = certificate
- @default_headers = headers
- @key = key
- @mapper = ContentTypeMapper.new
- @passphrase = passphrase
- @read_timeout = 30
- @verify_mode = verify_mode
- @logger = Net::Hippie.logger
- @follow_redirects = 0
+ attr_accessor :certificate, :key, :passphrase
+
+ def initialize(options = {})
+ @default_headers = options.fetch(:headers, DEFAULT_HEADERS)
+ @mapper = options.fetch(:mapper, ContentTypeMapper.new)
+ @read_timeout = options.fetch(:read_timeout, 10)
+ @open_timeout = options.fetch(:open_timeout, 10)
+ @verify_mode = options.fetch(:verify_mode, Net::Hippie.verify_mode)
+ @logger = options.fetch(:logger, Net::Hippie.logger)
+ @follow_redirects = options.fetch(:follow_redirects, 0)
+ @certificate = options[:certificate]
+ @key = options[:key]
+ @passphrase = options[:passphrase]
+ @connections = {}
end
def execute(uri, request, limit: follow_redirects, &block)
@@ -79,7 +81,6 @@ module Net
private
attr_reader :default_headers, :verify_mode
- attr_reader :certificate, :key, :passphrase
def attempt(attempt, max)
yield
@@ -92,15 +93,18 @@ module Net
end
def http_for(uri)
- uri = URI.parse(uri.to_s)
- http = Net::HTTP.new(uri.host, uri.port)
- http.read_timeout = read_timeout
- http.open_timeout = open_timeout if open_timeout
- http.use_ssl = uri.scheme == 'https'
- http.verify_mode = verify_mode
- http.set_debug_output(logger)
- apply_client_tls_to(http)
- http
+ @connections.fetch(uri.to_s) do |key|
+ uri = URI.parse(uri.to_s)
+ http = Net::HTTP.new(uri.host, uri.port)
+ http.read_timeout = read_timeout
+ http.open_timeout = open_timeout
+ http.use_ssl = uri.scheme == 'https'
+ http.verify_mode = verify_mode
+ http.set_debug_output(logger)
+ apply_client_tls_to(http)
+ @connections[key] = http
+ http
+ end
end
def request_for(type, uri, headers: {}, body: {})
lib/net/hippie.rb
@@ -52,5 +52,15 @@ module Net
def self.bearer_auth(token)
"Bearer #{token}"
end
+
+ def self.method_missing(symbol, *args)
+ default_client.with_retry(retries: 3) do |client|
+ client.public_send(symbol, *args)
+ end
+ end
+
+ def self.default_client
+ @subject ||= Client.new
+ end
end
end
test/net/client_test.rb
@@ -306,8 +306,8 @@ class ClientTest < Minitest::Test
end
def test_open_timeout_setting
- assert_nil subject.open_timeout
- @subject.open_timeout = 10
assert_equal subject.open_timeout, 10
+ @subject.open_timeout = 5
+ assert_equal subject.open_timeout, 5
end
end
test/net/hippie_test.rb
@@ -21,4 +21,17 @@ class HippieTest < Minitest::Test
Net::Hippie.verify_mode = OpenSSL::SSL::VERIFY_NONE
assert Net::Hippie.verify_mode == OpenSSL::SSL::VERIFY_NONE
end
+
+ def test_get_with_retry
+ uri = URI.parse('https://www.example.org/api/scim/v2/schemas')
+ WebMock.stub_request(:get, uri.to_s)
+ .to_timeout.then
+ .to_timeout.then
+ .to_timeout.then
+ .to_return(status: 200, body: { 'success' => 'true' }.to_json)
+ response = Net::Hippie.get(uri)
+ refute_nil response
+ assert_equal Net::HTTPOK, response.class
+ assert_equal JSON.parse(response.body)['success'], 'true'
+ end
end
README.md
@@ -3,8 +3,8 @@
[](https://rubygems.org/gems/net-hippie)
[](https://travis-ci.org/mokhan/net-hippie)
-Net::Hippie is a light weight wrapper around `net/http` that defaults to
-sending JSON messages.
+`Net::Hippie` is a light weight wrapper around `net/http` that defaults to
+sending `JSON` messages.
## Installation
@@ -27,23 +27,22 @@ Or install it yourself as:
```ruby
require 'net/hippie'
-Net::Hippie.logger = Rails.logger
-
-client = Net::Hippie::Client.new
+Net::Hippie.logger = Logger.new(STDERR)
headers = {
'Accept' => 'application/vnd.haveibeenpwned.v2+json'
}
-uri = URI.parse('https://haveibeenpwned.com/api/breaches')
-response = client.get(uri, headers: headers)
+uri = 'https://haveibeenpwned.com/api/breaches'
+response = Net::Hippie.get(uri, headers: headers)
puts JSON.parse(response.body)
```
```ruby
-client = Net::Hippie::Client.new
-body = { user: { name: 'hippie' } }
-response = client.post(URI.parse('https://example.org'), body: body)
+response = Net::Hippie.post(
+ 'https://example.org',
+ body: { name: 'hippie' }
+)
puts JSON.parse(response.body)
```
@@ -69,24 +68,30 @@ client = Net::Hippie::Client.new(
### Basic Auth
```ruby
-client = Net::Hippie::Client.new
-headers = { 'Authorization' => Net::Hippie.basic_auth('username', 'password') }
-client.get('https://www.example.org', headers: headers)
+Net::Hippie.get(
+ 'https://www.example.org',
+ headers: {
+ 'Authorization' => Net::Hippie.basic_auth('username', 'password')
+ }
+)
```
### Bearer Auth
```ruby
-client = Net::Hippie::Client.new
headers = { 'Authorization' => Net::Hippie.bearer_auth('token') }
-client.get('https://www.example.org', headers: headers)
+Net::Hippie.get('https://www.example.org', headers: headers)
```
## Development
-After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
+After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/test` to run the tests.
+You can also run `bin/console` for an interactive prompt that will allow you to experiment.
-To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
+To install this gem onto your local machine, run `bundle exec rake install`.
+To release a new version, update the version number in `version.rb`,
+and then run `bin/shipit`, which will create a git tag for the version,
+push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing