fluidfeatures 0.3.4 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/fluidfeatures/client.rb +48 -11
- data/lib/fluidfeatures/version.rb +1 -1
- metadata +1 -1
data/lib/fluidfeatures/client.rb
CHANGED
@@ -14,6 +14,9 @@ module FluidFeatures
|
|
14
14
|
|
15
15
|
API_REQUEST_LOG_MAX_SIZE = 200
|
16
16
|
|
17
|
+
# Do not gzip request or response body if size is under N bytes
|
18
|
+
MIN_GZIP_SIZE = 1024
|
19
|
+
|
17
20
|
def initialize(base_uri, logger)
|
18
21
|
|
19
22
|
@uuid = UUID.new.generate
|
@@ -83,8 +86,10 @@ module FluidFeatures
|
|
83
86
|
begin
|
84
87
|
|
85
88
|
request = Net::HTTP::Get.new url_path
|
89
|
+
request["Authorization"] = auth_token
|
86
90
|
request["Accept"] = "application/json"
|
87
|
-
request[
|
91
|
+
request["Accept-Encoding"] = "gzip"
|
92
|
+
|
88
93
|
@etags_lock.synchronize do
|
89
94
|
if cache and @etags.has_key? url_path
|
90
95
|
request["If-None-Match"] = @etags[url_path][:etag]
|
@@ -101,7 +106,7 @@ module FluidFeatures
|
|
101
106
|
no_change = true
|
102
107
|
success = true
|
103
108
|
elsif response.is_a? Net::HTTPSuccess
|
104
|
-
payload =
|
109
|
+
payload = parse_response_body response
|
105
110
|
if cache
|
106
111
|
@etags_lock.synchronize do
|
107
112
|
@etags[url_path] = {
|
@@ -112,7 +117,7 @@ module FluidFeatures
|
|
112
117
|
end
|
113
118
|
success = true
|
114
119
|
else
|
115
|
-
payload =
|
120
|
+
payload = parse_response_body response
|
116
121
|
if payload and payload.is_a? Hash and payload.has_key? "error"
|
117
122
|
err_msg = payload["error"]
|
118
123
|
end
|
@@ -143,11 +148,12 @@ module FluidFeatures
|
|
143
148
|
err_msg = nil
|
144
149
|
success = false
|
145
150
|
begin
|
151
|
+
|
146
152
|
request = Net::HTTP::Put.new uri_path
|
147
|
-
request["
|
153
|
+
request["Authorization"] = auth_token
|
148
154
|
request["Accept"] = "application/json"
|
149
|
-
request[
|
150
|
-
request
|
155
|
+
request["Accept-Encoding"] = "gzip"
|
156
|
+
encode_request_body(request, payload)
|
151
157
|
|
152
158
|
request_start_time = Time.now
|
153
159
|
response = @http.request uri, request
|
@@ -158,7 +164,7 @@ module FluidFeatures
|
|
158
164
|
if response.is_a? Net::HTTPSuccess
|
159
165
|
success = true
|
160
166
|
else
|
161
|
-
response_payload =
|
167
|
+
response_payload = parse_response_body response
|
162
168
|
if response_payload.is_a? Hash and response_payload.has_key? "error"
|
163
169
|
err_msg = response_payload["error"]
|
164
170
|
end
|
@@ -183,11 +189,12 @@ module FluidFeatures
|
|
183
189
|
err_msg = nil
|
184
190
|
success = false
|
185
191
|
begin
|
192
|
+
|
186
193
|
request = Net::HTTP::Post.new url_path
|
187
|
-
request["Content-Type"] = "application/json"
|
188
194
|
request["Accept"] = "application/json"
|
189
|
-
request[
|
190
|
-
request
|
195
|
+
request["Accept-Encoding"] = "gzip"
|
196
|
+
request["Authorization"] = auth_token
|
197
|
+
encode_request_body(request, payload)
|
191
198
|
|
192
199
|
request_start_time = Time.now
|
193
200
|
response = @http.request request
|
@@ -198,7 +205,7 @@ module FluidFeatures
|
|
198
205
|
if response.is_a? Net::HTTPSuccess
|
199
206
|
success = true
|
200
207
|
else
|
201
|
-
response_payload =
|
208
|
+
response_payload = parse_response_body response
|
202
209
|
if response_payload.is_a? Hash and response_payload.has_key? "error"
|
203
210
|
err_msg = response_payload["error"]
|
204
211
|
end
|
@@ -215,5 +222,35 @@ module FluidFeatures
|
|
215
222
|
return success
|
216
223
|
end
|
217
224
|
|
225
|
+
def parse_response_body response
|
226
|
+
content = response.body
|
227
|
+
if response["Content-Encoding"] == "gzip"
|
228
|
+
content = Zlib::GzipReader.new(
|
229
|
+
StringIO.new(content)
|
230
|
+
).read
|
231
|
+
end
|
232
|
+
JSON.load(content) rescue nil
|
233
|
+
end
|
234
|
+
|
235
|
+
def encode_request_body(request, payload, encoding="gzip")
|
236
|
+
|
237
|
+
# Encode as JSON string
|
238
|
+
content = JSON.dump(payload)
|
239
|
+
|
240
|
+
# Gzip compress if necessary
|
241
|
+
if encoding == "gzip" and content.size >= MIN_GZIP_SIZE
|
242
|
+
compressed = StringIO.new
|
243
|
+
gz_writer = Zlib::GzipWriter.new(compressed)
|
244
|
+
gz_writer.write(content)
|
245
|
+
gz_writer.close
|
246
|
+
content = compressed.string
|
247
|
+
end
|
248
|
+
|
249
|
+
request["Content-Type"] = "application/json"
|
250
|
+
request["Content-Encoding"] = encoding
|
251
|
+
request.body = content
|
252
|
+
|
253
|
+
end
|
254
|
+
|
218
255
|
end
|
219
256
|
end
|