7
7
module Contentstack
8
8
class API
9
9
using Utility
10
- def self . init_api ( api_key , delivery_token , environment , host , branch , live_preview )
10
+ def self . init_api ( api_key , delivery_token , environment , host , branch , live_preview , proxy , retry_options )
11
11
@host = host
12
12
@api_version = '/v3'
13
13
@environment = environment
@@ -16,6 +16,11 @@ def self.init_api(api_key, delivery_token, environment, host, branch, live_previ
16
16
@branch = branch
17
17
@headers = { environment : @environment }
18
18
@live_preview = live_preview
19
+ @proxy_details = proxy
20
+ @timeout = retry_options [ "timeout" ]
21
+ @retryDelay = retry_options [ "retryDelay" ]
22
+ @retryLimit = retry_options [ "retryLimit" ]
23
+ @errorRetry = retry_options [ "errorRetry" ]
19
24
end
20
25
21
26
def self . live_preview_query ( query = { } )
@@ -29,7 +34,7 @@ def self.fetch_content_types(uid="")
29
34
else
30
35
path = "/content_types"
31
36
end
32
- send_request ( path , { } )
37
+ fetch_retry ( path , { } )
33
38
end
34
39
35
40
def self . fetch_entries ( content_type , query )
@@ -38,7 +43,7 @@ def self.fetch_entries(content_type, query)
38
43
send_preview_request ( path , query )
39
44
else
40
45
path = "/content_types/#{ content_type } /entries"
41
- send_request ( path , query )
46
+ fetch_retry ( path , query )
42
47
end
43
48
end
44
49
@@ -48,22 +53,37 @@ def self.fetch_entry(content_type, entry_uid, query)
48
53
send_preview_request ( path , query )
49
54
else
50
55
path = "/content_types/#{ content_type } /entries/#{ entry_uid } "
51
- send_request ( path , query )
56
+ fetch_retry ( path , query )
52
57
end
53
58
end
54
59
55
60
def self . get_assets ( asset_uid = nil )
56
61
path = "/assets"
57
62
path += "/#{ asset_uid } " if !asset_uid . nil?
58
- send_request ( path )
63
+ fetch_retry ( path )
59
64
end
60
65
61
66
def self . get_sync_items ( query )
62
67
path = "/stacks/sync"
63
- send_request ( path , query )
68
+ fetch_retry ( path , query )
64
69
end
65
70
66
71
private
72
+ def self . fetch_retry ( path , query = nil , count = 0 )
73
+ response = send_request ( path , query )
74
+ if @errorRetry . include? ( response [ "status_code" ] . to_i )
75
+ if count < @retryLimit
76
+ retryDelay_in_seconds = @retryDelay / 1000 #converting retry_delay from milliseconds into seconds
77
+ sleep ( retryDelay_in_seconds . to_i ) #sleep method requires time in seconds as parameter
78
+ response = fetch_retry ( path , query , ( count + 1 ) )
79
+ else
80
+ raise Contentstack ::Error . new ( response ) #Retry Limit exceeded
81
+ end
82
+ else
83
+ response
84
+ end
85
+ end
86
+
67
87
def self . send_request ( path , q = nil )
68
88
q ||= { }
69
89
@@ -75,12 +95,44 @@ def self.send_request(path, q=nil)
75
95
"api_key" => @api_key ,
76
96
"access_token" => @access_token ,
77
97
"user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " ,
78
- "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } "
98
+ "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " ,
99
+ "read_timeout" => @timeout
79
100
}
80
101
if !@branch . nil? && !@branch . empty?
81
102
params [ "branch" ] = @branch
82
103
end
83
- ActiveSupport ::JSON . decode ( URI . open ( "#{ @host } #{ @api_version } #{ path } #{ query } " , params ) . read )
104
+
105
+ begin
106
+ if @proxy_details . empty?
107
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ @host } #{ @api_version } #{ path } #{ query } " , params ) . read )
108
+ elsif @proxy_details . present? && @proxy_details [ :url ] . present? && @proxy_details [ :port ] . present? && @proxy_details [ :username ] . present? && @proxy_details [ :password ] . present?
109
+ proxy_uri = URI . parse ( "http://#{ @proxy_details [ :url ] } :#{ @proxy_details [ :port ] } /" )
110
+ proxy_username = @proxy_details [ :username ]
111
+ proxy_password = @proxy_details [ :password ]
112
+
113
+ if !@branch . nil? && !@branch . empty?
114
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ @host } #{ @api_version } #{ path } #{ query } " , :proxy_http_basic_authentication => [ proxy_uri , proxy_username , proxy_password ] , "api_key" => @api_key , "access_token" => @access_token , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout , "branch" => @branch ) . read )
115
+ else
116
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ @host } #{ @api_version } #{ path } #{ query } " , :proxy_http_basic_authentication => [ proxy_uri , proxy_username , proxy_password ] , "api_key" => @api_key , "access_token" => @access_token , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout ) . read )
117
+ end
118
+ elsif @proxy_details . present? && @proxy_details [ :url ] . present? && @proxy_details [ :port ] . present? && @proxy_details [ :username ] . empty? && @proxy_details [ :password ] . empty?
119
+ proxy_uri = URI . parse ( "http://#{ @proxy_details [ :url ] } :#{ @proxy_details [ :port ] } /" )
120
+
121
+ if !@branch . nil? && !@branch . empty?
122
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ @host } #{ @api_version } #{ path } #{ query } " , "proxy" => proxy_uri , "api_key" => @api_key , "access_token" => @access_token , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout , "branch" => @branch ) . read )
123
+ else
124
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ @host } #{ @api_version } #{ path } #{ query } " , "proxy" => proxy_uri , "api_key" => @api_key , "access_token" => @access_token , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout ) . read )
125
+ end
126
+ end
127
+ rescue OpenURI ::HTTPError => error
128
+ response = error . io
129
+ #response.status
130
+ # => ["503", "Service Unavailable"]
131
+ error_response = JSON . parse ( response . string )
132
+ error_status = { "status_code" => response . status [ 0 ] , "status_message" => response . status [ 1 ] }
133
+ error = error_response . merge ( error_status )
134
+ raise Contentstack ::Error . new ( error . to_s )
135
+ end
84
136
end
85
137
86
138
def self . send_preview_request ( path , q = nil )
@@ -94,12 +146,43 @@ def self.send_preview_request(path, q=nil)
94
146
"api_key" => @api_key ,
95
147
"authorization" => @live_preview [ :management_token ] ,
96
148
"user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " ,
97
- "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } "
149
+ "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " ,
150
+ "read_timeout" => @timeout
98
151
}
99
152
if !@branch . nil? && !@branch . empty?
100
153
params [ "branch" ] = @branch
101
154
end
102
- ActiveSupport ::JSON . decode ( URI . open ( "#{ preview_host } #{ @api_version } #{ path } #{ query } " , params ) . read )
155
+ begin
156
+ if @proxy_details . empty?
157
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ preview_host } #{ @api_version } #{ path } #{ query } " , params ) . read )
158
+ elsif @proxy_details . present? && @proxy_details [ :url ] . present? && @proxy_details [ :port ] . present? && @proxy_details [ :username ] . present? && @proxy_details [ :password ] . present?
159
+ proxy_uri = URI . parse ( "http://#{ @proxy_details [ :url ] } :#{ @proxy_details [ :port ] } /" )
160
+ proxy_username = @proxy_details [ :username ]
161
+ proxy_password = @proxy_details [ :password ]
162
+
163
+ if !@branch . nil? && !@branch . empty?
164
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ preview_host } #{ @api_version } #{ path } #{ query } " , :proxy_http_basic_authentication => [ proxy_uri , proxy_username , proxy_password ] , "api_key" => @api_key , "authorization" => @live_preview [ :management_token ] , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout , "branch" => @branch ) . read )
165
+ else
166
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ preview_host } #{ @api_version } #{ path } #{ query } " , :proxy_http_basic_authentication => [ proxy_uri , proxy_username , proxy_password ] , "api_key" => @api_key , "authorization" => @live_preview [ :management_token ] , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout ) . read )
167
+ end
168
+ elsif @proxy_details . present? && @proxy_details [ :url ] . present? && @proxy_details [ :port ] . present? && @proxy_details [ :username ] . empty? && @proxy_details [ :password ] . empty?
169
+ proxy_uri = URI . parse ( "http://#{ @proxy_details [ :url ] } :#{ @proxy_details [ :port ] } /" )
170
+
171
+ if !@branch . nil? && !@branch . empty?
172
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ preview_host } #{ @api_version } #{ path } #{ query } " , "proxy" => proxy_uri , "api_key" => @api_key , "authorization" => @live_preview [ :management_token ] , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout , "branch" => @branch ) . read )
173
+ else
174
+ ActiveSupport ::JSON . decode ( URI . open ( "#{ preview_host } #{ @api_version } #{ path } #{ query } " , "proxy" => proxy_uri , "api_key" => @api_key , "authorization" => @live_preview [ :management_token ] , "user_agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "x-user-agent" => "ruby-sdk/#{ Contentstack ::VERSION } " , "read_timeout" => @timeout ) . read )
175
+ end
176
+ end
177
+ rescue OpenURI ::HTTPError => error
178
+ response = error . io
179
+ #response.status
180
+ # => ["503", "Service Unavailable"]
181
+ error_response = JSON . parse ( response . string )
182
+ error_status = { "status_code" => response . status [ 0 ] , "status_message" => response . status [ 1 ] }
183
+ error = error_response . merge ( error_status )
184
+ raise Contentstack ::Error . new ( error . to_s )
185
+ end
103
186
end
104
187
end
105
188
end
0 commit comments