rack-normalize-domain 0.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.
Files changed (2) hide show
  1. data/lib/rack/normalize-domain.rb +65 -0
  2. metadata +66 -0
@@ -0,0 +1,65 @@
1
+ require 'rack'
2
+ require 'uri'
3
+
4
+ class Rack::NormalizeDomain
5
+ def initialize(app, canned_strategy=nil, &block)
6
+ @app = app
7
+ @normalizer = get_normalizer(canned_strategy, block)
8
+ end
9
+
10
+ def get_normalizer(canned_strategy, block)
11
+ canned_normalizer = get_canned_normalizer(canned_strategy)
12
+ custom_normalizer = block || lambda { |host| host }
13
+
14
+ lambda { |host| custom_normalizer[canned_normalizer[host]] }
15
+ end
16
+
17
+ def get_canned_normalizer(strategy)
18
+ case strategy
19
+ when nil, :strip_www
20
+ lambda { |host| host.sub(/^www\./, '') }
21
+ else
22
+ fail "Unknown strategy: #{strategy}"
23
+ end
24
+ end
25
+
26
+ def call(env)
27
+ request = Request.new(@normalizer, env)
28
+
29
+ if request.needs_normalization?
30
+ [301, { 'Location' => request.normalized_url }, '']
31
+ else
32
+ @app.call(env)
33
+ end
34
+ end
35
+
36
+ class Request
37
+ def initialize(normalizer, env)
38
+ @normalizer = normalizer
39
+ @env = env
40
+ end
41
+
42
+ def needs_normalization?
43
+ http_get? and not already_normalized?
44
+ end
45
+
46
+ def normalized_url
47
+ "#{scheme}://#{normalized_host}#{path}#{query}"
48
+ end
49
+
50
+ def already_normalized?; host == normalized_host end
51
+ def normalized_host; @normalizer.call(host) end
52
+
53
+ def http_get?; verb == 'GET' end
54
+ def verb; @env['REQUEST_METHOD'] end
55
+
56
+ def scheme; @env['rack.url_scheme'] end
57
+ def host; @env['HTTP_HOST'] || @env['SERVER_NAME'] end
58
+
59
+ def path; raw_path == '/' ? '' : raw_path end
60
+ def query; raw_query == '' ? '' : "?#{raw_query}" end
61
+
62
+ def raw_path; @env['PATH_INFO'] end
63
+ def raw_query; @env['QUERY_STRING'] end
64
+ end
65
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-normalize-domain
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Daniel Brockman
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-05-25 00:00:00 Z
19
+ dependencies: []
20
+
21
+ description:
22
+ email:
23
+ - daniel@brockman.se
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - lib/rack/normalize-domain.rb
32
+ homepage: http://github.com/dbrock/rack-normalize-domain
33
+ licenses: []
34
+
35
+ post_install_message:
36
+ rdoc_options: []
37
+
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ hash: 3
46
+ segments:
47
+ - 0
48
+ version: "0"
49
+ required_rubygems_version: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ hash: 3
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ requirements: []
59
+
60
+ rubyforge_project:
61
+ rubygems_version: 1.7.2
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: Rack middleware that normalizes the domain of GET requests.
65
+ test_files: []
66
+