30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/little_monster/core/api.rb', line 30
def request(method, path, params = {}, retries: LittleMonster.default_request_retries,
retry_wait: LittleMonster.default_request_retry_wait,
critical: false)
request_id = SecureRandom.uuid
ret = 0
res = nil
url = [LittleMonster.api_url.chomp('/'), path.sub(/\//, '')].join '/'
params[:body] = MultiJson.dump params.fetch(:body, {}) unless params[:body].is_a? String
params[:headers] ||= {}
params[:headers]['Content-Type'] = 'application/json' unless params[:headers]['Content-Type']
params[:headers]['X-Request-ID'] = request_id
params[:timeout] = LittleMonster.request_timeout
begin
res = Typhoeus.public_send method, url, params
if res.code >= 500 || res.code.zero?
raise FuryHttpApiError, "[type:request_failed][request_id:#{request_id}] request to #{res.effective_url} failed with status #{res.code} retry #{ret}"
end
logger.info "[type:request_log][request_id:#{request_id}] request made to #{url} with [status:#{res.code}]"
rescue StandardError => e
logger.error e.message
if ret < retries
sleep(retry_wait)
ret += 1
retry
end
logger.error "[type:request_max_retries_reached][request_id:#{request_id}][url:#{url}][retries:#{ret}] request has reached max retries"
if critical
logger.error "[type:critical_request_failed][request_id:#{request_id}][url:#{url}][retries:#{ret}] request has reached max retries"
raise APIUnreachableError, "[request_id:#{request_id}] critical request to #{url} has fail, check little monster api"
end
end
res.define_singleton_method(:body) do
begin
MultiJson.load(res.options[:response_body], symbolize_keys: true)
rescue
res.options[:response_body]
end
end
res
end
|