@@ -5,28 +5,39 @@ 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
12- def self . response_for ( http_request , uri , max_retries = 5 )
18+ def self . response_for ( http_request , uri , max_retries = 2 )
19+ uri = uri_with_query ( uri , access_token : app_access_token )
20+ req = req_with_query ( http_request , access_token : app_access_token )
1321 response = Net ::HTTP . start ( uri . host , 443 , use_ssl : true ) do |http |
14- http . request http_request
22+ http . request req
1523 end
1624 if response . is_a? Net ::HTTPSuccess
1725 response
1826 elsif response . is_a? Net ::HTTPServerError
19- sleep_and_retry_response_for ( http_request , uri , max_retries , response . body )
27+ sleep_and_retry_response_for ( req , uri , max_retries , response . body )
28+ elsif response . is_a? ( Net ::HTTPBadRequest ) && response . body =~ /access token/i
29+ @app_access_token = nil
30+ response_for ( req , uri )
2031 else
2132 raise ContentNotFound , "Error #{ response . code } : #{ response . body } "
2233 end
2334 rescue SocketError => e
24- sleep_and_retry_response_for ( http_request , uri , max_retries , e . message )
35+ sleep_and_retry_response_for ( req , uri , max_retries , e . message )
2536 end
2637
2738 def self . sleep_and_retry_response_for ( http_request , uri , retries , message )
2839 if retries > 0
29- sleep ( 6 - retries ) ** 2
40+ sleep ( 3 - retries ) ** 2
3041 response_for http_request , uri , retries - 1
3142 else
3243 raise ConnectionError , message
@@ -37,6 +48,38 @@ def self.json_for(uri, max_retries = 3)
3748 response = response_for ( get_http_request ( uri ) , uri )
3849 JSON . parse ( response . body , symbolize_names : true )
3950 end
51+
52+ def self . uri_with_query ( uri , query = { } )
53+ return nil if uri . nil?
54+ new_query = URI . decode_www_form ( uri . query ) . to_h . merge ( query )
55+ uri . query = URI . encode_www_form ( new_query )
56+ uri
57+ end
58+
59+ def self . req_with_query ( http_request , query = { } )
60+ return nil if http_request . nil?
61+ new_uri = uri_with_query ( http_request . uri , query )
62+ case http_request
63+ when Net ::HTTP ::Get
64+ get_http_request ( new_uri )
65+ when Net ::HTTP ::Post
66+ req = Net ::HTTP ::Post . new new_uri
67+ req . set_form_data URI . decode_www_form ( http_request . body )
68+ req
69+ end
70+ end
71+
72+ def self . app_access_token
73+ @app_access_token ||= begin
74+ uri = URI ::HTTPS . build host : host , path : "/v2.8/oauth/access_token" ,
75+ query : URI . encode_www_form ( { client_id : app_id , client_secret : app_secret , grant_type : 'client_credentials' } )
76+ req = get_http_request ( uri )
77+ response = Net ::HTTP . start ( uri . host , 443 , use_ssl : true ) do |http |
78+ http . request req
79+ end
80+ JSON . parse ( response . body , symbolize_names : true ) [ :access_token ]
81+ end
82+ end
4083 end
4184 end
4285end
0 commit comments