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.
- checksums.yaml +4 -4
- data/lib/nypl_sierra_api_client.rb +43 -14
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82e6e4a869d4151703b816abea4f6774b015be7d0a6703648de2306ed42a20da
|
4
|
+
data.tar.gz: 1aa79afd819567f025bc049bbd8f2c5e16613a807161deb045b3475fca4558d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
88
|
+
raise SierraApiClientError.new "Failed to #{request.method} to #{request.path}: #{e.message}"
|
83
89
|
end
|
84
90
|
|
85
|
-
|
86
|
-
|
87
|
-
parse_response response
|
91
|
+
handle_response response, request, options
|
88
92
|
end
|
89
93
|
|
90
|
-
def
|
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
|
-
|
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
|
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: []
|