login_radius 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/hash.rb +12 -12
- data/lib/login_radius.rb +12 -11
- data/lib/login_radius/exception.rb +4 -4
- data/lib/login_radius/messages.rb +41 -102
- data/lib/login_radius/related.rb +34 -0
- data/lib/login_radius/user_profile.rb +101 -102
- data/lib/login_radius/user_profile_getters.rb +151 -105
- data/lib/login_radius/version.rb +3 -3
- data/lib/string.rb +7 -8
- metadata +20 -91
- data/.DS_Store +0 -0
- data/.gitignore +0 -18
- data/Gemfile +0 -25
- data/LICENSE +0 -22
- data/LoginRadiusTestApp/.gitignore +0 -15
- data/LoginRadiusTestApp/Gemfile +0 -42
- data/LoginRadiusTestApp/Gemfile.lock +0 -136
- data/LoginRadiusTestApp/README.rdoc +0 -261
- data/LoginRadiusTestApp/Rakefile +0 -7
- data/LoginRadiusTestApp/app/assets/images/rails.png +0 -0
- data/LoginRadiusTestApp/app/assets/javascripts/application.js +0 -15
- data/LoginRadiusTestApp/app/assets/stylesheets/application.css +0 -13
- data/LoginRadiusTestApp/app/controllers/application_controller.rb +0 -17
- data/LoginRadiusTestApp/app/helpers/application_helper.rb +0 -2
- data/LoginRadiusTestApp/app/mailers/.gitkeep +0 -0
- data/LoginRadiusTestApp/app/models/.gitkeep +0 -0
- data/LoginRadiusTestApp/app/views/application/callback.html.erb +0 -1
- data/LoginRadiusTestApp/app/views/application/index.html.erb +0 -7
- data/LoginRadiusTestApp/app/views/layouts/application.html.erb +0 -14
- data/LoginRadiusTestApp/config.ru +0 -4
- data/LoginRadiusTestApp/config/application.rb +0 -62
- data/LoginRadiusTestApp/config/boot.rb +0 -6
- data/LoginRadiusTestApp/config/database.yml +0 -25
- data/LoginRadiusTestApp/config/environment.rb +0 -5
- data/LoginRadiusTestApp/config/environments/development.rb +0 -37
- data/LoginRadiusTestApp/config/environments/production.rb +0 -67
- data/LoginRadiusTestApp/config/environments/test.rb +0 -37
- data/LoginRadiusTestApp/config/initializers/backtrace_silencers.rb +0 -7
- data/LoginRadiusTestApp/config/initializers/inflections.rb +0 -15
- data/LoginRadiusTestApp/config/initializers/mime_types.rb +0 -5
- data/LoginRadiusTestApp/config/initializers/secret_token.rb +0 -7
- data/LoginRadiusTestApp/config/initializers/session_store.rb +0 -8
- data/LoginRadiusTestApp/config/initializers/wrap_parameters.rb +0 -14
- data/LoginRadiusTestApp/config/locales/en.yml +0 -5
- data/LoginRadiusTestApp/config/routes.rb +0 -61
- data/LoginRadiusTestApp/db/seeds.rb +0 -7
- data/LoginRadiusTestApp/lib/assets/.gitkeep +0 -0
- data/LoginRadiusTestApp/lib/tasks/.gitkeep +0 -0
- data/LoginRadiusTestApp/log/.gitkeep +0 -0
- data/LoginRadiusTestApp/public/404.html +0 -26
- data/LoginRadiusTestApp/public/422.html +0 -26
- data/LoginRadiusTestApp/public/500.html +0 -25
- data/LoginRadiusTestApp/public/favicon.ico +0 -0
- data/LoginRadiusTestApp/public/robots.txt +0 -5
- data/LoginRadiusTestApp/script/rails +0 -6
- data/LoginRadiusTestApp/test/fixtures/.gitkeep +0 -0
- data/LoginRadiusTestApp/test/functional/.gitkeep +0 -0
- data/LoginRadiusTestApp/test/integration/.gitkeep +0 -0
- data/LoginRadiusTestApp/test/performance/browsing_test.rb +0 -12
- data/LoginRadiusTestApp/test/test_helper.rb +0 -13
- data/LoginRadiusTestApp/test/unit/.gitkeep +0 -0
- data/LoginRadiusTestApp/vendor/assets/javascripts/.gitkeep +0 -0
- data/LoginRadiusTestApp/vendor/assets/stylesheets/.gitkeep +0 -0
- data/LoginRadiusTestApp/vendor/plugins/.gitkeep +0 -0
- data/README.md +0 -417
- data/Rakefile +0 -2
- data/login_radius.gemspec +0 -20
- data/test/.DS_Store +0 -0
- data/test/basic_async_test.rb +0 -29
- data/test/unit/.DS_Store +0 -0
- data/test/unit/base_test.rb +0 -11
- data/test/unit/user_profile_test.rb +0 -68
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f10c5dff8edd14270ca75a8696f3b5d1f9d22c48
|
4
|
+
data.tar.gz: 1344ee04d0738519948ee7a20792e4fd0df2a595
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7e7c1190b505d9ff9ae8efc57052650be817216bb4cf6e897c7e1a81fe5a85e347c2b354241aa6ab05037bc6f41ae602342b66b20002739bc6667c08a0869094
|
7
|
+
data.tar.gz: 23267885a78f2386e3fc87fa5ca988a27569c271b358b6ff4c7f9a0f3e3d5e80a149adffd1fb808aebec5fe7dd52d2ca6f29412663c98cb352b0aa5c8a4a13ba
|
data/lib/hash.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
class Hash
|
2
|
-
def self.lr_convert_hash_keys(value) #lr_ appended so no method naming conflicts with other gems
|
3
|
-
case value
|
4
|
-
when Array
|
5
|
-
value.map { |v| lr_convert_hash_keys(v) }
|
6
|
-
# or `value.map(&method(:convert_hash_keys))`
|
7
|
-
when Hash
|
8
|
-
Hash[value.map { |k, v| [k.to_s.lr_underscore, lr_convert_hash_keys(v)] }]
|
9
|
-
else
|
10
|
-
value
|
11
|
-
end
|
12
|
-
end
|
1
|
+
class Hash
|
2
|
+
def self.lr_convert_hash_keys(value) #lr_ appended so no method naming conflicts with other gems
|
3
|
+
case value
|
4
|
+
when Array
|
5
|
+
value.map { |v| lr_convert_hash_keys(v) }
|
6
|
+
# or `value.map(&method(:convert_hash_keys))`
|
7
|
+
when Hash
|
8
|
+
Hash[value.map { |k, v| [k.to_s.lr_underscore, lr_convert_hash_keys(v)] }]
|
9
|
+
else
|
10
|
+
value
|
11
|
+
end
|
12
|
+
end
|
13
13
|
end
|
data/lib/login_radius.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
require "login_radius/version"
|
2
|
-
require "login_radius/user_profile_getters"
|
3
|
-
require "login_radius/messages"
|
4
|
-
require "login_radius/
|
5
|
-
require "login_radius/
|
6
|
-
require "
|
7
|
-
require "
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
require "login_radius/version"
|
2
|
+
require "login_radius/user_profile_getters"
|
3
|
+
require "login_radius/messages"
|
4
|
+
require "login_radius/related"
|
5
|
+
require "login_radius/user_profile"
|
6
|
+
require "login_radius/exception"
|
7
|
+
require "string"
|
8
|
+
require "hash"
|
9
|
+
|
10
|
+
module LoginRadius
|
11
|
+
|
12
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module LoginRadius
|
2
|
-
class Exception < Exception
|
3
|
-
end
|
4
|
-
end
|
1
|
+
module LoginRadius
|
2
|
+
class Exception < Exception
|
3
|
+
end
|
4
|
+
end
|
@@ -1,102 +1,41 @@
|
|
1
|
-
module LoginRadius
|
2
|
-
module Messages
|
3
|
-
|
4
|
-
# Sends a message to
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
#
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
# Sends a message to
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
# Sends a message to a person using facebook. Params hash takes following keys:
|
45
|
-
# to(optional) :- Person's wall it's going to, if blank, is your own
|
46
|
-
# title :- [optional parameter] status message title
|
47
|
-
# url:- [optional parameter] any url that you want post in status message
|
48
|
-
# imageurl :- [optional parameter] any image url that you want post in status message
|
49
|
-
# status :- your status message
|
50
|
-
# caption : [optional parameter] caption that you want post in status message
|
51
|
-
# description :- [optional parameter] description that you want post in status message
|
52
|
-
#
|
53
|
-
# @param params [Hash]
|
54
|
-
# @return [Boolean] Whether or not message succeeded
|
55
|
-
def make_facebook_post!(params = {})
|
56
|
-
call_api("status/update/#{secret}/#{token}", params)
|
57
|
-
end
|
58
|
-
|
59
|
-
# Sends a message to a person using facebook. Params hash takes following keys:
|
60
|
-
# to(optional) :- Person's wall it's going to, if blank, is your own
|
61
|
-
# title :- [optional parameter] status message title
|
62
|
-
# url:- [optional parameter] any url that you want post in status message
|
63
|
-
# imageurl :- [optional parameter] any image url that you want post in status message
|
64
|
-
# status :- your status message
|
65
|
-
# caption : [optional parameter] caption that you want post in status message
|
66
|
-
# description :- [optional parameter] description that you want post in status message
|
67
|
-
#
|
68
|
-
# @param params [Hash]
|
69
|
-
# @return [Boolean] Whether or not message succeeded
|
70
|
-
def make_facebook_post(params = {})
|
71
|
-
make_facebook_post!(params)
|
72
|
-
rescue LoginRadius::Exception => e
|
73
|
-
false
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
# Sends a message to a person. Will use either twitter, facebook or linked in, depending
|
79
|
-
# on where the person you're sending it to came from, and the keys present in the hash.
|
80
|
-
# Other methods in this module describe the keys they use, they all call this method
|
81
|
-
# with the proper keys for their service type.
|
82
|
-
#
|
83
|
-
# @param params [Hash] Params hash describing what you'd like to send.
|
84
|
-
# @return [Boolean] Whether or not message succeeded
|
85
|
-
def send_message!(params = {})
|
86
|
-
call_api("directmessage/#{secret}/#{token}",params)
|
87
|
-
end
|
88
|
-
|
89
|
-
# Sends a message to a person. Will use either twitter, facebook or linked in, depending
|
90
|
-
# on where the person you're sending it to came from, and the keys present in the hash.
|
91
|
-
# Other methods in this module describe the keys they use, they all call this method
|
92
|
-
# with the proper keys for their service type.
|
93
|
-
#
|
94
|
-
# @param params [Hash] Params hash describing what you'd like to send.
|
95
|
-
# @return [Boolean] Whether or not message succeeded
|
96
|
-
def send_message(params = {})
|
97
|
-
send_message!(params)
|
98
|
-
rescue LoginRadius::Exception => e
|
99
|
-
false
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
1
|
+
module LoginRadius
|
2
|
+
module Messages
|
3
|
+
|
4
|
+
# Sends a Status message to on facebook. Params hash takes following keys:
|
5
|
+
# access_token :- [Required parameter] access token
|
6
|
+
# title :- [optional parameter] status message title
|
7
|
+
# url:- [optional parameter] any url that you want post in status message
|
8
|
+
# imageurl :- [optional parameter] any image url that you want post in status message
|
9
|
+
# status :- your status message
|
10
|
+
# caption : [optional parameter] caption that you want post in status message
|
11
|
+
# description :- [optional parameter] description that you want post in status message
|
12
|
+
#
|
13
|
+
# @param params [Hash]
|
14
|
+
# @return [Boolean] Whether or not message succeeded
|
15
|
+
def post_status!(params = {})
|
16
|
+
call_api("api/v2/status/js", params)
|
17
|
+
end
|
18
|
+
def post_status(params = {})
|
19
|
+
post_status!(params)
|
20
|
+
rescue LoginRadius::Exception => e
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
# Sends a Direct message to on facebook. Params hash takes following keys:
|
25
|
+
# access_token :- [Required parameter] access token
|
26
|
+
# to :- [Required parameter] with whom you want post you direct message
|
27
|
+
# subject :- [optional parameter] any subject that you want post in direct message
|
28
|
+
# message :- [optional parameter] any message that you want post in direct message
|
29
|
+
#
|
30
|
+
# @param params [Hash]
|
31
|
+
# @return [Boolean] Whether or not message succeeded
|
32
|
+
def direct_message!(params = {})
|
33
|
+
call_api("api/v2/message/js", params)
|
34
|
+
end
|
35
|
+
def direct_message(params = {})
|
36
|
+
direct_message!(params)
|
37
|
+
rescue LoginRadius::Exception => e
|
38
|
+
false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module LoginRadius
|
2
|
+
module Related
|
3
|
+
# fetch images with respact album id. Params hash takes following keys:
|
4
|
+
# access_token :- [Required parameter] access token
|
5
|
+
# albumid :- [Required parameter] albumid for fetch images from album
|
6
|
+
#
|
7
|
+
# @param params [Hash]
|
8
|
+
# @return [Boolean] Whether or not message succeeded
|
9
|
+
|
10
|
+
def photo!(params = {})
|
11
|
+
call_api("api/v2/photo", params)
|
12
|
+
end
|
13
|
+
def photo(params = {})
|
14
|
+
photo!(params)
|
15
|
+
rescue LoginRadius::Exception => e
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
# fetch page with respact PageNameOrId. Params hash takes following keys:
|
20
|
+
# access_token :- [Required parameter] access token
|
21
|
+
# pagename :- [Required parameter] pagename for fetch page details from provider
|
22
|
+
#
|
23
|
+
# @param params [Hash]
|
24
|
+
# @return [Boolean] Whether or not message succeeded
|
25
|
+
def page!(params = {})
|
26
|
+
call_api("api/v2/page", params)
|
27
|
+
end
|
28
|
+
def page(params = {})
|
29
|
+
page!(params)
|
30
|
+
rescue LoginRadius::Exception => e
|
31
|
+
false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,102 +1,101 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
module LoginRadius
|
3
|
-
class UserProfile
|
4
|
-
include UserProfileGetters
|
5
|
-
include Messages
|
6
|
-
|
7
|
-
attr_accessor :secret, :token, :async
|
8
|
-
|
9
|
-
API_ROOT = "https://
|
10
|
-
|
11
|
-
# Takes a hash of account secret, token, and connection type(net_http or em_http)
|
12
|
-
# and uses it to auth against the LoginRadius API. Then it returns the Account object. The
|
13
|
-
# async key is optional, if set to true, will use Em::HTTP instead of Net::HTTP.
|
14
|
-
#
|
15
|
-
# @param opts [Hash] Must have keys :token, :secret, and :async(optional)
|
16
|
-
# @return [LoginRadius::Account]
|
17
|
-
def initialize(opts = {})
|
18
|
-
self.token = opts[:token]
|
19
|
-
self.secret = opts[:secret]
|
20
|
-
self.async = opts[:async]
|
21
|
-
raise LoginRadius::Exception.new("Invalid Request") unless token
|
22
|
-
raise LoginRadius::Exception.new("Invalid Token") unless guid_valid?(token)
|
23
|
-
raise LoginRadius::Exception.new("Invalid Secret") unless guid_valid?(secret)
|
24
|
-
end
|
25
|
-
|
26
|
-
# Takes a guid and returns whether or not it is valid.
|
27
|
-
#
|
28
|
-
# @param guid [String]
|
29
|
-
# @return [Boolean]
|
30
|
-
def guid_valid?(guid)
|
31
|
-
guid.match(/^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$/i)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Returns whether or not this object is authed.
|
35
|
-
#
|
36
|
-
# @return [Boolean]
|
37
|
-
def authenticated?
|
38
|
-
respond_to?(:
|
39
|
-
end
|
40
|
-
|
41
|
-
# Generic GET call function that other submodules can use to hit the API.
|
42
|
-
#
|
43
|
-
# @param url [String] Target URL to fetch data from.
|
44
|
-
# @param params [Hash] Parameters to send
|
45
|
-
# @return data [Hash] Parsed JSON data from the call
|
46
|
-
def call_api(url, params = {})
|
47
|
-
url = API_ROOT+url unless url.match(/^#{API_ROOT}/) #in case api root is included,
|
48
|
-
#as would happen in a recursive redirect call.
|
49
|
-
|
50
|
-
if async
|
51
|
-
#UNTESTED
|
52
|
-
#if async is true, we expect you to be using EM::Synchrony submodule and to be in an eventloop,
|
53
|
-
#like with a thin server using the Cramp framework. Otherwise, this method blows up.
|
54
|
-
response = EM::Synchrony.sync EventMachine::HttpRequest.new(url).aget :redirects => 2, :query => params
|
55
|
-
response = response.response
|
56
|
-
else
|
57
|
-
#synchronous version of the call.
|
58
|
-
url_obj = URI.parse(url)
|
59
|
-
url_obj.query = URI.encode_www_form(params)
|
60
|
-
|
61
|
-
http = Net::HTTP.new(url_obj.host, url_obj.port)
|
62
|
-
http.use_ssl = true
|
63
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
64
|
-
response = http.get(url_obj.request_uri)
|
65
|
-
|
66
|
-
if response.is_a?(Net::HTTPTemporaryRedirect)
|
67
|
-
#for some reason, we always get redirected when calling server first time.
|
68
|
-
#so if we do, we scan body for the redirect url, and the scan returns
|
69
|
-
#an array of arrays. So we grab the array we know has what we need,
|
70
|
-
#and grab the first element.
|
71
|
-
redirect_url_array = response.body.scan(/<a href=\"([^>]+)\">/i)[1]
|
72
|
-
redirect_url = redirect_url_array.first
|
73
|
-
return call_api(redirect_url, params)
|
74
|
-
end
|
75
|
-
|
76
|
-
response = response.body
|
77
|
-
end
|
78
|
-
|
79
|
-
# For some reason, this API returns true/false instead of JSON responses for certain calls.
|
80
|
-
# We catch this here.
|
81
|
-
return true if response.match(/^true/i)
|
82
|
-
return false if response.match(/^false/i)
|
83
|
-
|
84
|
-
#We rescue this because sometimes the API returns HTML pages(which can't be JSON parsed)
|
85
|
-
#This mostly happens when people use expired tokens. So we go ahead and raise an exception
|
86
|
-
#About it if it gets caught.
|
87
|
-
begin
|
88
|
-
unconverted_response = JSON.parse(response)
|
89
|
-
#it's all String keys in CamelCase above, so...
|
90
|
-
# IF we got a hash back, convert it directly, if its an array, convert each item which is a hash
|
91
|
-
# into snake case
|
92
|
-
converted_response = unconverted_response.is_a?(Hash) ?
|
93
|
-
Hash.lr_convert_hash_keys(unconverted_response).symbolize_keys! :
|
94
|
-
unconverted_response.map { |item| Hash.lr_convert_hash_keys(item).symbolize_keys! }
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
end
|
1
|
+
require 'net/http'
|
2
|
+
module LoginRadius
|
3
|
+
class UserProfile
|
4
|
+
include UserProfileGetters
|
5
|
+
include Messages
|
6
|
+
|
7
|
+
attr_accessor :secret, :token, :async
|
8
|
+
|
9
|
+
API_ROOT = "https://api.loginradius.com/"
|
10
|
+
|
11
|
+
# Takes a hash of account secret, token, and connection type(net_http or em_http)
|
12
|
+
# and uses it to auth against the LoginRadius API. Then it returns the Account object. The
|
13
|
+
# async key is optional, if set to true, will use Em::HTTP instead of Net::HTTP.
|
14
|
+
#
|
15
|
+
# @param opts [Hash] Must have keys :token, :secret, and :async(optional)
|
16
|
+
# @return [LoginRadius::Account]
|
17
|
+
def initialize(opts = {})
|
18
|
+
self.token = opts[:token]
|
19
|
+
self.secret = opts[:secret]
|
20
|
+
self.async = opts[:async]
|
21
|
+
raise LoginRadius::Exception.new("Invalid Request") unless token
|
22
|
+
raise LoginRadius::Exception.new("Invalid Token") unless guid_valid?(token)
|
23
|
+
raise LoginRadius::Exception.new("Invalid Secret") unless guid_valid?(secret)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Takes a guid and returns whether or not it is valid.
|
27
|
+
#
|
28
|
+
# @param guid [String]
|
29
|
+
# @return [Boolean]
|
30
|
+
def guid_valid?(guid)
|
31
|
+
guid.match(/^\{?[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\}?$/i)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns whether or not this object is authed.
|
35
|
+
#
|
36
|
+
# @return [Boolean]
|
37
|
+
def authenticated?
|
38
|
+
respond_to?(:access_token)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Generic GET call function that other submodules can use to hit the API.
|
42
|
+
#
|
43
|
+
# @param url [String] Target URL to fetch data from.
|
44
|
+
# @param params [Hash] Parameters to send
|
45
|
+
# @return data [Hash] Parsed JSON data from the call
|
46
|
+
def call_api(url, params = {})
|
47
|
+
url = API_ROOT+url unless url.match(/^#{API_ROOT}/) #in case api root is included,
|
48
|
+
#as would happen in a recursive redirect call.
|
49
|
+
|
50
|
+
if async
|
51
|
+
#UNTESTED
|
52
|
+
#if async is true, we expect you to be using EM::Synchrony submodule and to be in an eventloop,
|
53
|
+
#like with a thin server using the Cramp framework. Otherwise, this method blows up.
|
54
|
+
response = EM::Synchrony.sync EventMachine::HttpRequest.new(url).aget :redirects => 2, :query => params
|
55
|
+
response = response.response
|
56
|
+
else
|
57
|
+
#synchronous version of the call.
|
58
|
+
url_obj = URI.parse(url)
|
59
|
+
url_obj.query = URI.encode_www_form(params)
|
60
|
+
|
61
|
+
http = Net::HTTP.new(url_obj.host, url_obj.port)
|
62
|
+
http.use_ssl = true
|
63
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
64
|
+
response = http.get(url_obj.request_uri)
|
65
|
+
|
66
|
+
if response.is_a?(Net::HTTPTemporaryRedirect)
|
67
|
+
#for some reason, we always get redirected when calling server first time.
|
68
|
+
#so if we do, we scan body for the redirect url, and the scan returns
|
69
|
+
#an array of arrays. So we grab the array we know has what we need,
|
70
|
+
#and grab the first element.
|
71
|
+
redirect_url_array = response.body.scan(/<a href=\"([^>]+)\">/i)[1]
|
72
|
+
redirect_url = redirect_url_array.first
|
73
|
+
return call_api(redirect_url, params)
|
74
|
+
end
|
75
|
+
|
76
|
+
response = response.body
|
77
|
+
end
|
78
|
+
|
79
|
+
# For some reason, this API returns true/false instead of JSON responses for certain calls.
|
80
|
+
# We catch this here.
|
81
|
+
return true if response.match(/^true/i)
|
82
|
+
return false if response.match(/^false/i)
|
83
|
+
|
84
|
+
#We rescue this because sometimes the API returns HTML pages(which can't be JSON parsed)
|
85
|
+
#This mostly happens when people use expired tokens. So we go ahead and raise an exception
|
86
|
+
#About it if it gets caught.
|
87
|
+
begin
|
88
|
+
unconverted_response = JSON.parse(response)
|
89
|
+
#it's all String keys in CamelCase above, so...
|
90
|
+
# IF we got a hash back, convert it directly, if its an array, convert each item which is a hash
|
91
|
+
# into snake case
|
92
|
+
converted_response = unconverted_response.is_a?(Hash) ?
|
93
|
+
Hash.lr_convert_hash_keys(unconverted_response).symbolize_keys! :
|
94
|
+
unconverted_response.map { |item| Hash.lr_convert_hash_keys(item).symbolize_keys! }
|
95
|
+
return converted_response
|
96
|
+
rescue JSON::ParserError => e
|
97
|
+
raise LoginRadius::Exception.new("A JSON parsing error occured because the API returned an HTML page instead of JSON. This happens mostly when you're using an expired Token. Specifics: #{e.message}")
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|