LVS-JSONService 0.3.6 → 0.3.7
Sign up to get free protection for your applications and to get access to all the features.
- data/.specification +1 -1
- data/LVS-JSONService.gemspec +1 -1
- data/VERSION +1 -1
- data/lib/lvs/json_service/base.rb +2 -1
- data/lib/lvs/json_service/request.rb +13 -1
- data/spec/lvs/json_service/request_spec.rb +72 -0
- metadata +1 -1
data/.specification
CHANGED
data/LVS-JSONService.gemspec
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.7
|
@@ -220,7 +220,7 @@ module LVS
|
|
220
220
|
class Error < StandardError
|
221
221
|
attr_reader :message, :code, :service, :args, :json_response
|
222
222
|
|
223
|
-
def initialize(message, code, service, args, response=nil)
|
223
|
+
def initialize(message, code=nil, service=nil, args=nil, response=nil)
|
224
224
|
@message = message
|
225
225
|
@code = code
|
226
226
|
@service = service
|
@@ -235,5 +235,6 @@ module LVS
|
|
235
235
|
class TimeoutError < Error; end
|
236
236
|
class BackendUnavailableError < Error; end
|
237
237
|
class NotModified < Error; end
|
238
|
+
class RequestMismatchError < Error; end
|
238
239
|
end
|
239
240
|
end
|
@@ -19,7 +19,8 @@ module LVS
|
|
19
19
|
uri = URI.parse(service)
|
20
20
|
|
21
21
|
req = Net::HTTP::Post.new(uri.path)
|
22
|
-
|
22
|
+
req.add_field("X-LVS-Request-ID", options[:request_id])
|
23
|
+
|
23
24
|
req.form_data = { "object_request" => args.to_json }
|
24
25
|
|
25
26
|
options[:encrypted] ||= require_ssl?
|
@@ -78,11 +79,13 @@ module LVS
|
|
78
79
|
def run_remote_request(service, args, options = {})
|
79
80
|
LVS::JsonService::Logger.debug "Requesting '#{service}' with #{args.to_json}"
|
80
81
|
|
82
|
+
options[:request_id] = unique_request_id
|
81
83
|
if options[:cached_for]
|
82
84
|
timing = "CACHED"
|
83
85
|
response, result = Rails.cache.fetch([service, args].cache_key, :expires_in => options[:cached_for]) do
|
84
86
|
start = Time.now
|
85
87
|
response = http_request_with_timeout(service, args, options)
|
88
|
+
verify_request_id(response, options[:request_id])
|
86
89
|
net_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
|
87
90
|
start = Time.now
|
88
91
|
result = JSON.parse(response.body)
|
@@ -93,6 +96,7 @@ module LVS
|
|
93
96
|
else
|
94
97
|
start = Time.now
|
95
98
|
response = http_request_with_timeout(service, args, options)
|
99
|
+
verify_request_id(response, options[:request_id])
|
96
100
|
net_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
|
97
101
|
start = Time.now
|
98
102
|
result = JSON.parse(response.body)
|
@@ -110,6 +114,14 @@ module LVS
|
|
110
114
|
end
|
111
115
|
result
|
112
116
|
end
|
117
|
+
|
118
|
+
def verify_request_id(response, request_id)
|
119
|
+
returned_request_id = response["X-LVS-Request-ID"]
|
120
|
+
if returned_request_id != request_id && !returned_request_id.blank?
|
121
|
+
raise LVS::JsonService::RequestMismatchError.new("The sent Request ID (#{request_id}) didn't " +
|
122
|
+
"match the returned Request ID (#{returned_request_id}) ")
|
123
|
+
end
|
124
|
+
end
|
113
125
|
end
|
114
126
|
end
|
115
127
|
end
|
@@ -234,6 +234,78 @@ describe LVS::JsonService::Request do
|
|
234
234
|
ClassWithRequest.run_remote_request(@url, @args, @options)
|
235
235
|
}.should raise_error(LVS::JsonService::Error)
|
236
236
|
end
|
237
|
+
|
238
|
+
it "should generate a unique Request ID" do
|
239
|
+
ClassWithRequest.unique_request_id.should_not eql(ClassWithRequest.unique_request_id)
|
240
|
+
end
|
241
|
+
|
242
|
+
it "should send a Request ID" do
|
243
|
+
@mock_post = mock(:post, :null_object => true)
|
244
|
+
Net::HTTP::Post.stub!(:new).and_return(@mock_post)
|
245
|
+
@mock_post.should_receive(:add_field).with("X-LVS-Request-ID", '1234')
|
246
|
+
|
247
|
+
@mock_http = MockNetHttp.new
|
248
|
+
@connection = @mock_http.connection
|
249
|
+
Net::HTTP.stub!(:new).and_return(@mock_http)
|
250
|
+
|
251
|
+
response = {}
|
252
|
+
response.stub!(:body).and_return("")
|
253
|
+
JSON.stub(:parse)
|
254
|
+
ClassWithRequest.stub!(:unique_request_id).and_return('1234')
|
255
|
+
ClassWithRequest.stub!(:verify_request_id)
|
256
|
+
ClassWithRequest.run_remote_request(@url, @args, @options)
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should raise an error if the Request ID doesn't match the one returned" do
|
260
|
+
@mock_post = mock(:post, :null_object => true)
|
261
|
+
Net::HTTP::Post.stub!(:new).and_return(@mock_post)
|
262
|
+
@mock_http = MockNetHttp.new
|
263
|
+
@connection = @mock_http.connection
|
264
|
+
Net::HTTP.stub!(:new).and_return(@mock_http)
|
265
|
+
|
266
|
+
response = {"X-LVS-Request-ID" => "5678"}
|
267
|
+
response.stub!(:body).and_return("")
|
268
|
+
ClassWithRequest.stub!(:http_request_with_timeout).and_return(response)
|
269
|
+
JSON.stub(:parse)
|
270
|
+
ClassWithRequest.stub!(:unique_request_id).and_return('1234')
|
271
|
+
lambda {
|
272
|
+
ClassWithRequest.run_remote_request(@url, @args, @options)
|
273
|
+
}.should raise_error(LVS::JsonService::RequestMismatchError)
|
274
|
+
end
|
275
|
+
|
276
|
+
it "shouldn't raise an error if the Request ID matches the one returned" do
|
277
|
+
@mock_post = mock(:post, :null_object => true)
|
278
|
+
Net::HTTP::Post.stub!(:new).and_return(@mock_post)
|
279
|
+
@mock_http = MockNetHttp.new
|
280
|
+
@connection = @mock_http.connection
|
281
|
+
Net::HTTP.stub!(:new).and_return(@mock_http)
|
282
|
+
|
283
|
+
response = {"X-LVS-Request-ID" => "5678"}
|
284
|
+
response.stub!(:body).and_return("")
|
285
|
+
ClassWithRequest.stub!(:http_request_with_timeout).and_return(response)
|
286
|
+
JSON.stub(:parse)
|
287
|
+
ClassWithRequest.stub!(:unique_request_id).and_return('5678')
|
288
|
+
lambda {
|
289
|
+
ClassWithRequest.run_remote_request(@url, @args, @options)
|
290
|
+
}.should_not raise_error(LVS::JsonService::RequestMismatchError)
|
291
|
+
end
|
292
|
+
|
293
|
+
it "shouldn't raise an error if there is no response Request ID header" do
|
294
|
+
@mock_post = mock(:post, :null_object => true)
|
295
|
+
Net::HTTP::Post.stub!(:new).and_return(@mock_post)
|
296
|
+
@mock_http = MockNetHttp.new
|
297
|
+
@connection = @mock_http.connection
|
298
|
+
Net::HTTP.stub!(:new).and_return(@mock_http)
|
299
|
+
|
300
|
+
response = {}
|
301
|
+
response.stub!(:body).and_return("")
|
302
|
+
ClassWithRequest.stub!(:http_request_with_timeout).and_return(response)
|
303
|
+
JSON.stub(:parse)
|
304
|
+
ClassWithRequest.stub!(:unique_request_id).and_return('5678')
|
305
|
+
lambda {
|
306
|
+
ClassWithRequest.run_remote_request(@url, @args, @options)
|
307
|
+
}.should_not raise_error(LVS::JsonService::RequestMismatchError)
|
308
|
+
end
|
237
309
|
end
|
238
310
|
|
239
311
|
end
|