moesif_rack 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ec9a7d8a1458019f25ec5638b642921be4c8be50
4
+ data.tar.gz: cbe40d5f9f92844428f20fc8b974b53856d364a0
5
+ SHA512:
6
+ metadata.gz: 5dd232e683be3c8e32898719a2f40725e0f66ced2b0453acec6fabcaeb72e3853959c00325f553847a5e7695d640a391a7b3f18920f41cd7269e3cd8dada1ada
7
+ data.tar.gz: eb6a52983cec544bbca557b0fac4ef4b7a7d197861e833b7077c5aac28dd38110581bd2dcc8b5bcbd807e7d241b440302d8c65daaa90eb8ca0eaaedbb4530276
data/LICENSE ADDED
@@ -0,0 +1,216 @@
1
+ Copyright (c) 2016 Moesif, Inc
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
14
+
15
+
16
+ Apache License
17
+ Version 2.0, January 2004
18
+ http://www.apache.org/licenses/
19
+
20
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
21
+
22
+ 1. Definitions.
23
+
24
+ "License" shall mean the terms and conditions for use, reproduction,
25
+ and distribution as defined by Sections 1 through 9 of this document.
26
+
27
+ "Licensor" shall mean the copyright owner or entity authorized by
28
+ the copyright owner that is granting the License.
29
+
30
+ "Legal Entity" shall mean the union of the acting entity and all
31
+ other entities that control, are controlled by, or are under common
32
+ control with that entity. For the purposes of this definition,
33
+ "control" means (i) the power, direct or indirect, to cause the
34
+ direction or management of such entity, whether by contract or
35
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
36
+ outstanding shares, or (iii) beneficial ownership of such entity.
37
+
38
+ "You" (or "Your") shall mean an individual or Legal Entity
39
+ exercising permissions granted by this License.
40
+
41
+ "Source" form shall mean the preferred form for making modifications,
42
+ including but not limited to software source code, documentation
43
+ source, and configuration files.
44
+
45
+ "Object" form shall mean any form resulting from mechanical
46
+ transformation or translation of a Source form, including but
47
+ not limited to compiled object code, generated documentation,
48
+ and conversions to other media types.
49
+
50
+ "Work" shall mean the work of authorship, whether in Source or
51
+ Object form, made available under the License, as indicated by a
52
+ copyright notice that is included in or attached to the work
53
+ (an example is provided in the Appendix below).
54
+
55
+ "Derivative Works" shall mean any work, whether in Source or Object
56
+ form, that is based on (or derived from) the Work and for which the
57
+ editorial revisions, annotations, elaborations, or other modifications
58
+ represent, as a whole, an original work of authorship. For the purposes
59
+ of this License, Derivative Works shall not include works that remain
60
+ separable from, or merely link (or bind by name) to the interfaces of,
61
+ the Work and Derivative Works thereof.
62
+
63
+ "Contribution" shall mean any work of authorship, including
64
+ the original version of the Work and any modifications or additions
65
+ to that Work or Derivative Works thereof, that is intentionally
66
+ submitted to Licensor for inclusion in the Work by the copyright owner
67
+ or by an individual or Legal Entity authorized to submit on behalf of
68
+ the copyright owner. For the purposes of this definition, "submitted"
69
+ means any form of electronic, verbal, or written communication sent
70
+ to the Licensor or its representatives, including but not limited to
71
+ communication on electronic mailing lists, source code control systems,
72
+ and issue tracking systems that are managed by, or on behalf of, the
73
+ Licensor for the purpose of discussing and improving the Work, but
74
+ excluding communication that is conspicuously marked or otherwise
75
+ designated in writing by the copyright owner as "Not a Contribution."
76
+
77
+ "Contributor" shall mean Licensor and any individual or Legal Entity
78
+ on behalf of whom a Contribution has been received by Licensor and
79
+ subsequently incorporated within the Work.
80
+
81
+ 2. Grant of Copyright License. Subject to the terms and conditions of
82
+ this License, each Contributor hereby grants to You a perpetual,
83
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
84
+ copyright license to reproduce, prepare Derivative Works of,
85
+ publicly display, publicly perform, sublicense, and distribute the
86
+ Work and such Derivative Works in Source or Object form.
87
+
88
+ 3. Grant of Patent License. Subject to the terms and conditions of
89
+ this License, each Contributor hereby grants to You a perpetual,
90
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
91
+ (except as stated in this section) patent license to make, have made,
92
+ use, offer to sell, sell, import, and otherwise transfer the Work,
93
+ where such license applies only to those patent claims licensable
94
+ by such Contributor that are necessarily infringed by their
95
+ Contribution(s) alone or by combination of their Contribution(s)
96
+ with the Work to which such Contribution(s) was submitted. If You
97
+ institute patent litigation against any entity (including a
98
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
99
+ or a Contribution incorporated within the Work constitutes direct
100
+ or contributory patent infringement, then any patent licenses
101
+ granted to You under this License for that Work shall terminate
102
+ as of the date such litigation is filed.
103
+
104
+ 4. Redistribution. You may reproduce and distribute copies of the
105
+ Work or Derivative Works thereof in any medium, with or without
106
+ modifications, and in Source or Object form, provided that You
107
+ meet the following conditions:
108
+
109
+ (a) You must give any other recipients of the Work or
110
+ Derivative Works a copy of this License; and
111
+
112
+ (b) You must cause any modified files to carry prominent notices
113
+ stating that You changed the files; and
114
+
115
+ (c) You must retain, in the Source form of any Derivative Works
116
+ that You distribute, all copyright, patent, trademark, and
117
+ attribution notices from the Source form of the Work,
118
+ excluding those notices that do not pertain to any part of
119
+ the Derivative Works; and
120
+
121
+ (d) If the Work includes a "NOTICE" text file as part of its
122
+ distribution, then any Derivative Works that You distribute must
123
+ include a readable copy of the attribution notices contained
124
+ within such NOTICE file, excluding those notices that do not
125
+ pertain to any part of the Derivative Works, in at least one
126
+ of the following places: within a NOTICE text file distributed
127
+ as part of the Derivative Works; within the Source form or
128
+ documentation, if provided along with the Derivative Works; or,
129
+ within a display generated by the Derivative Works, if and
130
+ wherever such third-party notices normally appear. The contents
131
+ of the NOTICE file are for informational purposes only and
132
+ do not modify the License. You may add Your own attribution
133
+ notices within Derivative Works that You distribute, alongside
134
+ or as an addendum to the NOTICE text from the Work, provided
135
+ that such additional attribution notices cannot be construed
136
+ as modifying the License.
137
+
138
+ You may add Your own copyright statement to Your modifications and
139
+ may provide additional or different license terms and conditions
140
+ for use, reproduction, or distribution of Your modifications, or
141
+ for any such Derivative Works as a whole, provided Your use,
142
+ reproduction, and distribution of the Work otherwise complies with
143
+ the conditions stated in this License.
144
+
145
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
146
+ any Contribution intentionally submitted for inclusion in the Work
147
+ by You to the Licensor shall be under the terms and conditions of
148
+ this License, without any additional terms or conditions.
149
+ Notwithstanding the above, nothing herein shall supersede or modify
150
+ the terms of any separate license agreement you may have executed
151
+ with Licensor regarding such Contributions.
152
+
153
+ 6. Trademarks. This License does not grant permission to use the trade
154
+ names, trademarks, service marks, or product names of the Licensor,
155
+ except as required for reasonable and customary use in describing the
156
+ origin of the Work and reproducing the content of the NOTICE file.
157
+
158
+ 7. Disclaimer of Warranty. Unless required by applicable law or
159
+ agreed to in writing, Licensor provides the Work (and each
160
+ Contributor provides its Contributions) on an "AS IS" BASIS,
161
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
162
+ implied, including, without limitation, any warranties or conditions
163
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
164
+ PARTICULAR PURPOSE. You are solely responsible for determining the
165
+ appropriateness of using or redistributing the Work and assume any
166
+ risks associated with Your exercise of permissions under this License.
167
+
168
+ 8. Limitation of Liability. In no event and under no legal theory,
169
+ whether in tort (including negligence), contract, or otherwise,
170
+ unless required by applicable law (such as deliberate and grossly
171
+ negligent acts) or agreed to in writing, shall any Contributor be
172
+ liable to You for damages, including any direct, indirect, special,
173
+ incidental, or consequential damages of any character arising as a
174
+ result of this License or out of the use or inability to use the
175
+ Work (including but not limited to damages for loss of goodwill,
176
+ work stoppage, computer failure or malfunction, or any and all
177
+ other commercial damages or losses), even if such Contributor
178
+ has been advised of the possibility of such damages.
179
+
180
+ 9. Accepting Warranty or Additional Liability. While redistributing
181
+ the Work or Derivative Works thereof, You may choose to offer,
182
+ and charge a fee for, acceptance of support, warranty, indemnity,
183
+ or other liability obligations and/or rights consistent with this
184
+ License. However, in accepting such obligations, You may act only
185
+ on Your own behalf and on Your sole responsibility, not on behalf
186
+ of any other Contributor, and only if You agree to indemnify,
187
+ defend, and hold each Contributor harmless for any liability
188
+ incurred by, or claims asserted against, such Contributor by reason
189
+ of your accepting any such warranty or additional liability.
190
+
191
+ END OF TERMS AND CONDITIONS
192
+
193
+ APPENDIX: How to apply the Apache License to your work.
194
+
195
+ To apply the Apache License to your work, attach the following
196
+ boilerplate notice, with the fields enclosed by brackets "[]"
197
+ replaced with your own identifying information. (Don't include
198
+ the brackets!) The text should be enclosed in the appropriate
199
+ comment syntax for the file format. We also recommend that a
200
+ file or class name and description of purpose be included on the
201
+ same "printed page" as the copyright notice for easier
202
+ identification within third-party archives.
203
+
204
+ Copyright [yyyy] [name of copyright owner]
205
+
206
+ Licensed under the Apache License, Version 2.0 (the "License");
207
+ you may not use this file except in compliance with the License.
208
+ You may obtain a copy of the License at
209
+
210
+ http://www.apache.org/licenses/LICENSE-2.0
211
+
212
+ Unless required by applicable law or agreed to in writing, software
213
+ distributed under the License is distributed on an "AS IS" BASIS,
214
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
215
+ See the License for the specific language governing permissions and
216
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,123 @@
1
+ Moesif Middleware for Ruby on Rails and Rack
2
+ ======================
3
+
4
+ Middleware that logs APIs built on Ruby on Rails and Rack.
5
+
6
+ [Source Code on GitHub](https://github.com/moesif/moesif-rack)
7
+
8
+ __Check out Moesif's
9
+ [Ruby developer documentation](https://www.moesif.com/developer-documentation) to learn more__
10
+
11
+
12
+
13
+ Install from RubyGems
14
+ =====================
15
+
16
+ ```bash
17
+ gem install moesif_rack
18
+ ```
19
+ How to use:
20
+ ===========
21
+
22
+ Create the options
23
+
24
+ ```ruby
25
+ moesif_options = {
26
+ 'application_id' => 'Your application Id'
27
+ }
28
+ ```
29
+
30
+ Add to Middleware
31
+
32
+
33
+ within `config/application.rb`
34
+
35
+ ```ruby
36
+
37
+
38
+ class Application < Rails::Application
39
+ # snip
40
+
41
+ config.middleware.use "MoesifRack::MoesifMiddleware", moesif_options
42
+
43
+ # snip
44
+ end
45
+
46
+ ```
47
+
48
+
49
+ How to configure:
50
+ =================
51
+
52
+ options is a hash with these possible key value pairs.
53
+
54
+ #### application_id
55
+
56
+ Required. String. This is the Moesif application_id under settings
57
+ from your [Moesif account.](https://www.moesif.com)
58
+
59
+
60
+ #### api_version
61
+
62
+ Optional. String. Tag requests with the version of your API.
63
+
64
+
65
+ #### identify_user
66
+
67
+ Optional.
68
+ identify_user is a function that takes env, headers, and body as arguments and returns a user_id string. This helps us attribute requests to unique users. Even though Moesif can automatically retrieve the user_id without this, this is highly recommended to ensure accurate attribution.
69
+
70
+ ```ruby
71
+
72
+ moesif_options['identify_user'] = Proc.new { |env, headers, body|
73
+
74
+ #snip
75
+
76
+ 'the_user_id'
77
+ }
78
+
79
+ ```
80
+
81
+ @api_version = options['api_version']
82
+ @identify_user = options['identify_user']
83
+ @identify_session = options['identify_session']
84
+ @mask_data = options['mask_data']
85
+ @debug = options['debug']
86
+
87
+ #### identify_session
88
+
89
+ Optional. A Proc that takes env, headers, body and returns a string.
90
+
91
+ ```ruby
92
+
93
+ moesif_options['identify_session'] = Proc.new { |env, headers, body|
94
+
95
+ #snip
96
+
97
+ 'the_session_token'
98
+ }
99
+
100
+ ```
101
+
102
+ #### mask_data
103
+
104
+ Optional. A Proc that takes event_model as an argument and returns event_model.
105
+ With mask_data, you can make modifications to headers or body of the event before it is sent to Moesif.
106
+
107
+ ```ruby
108
+
109
+ moesif_options['mask_data'] = Proc.new { |event_model|
110
+
111
+ #snip
112
+
113
+ event_model
114
+ }
115
+
116
+ ```
117
+
118
+ For details for the spec of event model, please see the [moesifapi-ruby git](https://github.com/Moesif/moesifapi-ruby)
119
+
120
+
121
+ #### debug
122
+
123
+ Optional. Boolean. Default false. If true, it will print out debug messages. In debug mode, the processing is not done in backend thread.
@@ -0,0 +1,131 @@
1
+ require 'moesif_api'
2
+ require 'json'
3
+ require 'time'
4
+
5
+ module MoesifRack
6
+
7
+ class MoesifMiddleware
8
+ def initialize app, options = {}
9
+ @app = app
10
+ if not options['application_id']
11
+ raise 'application_id requird for Moesif Middleware'
12
+ end
13
+ @api_client = MoesifApi::MoesifAPIClient.new(options['application_id'])
14
+ @api_controller = @api_client.api
15
+
16
+ @api_version = options['api_version']
17
+ @identify_user = options['identify_user']
18
+ @identify_session = options['identify_session']
19
+ @mask_data = options['mask_data']
20
+ @debug = options['debug']
21
+ end
22
+
23
+ def call env
24
+ start_time = Time.now.utc.iso8601
25
+
26
+ if @debug
27
+ puts 'inside moesif middleware'
28
+ end
29
+
30
+ status, headers, body = @app.call env
31
+ end_time = Time.now.utc.iso8601
32
+
33
+ process_send = lambda do
34
+ req = Rack::Request.new(env)
35
+ complex_copy = env.dup
36
+
37
+ req_headers = {}
38
+ complex_copy.select {|k,v| k.start_with? 'HTTP_'}.each do |key, val|
39
+ req_headers[key.sub(/^HTTP_/, '')] = val
40
+ end
41
+
42
+ req_body_string = req.body.read
43
+ req.body.rewind
44
+
45
+ if req_body_string && req_body_string.length != 0
46
+ begin
47
+ req_body = JSON.parse(req_body_string)
48
+ rescue
49
+ req_body = {
50
+ 'msg' => 'error parsing body',
51
+ 'body' => req_body_string
52
+ }
53
+ end
54
+ end
55
+
56
+ rsp_headers = headers.dup
57
+
58
+ content_type = rsp_headers['Content-Type'];
59
+
60
+ if body && body.body
61
+ begin
62
+ rsp_body = JSON.parse(body.body)
63
+ rescue
64
+ if content_type && (content_type.include? "json")
65
+ rsp_body = {
66
+ 'msg' => 'error parsing json',
67
+ 'body' => body.body
68
+ }
69
+ end
70
+ end
71
+ end
72
+
73
+ event_req = MoesifApi::EventRequestModel.new()
74
+ event_req.time = start_time
75
+ event_req.uri = req.url
76
+ event_req.verb = req.request_method
77
+
78
+ if @api_version
79
+ event_req.api_version = @api_version
80
+ end
81
+ event_req.ip_address = req.ip
82
+ event_req.headers = req_headers
83
+ event_req.body = req_body
84
+
85
+ event_rsp = MoesifApi::EventResponseModel.new()
86
+ event_rsp.time = end_time
87
+ event_rsp.status = status
88
+ event_rsp.headers = rsp_headers
89
+ event_rsp.body = rsp_body
90
+
91
+ event_model = MoesifApi::EventModel.new()
92
+ event_model.request = event_req
93
+ event_model.response = event_rsp
94
+ if @identify_user
95
+ if @debug
96
+ puts "calling identify user proc"
97
+ end
98
+ event_model.user_id = @identify_user.call(env, headers, body)
99
+ end
100
+ if @identify_session
101
+ if @debug
102
+ puts "calling identify session proc"
103
+ end
104
+ event_model.session_token = @identify_session.call(env, headers, body)
105
+ end
106
+ if @mask_data
107
+ if @debug
108
+ puts "calling mask_data proc"
109
+ end
110
+ event_model = @mask_data.call(event_model)
111
+ end
112
+
113
+ if @debug
114
+ puts "sending data to moesif"
115
+ puts event_model.to_json
116
+ end
117
+ # Perform the API call through the SDK function
118
+ @api_controller.create_event(event_model)
119
+
120
+ end
121
+
122
+ if @debug
123
+ process_send.call
124
+ else
125
+ Thread.start(&process_send)
126
+ end
127
+
128
+ [status, headers, body]
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,6 @@
1
+
2
+ require 'openssl'
3
+ require 'json'
4
+ require 'unirest'
5
+
6
+ require_relative 'moesif_rack/moesif_middleware.rb'
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moesif_rack
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Moesif, Inc
8
+ - Xing Wang
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-11-14 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: test-unit
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: 3.1.5
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: 3.1.5
28
+ - !ruby/object:Gem::Dependency
29
+ name: unirest
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: 1.1.2
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: 1.1.2
42
+ - !ruby/object:Gem::Dependency
43
+ name: json_mapper
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 0.2.1
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 0.2.1
56
+ - !ruby/object:Gem::Dependency
57
+ name: moesif_api
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: 1.0.4
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 1.0.4
70
+ description: Collection/Data Ingestion SDK for Rack (also Rails) Middleware / RoR
71
+ email: xing@moesif.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - LICENSE
77
+ - README.md
78
+ - lib/moesif_rack.rb
79
+ - lib/moesif_rack/moesif_middleware.rb
80
+ homepage: https://moesif.com
81
+ licenses:
82
+ - Apache-2.0
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - "~>"
91
+ - !ruby/object:Gem::Version
92
+ version: '2.0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.6.7
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: moesif_rack
104
+ test_files: []