rack-denyie 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.1.0
data/lib/html/default.erb CHANGED
@@ -45,19 +45,19 @@
45
45
  font-family: Arial, Helvetica, Tahoma, sans-serif;
46
46
  background-image: url("http://digitalstarstudios.com/images/denyie/default_bg.jpg");
47
47
  background-repeat: repeat;
48
+ text-align: center;
48
49
  }
49
50
 
50
- div#container {
51
+ #container {
51
52
  overflow: auto;
52
53
  margin: 0 auto;
53
54
  margin-top: 100px;
54
55
  padding: 20px 20px 15px 20px;
55
56
  width: 500px;
56
- text-align: center;
57
+ text-align: left;
57
58
  background-color: #FFFFFF;
58
59
  border: 2px solid #2B445F;
59
60
  }
60
- div#container * { text-align: left }
61
61
 
62
62
  p, li { font-size: 18px }
63
63
  h1, p { margin-bottom: 10px }
@@ -68,7 +68,7 @@
68
68
  span { font-weight: bold }
69
69
 
70
70
  ul { margin-top: 20px }
71
- ul li { float: left; width: 250px; margin-bottom: 20px }
71
+ ul li { float: left; margin-bottom: 20px; width: 250px }
72
72
  ul li img { float: left; margin-right: 10px; border: none }
73
73
 
74
74
  a, a:visited, a:active {
@@ -82,6 +82,9 @@
82
82
 
83
83
 
84
84
  </style>
85
+ <!--[if lte IE 5]>
86
+ <style type="text/css">#container { width: 540px } ul li { width: 230px }</style>
87
+ <![endif]-->
85
88
  </head>
86
89
  <body>
87
90
  <div id="container">
data/lib/rack-denyie.rb CHANGED
@@ -2,76 +2,98 @@ require 'rack'
2
2
  require 'erb'
3
3
 
4
4
  module Rack
5
- class DenyIE
6
-
7
- DEFAULT_TEMPLATE_PATH = ::File.join(::File.dirname(__FILE__), 'html', 'default.erb')
8
- URL_REGEX = %r{\b(([\w-]+://?|[\w\d]+[.])[^\s()<>]+(?:(?:\([\w\d)]+\)[^\s()<>]*)+|([^[:punct:]\s]|/)))} # http://alanstorm.com/url_regex_explained
9
-
10
- def initialize(app, options = {})
11
- @app = app # Passed App
12
- @options = {
13
- :min_version => 7,
14
- :headline => "Your version of Internet Explorer is not supported.",
15
- :site_name => "this site",
16
- :template => DEFAULT_TEMPLATE_PATH,
17
- :redirect_url => nil }.merge options # Middleware Options
18
- end
5
+
6
+ class DenyIE
7
+
8
+ URL_REGEX = %r{\b(([\w-]+://?|[\w\d]+[.])[^\s()<>]+(?:(?:\([\w\d)]+\)[^\s()<>]*)+|([^[:punct:]\s]|/)))} # http://alanstorm.com/url_regex_explained
9
+
10
+ # Default Options
11
+ DEFAULT_MIN_VERSION = 7
12
+ DEFAULT_HEADLINE = "This version of Internet Explorer is not supported."
13
+ DEFAULT_SITE = "this site"
14
+ DEFAULT_TEMPLATE_PATH = ::File.join(::File.dirname(__FILE__), 'html', 'default.erb')
15
+
16
+ DEFAULT_REDIRECT_MESSAGE = "Your browser is unsupported."
17
+
18
+ def initialize(app, options = {})
19
+ @app = app
20
+ @options = {
21
+ :min_version => DEFAULT_MIN_VERSION, # The minimum version of IE you want allowed through
22
+ :headline => DEFAULT_HEADLINE, # The headline message displayed to filtered IE users
23
+ :site_name => DEFAULT_SITE, # Your site name.
24
+ :template => DEFAULT_TEMPLATE_PATH, # A custom template, either ERB or HTML
25
+ :redirect_url => nil }.merge options # Redirects users to a new location rather than displaying a template
26
+ end
19
27
 
20
- def call(env)
21
- status, @headers, content = @app.call(env)
22
- is_unsupported?(env) && is_content_html? ? act_on_ie : @app.call(env)
23
- end
28
+ def call(env)
29
+ status, @headers, content = @app.call(env)
30
+ is_unsupported?(env) && is_content_html? ? act_on_ie : @app.call(env)
31
+ end
24
32
 
25
- private
33
+ private
26
34
 
27
- def is_unsupported?(env)
28
- minimum_version = (@options[:min_version].to_i - 1)
29
- env["HTTP_USER_AGENT"].match(/MSIE [0-#{minimum_version}]/) # \.[0-9][0-9]?
30
- end
35
+ # Uses a regex to filter IE versions
36
+ def is_unsupported?(env)
37
+ minimum_version = (@options[:min_version].to_i - 1)
38
+ env["HTTP_USER_AGENT"].match(/MSIE [0-#{minimum_version}]/) # \.[0-9][0-9]?
39
+ end
31
40
 
32
- def is_content_html?
33
- @headers["Content-Type"] && @headers["Content-Type"].include?("text/html")
34
- end
35
-
36
- def act_on_ie
37
- should_redirect? ? redirect_browser : display_template
38
- end
41
+ # Checks if the content is html, this middleware ONLY filters content that is HTML
42
+ def is_content_html?
43
+ @headers["Content-Type"] && @headers["Content-Type"].include?("text/html")
44
+ end
39
45
 
40
- def should_redirect?
41
- !@options[:redirect_url].nil? && @options[:redirect_url].match(URL_REGEX)
42
- end
46
+ # Decides which action to take, either redirect or display template
47
+ def act_on_ie
48
+ should_redirect? ? redirect_browser : display_template
49
+ end
43
50
 
44
- def redirect_browser
45
- [302, { 'Location' => @options[:redirect_url] }, "Your browser is unsupported." ]
46
- end
51
+ # Checks if redirection is set
52
+ def should_redirect?
53
+ !@options[:redirect_url].nil? && @options[:redirect_url].match(URL_REGEX)
54
+ end
47
55
 
48
- def display_template
49
- response = (::File.extname(@options[:template]) == ".erb") ? process_erb : ::File.read(@options[:template]) # TODO: Add check to see if template points to an actual file
50
- @headers['Content-Length'] = Rack::Utils.bytesize(response.to_s).to_s
51
- [200, @headers, response]
52
- end
56
+ # Redirects the browser to a new location
57
+ def redirect_browser
58
+ [302, { 'Location' => @options[:redirect_url] }, DEFAULT_REDIRECT_MESSAGE ]
59
+ end
53
60
 
54
- def process_erb
55
- raw = ::File.read(@options[:template])
56
- erb = ERB.new(raw, nil, "%<>")
57
- binding = TemplateVars.new(@options).get_binding # Variables passed to ERB template
58
- template = erb.result(binding)
59
- template.gsub(/\n$/,'')
60
- end
61
+ # Displays the template
62
+ def display_template
63
+ response = (::File.extname(@options[:template]) == ".erb") ? ProcessERB.new(@options).bound : ::File.read(@options[:template])
64
+ [200, @headers, response]
65
+ end
61
66
 
62
- end
67
+ end
63
68
 
64
- class TemplateVars
69
+ class ProcessERB
65
70
 
66
- def initialize(vars = {})
67
- vars.each_pair do |key, value|
68
- self.instance_variable_set("@#{key}", value)
71
+ def initialize(options = {})
72
+ @options = options
73
+ @erb = ERB.new(::File.read(@options[:template]), nil, "%<>")
69
74
  end
75
+
76
+ def bound
77
+ binding = TemplateVars.new(@options).get_binding # Variables passed to ERB template
78
+ @template = @erb.result(binding)
79
+ @template.gsub(/\n$/,'')
80
+ end
81
+
70
82
  end
83
+
84
+ # Binds the options as template variables (NOTE: This is probably a better way of doing this, I just don't know it.)
85
+ class TemplateVars
86
+
87
+ def initialize(options = {})
88
+ options.each_pair do |key, value|
89
+ self.instance_variable_set("@#{key}", value)
90
+ end
91
+ end
92
+
93
+ def get_binding
94
+ binding
95
+ end
71
96
 
72
- def get_binding
73
- binding
74
97
  end
75
98
 
76
- end
77
99
  end
data/rack-denyie.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rack-denyie}
8
- s.version = "1.0.0"
8
+ s.version = "1.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Brad Whitcomb"]
12
- s.date = %q{2009-11-30}
12
+ s.date = %q{2009-12-03}
13
13
  s.description = %q{Rack middleware that denies specified versions of IE.}
14
14
  s.email = %q{brad@digitalstarstudios.com}
15
15
  s.extra_rdoc_files = [
@@ -6,42 +6,30 @@ class TestRackDenyIE < Test::Unit::TestCase
6
6
  BODY = "OK"
7
7
  CUSTOM_TEMPLATE_PATH = File.expand_path(File.join(File.dirname(__FILE__), 'html', 'custom_template.html'))
8
8
 
9
- def get_response(user_agent, body, content_type = 'text/html', options = {})
9
+ def request(user_agent, options = {}, content_type = 'text/html')
10
10
  app = Rack::Builder.new do
11
11
  use Rack::DenyIE, options
12
- run lambda { |env| env["HTTP_USER_AGENT"] = user_agent; [200, {'Content-Type' => content_type}, [body] ] }
12
+ run lambda { |env| env["HTTP_USER_AGENT"] = user_agent; [200, {'Content-Type' => content_type}, BODY ] }
13
13
  end
14
14
  Rack::MockRequest.new(app).get('/')
15
15
  end
16
-
17
- def read_erb(ver)
18
- @defaults = {
19
- :min_version => ver || 7,
20
- :headline => "Your version of Internet Explorer is not supported.",
21
- :site_name => "this site",
22
- :template => Rack::DenyIE::DEFAULT_TEMPLATE_PATH,
23
- :redirect_url => nil
24
- }
25
- raw = File.read(@defaults[:template])
26
- erb = ERB.new(raw, nil, "%<>")
27
- binding = Rack::TemplateVars.new(@defaults).get_binding
28
- template = erb.result(binding)
29
- template.gsub(/\n$/,'')
30
- end
31
16
 
32
- context "When Rack::DenyIE" do
17
+ context "When the App" do
33
18
 
34
- user_agents = [
19
+ # Non-IE Tests
20
+
21
+ other_user_agents = [
35
22
  "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.5) Gecko/Firefox/3.5.5",
36
23
  "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; fi-fi) AppleWebKit/531.9 (KHTML, like Gecko) Version/4.0.3 Safari/531.9",
37
24
  "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8",
38
25
  "Opera/9.64 (X11; Linux i686; U; tr) Presto/2.1.1"
39
26
  ]
40
27
 
41
- user_agents.each do |agent|
28
+ # Non-IE User Agents
29
+ other_user_agents.each do |agent|
42
30
  context "encounters a user agent like #{agent}" do
43
31
  setup do
44
- @response = get_response(agent, BODY)
32
+ @response = request(agent)
45
33
  end
46
34
  should "return original response" do
47
35
  assert_equal BODY, @response.body
@@ -49,91 +37,69 @@ class TestRackDenyIE < Test::Unit::TestCase
49
37
  end
50
38
  end
51
39
 
52
- context "encounters supported IE 8" do
53
- setup do
54
- user_agent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)"
55
- @response = get_response(user_agent, BODY, "text/html", { :min_version => 8 })
56
- end
57
- should "return original response" do
58
- assert_equal BODY, @response.body
59
- end
60
- end
61
-
62
- # IE 6 Tests
63
-
64
- context "encounters supported IE 6" do
65
- setup do
66
- user_agent = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
67
- @response = get_response(user_agent, BODY, "text/html", { :min_version => 6 })
68
- end
69
- should "return original response" do
70
- assert_equal BODY, @response.body
71
- end
72
- end
73
-
74
- context "encounters unsupported IE 6" do
75
- setup do
76
- user_agent = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
77
- @response = get_response(user_agent, BODY, "text/html", { :min_version => 7 })
78
- end
79
- should "return default IE template" do
80
- default_template = read_erb(7)
81
-
82
- assert_equal default_template, @response.body
83
- end
84
- end
40
+ # Internet Explorer Tests
85
41
 
86
- context "encounters unsupported IE 6 and custom template" do
87
- setup do
88
- user_agent = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
89
- @response = get_response(user_agent, BODY, "text/html", { :min_version => 7, :template => CUSTOM_TEMPLATE_PATH })
90
- end
91
- should "return custom IE template" do
92
- default_template = read_erb(7)
93
- custom_template = File.read(CUSTOM_TEMPLATE_PATH)
94
-
95
- assert_not_equal default_template, @response.body
96
- assert_equal custom_template, @response.body
97
- end
98
- end
99
-
100
- # IE 7 Tests
101
-
102
- context "encounters supported IE 7" do
103
- setup do
104
- user_agent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.21022)"
105
- @response = get_response(user_agent, BODY, "text/html", { :min_version => 7 })
106
- end
107
- should "return original response" do
108
- assert_equal BODY, @response.body
109
- end
110
- end
111
-
112
- context "encounters unsupported IE 7" do
113
- setup do
114
- user_agent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.21022)"
115
- @response = get_response(user_agent, BODY, "text/html", { :min_version => 8 })
116
- end
117
- should "return default IE template" do
118
- default_template = read_erb(8)
119
-
120
- assert_equal default_template, @response.body
121
- end
122
- end
42
+ ie_user_agents = [
43
+ [8, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)"],
44
+ [7, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.21022)"],
45
+ [6, "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"],
46
+ [5, "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"],
47
+ [4, "Mozilla/4.0 PPC (compatible; MSIE 4.01; Windows CE; PPC; 240x320; Sprint:PPC-6700; PPC; 240x320)"],
48
+ ]
123
49
 
124
- context "encounters unsupported IE 7 and custom template" do
125
- setup do
126
- user_agent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; Media Center PC 5.0; .NET CLR 1.1.4322; .NET CLR 3.5.21022)"
127
- @response = get_response(user_agent, BODY, "text/html", { :min_version => 8, :template => CUSTOM_TEMPLATE_PATH })
128
- end
129
- should "return custom IE template" do
130
- default_template = read_erb(8)
131
- custom_template = File.read(CUSTOM_TEMPLATE_PATH)
132
-
133
- assert_not_equal default_template, @response.body
134
- assert_equal custom_template, @response.body
135
- end
136
- end
50
+ # All IE versions with Default Template
51
+ (4..8).each do |min_ver|
52
+ ie_user_agents.each do |ie_agent|
53
+ context "encounters Internet Explorer #{ie_agent[0]}," do
54
+ setup do
55
+ @options = { :min_version => min_ver, :headline => "Why are you using IE?", :site_name => "DenyIE Test" }
56
+ end
57
+ if ie_agent[0] >= min_ver
58
+ context "and the browser version (#{ie_agent[0]}) is greater than the minimum version (#{min_ver}), then it" do
59
+ setup do
60
+ @response = request(ie_agent[1], @options)
61
+ end
62
+ should "return the original body" do
63
+ assert_equal BODY, @response.body
64
+ end
65
+ end
66
+ else
67
+ context "if the browser version is less than or equal to #{min_ver}" do
68
+ context "and there is no custom template specified, then it" do
69
+ setup do
70
+ @response = request(ie_agent[1], @options)
71
+ @options[:template] = Rack::DenyIE::DEFAULT_TEMPLATE_PATH
72
+ @default_template = Rack::ProcessERB.new(@options).bound
73
+ end
74
+ should "return the default template" do
75
+ assert_equal @default_template, @response.body
76
+ end
77
+ end
78
+ context "and there is a custom template specified, then it" do
79
+ setup do
80
+ @options[:template] = CUSTOM_TEMPLATE_PATH
81
+ @response = request(ie_agent[1], @options)
82
+ @custom_template = File.read(CUSTOM_TEMPLATE_PATH)
83
+ end
84
+ should "return the custom template" do
85
+ assert_equal @custom_template, @response.body
86
+ end
87
+ end
88
+ context "and a redirection url is specified, then it" do
89
+ setup do
90
+ @options[:redirect_url] = "http://browsehappy.org"
91
+ @response = request(ie_agent[1], @options)
92
+ end
93
+ should "redirect the user to the new location" do
94
+ assert_equal @response.status, 302
95
+ assert_equal @response.headers["Location"], "http://browsehappy.org"
96
+ end
97
+ end
98
+ end # Context
99
+ end # Conditional
100
+ end # Context
101
+ end # Array
102
+ end # Loop
137
103
 
138
104
  end
139
105
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-denyie
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brad Whitcomb
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-11-30 00:00:00 -08:00
12
+ date: 2009-12-03 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency