nypl_sierra_api_client 1.0.3 → 1.1.0

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 (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: []