@@ -5,18 +5,30 @@ class Base
55
66 private
77
8+ def self . post_http_request ( uri , form_data = { } )
9+ http_request = Net ::HTTP ::Post . new uri
10+ http_request . set_form_data form_data
11+ http_request
12+ end
13+
814 def self . get_http_request ( uri )
9- Net ::HTTP ::Get . new ( uri . request_uri )
15+ Net ::HTTP ::Get . new ( uri )
1016 end
1117
1218 def self . response_for ( http_request , uri , max_retries = 5 )
19+ uri = uri_with_query ( uri , access_token : app_access_token )
20+ http_request = req_with_query ( http_request , access_token : app_access_token )
21+
1322 response = Net ::HTTP . start ( uri . host , 443 , use_ssl : true ) do |http |
1423 http . request http_request
1524 end
1625 if response . is_a? Net ::HTTPSuccess
1726 response
1827 elsif response . is_a? Net ::HTTPServerError
1928 sleep_and_retry_response_for ( http_request , uri , max_retries , response . body )
29+ elsif response . is_a? ( Net ::HTTPBadRequest ) && response . body =~ /access token/i
30+ @app_access_token = nil
31+ response_for ( http_request , uri )
2032 else
2133 raise ContentNotFound , "Error #{ response . code } : #{ response . body } "
2234 end
@@ -37,6 +49,38 @@ def self.json_for(uri, max_retries = 3)
3749 response = response_for ( get_http_request ( uri ) , uri )
3850 JSON . parse ( response . body , symbolize_names : true )
3951 end
52+
53+ def self . uri_with_query ( uri , query = { } )
54+ return nil if uri . nil?
55+ new_query = URI . decode_www_form ( uri . query ) . to_h . merge ( query )
56+ uri . query = URI . encode_www_form ( new_query )
57+ uri
58+ end
59+
60+ def self . req_with_query ( http_request , query = { } )
61+ return nil if http_request . nil?
62+ new_uri = uri_with_query ( http_request . uri , query )
63+ case http_request
64+ when Net ::HTTP ::Get
65+ get_http_request ( new_uri )
66+ when Net ::HTTP ::Post
67+ req = Net ::HTTP ::Post . new new_uri
68+ req . set_form_data URI . decode_www_form ( http_request . body )
69+ req
70+ end
71+ end
72+
73+ def self . app_access_token
74+ @app_access_token ||= begin
75+ uri = URI ::HTTPS . build host : host , path : "/v2.8/oauth/access_token" ,
76+ query : URI . encode_www_form ( { client_id : app_id , client_secret : app_secret , grant_type : 'client_credentials' } )
77+ req = get_http_request ( uri )
78+ response = Net ::HTTP . start ( uri . host , 443 , use_ssl : true ) do |http |
79+ http . request req
80+ end
81+ JSON . parse ( response . body , symbolize_names : true ) [ :access_token ]
82+ end
83+ end
4084 end
4185 end
4286end
0 commit comments