nypl_sierra_api_client 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nypl_sierra_api_client.rb +43 -14
  3. metadata +4 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 227304609f16f96cf643ec758501e7ba23952da2c77cc513d6b08781622da9a8
4
- data.tar.gz: a723fc2eb6e3fc3e33937c513eaddaa05d7a194b9f11fc8eb12f9d2cfd7da594
3
+ metadata.gz: 82e6e4a869d4151703b816abea4f6774b015be7d0a6703648de2306ed42a20da
4
+ data.tar.gz: 1aa79afd819567f025bc049bbd8f2c5e16613a807161deb045b3475fca4558d8
5
5
  SHA512:
6
- metadata.gz: 213eed76eb255b12e38b00d7460dfb91bc8fac2afa2c92e025fb62019bee8a35d3c664b4713988865ed6b57327b736f3301858a40ae3a8019fad24e50342eb0e
7
- data.tar.gz: 97b00de6b5114deb32da9e72b3490e03e26077c9e23db72f015adc584c5a56a6b912798156fd59021c3d9a43840755b96c4e2b92a113c0a6216cde9edbb53cd5
6
+ metadata.gz: 69e7d9f2889259802eeb7cb48a97251cb713e8cdddb30189300c2ba49c2847caa040b69641ada2a8e6a2269dec240fda6f3bd5ab03a8029fb5072d8e851b05ca
7
+ data.tar.gz: dc5e94f8650598f978dc068eacb3b76dd9eca87fb6f41ee5b489f62fe8279a51898bb24d79c4dd7b1be1c6933a6071dccc2b73ce37270f7bbe0a3b9c692fed1a
@@ -27,6 +27,8 @@ class SierraApiClient
27
27
  config_defaults[:env].each do |key, value|
28
28
  raise SierraApiClientError.new "Missing config: neither config.#{key} nor ENV.#{value} are set" unless @config[key]
29
29
  end
30
+
31
+ @retries = 0
30
32
  end
31
33
 
32
34
  def get (path, options = {})
@@ -55,17 +57,14 @@ class SierraApiClient
55
57
 
56
58
  authenticate! if options[:authenticated]
57
59
 
58
- uri = URI.parse("#{@config[:base_url]}#{path}")
59
-
60
- http = Net::HTTP.new(uri.host, uri.port)
61
- http.use_ssl = uri.scheme === 'https'
60
+ @uri = URI.parse("#{@config[:base_url]}#{path}")
62
61
 
63
62
  # Build request headers:
64
63
  request_headers = {}
65
64
  request_headers['Content-Type'] = options[:headers]['Content-Type'] unless options.dig(:headers, 'Content-Type').nil?
66
65
 
67
66
  # Create HTTP::Get or HTTP::Post
68
- request = Net::HTTP.const_get(method.capitalize).new(uri, request_headers)
67
+ request = Net::HTTP.const_get(method.capitalize).new(@uri, request_headers)
69
68
 
70
69
  # Add bearer token header
71
70
  request['Authorization'] = "Bearer #{@access_token}" if options[:authenticated]
@@ -73,31 +72,57 @@ class SierraApiClient
73
72
  # Allow caller to modify the request before we send it off:
74
73
  yield request if block_given?
75
74
 
76
- logger.debug "SierraApiClient: #{method} to Sierra api", { uri: uri, body: request.body }
75
+ logger.debug "SierraApiClient: #{method} to Sierra api", { uri: @uri, body: request.body }
76
+
77
+ execute request, options
78
+ end
79
+
80
+ def execute (request, options)
81
+ http = Net::HTTP.new(@uri.host, @uri.port)
82
+ http.use_ssl = @uri.scheme === 'https'
77
83
 
78
84
  begin
79
- # Execute request:
80
85
  response = http.request(request)
86
+ logger.debug "SierraApiClient: Got Sierra api response", { code: response.code, body: response.body }
81
87
  rescue => e
82
- raise SierraApiClientError.new(e), "Failed to #{method} to #{path}: #{e.message}"
88
+ raise SierraApiClientError.new "Failed to #{request.method} to #{request.path}: #{e.message}"
83
89
  end
84
90
 
85
- logger.debug "SierraApiClient: Got Sierra api response", { code: response.code, body: response.body }
86
-
87
- parse_response response
91
+ handle_response response, request, options
88
92
  end
89
93
 
90
- def parse_response (response)
94
+ def handle_response (response, request, options)
91
95
  if response.code == "401"
92
96
  # Likely an expired access-token; Wipe it for next run
93
- # TODO: Implement token refresh
94
97
  @access_token = nil
95
- raise SierraApiClientTokenError.new("Got a 401: #{response.body}")
98
+ if @retries < 3
99
+ if options[:authenticated]
100
+ logger.debug "SierraApiClient: Refreshing oauth token for 401", { code: 401, body: response.body, retry: @retries }
101
+
102
+ return reauthenticate_and_reattempt request, options
103
+ end
104
+ else
105
+ retries_exceeded = true
106
+ end
107
+
108
+ reset_retries
109
+ message = "Got a 401: #{retries_exceeded ? "Maximum retries exceeded, " : ''}#{response.body}"
110
+ raise SierraApiClientTokenError.new(message)
96
111
  end
97
112
 
113
+ reset_retries if @retries > 0
98
114
  SierraApiResponse.new(response)
99
115
  end
100
116
 
117
+ def reauthenticate_and_reattempt request, options
118
+ @retries += 1
119
+ authenticate!
120
+ # Reset bearer token header
121
+ request['Authorization'] = "Bearer #{@access_token}"
122
+
123
+ execute request, options
124
+ end
125
+
101
126
  def parse_http_options (_options)
102
127
  options = {
103
128
  authenticated: true
@@ -143,4 +168,8 @@ class SierraApiClient
143
168
  def logger
144
169
  @logger ||= NyplLogFormatter.new(STDOUT, level: @config[:log_level])
145
170
  end
171
+
172
+ def reset_retries
173
+ @retries = 0
174
+ end
146
175
  end
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nypl_sierra_api_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nonword
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2020-04-21 00:00:00.000000000 Z
@@ -23,7 +23,7 @@ homepage: https://github.com/NYPL/ruby-sierra-api-client
23
23
  licenses:
24
24
  - MIT
25
25
  metadata: {}
26
- post_install_message:
26
+ post_install_message:
27
27
  rdoc_options: []
28
28
  require_paths:
29
29
  - lib
@@ -39,7 +39,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
39
39
  version: '0'
40
40
  requirements: []
41
41
  rubygems_version: 3.1.2
42
- signing_key:
42
+ signing_key:
43
43
  specification_version: 4
44
44
  summary: NYPL Sierra API client
45
45
  test_files: []