rack_upstream_identification 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -1,20 +1,11 @@
1
1
  = rack_upstream_identification
2
2
 
3
- acts_as_filterable is an ActiveRecord plugin that was hacked together (originally a monkey patch) to avoid repeating the same text filtering logic that was re-implemented all over the place in a legacy domain model.
4
-
5
- == Current filters in place:
6
-
7
- * filter_for_digits: leaves only numeric values
8
- * filter_for_uppercase: uppercase all alpha characters
9
- * filter_for_lowercase: lowercase all alpha characters
10
- * filter_for_whitespace: strips and non-essential whitespace out of a string (leaving only single whitespace characters).
11
-
12
- Features I'd like to add in the future:
13
- * User-defined custom filters configured via DSL.
14
- * Additional macros that filter decimal values, etc.
15
- * Allow the developer to opt-in models for filtering and not include
16
- the plugin in ActiveRecord::Base
3
+ Upstream Identification is a Rack middleware that is useful in debugging requests in mult-server environments.
4
+ It is often difficult to debug client-side (or server-side ones) that might be occuring on only a handful of machines.
5
+ This was created to provide originating server indentity that is easily accessable in the browser (or command-line tools like curl).
17
6
 
7
+ Read below for usage.
8
+
18
9
  = Runtime Dependencies
19
10
 
20
11
  * Rack 1.0.0+
@@ -24,22 +15,44 @@ Features I'd like to add in the future:
24
15
 
25
16
  == Rails
26
17
 
27
- config.gem "acts_as_filterable", :source => "http://gemcutter.org"
18
+ config.gem "rack_upstream_identification", :lib => "rack/upstream_identification", :version => "0.0.1", :source => "http://gemcutter.org"
19
+
20
+ OR
21
+
22
+ script/plugin install git://github.com/rares/rack_upstream_identification.git
28
23
 
29
24
  == Bundler
30
25
 
31
26
  source "http://gemcutter.org"
32
- gem "acts_as_filterable", "0.2.0"
27
+ gem "rack_upstream_identification", "0.0.1"
33
28
 
34
29
  == RubyGems
35
30
 
36
- gem install acts_as_filterable --source http://gemcutter.org
31
+ gem install rack_upstream_identification --source http://gemcutter.org
37
32
 
38
33
  = Usage
39
-
40
- class MyModel < ActiveRecord::Base
41
- filter_for_digits :phone_number, :fax_number
42
- end
34
+
35
+ By default this middleware injects a header called "X-Upsteam-Identification" that defaults to using the machine's hostname (given a hostname 'foo'):
36
+
37
+ use Rack::UpstreamIdentification
38
+
39
+ yields the header: "X-Upstream-Identification: foo"
40
+
41
+ There are a few available options that allow for mutation of the default output:
42
+
43
+ * header - The following configuration will change the <b>name</b> of the header:
44
+
45
+ use Rack::UpstreamIdentification, "your_header_name"
46
+
47
+ * blk - Passing a block yields the machine's hostname and should return a string that will be sent to the client as the value:
48
+
49
+ use Rack::UpstreamIdentification do |hostname|
50
+ Zlib.crc32(hostname).to_s
51
+ end
52
+
53
+ If you plan on obfuscating this value (as above) there is no facility to track mappings from checksums to servernames so this will have to be managed in your code.
54
+
55
+ Depending on what stack you are using, these statements will live in various places. Please consult documentation for the proper location.
43
56
 
44
57
  = Contributing
45
58
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -5,14 +5,14 @@ module Rack
5
5
  # A middleware for injecting upstream host info into a response header.
6
6
  class UpstreamIdentification
7
7
 
8
- attr_reader :transform, :header_name
8
+ attr_reader :app, :transform, :header_name
9
9
 
10
10
  # Creates the middleware with the following configuration options:
11
11
  #
12
- # [\+header+] The name of the header that is sent to the client.
12
+ # [+header+] The name of the header that is sent to the client.
13
13
  # Defaults to "X-Upstream-Identification"
14
14
  #
15
- # [\+blk+] The optional block used to transform a header. If
15
+ # [+blk+] The optional block used to transform a header. If
16
16
  # a block is passed, the following applies:
17
17
  # * The machine's hostname is passed to the block.
18
18
  # This gives the block the opportunity to change
@@ -31,19 +31,34 @@ module Rack
31
31
  end
32
32
 
33
33
  def call(env)
34
- push_header @app.call(env)
34
+ status, headers, response = app.call(env)
35
+ inject_identity! headers
36
+
37
+ [status, headers, response]
35
38
  end
36
39
 
37
- private
40
+ protected
38
41
 
39
42
  # Push the configured header down to the client
40
- def push_header(response)
41
- response[1][header_name] = if transform
42
- transform.call(host_name).to_s
43
+ def inject_identity!(headers)
44
+ headers[header_name] = if transform
45
+ invoke_transform host_name, &transform
43
46
  else
44
47
  host_name
45
48
  end
46
- response
49
+
50
+ nil
51
+ end
52
+
53
+ # Invoke the transform block.
54
+ # If the block does not return a non-nil value, raise and exception
55
+ def invoke_transform(host_name, &transform)
56
+ header_value = transform.call(host_name)
57
+ unless header_value
58
+ raise ArgumentError, "transform block must return a non-nil value"
59
+ end
60
+
61
+ header_value.to_s
47
62
  end
48
63
 
49
64
  # Get the hostname for the current machine
@@ -31,6 +31,13 @@ class TestRackUpstreamIdentification < Test::Unit::TestCase
31
31
  end
32
32
  run handler
33
33
  end
34
+
35
+ map "/empty_block" do
36
+ use Rack::UpstreamIdentification do |host|
37
+ end
38
+ run handler
39
+ end
40
+
34
41
  end.to_app
35
42
  end
36
43
 
@@ -89,7 +96,7 @@ class TestRackUpstreamIdentification < Test::Unit::TestCase
89
96
  end
90
97
 
91
98
  should "push the header down using the transformed value" do
92
- assert_header_value "X-Upstream-Identification", `hostname`.chomp.upcase
99
+ assert_header_value "X-Upstream-Identification", Socket.gethostname.upcase
93
100
  end
94
101
 
95
102
  end
@@ -103,13 +110,21 @@ class TestRackUpstreamIdentification < Test::Unit::TestCase
103
110
  assert_header_present "crypted_header"
104
111
  end
105
112
 
106
- should "push the header down using the crypted header value" do
113
+ should "push the header down using the mutated header value" do
107
114
  assert_header_value "crypted_header", Zlib.crc32(Socket.gethostname).to_s
108
115
  end
109
116
 
117
+ end
118
+
119
+ context "with an empty transform block" do
120
+ should "raise an ArgumentError indicating that the transform block should return a non-nil value" do
121
+ assert_raise ArgumentError do
122
+ get "/empty_block"
123
+ end
124
+ end
110
125
 
111
126
  end
112
-
127
+
113
128
  end
114
129
 
115
130
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack_upstream_identification
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rob Ares
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-21 00:00:00 -05:00
12
+ date: 2009-11-29 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency