fusionauth_client 1.0.11

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.
@@ -0,0 +1,330 @@
1
+ require 'base64'
2
+ require 'json'
3
+ require 'net/http'
4
+
5
+ module FusionAuth
6
+ class RESTClient
7
+ def initialize
8
+ @url = ''.dup
9
+ @parameters = {}
10
+ @proxy = {}
11
+ @headers = {}
12
+ @body_handler = nil
13
+ @certificate = nil
14
+ @connect_timeout = 1000
15
+ @read_timeout = 2000
16
+ @error_response_handler = nil
17
+ @error_type = nil
18
+ @method = nil
19
+ @success_response_handler = nil
20
+ end
21
+
22
+ def authorization(authorization)
23
+ @headers['Authorization'] = authorization
24
+ self
25
+ end
26
+
27
+ def basic_authorization(username, password)
28
+ if username != nil && password != nil
29
+ credentials = username + ':' + password
30
+
31
+ encoded = Base64.encode64(credentials)
32
+ @headers['Authorization'] = "Basic #{encoded}"
33
+ end
34
+
35
+ self
36
+ end
37
+
38
+ #
39
+ # Sets the BodyHandler for this RESTClient
40
+ #
41
+ # @param body_handler [BodyHandler] The body handler.
42
+ # @return [RESTClient] this
43
+ #
44
+ def body_handler(body_handler)
45
+ @body_handler = body_handler
46
+ self
47
+ end
48
+
49
+ def certificate(certificate)
50
+ @certificate = certificate
51
+ self
52
+ end
53
+
54
+ def connect_timeout(connect_timeout)
55
+ @connect_timeout = connect_timeout
56
+ self
57
+ end
58
+
59
+ def read_timeout(read_timeout)
60
+ @read_timeout = read_timeout
61
+ self
62
+ end
63
+
64
+ def delete
65
+ @method = 'DELETE'
66
+ self
67
+ end
68
+
69
+ def error_response_handler(error_response_handler)
70
+ @error_response_handler = error_response_handler
71
+ self
72
+ end
73
+
74
+ def get
75
+ @method = 'GET'
76
+ self
77
+ end
78
+
79
+ def go
80
+ if @url.size == 0
81
+ raise ArgumentError, 'You must specify a URL'
82
+ end
83
+
84
+ if @method == nil
85
+ raise ArgumentError, 'You must specify a HTTP method'
86
+ end
87
+
88
+ response = ClientResponse.new
89
+ response.request = (@body_handler != nil) ? @body_handler.body_object : nil
90
+ response.method = @method
91
+
92
+ begin
93
+ if @parameters.length > 0
94
+ if @url.index('?') == nil
95
+ @url<<'?'
96
+ end
97
+
98
+ list = []
99
+ @parameters.each { |key, values|
100
+ values.each { |value|
101
+ list<<"#{URI.encode_www_form_component(key)}=#{URI.encode_www_form_component(value)}"
102
+ }
103
+ }
104
+
105
+ @url<<list.join('&')
106
+ end
107
+
108
+ response.url = URI(@url)
109
+ opts = {:p_addr => @proxy[:p_addr], :p_port => @proxy[:p_port], :p_user => @proxy[:p_user], :p_pass => @proxy[:p_pass], :open_timeout => @connect_timeout, :read_timeout => @read_timeout}
110
+ if @certificate != nil
111
+ opts[:cert] = @certificate
112
+ end
113
+ if response.url.scheme == 'https'
114
+ opts[:use_ssl] = true
115
+ end
116
+ if @body_handler != nil
117
+ @body_handler.set_headers(@headers)
118
+ end
119
+
120
+ http_response = nil
121
+ Net::HTTP.start(response.url.hostname, response.url.port, opts) { |http|
122
+ request = nil
123
+ if @method == 'COPY'
124
+ request = Net::HTTP::Copy.new(response.url, @headers)
125
+ elsif @method == 'DELETE'
126
+ request = Net::HTTP::Delete.new(response.url, @headers)
127
+ elsif @method == 'GET'
128
+ request = Net::HTTP::Get.new(response.url, @headers)
129
+ elsif @method == 'HEAD'
130
+ request = Net::HTTP::Head.new(response.url, @headers)
131
+ elsif @method == 'LOCK'
132
+ request = Net::HTTP::Lock.new(response.url, @headers)
133
+ elsif @method == 'MKCOL'
134
+ request = Net::HTTP::Mkcol.new(response.url, @headers)
135
+ elsif @method == 'MOVE'
136
+ request = Net::HTTP::Move.new(response.url, @headers)
137
+ elsif @method == 'OPTIONS'
138
+ request = Net::HTTP::Options.new(response.url, @headers)
139
+ elsif @method == 'PATCH'
140
+ request = Net::HTTP::Patch.new(response.url, @headers)
141
+ elsif @method == 'POST'
142
+ request = Net::HTTP::Post.new(response.url, @headers)
143
+ elsif @method == 'PROPFIND'
144
+ request = Net::HTTP::Propfind.new(response.url, @headers)
145
+ elsif @method == 'PROPPATCH'
146
+ request = Net::HTTP::Proppatch.new(response.url, @headers)
147
+ elsif @method == 'PUT'
148
+ request = Net::HTTP::Put.new(response.url, @headers)
149
+ elsif @method == 'TRACE'
150
+ request = Net::HTTP::Trace.new(response.url, @headers)
151
+ elsif @method == 'UNLOCK'
152
+ request = Net::HTTP::Unlock.new(response.url, @headers)
153
+ else
154
+ raise ArgumentError, "Invalid HTTP method #{@method}"
155
+ end
156
+
157
+ request.body = response.request
158
+ http_response = http.request(request)
159
+ }
160
+
161
+ response.status = http_response.code.to_i
162
+ if response.status < 200 || response.status > 299
163
+ if http_response.class.body_permitted? && !http_response.body.nil? && http_response.body.size > 0 && @error_response_handler != nil
164
+ response.error_response = @error_response_handler.call(http_response.body)
165
+ end
166
+ elsif http_response.class.body_permitted? && !http_response.body.nil? && http_response.body.size > 0 && @success_response_handler != nil
167
+ response.success_response = @success_response_handler.call(http_response.body)
168
+ end
169
+ rescue Exception => e
170
+ response.status = -1
171
+ response.exception = e
172
+ # e.backtrace.each {|l| p l}
173
+ end
174
+
175
+ response
176
+ end
177
+
178
+ def header(name, value)
179
+ @headers[name] = value
180
+ self
181
+ end
182
+
183
+ def headers(headers)
184
+ @headers.merge!(headers)
185
+ self
186
+ end
187
+
188
+ def post
189
+ @method = 'POST'
190
+ self
191
+ end
192
+
193
+ def put
194
+ @method = 'PUT'
195
+ self
196
+ end
197
+
198
+ def success_response_handler(success_response_handler)
199
+ @success_response_handler = success_response_handler
200
+ self
201
+ end
202
+
203
+ def uri(uri)
204
+ if @url.size == 0
205
+ self
206
+ end
207
+
208
+ if @url[@url.size - 1] == '/' && uri[0] == '/'
209
+ @url<<uri[1..uri.size]
210
+ elsif @url[@url.size - 1] != '/' && uri[0] != '/'
211
+ @url<<"/#{uri}"
212
+ else
213
+ @url<<uri
214
+ end
215
+
216
+ self
217
+ end
218
+
219
+ def url(url)
220
+ @url = url.dup
221
+ self
222
+ end
223
+
224
+ #
225
+ # Add a URL parameter as a key value pair.
226
+ #
227
+ # @param name [String] The URL parameter name.
228
+ # @param value [String} ]The url parameter value. The <code>.toString()</ code> method will be used to
229
+ # get the <code>String</code> used in the URL parameter. If the object type is a
230
+ # @link Collection} a key value pair will be added for each value in the collection.
231
+ # @link ZonedDateTime} will also be handled uniquely in that the <code>long</ code> will
232
+ # be used to set in the request using <code>ZonedDateTime.toInstant().toEpochMilli()</code>
233
+ # @return This.
234
+ #
235
+ def url_parameter(name, value)
236
+ if value == nil
237
+ return self
238
+ end
239
+
240
+ if value.is_a? Array
241
+ @parameters[name] = value
242
+ else
243
+ values = @parameters[name]
244
+ if values == nil
245
+ values = []
246
+ @parameters[name] = values
247
+ end
248
+ values<<value
249
+ end
250
+
251
+ self
252
+ end
253
+
254
+ #
255
+ # Append a url path segment. <p>
256
+ # For Example: <pre>
257
+ # .url("http://www.foo.com ")
258
+ # .urlSegment(" bar ")
259
+ # </pre>
260
+ # This will result in a url of <code>http://www.foo.com/bar</code>
261
+ #
262
+ # @param value The url path segment. A nil value will be ignored.
263
+ # @return This.
264
+ #/
265
+ def url_segment(value)
266
+ if value == nil
267
+ return self
268
+ end
269
+
270
+ if @url[@url.size - 1] != '/'
271
+ @url<<'/'
272
+ end
273
+
274
+ @url<<value
275
+ self
276
+ end
277
+
278
+ private
279
+ def to_http_uri(uri)
280
+ uri.path + (uri.query == nil ? '' : "?#{uri.query}")
281
+ end
282
+ end
283
+
284
+ class ClientResponse
285
+ attr_accessor :url, :request, :method, :status, :success_response, :error_response, :exception
286
+
287
+ def was_successful
288
+ @status >= 200 && @status <= 299
289
+ end
290
+ end
291
+
292
+ class JSONBodyHandler
293
+ attr_accessor :length, :body
294
+
295
+ def initialize(body_object)
296
+ @body = JSON.generate(body_object)
297
+ end
298
+
299
+ #
300
+ # Returns the body String for the request
301
+ #
302
+ # @return [String] The body as a String
303
+ def body_object
304
+ @body
305
+ end
306
+
307
+ #
308
+ # Sets any headers necessary for the body to be processed.
309
+ #
310
+ # @param headers [Hash] The headers hash to add any headers needed by this BodyHandler
311
+ # @return [Object] The object
312
+ def set_headers(headers)
313
+ headers['Length'] = body.bytesize.to_s
314
+ headers['Content-Type'] = 'application/json'
315
+ nil
316
+ end
317
+ end
318
+
319
+ class JSONResponseHandler
320
+ attr_accessor :type
321
+
322
+ def initialize(type)
323
+ @type = type
324
+ end
325
+
326
+ def call(body)
327
+ JSON.parse(body, :object_class => @type)
328
+ end
329
+ end
330
+ end
metadata ADDED
@@ -0,0 +1,59 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fusionauth_client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.11
5
+ platform: ruby
6
+ authors:
7
+ - Brian Pontarelli
8
+ - Daniel DeGroff
9
+ autorequire:
10
+ bindir: exe
11
+ cert_chain: []
12
+ date: 2018-09-10 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: This library contains the Ruby client library that helps you connect
15
+ your application to FusionAuth.
16
+ email:
17
+ - brian@fusionauth.io
18
+ - daniel@fusionauth.io
19
+ executables: []
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - ".gitignore"
24
+ - ".ruby-version"
25
+ - Gemfile
26
+ - LICENSE.txt
27
+ - README.md
28
+ - Rakefile
29
+ - build.savant
30
+ - fusionauth-ruby-client.iml
31
+ - fusionauth_client.gemspec
32
+ - lib/fusionauth/fusionauth_client.rb
33
+ - lib/fusionauth/rest_client.rb
34
+ homepage: https://github.com/FusionAuth/fusionauth-ruby-client
35
+ licenses:
36
+ - Apache-2.0
37
+ metadata:
38
+ allowed_push_host: https://rubygems.org
39
+ post_install_message:
40
+ rdoc_options: []
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ requirements: []
54
+ rubyforge_project:
55
+ rubygems_version: 2.5.1
56
+ signing_key:
57
+ specification_version: 4
58
+ summary: The Ruby client library for FusionAuth
59
+ test_files: []