rack-denyie 0.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/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +20 -0
- data/README.rdoc +36 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/html/default.html +17 -0
- data/lib/rack-denyie.rb +47 -0
- data/test/html/custom_template.html +16 -0
- data/test/test_helper.rb +9 -0
- data/test/test_rack-denyie.rb +110 -0
- metadata +86 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Brad Whitcomb, Digitalstar Studios
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
== IE Filter on Rack
|
2
|
+
|
3
|
+
Use rack to filter out unsupported IE versions.
|
4
|
+
Use the default template, a custom template or redirect users to another location.
|
5
|
+
|
6
|
+
Because dealing with IE should be easy.
|
7
|
+
Because you can support what you want (if you're lucky).
|
8
|
+
|
9
|
+
=== How?
|
10
|
+
|
11
|
+
# Default Options, IE < 7 & Default Template
|
12
|
+
use Rack::NoIE
|
13
|
+
|
14
|
+
use Rack::NoIE, {
|
15
|
+
:version => 7, # IE < 8
|
16
|
+
:template => '/full/path/to/your/template.html'
|
17
|
+
}
|
18
|
+
|
19
|
+
=== Why?
|
20
|
+
|
21
|
+
1. IE 6 was released in 2001.
|
22
|
+
2. Developing for IE 6 costs extra time + money.
|
23
|
+
3. Because they're releasing the alpha version of IE 9 next year.
|
24
|
+
|
25
|
+
=== Release Years
|
26
|
+
===
|
27
|
+
|
28
|
+
* IE 9 ~ 2010
|
29
|
+
* IE 8 = 2009
|
30
|
+
* IE 7 = 2006
|
31
|
+
* IE 6 = 2001 <= Should be unsupported
|
32
|
+
* IE 5 = 1999 <= Should be unsupported
|
33
|
+
|
34
|
+
== Copyright
|
35
|
+
|
36
|
+
Copyright (c) 2009 Brad Whitcomb, Digitalstar Studios. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "rack-denyie"
|
8
|
+
gem.summary = "Use rack to filter out unsupported IE versions."
|
9
|
+
gem.description = "Use rack to filter out unsupported IE versions. Use default/custom template or redirect users to another place."
|
10
|
+
gem.email = "brad@digitalstarstudios.com"
|
11
|
+
gem.homepage = "http://github.com/whitcomb/rack-denyie"
|
12
|
+
gem.authors = ["Brad Whitcomb"]
|
13
|
+
gem.add_dependency "rack", "1.0.0"
|
14
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
15
|
+
end
|
16
|
+
Jeweler::GemcutterTasks.new
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'rake/testtask'
|
22
|
+
Rake::TestTask.new(:test) do |test|
|
23
|
+
test.libs << 'lib' << 'test'
|
24
|
+
test.pattern = 'test/**/test_*.rb'
|
25
|
+
test.verbose = true
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'rcov/rcovtask'
|
30
|
+
Rcov::RcovTask.new do |test|
|
31
|
+
test.libs << 'test'
|
32
|
+
test.pattern = 'test/**/test_*.rb'
|
33
|
+
test.verbose = true
|
34
|
+
end
|
35
|
+
rescue LoadError
|
36
|
+
task :rcov do
|
37
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
task :test => :check_dependencies
|
42
|
+
|
43
|
+
task :default => :test
|
44
|
+
|
45
|
+
require 'rake/rdoctask'
|
46
|
+
Rake::RDocTask.new do |rdoc|
|
47
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
48
|
+
|
49
|
+
rdoc.rdoc_dir = 'rdoc'
|
50
|
+
rdoc.title = "rack-noie #{version}"
|
51
|
+
rdoc.rdoc_files.include('README*')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>Please Upgrade</title>
|
6
|
+
<style type="text/css">
|
7
|
+
h1 {
|
8
|
+
color: red;
|
9
|
+
font-size: 22px;
|
10
|
+
}
|
11
|
+
</style>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<h1>Your browser is unsupported.</h1>
|
15
|
+
<p>Please upgrade to the latest version of <a href="http://www.microsoft.com/windows/Internet-explorer/default.aspx" title="Download Internet Explorer">Internet Explorer</a></p>
|
16
|
+
</body>
|
17
|
+
</html>
|
data/lib/rack-denyie.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'rack'
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
class DenyIE
|
5
|
+
|
6
|
+
DEFAULT_TEMPLATE_PATH = ::File.join(::File.dirname(__FILE__), 'html', 'default.html')
|
7
|
+
|
8
|
+
def initialize(app, options = {})
|
9
|
+
@app = app
|
10
|
+
@options = { :min_version => 6, :template_path => DEFAULT_TEMPLATE_PATH, :redirect_url => nil }.merge options
|
11
|
+
end
|
12
|
+
|
13
|
+
def call(env)
|
14
|
+
status, @headers, content = @app.call(env)
|
15
|
+
is_browser_supported?(env) && is_content_html? ? act_on_ie : @app.call(env)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def is_browser_supported?(env)
|
21
|
+
env["HTTP_USER_AGENT"].match(/MSIE [0-#{@options[:min_version]}]\.[0-9][0-9]?/)
|
22
|
+
end
|
23
|
+
|
24
|
+
def is_content_html?
|
25
|
+
@headers["Content-Type"] && @headers["Content-Type"].include?("text/html")
|
26
|
+
end
|
27
|
+
|
28
|
+
def act_on_ie
|
29
|
+
should_redirect? ? redirect_browser : display_template
|
30
|
+
end
|
31
|
+
|
32
|
+
def should_redirect?
|
33
|
+
!@options[:redirect_url].nil? && @options[:redirect_url].match(/(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix)
|
34
|
+
end
|
35
|
+
|
36
|
+
def redirect_browser
|
37
|
+
[302, { 'Location' => @options[:redirect_url] }, "Your browser is unsupported." ]
|
38
|
+
end
|
39
|
+
|
40
|
+
def display_template
|
41
|
+
response = ::File.read(@options[:template_path]) # TODO: Add check to see if template points to an actual file
|
42
|
+
@headers['Content-Length'] = Rack::Utils.bytesize(response.to_s).to_s
|
43
|
+
[200, @headers, response]
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
<title>Please Upgrade</title>
|
6
|
+
<style type="text/css">
|
7
|
+
h1 {
|
8
|
+
color: red;
|
9
|
+
font-size: 22px;
|
10
|
+
}
|
11
|
+
</style>
|
12
|
+
</head>
|
13
|
+
<body>
|
14
|
+
<h1>This is a custom template!</h1>
|
15
|
+
</body>
|
16
|
+
</html>
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TestRackDenyIE < Test::Unit::TestCase
|
4
|
+
|
5
|
+
BODY = "OK"
|
6
|
+
|
7
|
+
CUSTOM_TEMPLATE_PATH = File.expand_path(File.join(File.dirname(__FILE__), 'html', 'custom_template.html'))
|
8
|
+
|
9
|
+
def get_response(user_agent, body, content_type = 'text/html', options = {})
|
10
|
+
app = Rack::Builder.new do
|
11
|
+
use Rack::DenyIE, options
|
12
|
+
run lambda { |env| env["HTTP_USER_AGENT"] = user_agent; [200, {'Content-Type' => content_type}, [body] ] }
|
13
|
+
end
|
14
|
+
Rack::MockRequest.new(app).get('/')
|
15
|
+
end
|
16
|
+
|
17
|
+
context "When Rack::DenyIE" do
|
18
|
+
|
19
|
+
user_agents = [
|
20
|
+
"Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.1.5) Gecko/Firefox/3.5.5",
|
21
|
+
"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",
|
22
|
+
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/417.9 (KHTML, like Gecko) Safari/417.8",
|
23
|
+
"Opera/9.64 (X11; Linux i686; U; tr) Presto/2.1.1"
|
24
|
+
]
|
25
|
+
|
26
|
+
user_agents.each do |agent|
|
27
|
+
context "encounters a user agent like #{agent}" do
|
28
|
+
setup do
|
29
|
+
@response = get_response(agent, BODY)
|
30
|
+
end
|
31
|
+
should "return original response" do
|
32
|
+
assert_equal BODY, @response.body
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "encounters supported IE 7" do
|
38
|
+
setup do
|
39
|
+
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)"
|
40
|
+
@response = get_response(user_agent, BODY, "text/html", { :version => 6 })
|
41
|
+
end
|
42
|
+
should "return original response" do
|
43
|
+
assert_equal BODY, @response.body
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "encounters supported IE 8" do
|
48
|
+
setup do
|
49
|
+
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)"
|
50
|
+
@response = get_response(user_agent, BODY, "text/html", { :version => 7 })
|
51
|
+
end
|
52
|
+
should "return original response" do
|
53
|
+
assert_equal BODY, @response.body
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "encounters unsupported IE 6" do
|
58
|
+
setup do
|
59
|
+
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)"
|
60
|
+
@response = get_response(user_agent, BODY, "text/html", { :min_version => 6 })
|
61
|
+
end
|
62
|
+
should "return default IE template" do
|
63
|
+
default_template = File.read(Rack::DenyIE::DEFAULT_TEMPLATE_PATH)
|
64
|
+
|
65
|
+
assert_equal default_template, @response.body
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "encounters unsupported IE 7" do
|
70
|
+
setup do
|
71
|
+
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)"
|
72
|
+
@response = get_response(user_agent, BODY, "text/html", { :min_version => 7 })
|
73
|
+
end
|
74
|
+
should "return default IE template" do
|
75
|
+
default_template = File.read(Rack::DenyIE::DEFAULT_TEMPLATE_PATH)
|
76
|
+
|
77
|
+
assert_equal default_template, @response.body
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "encounters unsupported IE 6 and custom template" do
|
82
|
+
setup do
|
83
|
+
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)"
|
84
|
+
@response = get_response(user_agent, BODY, "text/html", { :min_version => 6, :template_path => CUSTOM_TEMPLATE_PATH })
|
85
|
+
end
|
86
|
+
should "return custom IE template" do
|
87
|
+
default_template = File.read(Rack::DenyIE::DEFAULT_TEMPLATE_PATH)
|
88
|
+
custom_template = File.read(CUSTOM_TEMPLATE_PATH)
|
89
|
+
|
90
|
+
assert_not_equal default_template, @response.body
|
91
|
+
assert_equal custom_template, @response.body
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "encounters unsupported IE 7 and custom template" do
|
96
|
+
setup do
|
97
|
+
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)"
|
98
|
+
@response = get_response(user_agent, BODY, "text/html", { :min_version => 7, :template_path => CUSTOM_TEMPLATE_PATH })
|
99
|
+
end
|
100
|
+
should "return custom IE template" do
|
101
|
+
default_template = File.read(Rack::DenyIE::DEFAULT_TEMPLATE_PATH)
|
102
|
+
custom_template = File.read(CUSTOM_TEMPLATE_PATH)
|
103
|
+
|
104
|
+
assert_not_equal default_template, @response.body
|
105
|
+
assert_equal custom_template, @response.body
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
end
|
metadata
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rack-denyie
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brad Whitcomb
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-24 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rack
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - "="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.0.0
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: thoughtbot-shoulda
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description: Use rack to filter out unsupported IE versions. Use default/custom template or redirect users to another place.
|
36
|
+
email: brad@digitalstarstudios.com
|
37
|
+
executables: []
|
38
|
+
|
39
|
+
extensions: []
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
42
|
+
- LICENSE
|
43
|
+
- README.rdoc
|
44
|
+
files:
|
45
|
+
- .document
|
46
|
+
- .gitignore
|
47
|
+
- LICENSE
|
48
|
+
- README.rdoc
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- lib/html/default.html
|
52
|
+
- lib/rack-denyie.rb
|
53
|
+
- test/html/custom_template.html
|
54
|
+
- test/test_helper.rb
|
55
|
+
- test/test_rack-denyie.rb
|
56
|
+
has_rdoc: true
|
57
|
+
homepage: http://github.com/whitcomb/rack-denyie
|
58
|
+
licenses: []
|
59
|
+
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options:
|
62
|
+
- --charset=UTF-8
|
63
|
+
require_paths:
|
64
|
+
- lib
|
65
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: "0"
|
70
|
+
version:
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: "0"
|
76
|
+
version:
|
77
|
+
requirements: []
|
78
|
+
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 1.3.5
|
81
|
+
signing_key:
|
82
|
+
specification_version: 3
|
83
|
+
summary: Use rack to filter out unsupported IE versions.
|
84
|
+
test_files:
|
85
|
+
- test/test_helper.rb
|
86
|
+
- test/test_rack-denyie.rb
|