resurfaceio-logger 1.7.5

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3e0ed89c6f3304584c60bb686d5c20de7f0cd341
4
+ data.tar.gz: 32d7eef540733c228600ef0868160be0a2f83f5f
5
+ SHA512:
6
+ metadata.gz: d527e29d631b95cf34831079fefb95b52cf5c40e0d2b40d249c47a10aa8606b3d6b7be588878d318446fa7192be0203312a6633838b4a4e3c7321c096f52fc17
7
+ data.tar.gz: 95942bc79f0877a8ff7e5d6f07d4390d4cc492f1f8b69f197cab4e07d5da3a5066fd578a860382c6d869b0d8d8cbe6f36c097f9dd00991c43c91e19dff6c0c01
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ require 'resurfaceio/base_logger'
5
+ require 'resurfaceio/http_logger'
6
+ require 'resurfaceio/http_logger_for_rack'
7
+ require 'resurfaceio/http_logger_for_rails'
8
+ require 'resurfaceio/http_request_impl'
9
+ require 'resurfaceio/http_response_impl'
10
+ require 'resurfaceio/usage_loggers'
11
+
12
+ module Resurfaceio
13
+
14
+ class BaseLogger < HttpLogger
15
+ end
16
+
17
+ class HttpLogger < HttpLogger
18
+ end
19
+
20
+ class HttpLoggerForRack < HttpLoggerForRack
21
+ end
22
+
23
+ class HttpLoggerForRails < HttpLoggerForRails
24
+ end
25
+
26
+ class HttpRequestImpl < HttpRequestImpl
27
+ end
28
+
29
+ class HttpResponseImpl < HttpResponseImpl
30
+ end
31
+
32
+ class UsageLoggers < UsageLoggers
33
+ end
34
+
35
+ end
@@ -0,0 +1,104 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ require 'uri'
5
+ require 'net/http'
6
+ require 'net/https'
7
+ require 'resurfaceio/usage_loggers'
8
+
9
+ class BaseLogger
10
+
11
+ def initialize(agent, options={})
12
+ @agent = agent
13
+ @version = BaseLogger.version_lookup
14
+
15
+ # set options in priority order
16
+ if options.respond_to?(:fetch) && options.respond_to?(:has_key?)
17
+ @enabled = options.fetch(:enabled, true)
18
+ if options.has_key?(:queue)
19
+ @queue = options[:queue]
20
+ elsif options.has_key?(:url)
21
+ url = options[:url]
22
+ if url.nil?
23
+ @url = UsageLoggers.url_by_default
24
+ elsif url.eql?('DEMO')
25
+ @url = UsageLoggers.url_for_demo
26
+ else
27
+ @url = url
28
+ end
29
+ @enabled = false if url.nil?
30
+ else
31
+ @url = UsageLoggers.url_by_default
32
+ @enabled = false if @url.nil?
33
+ end
34
+ elsif options.respond_to?(:to_s)
35
+ @url = options.to_s
36
+ @enabled = @url.nil? ? false : true
37
+ else
38
+ @enabled = false
39
+ end
40
+
41
+ # validate url when present
42
+ unless @url.nil?
43
+ begin
44
+ raise Exception unless URI.parse(@url).scheme.include?('http')
45
+ rescue Exception
46
+ @url = nil
47
+ @enabled = false
48
+ end
49
+ end
50
+ end
51
+
52
+ def agent
53
+ @agent
54
+ end
55
+
56
+ def disable
57
+ @enabled = false
58
+ self
59
+ end
60
+
61
+ def enable
62
+ @enabled = true unless @queue.nil? && @url.nil?
63
+ self
64
+ end
65
+
66
+ def enabled?
67
+ @enabled && UsageLoggers.enabled?
68
+ end
69
+
70
+ def submit(json)
71
+ if !enabled?
72
+ true
73
+ elsif @queue
74
+ @queue << json
75
+ true
76
+ else
77
+ begin
78
+ @url_parsed ||= URI.parse(@url)
79
+ @url_connection ||= Net::HTTP.new(@url_parsed.host, @url_parsed.port)
80
+ @url_connection.use_ssl = @url.include?('https')
81
+ request = Net::HTTP::Post.new(@url_parsed.path)
82
+ request.body = json
83
+ response = @url_connection.request(request)
84
+ response.code.to_i == 200
85
+ rescue SocketError
86
+ @url_connection = nil
87
+ false
88
+ end
89
+ end
90
+ end
91
+
92
+ def url
93
+ @url
94
+ end
95
+
96
+ def version
97
+ @version
98
+ end
99
+
100
+ def self.version_lookup
101
+ Gem.loaded_specs['resurfaceio-logger'].version.to_s
102
+ end
103
+
104
+ end
@@ -0,0 +1,89 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ require 'json'
5
+ require 'resurfaceio/base_logger'
6
+
7
+ class HttpLogger < BaseLogger
8
+
9
+ AGENT = 'http_logger.rb'
10
+
11
+ def initialize(options={})
12
+ super(AGENT, options)
13
+ end
14
+
15
+ def format(request, request_body, response, response_body, now=Time.now.to_i.to_s)
16
+ message = []
17
+ append_value message, 'request_method', request.request_method
18
+ append_value message, 'request_url', request.url
19
+ append_value message, 'response_code', response.status
20
+ append_request_headers message, request
21
+ append_response_headers message, response
22
+ append_value message, 'request_body', request_body.nil? ? request.body : request_body
23
+ append_value message, 'response_body', response_body.nil? ? response.body : response_body
24
+ message << ['agent', @agent]
25
+ message << ['version', @version]
26
+ message << ['now', now]
27
+ JSON.generate message
28
+ end
29
+
30
+ def log(request, request_body, response, response_body)
31
+ !enabled? || submit(format(request, request_body, response, response_body))
32
+ end
33
+
34
+ protected
35
+
36
+ def append_request_headers(message, request)
37
+ respond_to_env = request.respond_to?(:env)
38
+ if respond_to_env || request.respond_to?(:headers)
39
+ headers = respond_to_env ? request.env : request.headers
40
+ headers.each do |name, value|
41
+ unless value.nil?
42
+ if name =~ /^CONTENT_TYPE/
43
+ message << ['request_header.content-type', value]
44
+ end
45
+ if name =~ /^HTTP_/
46
+ message << ["request_header.#{name[5..-1].downcase.tr('_', '-')}", value]
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def append_response_headers(message, response)
54
+ found_content_type = false
55
+ if response.respond_to?(:headers)
56
+ response.headers.each do |name, value|
57
+ unless value.nil?
58
+ name = name.downcase
59
+ found_content_type = true if name =~ /^content-type/
60
+ message << ["response_header.#{name}", value]
61
+ end
62
+ end
63
+ end
64
+ unless found_content_type || response.content_type.nil?
65
+ message << ['response_header.content-type', response.content_type]
66
+ end
67
+ end
68
+
69
+ def append_value(message, key, value=nil)
70
+ unless key.nil?
71
+ unless value.nil?
72
+ case value
73
+ when Array
74
+ message << [key, value.join]
75
+ when String
76
+ message << [key, value]
77
+ else
78
+ if value.respond_to?(:read)
79
+ message << [key, value.read]
80
+ else
81
+ message << [key, value.to_s]
82
+ end
83
+ end
84
+ end
85
+ end
86
+ message
87
+ end
88
+
89
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ require 'rack'
5
+ require 'resurfaceio/http_logger'
6
+
7
+ class HttpLoggerForRack # http://rack.rubyforge.org/doc/SPEC.html
8
+
9
+ def initialize(app, options={})
10
+ @app = app
11
+ @logger = HttpLogger.new(options)
12
+ end
13
+
14
+ def call(env)
15
+ status, headers, body = @app.call(env)
16
+ if @logger.enabled? && status == 200
17
+ response = Rack::Response.new(body, status, headers)
18
+ if string_content_type?(response.content_type)
19
+ request = Rack::Request.new(env)
20
+ @logger.log(request, nil, response, nil)
21
+ end
22
+ end
23
+ [status, headers, body]
24
+ end
25
+
26
+ protected
27
+
28
+ def string_content_type?(s)
29
+ !s.nil? && s =~ /^(text\/(html|plain|xml))|(application\/(json|soap|xml|x-www-form-urlencoded))/i
30
+ end
31
+
32
+ end
@@ -0,0 +1,17 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ require 'resurfaceio/http_logger'
5
+
6
+ class HttpLoggerForRails
7
+
8
+ def initialize(options={})
9
+ @logger = HttpLogger.new(options)
10
+ end
11
+
12
+ def around(controller)
13
+ yield
14
+ @logger.log(controller.request, nil, controller.response, nil)
15
+ end
16
+
17
+ end
@@ -0,0 +1,42 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ class HttpRequestImpl
5
+
6
+ def initialize
7
+ @headers = Hash.new
8
+ @raw_body = nil
9
+ end
10
+
11
+ def add_header(key, value)
12
+ unless value.nil?
13
+ existing = @headers[key]
14
+ if existing.nil?
15
+ @headers[key] = value
16
+ else
17
+ @headers[key] = "#{existing}, #{value}"
18
+ end
19
+ end
20
+ end
21
+
22
+ def body
23
+ @raw_body ? StringIO.new(@raw_body) : nil
24
+ end
25
+
26
+ def content_type
27
+ @headers['CONTENT_TYPE']
28
+ end
29
+
30
+ def content_type=(content_type)
31
+ @headers['CONTENT_TYPE'] = content_type
32
+ end
33
+
34
+ def headers
35
+ @headers
36
+ end
37
+
38
+ attr_accessor :raw_body
39
+ attr_accessor :request_method
40
+ attr_accessor :url
41
+
42
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ class HttpResponseImpl
5
+
6
+ def initialize
7
+ @headers = Hash.new
8
+ @raw_body = nil
9
+ end
10
+
11
+ def add_header(key, value)
12
+ unless value.nil?
13
+ existing = @headers[key]
14
+ if existing.nil?
15
+ @headers[key] = value
16
+ else
17
+ @headers[key] = "#{existing}, #{value}"
18
+ end
19
+ end
20
+ end
21
+
22
+ def body
23
+ @raw_body ? [@raw_body] : nil
24
+ end
25
+
26
+ def content_type
27
+ @headers['Content-Type']
28
+ end
29
+
30
+ def content_type=(content_type)
31
+ @headers['Content-Type'] = content_type
32
+ end
33
+
34
+ def headers
35
+ @headers
36
+ end
37
+
38
+ attr_accessor :raw_body
39
+ attr_accessor :status
40
+
41
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ # © 2016-2017 Resurface Labs LLC
3
+
4
+ class UsageLoggers
5
+
6
+ @@DISABLED = 'true'.eql?(ENV['USAGE_LOGGERS_DISABLE'])
7
+
8
+ @@disabled = @@DISABLED
9
+
10
+ def self.disable
11
+ @@disabled = true
12
+ end
13
+
14
+ def self.enable
15
+ @@disabled = false unless @@DISABLED
16
+ end
17
+
18
+ def self.enabled?
19
+ !@@disabled
20
+ end
21
+
22
+ def self.url_by_default
23
+ ENV['USAGE_LOGGERS_URL']
24
+ end
25
+
26
+ def self.url_for_demo
27
+ 'https://demo-resurfaceio.herokuapp.com/messages'
28
+ end
29
+
30
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resurfaceio-logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.7.5
5
+ platform: ruby
6
+ authors:
7
+ - RobDickinson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-05-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Library for usage logging
70
+ email:
71
+ - resurfacelabs@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/resurfaceio/all.rb
77
+ - lib/resurfaceio/base_logger.rb
78
+ - lib/resurfaceio/http_logger.rb
79
+ - lib/resurfaceio/http_logger_for_rack.rb
80
+ - lib/resurfaceio/http_logger_for_rails.rb
81
+ - lib/resurfaceio/http_request_impl.rb
82
+ - lib/resurfaceio/http_response_impl.rb
83
+ - lib/resurfaceio/usage_loggers.rb
84
+ homepage: https://github.com/resurfaceio/logger-ruby
85
+ licenses:
86
+ - Apache-2.0
87
+ metadata: {}
88
+ post_install_message:
89
+ rdoc_options: []
90
+ require_paths:
91
+ - lib
92
+ required_ruby_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.2'
97
+ required_rubygems_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ requirements: []
103
+ rubyforge_project:
104
+ rubygems_version: 2.6.11
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Library for usage logging
108
+ test_files: []