LVS-JSONService 0.4.2 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.specification CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: LVS-JSONService
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  require_paths:
6
6
  - lib
7
7
  platform: ruby
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{LVS-JSONService}
5
- s.version = "0.4.2"
5
+ s.version = "0.4.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["LVS", "andyjeffries"]
9
- s.date = %q{2009-08-06}
9
+ s.date = %q{2010-01-19}
10
10
  s.email = %q{info@lvs.co.uk}
11
11
  s.extra_rdoc_files = [
12
12
  "LICENSE",
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.4.3
data/lib/json_service.rb CHANGED
@@ -1,2 +1,6 @@
1
+ require 'rubygems'
2
+ require 'activesupport'
3
+ require 'eventmachine'
4
+ require 'em-http'
1
5
  require 'lvs/json_service/base'
2
6
  require 'lvs/json_service/logger'
@@ -12,15 +12,16 @@ module LVS
12
12
  protected
13
13
 
14
14
  class << self
15
- @site = ""
16
- @services = []
17
- @service_prefix = ""
18
- @field_prefix = ""
19
- @encrypted = false
20
- @ignore_missing = false
21
- @auth_cert = ""
22
- @auth_key = ""
23
- @auth_key_pass = ""
15
+ @site = ""
16
+ @services = []
17
+ @service_prefix = ""
18
+ @field_prefix = ""
19
+ @encrypted = false
20
+ @ignore_missing = false
21
+ @auth_cert = ""
22
+ @auth_key = ""
23
+ @auth_key_pass = ""
24
+ @eventmachine_async = false
24
25
 
25
26
  def encrypted=(value)
26
27
  @encrypted = value
@@ -55,6 +56,10 @@ module LVS
55
56
  @field_prefix = value
56
57
  end
57
58
 
59
+ def is_eventmachine_async!
60
+ @eventmachine_async = true
61
+ end
62
+
58
63
  def site=(value)
59
64
  # value is containing AGP_LOCATION already sometimes:
60
65
  value.gsub!(/^#{AGP_LOCATION}/, '') if defined?(AGP_LOCATION) && value.match(/#{AGP_LOCATION}/)
@@ -80,7 +85,7 @@ module LVS
80
85
  (Module.const_defined?(:SSL_ENABLED) && SSL_ENABLED) || (Module.const_defined?(:SSL_DISABLED) && !SSL_DISABLED)
81
86
  end
82
87
 
83
- def define_service(name, service, options = {})
88
+ def define_service(name, service, options = {}, &block)
84
89
  service_name = name
85
90
 
86
91
  service_path = service.split('.')
@@ -92,12 +97,13 @@ module LVS
92
97
  prefix = service_path[0..-3].join('.') + '.'
93
98
  end
94
99
 
95
- options[:encrypted] = @encrypted if @encrypted
96
- options[:auth_cert] = @auth_cert if @auth_cert
97
- options[:auth_key] = @auth_key if @auth_key
98
- options[:auth_key_pass] = @auth_key_pass if @auth_key_pass
100
+ options[:encrypted] = @encrypted if @encrypted
101
+ options[:eventmachine_async] = @eventmachine_async if @eventmachine_async
102
+ options[:auth_cert] = @auth_cert if @auth_cert
103
+ options[:auth_key] = @auth_key if @auth_key
104
+ options[:auth_key_pass] = @auth_key_pass if @auth_key_pass
99
105
 
100
- (class<<self;self;end).send :define_method, service_name do |*args|
106
+ (class<<self;self;end).send :define_method, service_name do |*args, &block|
101
107
  method_params, flags = args
102
108
 
103
109
  method_params ||= {}
@@ -109,11 +115,22 @@ module LVS
109
115
  options[:required].each do |key|
110
116
  raise LVS::JsonService::Error.new("Required field #{key} wasn't supplied", internal_service, '0', method_params) if method_params[key].blank?
111
117
  end
112
- result = self.run_remote_request(@site + prefix + internal_service, method_params, options)
113
- if flags && flags[:raw]
114
- result
118
+ if block
119
+ self.run_remote_request(@site + prefix + internal_service, method_params, options) do |result|
120
+ if flags && flags[:raw]
121
+ yield(result)
122
+ else
123
+ block.call(self.parse_result(result))
124
+ end
125
+ end
115
126
  else
116
- self.parse_result(result)
127
+ result = self.run_remote_request(@site + prefix + internal_service, method_params, options)
128
+ puts "In service call non-block"
129
+ if flags && flags[:raw]
130
+ result
131
+ else
132
+ self.parse_result(result)
133
+ end
117
134
  end
118
135
  end
119
136
 
@@ -132,7 +149,9 @@ module LVS
132
149
  end
133
150
 
134
151
  def parse_result(response)
135
- if response.is_a?(Array)
152
+ if response.is_a?(LVS::JsonService::Error)
153
+ response
154
+ elsif response.is_a?(Array)
136
155
  array = response.map { |x| self.new(x) }
137
156
  else
138
157
  self.new(response)
@@ -267,7 +286,7 @@ module LVS
267
286
  end
268
287
 
269
288
  class Error < StandardError
270
- attr_reader :message, :code, :service, :args, :json_response
289
+ attr_reader :message, :code, :service, :args, :json_response, :backtrace
271
290
 
272
291
  def initialize(message, code=nil, service=nil, args=nil, response=nil)
273
292
  @message = message
@@ -275,6 +294,7 @@ module LVS
275
294
  @service = service
276
295
  @args = args
277
296
  @json_response = response
297
+ @backtrace = caller
278
298
 
279
299
  super "#{message}\n#{service} (#{args.inspect})"
280
300
  end
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'ostruct'
2
3
  require 'lvs/json_service/logger'
3
4
  require 'lvs/json_service/connection_manager'
4
5
 
@@ -15,7 +16,7 @@ module LVS
15
16
  Digest::SHA1.hexdigest((rand(4294967295)+Time.now.usec).to_s)
16
17
  end
17
18
 
18
- def http_request_with_timeout(service, args, options)
19
+ def http_standard_request_with_timeout(service, args, options)
19
20
  uri = URI.parse(service)
20
21
 
21
22
  req = Net::HTTP::Post.new(uri.path)
@@ -65,7 +66,6 @@ module LVS
65
66
 
66
67
  rescue OpenSSL::SSL::SSLError => e
67
68
  raise LVS::JsonService::BackendUnavailableError.new("Backend unavailable #{e}", 500, service, args)
68
-
69
69
  end
70
70
 
71
71
  if response.is_a?(Net::HTTPNotFound)
@@ -76,55 +76,110 @@ module LVS
76
76
  raise LVS::JsonService::NotModified.new("304 Data hasn't changed", 304, service, args)
77
77
  end
78
78
 
79
- response
79
+ yield(response)
80
+ end
81
+
82
+ def http_eventmachine_request_with_timeout(service, args, options)
83
+ http_options = {}
84
+ http_options[:timeout] = options[:timeout] || 1
85
+ http_options[:head] = {"X-LVS-Request-ID" => options[:request_id]}
86
+ http_options[:body] = {"object_request" => args.to_json}
87
+
88
+ http = EventMachine::HttpRequest.new(service).post(http_options)
89
+ http.callback {
90
+ response = OpenStruct.new(:request_id => http.response_header["X-LVS-Request-ID"], :body => http.response)
91
+ yield(response)
92
+ }
93
+ http.errback {
94
+ if (http.response_header.status == 404)
95
+ yield(LVS::JsonService::NotFoundError.new("404 Found for the service #{service}", 404, service, args))
96
+ elsif (http.response_header.status == 304)
97
+ yield(LVS::JsonService::NotModified.new("304 Data hasn't changed", 304, service, args))
98
+ elsif (http.response_header.status == 0)
99
+ yield(LVS::JsonService::BackendUnavailableError.new("Backend unavailable (in time)", 500, service, args))
100
+ else
101
+ yield(LVS::JsonService::Error.new("Unknown error (#{http.response_header.inspect})", 500, service, args))
102
+ end
103
+ }
80
104
  end
81
105
 
82
106
  def run_remote_request(service, args, options = {})
83
107
  LVS::JsonService::Logger.debug "Requesting '#{service}' with #{args.to_json}"
84
108
 
109
+ response = nil
110
+ result = nil
85
111
  options[:request_id] = unique_request_id
112
+
86
113
  if options[:cached_for]
87
114
  timing = "CACHED"
88
- response, result = Rails.cache.fetch([service, args].cache_key, :expires_in => options[:cached_for]) do
89
- start = Time.now
90
- response = http_request_with_timeout(service, args, options)
91
- verify_request_id(response, options[:request_id])
92
- net_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
93
- start = Time.now
94
- result = JSON.parse(response.body)
95
- parse_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
96
- timing = "Net: #{net_timing}, Parse: #{parse_timing}"
97
- [response, result]
115
+ response, result = Rails.cache.read([service, args].cache_key, :expires_in => options[:cached_for])
116
+ end
117
+ if response.nil?
118
+ start = Time.now
119
+ if options[:eventmachine_async]
120
+ http_eventmachine_request_with_timeout(service, args, options) do |response|
121
+ if response.is_a?(LVS::JsonService::Error)
122
+ result = response
123
+ else
124
+ verify_request_id(response.request_id, options[:request_id])
125
+ net_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
126
+ start = Time.now
127
+ result = JSON.parse(response.body)
128
+ parse_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
129
+ timing = "Net: #{net_timing}, Parse: #{parse_timing}"
130
+ if options[:cached_for]
131
+ Rails.cache.write([service, args].cache_key, [response, result], :expires_in => options[:cached_for])
132
+ end
133
+ log_response(timing, response.body, options)
134
+ if result.is_a?(Hash) && result.has_key?("PCode")
135
+ result = LVS::JsonService::Error.new(result["message"], result["PCode"], service, args, result)
136
+ end
137
+ end
138
+ yield(result) if block_given?
139
+ return result
140
+ end
141
+ else
142
+ http_standard_request_with_timeout(service, args, options) do |response|
143
+ verify_request_id(response["X-LVS-Request-ID"], options[:request_id])
144
+ net_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
145
+ start = Time.now
146
+ result = JSON.parse(response.body)
147
+ parse_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
148
+ timing = "Net: #{net_timing}, Parse: #{parse_timing}"
149
+ if options[:cached_for]
150
+ Rails.cache.write([service, args].cache_key, [response, result], :expires_in => options[:cached_for])
151
+ end
152
+ log_response(timing, response.body, options)
153
+ if result.is_a?(Hash) && result.has_key?("PCode")
154
+ raise LVS::JsonService::Error.new(result["message"], result["PCode"], service, args, result)
155
+ end
156
+ yield(result) if block_given?
157
+ return result
158
+ end
98
159
  end
99
160
  else
100
- start = Time.now
101
- response = http_request_with_timeout(service, args, options)
102
- verify_request_id(response, options[:request_id])
103
- net_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
104
- start = Time.now
105
- result = JSON.parse(response.body)
106
- parse_timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
107
- timing = "Net: #{net_timing}, Parse: #{parse_timing}"
161
+ log_response(timing, response.body, options)
162
+ if result.is_a?(Hash) && result.has_key?("PCode")
163
+ raise LVS::JsonService::Error.new(result["message"], result["PCode"], service, args, result)
164
+ end
108
165
  end
166
+ result
167
+ end
109
168
 
110
- if response.body.size < 1024 || options[:debug]
111
- LVS::JsonService::Logger.debug "Response (#{timing}): #{response.body.gsub(/\n/, '')}"
169
+ def log_response(timing, body, options)
170
+ if body.size < 1024 || options[:debug]
171
+ LVS::JsonService::Logger.debug "Response (#{timing}): #{body.gsub(/\n/, '')}"
112
172
  else
113
- LVS::JsonService::Logger.debug "Response Snippet (#{timing} / #{"%.1f" % (response.body.size/1024)}kB): #{response.body.gsub(/\n/, '')[0..1024]}"
114
- end
115
- if result.is_a?(Hash) && result.has_key?("PCode")
116
- raise LVS::JsonService::Error.new(result["message"], result["PCode"], service, args, result)
173
+ LVS::JsonService::Logger.debug "Response Snippet (#{timing} / #{"%.1f" % (body.size/1024)}kB): #{body.gsub(/\n/, '')[0..1024]}"
117
174
  end
118
- result
119
175
  end
120
176
 
121
- def verify_request_id(response, request_id)
122
- returned_request_id = response["X-LVS-Request-ID"]
123
- if returned_request_id != request_id && !returned_request_id.blank?
124
- raise LVS::JsonService::RequestMismatchError.new("The sent Request ID (#{request_id}) didn't " +
177
+ def verify_request_id(returned_request_id, sent_request_id)
178
+ if returned_request_id != sent_request_id && !returned_request_id.blank?
179
+ raise LVS::JsonService::RequestMismatchError.new("The sent Request ID (#{sent_request_id}) didn't " +
125
180
  "match the returned Request ID (#{returned_request_id}) ")
126
181
  else
127
- LVS::JsonService::Logger.debug "Sent and received Request ID - #{request_id}"
182
+ LVS::JsonService::Logger.debug "Sent and received Request ID - #{sent_request_id}"
128
183
  end
129
184
  end
130
185
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: LVS-JSONService
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - LVS
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-08-06 00:00:00 +01:00
13
+ date: 2010-01-19 00:00:00 +00:00
14
14
  default_executable:
15
15
  dependencies: []
16
16