moesif_rack 1.4.19 → 2.0.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.
- checksums.yaml +4 -4
- data/lib/moesif_rack/app_config.rb +76 -113
- data/lib/moesif_rack/client_ip.rb +61 -102
- data/lib/moesif_rack/governance_rules.rb +480 -0
- data/lib/moesif_rack/moesif_helpers.rb +33 -6
- data/lib/moesif_rack/moesif_middleware.rb +159 -148
- data/lib/moesif_rack/regex_config_helper.rb +96 -104
- data/lib/moesif_rack/update_company.rb +44 -48
- data/lib/moesif_rack/update_user.rb +44 -48
- data/moesif_capture_outgoing/httplog/adapters/net_http.rb +18 -21
- data/moesif_capture_outgoing/httplog/http_log.rb +57 -107
- data/moesif_capture_outgoing/httplog.rb +2 -2
- data/test/config_example.json +1473 -0
- data/test/govrule_example.json +20 -0
- data/test/test_governance_rules.rb +213 -0
- data/test/{moesif_rack_test.rb → test_moesif_rack.rb} +18 -16
- metadata +30 -6
@@ -3,17 +3,14 @@ require 'rack'
|
|
3
3
|
require 'moesif_api'
|
4
4
|
require 'json'
|
5
5
|
require 'base64'
|
6
|
-
require_relative '../../lib/moesif_rack/app_config
|
6
|
+
require_relative '../../lib/moesif_rack/app_config'
|
7
7
|
|
8
8
|
module MoesifCaptureOutgoing
|
9
|
-
|
10
9
|
class << self
|
11
|
-
|
12
|
-
def start_capture_outgoing(options)
|
10
|
+
def start_capture_outgoing(options, app_config_manager, events_queue)
|
13
11
|
@moesif_options = options
|
14
|
-
|
15
|
-
|
16
|
-
end
|
12
|
+
raise 'application_id required for Moesif Middleware' unless @moesif_options['application_id']
|
13
|
+
|
17
14
|
@api_client = MoesifApi::MoesifAPIClient.new(@moesif_options['application_id'])
|
18
15
|
@api_controller = @api_client.api
|
19
16
|
@debug = @moesif_options['debug']
|
@@ -24,31 +21,22 @@ module MoesifCaptureOutgoing
|
|
24
21
|
@skip_outgoing = options['skip_outgoing']
|
25
22
|
@mask_data_outgoing = options['mask_data_outgoing']
|
26
23
|
@log_body_outgoing = options.fetch('log_body_outgoing', true)
|
27
|
-
|
28
|
-
@
|
24
|
+
|
25
|
+
@app_config = app_config_manager
|
26
|
+
# @app_config and @events_queue should be shared instance from the middleware
|
27
|
+
# so that we can use the same queue and same loaded @app_config
|
28
|
+
@events_queue = events_queue
|
29
29
|
@sampling_percentage = 100
|
30
30
|
@last_updated_time = Time.now.utc
|
31
|
-
@config_dict = Hash.new
|
32
|
-
begin
|
33
|
-
new_config = @app_config.get_config(@api_controller)
|
34
|
-
if !new_config.nil?
|
35
|
-
@config, @config_etag, @last_config_download_time = @app_config.parse_configuration(new_config)
|
36
|
-
end
|
37
|
-
rescue => exception
|
38
|
-
if @debug
|
39
|
-
puts 'Error while parsing application configuration on initialization'
|
40
|
-
puts exception.to_s
|
41
|
-
end
|
42
|
-
end
|
43
31
|
end
|
44
32
|
|
45
|
-
def call
|
33
|
+
def call(url, request, request_time, response, response_time)
|
46
34
|
send_moesif_event(url, request, request_time, response, response_time)
|
47
35
|
end
|
48
|
-
|
36
|
+
|
49
37
|
def get_response_body(response)
|
50
38
|
body = response.respond_to?(:body) ? response.body : response
|
51
|
-
body = body.inject(
|
39
|
+
body = body.inject('') { |i, a| i << a } if body.respond_to?(:each)
|
52
40
|
body.to_s
|
53
41
|
end
|
54
42
|
|
@@ -57,12 +45,9 @@ module MoesifCaptureOutgoing
|
|
57
45
|
end
|
58
46
|
|
59
47
|
def send_moesif_event(url, request, request_time, response, response_time)
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
puts "Skip sending as it is moesif Event"
|
64
|
-
end
|
65
|
-
else
|
48
|
+
if url.downcase.include? 'moesif'
|
49
|
+
puts 'Skip sending as it is moesif Event' if @debug
|
50
|
+
else
|
66
51
|
response.code = transform_response_code(response.code) if response.code.is_a?(Symbol)
|
67
52
|
|
68
53
|
# Request Body
|
@@ -70,14 +55,12 @@ module MoesifCaptureOutgoing
|
|
70
55
|
req_body_transfer_encoding = nil
|
71
56
|
req_body = nil
|
72
57
|
|
73
|
-
if @log_body_outgoing
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
req_body_transfer_encoding = 'base64'
|
80
|
-
end
|
58
|
+
if @log_body_outgoing && (req_body_string && req_body_string.length != 0)
|
59
|
+
begin
|
60
|
+
req_body = JSON.parse(req_body_string)
|
61
|
+
rescue StandardError
|
62
|
+
req_body = Base64.encode64(req_body_string)
|
63
|
+
req_body_transfer_encoding = 'base64'
|
81
64
|
end
|
82
65
|
end
|
83
66
|
|
@@ -86,19 +69,17 @@ module MoesifCaptureOutgoing
|
|
86
69
|
rsp_body_transfer_encoding = nil
|
87
70
|
rsp_body = nil
|
88
71
|
|
89
|
-
if @log_body_outgoing
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
rsp_body_transfer_encoding = 'base64'
|
96
|
-
end
|
72
|
+
if @log_body_outgoing && (rsp_body_string && rsp_body_string.length != 0)
|
73
|
+
begin
|
74
|
+
rsp_body = JSON.parse(rsp_body_string)
|
75
|
+
rescue StandardError
|
76
|
+
rsp_body = Base64.encode64(rsp_body_string)
|
77
|
+
rsp_body_transfer_encoding = 'base64'
|
97
78
|
end
|
98
79
|
end
|
99
80
|
|
100
81
|
# Event Request
|
101
|
-
event_req = MoesifApi::EventRequestModel.new
|
82
|
+
event_req = MoesifApi::EventRequestModel.new
|
102
83
|
event_req.time = request_time
|
103
84
|
event_req.uri = url
|
104
85
|
event_req.verb = request.method.to_s.upcase
|
@@ -107,8 +88,8 @@ module MoesifCaptureOutgoing
|
|
107
88
|
event_req.body = req_body
|
108
89
|
event_req.transfer_encoding = req_body_transfer_encoding
|
109
90
|
|
110
|
-
# Event Response
|
111
|
-
event_rsp = MoesifApi::EventResponseModel.new
|
91
|
+
# Event Response
|
92
|
+
event_rsp = MoesifApi::EventResponseModel.new
|
112
93
|
event_rsp.time = response_time
|
113
94
|
event_rsp.status = response.code.to_i
|
114
95
|
event_rsp.headers = response.each_header.collect.to_h
|
@@ -116,71 +97,58 @@ module MoesifCaptureOutgoing
|
|
116
97
|
event_rsp.transfer_encoding = rsp_body_transfer_encoding
|
117
98
|
|
118
99
|
# Prepare Event Model
|
119
|
-
event_model = MoesifApi::EventModel.new
|
100
|
+
event_model = MoesifApi::EventModel.new
|
120
101
|
event_model.request = event_req
|
121
102
|
event_model.response = event_rsp
|
122
|
-
event_model.direction =
|
103
|
+
event_model.direction = 'Outgoing'
|
123
104
|
|
124
105
|
# Metadata for Outgoing Request
|
125
106
|
if @get_metadata_outgoing
|
126
|
-
if @debug
|
127
|
-
puts "calling get_metadata_outgoing proc"
|
128
|
-
end
|
107
|
+
puts 'calling get_metadata_outgoing proc' if @debug
|
129
108
|
event_model.metadata = @get_metadata_outgoing.call(request, response)
|
130
109
|
end
|
131
110
|
|
132
111
|
# Identify User
|
133
112
|
if @identify_user_outgoing
|
134
|
-
if @debug
|
135
|
-
puts "calling identify_user_outgoing proc"
|
136
|
-
end
|
113
|
+
puts 'calling identify_user_outgoing proc' if @debug
|
137
114
|
event_model.user_id = @identify_user_outgoing.call(request, response)
|
138
115
|
end
|
139
116
|
|
140
117
|
# Identify Company
|
141
118
|
if @identify_company_outgoing
|
142
|
-
if @debug
|
143
|
-
puts "calling identify_company_outgoing proc"
|
144
|
-
end
|
119
|
+
puts 'calling identify_company_outgoing proc' if @debug
|
145
120
|
event_model.company_id = @identify_company_outgoing.call(request, response)
|
146
121
|
end
|
147
122
|
|
148
123
|
# Session Token
|
149
124
|
if @identify_session_outgoing
|
150
|
-
if @debug
|
151
|
-
puts "calling identify_session_outgoing proc"
|
152
|
-
end
|
125
|
+
puts 'calling identify_session_outgoing proc' if @debug
|
153
126
|
event_model.session_token = @identify_session_outgoing.call(request, response)
|
154
127
|
end
|
155
128
|
|
156
129
|
# Skip Outgoing Request
|
157
130
|
should_skip = false
|
158
131
|
|
159
|
-
if @skip_outgoing
|
160
|
-
if @skip_outgoing.call(request, response)
|
161
|
-
should_skip = true;
|
162
|
-
end
|
163
|
-
end
|
132
|
+
should_skip = true if @skip_outgoing && @skip_outgoing.call(request, response)
|
164
133
|
|
165
134
|
if !should_skip
|
166
135
|
|
167
136
|
# Mask outgoing Event
|
168
137
|
if @mask_data_outgoing
|
169
|
-
if @debug
|
170
|
-
puts "calling mask_data_outgoing proc"
|
171
|
-
end
|
138
|
+
puts 'calling mask_data_outgoing proc' if @debug
|
172
139
|
event_model = @mask_data_outgoing.call(event_model)
|
173
140
|
end
|
174
141
|
|
175
142
|
# Send Event to Moesif
|
176
143
|
begin
|
177
144
|
@random_percentage = Random.rand(0.00..100.00)
|
178
|
-
begin
|
179
|
-
@sampling_percentage = @app_config.get_sampling_percentage(event_model,
|
180
|
-
|
145
|
+
begin
|
146
|
+
@sampling_percentage = @app_config.get_sampling_percentage(event_model, event_model.user_id,
|
147
|
+
event_model.company_id)
|
148
|
+
rescue StandardError => e
|
181
149
|
if @debug
|
182
150
|
puts 'Error while getting sampling percentage, assuming default behavior'
|
183
|
-
puts
|
151
|
+
puts e
|
184
152
|
end
|
185
153
|
@sampling_percentage = 100
|
186
154
|
end
|
@@ -191,47 +159,29 @@ module MoesifCaptureOutgoing
|
|
191
159
|
puts 'Sending Outgoing Request Data to Moesif'
|
192
160
|
puts event_model.to_json
|
193
161
|
end
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
if !new_config.nil?
|
201
|
-
@config, @config_etag, @last_config_download_time = @app_config.parse_configuration(new_config)
|
202
|
-
end
|
203
|
-
rescue => exception
|
204
|
-
if @debug
|
205
|
-
puts 'Error while updating the application configuration'
|
206
|
-
puts exception.to_s
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
|
-
if @debug
|
211
|
-
puts("Event successfully sent to Moesif")
|
212
|
-
end
|
213
|
-
else
|
214
|
-
if @debug
|
215
|
-
puts("Skipped outgoing Event due to sampling percentage: " + @sampling_percentage.to_s + " and random percentage: " + @random_percentage.to_s)
|
162
|
+
|
163
|
+
# we put in the queue and format abot it.
|
164
|
+
unless @events_queue.nil?
|
165
|
+
@events_queue << event_model
|
166
|
+
puts('Outgoing Event successfully added to event queue') if @debug
|
167
|
+
return
|
216
168
|
end
|
169
|
+
elsif @debug
|
170
|
+
puts('Skipped outgoing Event due to sampling percentage: ' + @sampling_percentage.to_s + ' and random percentage: ' + @random_percentage.to_s)
|
217
171
|
end
|
218
172
|
rescue MoesifApi::APIException => e
|
219
173
|
if e.response_code.between?(401, 403)
|
220
|
-
puts
|
174
|
+
puts 'Unathorized accesss sending event to Moesif. Please verify your Application Id.'
|
221
175
|
end
|
222
176
|
if @debug
|
223
|
-
puts
|
177
|
+
puts 'Error sending event to Moesif, with status code: '
|
224
178
|
puts e.response_code
|
225
179
|
end
|
226
|
-
rescue => e
|
227
|
-
if @debug
|
228
|
-
puts e.to_s
|
229
|
-
end
|
180
|
+
rescue StandardError => e
|
181
|
+
puts e if @debug
|
230
182
|
end
|
231
|
-
|
232
|
-
|
233
|
-
puts 'Skip sending outgoing request'
|
234
|
-
end
|
183
|
+
elsif @debug
|
184
|
+
puts 'Skip sending outgoing request'
|
235
185
|
end
|
236
186
|
end
|
237
187
|
end
|
@@ -1,2 +1,2 @@
|
|
1
|
-
require_relative 'httplog/http_log
|
2
|
-
require_relative 'httplog/adapters/net_http
|
1
|
+
require_relative 'httplog/http_log'
|
2
|
+
require_relative 'httplog/adapters/net_http'
|