rack-informant 1.1.0
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 +1 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +14 -0
- data/lib/rack/informant.rb +75 -0
- data/rack-informant.gemspec +12 -0
- metadata +51 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rack-informant-*.gem
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
module Rack
|
2
|
+
# Middleware that "informs on" an application, reporting everything it does
|
3
|
+
# to its secret employer. Other middlewares may become hostile if they find
|
4
|
+
# out.
|
5
|
+
#
|
6
|
+
# After each request is processed, calls the provided block with a hash
|
7
|
+
# containing:
|
8
|
+
# * :method - HTTP request method, e.g. 'GET', 'POST'
|
9
|
+
# * :path - path segment of the request (no host, port or querystring),
|
10
|
+
# e.g. '/info'
|
11
|
+
# * :status - HTTP response status code, e.g. 200, 404
|
12
|
+
# * :runtime - total request processing time (by the server's reckoning) in
|
13
|
+
# *seconds*, as a float. e.g. 0.1 == 100 ms.
|
14
|
+
#
|
15
|
+
# This middleware is async-safe (i.e. should work correctly for both
|
16
|
+
# synchronous requests and asynchronous requests).
|
17
|
+
#
|
18
|
+
# Example usage:
|
19
|
+
#
|
20
|
+
# require 'rack/informant'
|
21
|
+
# use Rack::Informant do |request|
|
22
|
+
# # poor man's request logging (use Rack::CommonLogger instead)
|
23
|
+
# puts "#{request[:method]} #{request[:path]}: #{request[:status]} #{request[:runtime]}"
|
24
|
+
# end
|
25
|
+
|
26
|
+
class Informant
|
27
|
+
def initialize(app, &block)
|
28
|
+
@app = app
|
29
|
+
@callback = block || lambda {|*_|}
|
30
|
+
end
|
31
|
+
|
32
|
+
def call(env)
|
33
|
+
start = Time.now
|
34
|
+
|
35
|
+
if original_callback = env['async.callback']
|
36
|
+
env['async.callback'] = proc do |response|
|
37
|
+
status, headers, body = response
|
38
|
+
|
39
|
+
inform!(env, start, status, headers, body)
|
40
|
+
|
41
|
+
original_callback.call(response)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
catch :async do
|
46
|
+
status, headers, body = @app.call(env)
|
47
|
+
|
48
|
+
# if we got this far, then @app.call didn't throw :async
|
49
|
+
return [status, headers, body] if status == -1 # alternative async API
|
50
|
+
|
51
|
+
# if we got *this* far, @app.call is definitely synchronous
|
52
|
+
inform!(env, start, status, headers, body)
|
53
|
+
|
54
|
+
return [status, headers, body]
|
55
|
+
end
|
56
|
+
|
57
|
+
# we only end up here if @app.call threw :async, so just throw it on.
|
58
|
+
throw :async
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
def inform!(env, start, status, headers, body)
|
63
|
+
runtime = Time.now - start
|
64
|
+
|
65
|
+
event = {
|
66
|
+
method: env['REQUEST_METHOD'],
|
67
|
+
path: env['PATH_INFO'],
|
68
|
+
status: status,
|
69
|
+
runtime: runtime,
|
70
|
+
}
|
71
|
+
|
72
|
+
@callback.call(event)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'rack-informant'
|
3
|
+
s.authors = ['Rapportive Inc']
|
4
|
+
s.email = 'supportive@rapportive.com'
|
5
|
+
s.version = '1.1.0'
|
6
|
+
s.summary = %q{Reporting middleware.}
|
7
|
+
s.description = "Middleware that reports all requests to an interested party (e.g. for analytics)."
|
8
|
+
s.homepage = "https://github.com/rapportive-oss/rack-informant"
|
9
|
+
s.date = Date.today.to_s
|
10
|
+
s.files = `git ls-files`.split("\n")
|
11
|
+
s.require_paths = %w(lib)
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-informant
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rapportive Inc
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-15 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: Middleware that reports all requests to an interested party (e.g. for
|
15
|
+
analytics).
|
16
|
+
email: supportive@rapportive.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- .gitignore
|
22
|
+
- Gemfile
|
23
|
+
- Gemfile.lock
|
24
|
+
- lib/rack/informant.rb
|
25
|
+
- rack-informant.gemspec
|
26
|
+
homepage: https://github.com/rapportive-oss/rack-informant
|
27
|
+
licenses: []
|
28
|
+
post_install_message:
|
29
|
+
rdoc_options: []
|
30
|
+
require_paths:
|
31
|
+
- lib
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 1.8.19
|
47
|
+
signing_key:
|
48
|
+
specification_version: 3
|
49
|
+
summary: Reporting middleware.
|
50
|
+
test_files: []
|
51
|
+
has_rdoc:
|