LVS-JSONService 0.2.0 → 0.2.1
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/.gitignore +2 -1
- data/.specification +1 -1
- data/JSONService.gemspec +2 -2
- data/VERSION +1 -1
- data/lib/lvs/json_service/base.rb +103 -104
- data/lib/lvs/json_service/logger.rb +2 -3
- data/lib/lvs/json_service/request.rb +30 -7
- metadata +2 -2
data/.gitignore
CHANGED
data/.specification
CHANGED
data/JSONService.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{JSONService}
|
5
|
-
s.version = "0.2.
|
5
|
+
s.version = "0.2.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["LVS"]
|
9
|
-
s.date = %q{2009-06-
|
9
|
+
s.date = %q{2009-06-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.2.
|
1
|
+
0.2.1
|
@@ -7,130 +7,129 @@ module LVS
|
|
7
7
|
class Base
|
8
8
|
include ::LVS::JsonService::Request
|
9
9
|
|
10
|
-
@@services = []
|
11
|
-
@@cache = CACHE if defined?(CACHE)
|
12
|
-
@@service_prefix = ""
|
13
10
|
attr_accessor :fields
|
14
|
-
cattr_accessor :service_prefix
|
15
|
-
cattr_accessor :field_prefix
|
16
|
-
cattr_accessor :cache
|
17
11
|
|
18
12
|
protected
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
value
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
mutex ||= Mutex::new
|
45
|
-
tried = false
|
46
|
-
mutex.lock if AppTools.is_memcached_threaded?
|
47
|
-
begin
|
48
|
-
jsn_data = { }
|
49
|
-
if ActionController::Base.perform_caching && @@cache
|
50
|
-
Rails.logger.info("JSON API CACHED CALL: #{service} - #{args.to_yaml}")
|
51
|
-
key = "json:call:" + Digest::MD5.hexdigest("#{service}:#{args.to_s}")
|
52
|
-
cached = @@cache.get(key)
|
53
|
-
if cached.nil?
|
54
|
-
result = self.send(service_name, args)
|
55
|
-
@@cache.set(key, result, options[:cache_time])
|
56
|
-
jsn_data = result
|
57
|
-
else
|
58
|
-
jsn_data = cached
|
59
|
-
end
|
60
|
-
else
|
61
|
-
Rails.logger.info("JSON API CALL: #{method} - #{args.to_yaml}")
|
62
|
-
jsn_data = self.send(service_name, args)
|
63
|
-
end
|
64
|
-
jsn_data
|
65
|
-
rescue MemCache::MemCacheError => err
|
66
|
-
raise err if tried
|
67
|
-
Rails.logger.info("JSON API CALL RETRY: #{err} - #{method} - #{args.to_yaml}")
|
68
|
-
tried = true
|
69
|
-
retry
|
70
|
-
end
|
71
|
-
ensure
|
72
|
-
mutex.unlock if AppTools.is_memcached_threaded?
|
73
|
-
end
|
14
|
+
class << self
|
15
|
+
@site = ""
|
16
|
+
@services = []
|
17
|
+
@service_prefix = ""
|
18
|
+
@field_prefix = ""
|
19
|
+
@encrypted = false
|
20
|
+
@auth_cert = ""
|
21
|
+
@auth_key = ""
|
22
|
+
@auth_key_pass = ""
|
23
|
+
|
24
|
+
def encrypted=(value)
|
25
|
+
@encrypted = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def auth_cert=(value)
|
29
|
+
@auth_cert = value
|
30
|
+
end
|
31
|
+
|
32
|
+
def auth_key=(value)
|
33
|
+
@auth_key = value
|
34
|
+
end
|
35
|
+
|
36
|
+
def auth_key_pass=(value)
|
37
|
+
@auth_key_pass = value
|
74
38
|
end
|
75
|
-
end
|
76
39
|
|
77
|
-
|
78
|
-
|
40
|
+
def agp_location=(value)
|
41
|
+
@agp_location = value
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_service(service)
|
45
|
+
@services ||= []
|
46
|
+
@services = @services << service
|
47
|
+
end
|
48
|
+
|
49
|
+
def service_prefix=(value)
|
50
|
+
@service_prefix = value
|
51
|
+
end
|
52
|
+
|
53
|
+
def field_prefix=(value)
|
54
|
+
@field_prefix = value
|
55
|
+
end
|
56
|
+
|
57
|
+
def site=(value)
|
58
|
+
# value is containing AGP_LOCATION already sometimes:
|
59
|
+
value.gsub!(/^#{AGP_LOCATION}/, '') if AGP_LOCATION && value.match(/#{AGP_LOCATION}/)
|
60
|
+
agp = @agp_location ? @agp_location : AGP_LOCATION
|
61
|
+
agp.gsub!(/\/$/, '')
|
62
|
+
value.gsub!(/^\//, '')
|
63
|
+
@site = (agp + '/' + value)
|
64
|
+
end
|
79
65
|
|
80
|
-
|
81
|
-
|
82
|
-
internal_service = service
|
83
|
-
prefix = @@service_prefix
|
84
|
-
else
|
85
|
-
internal_service = service_path[-2..-1].join('.')
|
86
|
-
prefix = service_path[0..-3].join('.') + '.'
|
66
|
+
def debug(message)
|
67
|
+
LVS::JsonService::Logger.debug " \033[1;4;32mLVS::JsonService\033[0m #{message}"
|
87
68
|
end
|
88
69
|
|
89
|
-
|
90
|
-
|
91
|
-
self.define_cached_service(name, service, options)
|
70
|
+
def require_ssl?
|
71
|
+
(Module.const_defined?(:SSL_ENABLED) && SSL_ENABLED) || (Module.const_defined?(:SSL_DISABLED) && !SSL_DISABLED)
|
92
72
|
end
|
93
73
|
|
94
|
-
(
|
95
|
-
|
74
|
+
def define_service(name, service, options = {})
|
75
|
+
service_name = name
|
96
76
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
end
|
102
|
-
options[:required] ||= {}
|
103
|
-
options[:required].each do |key|
|
104
|
-
raise LVS::JsonService::Error.new("Required field #{key} wasn't supplied", internal_service, '0', method_params) if method_params[key].blank?
|
105
|
-
end
|
106
|
-
result = self.run_remote_request(@@site + prefix + internal_service, method_params, options)
|
107
|
-
if flags && flags[:raw]
|
108
|
-
result
|
77
|
+
service_path = service.split('.')
|
78
|
+
if service_path.size <= 2
|
79
|
+
internal_service = service
|
80
|
+
prefix = @service_prefix
|
109
81
|
else
|
110
|
-
|
82
|
+
internal_service = service_path[-2..-1].join('.')
|
83
|
+
prefix = service_path[0..-3].join('.') + '.'
|
111
84
|
end
|
112
|
-
end
|
113
85
|
|
114
|
-
|
115
|
-
|
86
|
+
options[:encrypted] = @encrypted if @encrypted
|
87
|
+
options[:auth_cert] = @auth_cert if @auth_cert
|
88
|
+
options[:auth_key] = @auth_key if @auth_key
|
89
|
+
options[:auth_key_pass] = @auth_key_pass if @auth_key_pass
|
90
|
+
|
91
|
+
(class<<self;self;end).send :define_method, service_name do |args|
|
92
|
+
method_params, flags = args
|
93
|
+
|
94
|
+
method_params ||= {}
|
95
|
+
options[:defaults] ||= {}
|
96
|
+
options[:defaults].each_pair do |key, value|
|
97
|
+
method_params[key] = value if method_params[key].blank?
|
98
|
+
end
|
99
|
+
options[:required] ||= {}
|
100
|
+
options[:required].each do |key|
|
101
|
+
raise LVS::JsonService::Error.new("Required field #{key} wasn't supplied", internal_service, '0', method_params) if method_params[key].blank?
|
102
|
+
end
|
103
|
+
result = self.run_remote_request(@site + prefix + internal_service, method_params, options)
|
104
|
+
if flags && flags[:raw]
|
105
|
+
result
|
106
|
+
else
|
107
|
+
self.parse_result(result)
|
108
|
+
end
|
109
|
+
end
|
116
110
|
|
117
|
-
|
118
|
-
(class<<self;self;end).send :define_method, name do |*args|
|
119
|
-
self.parse_result(JSON.parse(json))
|
111
|
+
add_service(name)
|
120
112
|
end
|
121
|
-
@@services << name
|
122
|
-
end
|
123
113
|
|
124
|
-
|
125
|
-
|
126
|
-
|
114
|
+
def fake_service(name, json)
|
115
|
+
(class<<self;self;end).send :define_method, name do |*args|
|
116
|
+
self.parse_result(JSON.parse(json))
|
117
|
+
end
|
118
|
+
add_service(name)
|
119
|
+
end
|
127
120
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
121
|
+
def services
|
122
|
+
@services
|
123
|
+
end
|
124
|
+
|
125
|
+
def parse_result(response)
|
126
|
+
if response.is_a?(Array)
|
127
|
+
response.map { |x| self.new(x) }
|
128
|
+
else
|
129
|
+
self.new(response)
|
130
|
+
end
|
133
131
|
end
|
132
|
+
|
134
133
|
end
|
135
134
|
|
136
135
|
def initialize(values = {})
|
@@ -2,9 +2,8 @@ module LVS
|
|
2
2
|
module JsonService
|
3
3
|
module Logger
|
4
4
|
def self.debug(message)
|
5
|
-
|
6
|
-
|
7
|
-
end
|
5
|
+
message = " \033[1;4;32mLVS::JsonService\033[0m #{message}"
|
6
|
+
Rails.logger.debug(message)
|
8
7
|
end
|
9
8
|
end
|
10
9
|
end
|
@@ -17,9 +17,14 @@ module LVS
|
|
17
17
|
|
18
18
|
http = Net::HTTP.new(uri.host, uri.port)
|
19
19
|
|
20
|
-
|
20
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
21
|
+
if options[:encrypted] || require_ssl?
|
21
22
|
http.use_ssl = true
|
23
|
+
# Self-signed certs give streams of "warning: peer certificate won't be verified in this SSL session"
|
24
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
25
|
+
LVS::JsonService::Logger.debug "Using SSL"
|
22
26
|
if options[:auth_cert]
|
27
|
+
LVS::JsonService::Logger.debug "Using Auth"
|
23
28
|
http.cert = OpenSSL::X509::Certificate.new(File.read(options[:auth_cert]))
|
24
29
|
http.key = OpenSSL::PKey::RSA.new(File.read(options[:auth_key]), options[:auth_key_password])
|
25
30
|
end
|
@@ -37,7 +42,7 @@ module LVS
|
|
37
42
|
retries -= 1
|
38
43
|
response = http.start { |connection| connection.request(req) }
|
39
44
|
|
40
|
-
rescue Timeout::Error
|
45
|
+
rescue Timeout::Error => e
|
41
46
|
if retries >= 0
|
42
47
|
LVS::JsonService::Logger.debug(
|
43
48
|
"Retrying #{service} due to TimeoutError"
|
@@ -46,7 +51,7 @@ module LVS
|
|
46
51
|
end
|
47
52
|
raise LVS::JsonService::TimeoutError.new("Backend failed to respond in time", 500, service, args)
|
48
53
|
|
49
|
-
rescue Errno::ECONNREFUSED
|
54
|
+
rescue Errno::ECONNREFUSED => e
|
50
55
|
if retries >= 0
|
51
56
|
LVS::JsonService::Logger.debug(
|
52
57
|
"Retrying #{service} due to Errno::ECONNREFUSED"
|
@@ -55,6 +60,10 @@ module LVS
|
|
55
60
|
retry
|
56
61
|
end
|
57
62
|
raise LVS::JsonService::BackendUnavailableError.new("Backend unavailable", 500, service, args)
|
63
|
+
|
64
|
+
rescue OpenSSL::SSL::SSLError => e
|
65
|
+
raise LVS::JsonService::BackendUnavailableError.new("Backend unavailable #{e}", 500, service, args)
|
66
|
+
|
58
67
|
end
|
59
68
|
|
60
69
|
if response.is_a?(Net::HTTPNotFound)
|
@@ -65,12 +74,26 @@ module LVS
|
|
65
74
|
end
|
66
75
|
|
67
76
|
def run_remote_request(service, args, options = {})
|
68
|
-
LVS::JsonService::Logger.debug "
|
69
|
-
|
77
|
+
LVS::JsonService::Logger.debug "Requesting '#{service}' with #{args.to_json}"
|
78
|
+
|
79
|
+
if options[:cached_for]
|
80
|
+
timing = "CACHED"
|
81
|
+
response = Rails.cache.fetch([service, args].cache_key, :expires_in => options[:cached_for]) do
|
82
|
+
start = Time.now
|
83
|
+
response = http_request_with_timeout(service, args, options)
|
84
|
+
timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
|
85
|
+
response
|
86
|
+
end
|
87
|
+
else
|
88
|
+
start = Time.now
|
89
|
+
response = http_request_with_timeout(service, args, options)
|
90
|
+
timing = ("%.1f" % ((Time.now - start) * 1000)) + "ms"
|
91
|
+
end
|
92
|
+
|
70
93
|
if response.body.size < 1024
|
71
|
-
LVS::JsonService::Logger.debug "Response: #{response.body.gsub(/\n/, '')}"
|
94
|
+
LVS::JsonService::Logger.debug "Response (#{timing}): #{response.body.gsub(/\n/, '')}"
|
72
95
|
else
|
73
|
-
LVS::JsonService::Logger.debug "Response Snippet: #{response.body.gsub(/\n/, '')[0..1024]}"
|
96
|
+
LVS::JsonService::Logger.debug "Response Snippet (#{timing}): #{response.body.gsub(/\n/, '')[0..1024]}"
|
74
97
|
end
|
75
98
|
result = JSON.parse(response.body)
|
76
99
|
if result.is_a?(Hash) && result.has_key?("PCode")
|
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.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LVS
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-19 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|