rack-accept 0.4.4 → 0.4.5

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.
@@ -0,0 +1,144 @@
1
+ # Rack::Accept
2
+
3
+ **Rack::Accept** is a suite of tools for Ruby/Rack applications that eases the
4
+ complexity of building and interpreting the Accept* family of [HTTP request headers][rfc].
5
+
6
+ Some features of the library are:
7
+
8
+ * Strict adherence to [RFC 2616][rfc], specifically [section 14][rfc-sec14]
9
+ * Full support for the [Accept][rfc-sec14-1], [Accept-Charset][rfc-sec14-2],
10
+ [Accept-Encoding][rfc-sec14-3], and [Accept-Language][rfc-sec14-4] HTTP
11
+ request headers
12
+ * May be used as [Rack][rack] middleware or standalone
13
+ * A comprehensive [test suite][test] that covers many edge cases
14
+
15
+ [rfc]: http://www.w3.org/Protocols/rfc2616/rfc2616.html
16
+ [rfc-sec14]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
17
+ [rfc-sec14-1]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
18
+ [rfc-sec14-2]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2
19
+ [rfc-sec14-3]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
20
+ [rfc-sec14-4]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
21
+ [rack]: http://rack.rubyforge.org/
22
+ [test]: http://github.com/mjijackson/rack-accept/tree/master/test/
23
+
24
+ ## Installation
25
+
26
+ **Using [RubyGems](http://rubygems.org/):**
27
+
28
+ $ sudo gem install rack-accept
29
+
30
+ **From a local copy:**
31
+
32
+ $ git clone git://github.com/mjijackson/rack-accept.git
33
+ $ cd rack-accept
34
+ $ rake package && sudo rake install
35
+
36
+ ## Usage
37
+
38
+ **Rack::Accept** implements the Rack middleware interface and may be used with any
39
+ Rack-based application. Simply insert the `Rack::Accept` module in your Rack
40
+ middleware pipeline and access the `Rack::Accept::Request` object in the
41
+ `rack-accept.request` environment key, as in the following example.
42
+
43
+ ```ruby
44
+ require 'rack/accept'
45
+
46
+ use Rack::Accept
47
+
48
+ app = lambda do |env|
49
+ accept = env['rack-accept.request']
50
+ response = Rack::Response.new
51
+
52
+ if accept.media_type?('text/html')
53
+ response['Content-Type'] = 'text/html'
54
+ response.write "<p>Hello. You accept text/html!</p>"
55
+ else
56
+ response['Content-Type'] = 'text/plain'
57
+ response.write "Apparently you don't accept text/html. Too bad."
58
+ end
59
+
60
+ response.finish
61
+ end
62
+
63
+ run app
64
+ ```
65
+
66
+ **Rack::Accept** can also construct automatic [406][406] responses if you set up
67
+ the types of media, character sets, encoding, or languages your server is able
68
+ to serve ahead of time. If you pass a configuration block to your `use`
69
+ statement it will yield the `Rack::Accept::Context` object that is used for that
70
+ invocation.
71
+
72
+ [406]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7
73
+
74
+ ```ruby
75
+ require 'rack/accept'
76
+
77
+ use(Rack::Accept) do |context|
78
+ # We only ever serve content in English or Japanese from this site, so if
79
+ # the user doesn't accept either of these we will respond with a 406.
80
+ context.languages = %w< en jp >
81
+ end
82
+
83
+ app = ...
84
+
85
+ run app
86
+ ```
87
+
88
+ **Note:** _You should think carefully before using Rack::Accept in this way.
89
+ Many user agents are careless about the types of Accept headers they send, and
90
+ depend on apps not being too picky. Instead of automatically sending a 406, you
91
+ should probably only send one when absolutely necessary._
92
+
93
+ Additionally, **Rack::Accept** may be used outside of a Rack context to provide
94
+ any Ruby app the ability to construct and interpret Accept headers.
95
+
96
+ ```ruby
97
+ require 'rack/accept'
98
+
99
+ mtype = Rack::Accept::MediaType.new
100
+ mtype.qvalues = { 'text/html' => 1, 'text/*' => 0.8, '*/*' => 0.5 }
101
+ mtype.to_s # => "Accept: text/html, text/*;q=0.8, */*;q=0.5"
102
+
103
+ cset = Rack::Accept::Charset.new('unicode-1-1, iso-8859-5;q=0.8')
104
+ cset.best_of(%w< iso-8859-5 unicode-1-1 >) # => "unicode-1-1"
105
+ cset.accept?('iso-8859-1') # => true
106
+ ```
107
+
108
+ The very last line in this example may look like a mistake to someone not
109
+ familiar with the intricacies of [the spec][rfc-sec14-3], but it's actually
110
+ correct. It just puts emphasis on the convenience of using this library so you
111
+ don't have to worry about these kinds of details.
112
+
113
+ ## Four-letter Words
114
+
115
+ - Spec: [http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html][rfc-sec14]
116
+ - Code: [http://github.com/mjijackson/rack-accept][code]
117
+ - Bugs: [http://github.com/mjijackson/rack-accept/issues][bugs]
118
+ - Docs: [http://mjijackson.github.com/rack-accept][docs]
119
+
120
+ [code]: http://github.com/mjijackson/rack-accept
121
+ [bugs]: http://github.com/mjijackson/rack-accept/issues
122
+ [docs]: http://mjijackson.github.com/rack-accept
123
+
124
+ ## License
125
+
126
+ Copyright 2012 Michael Jackson
127
+
128
+ Permission is hereby granted, free of charge, to any person obtaining a copy
129
+ of this software and associated documentation files (the "Software"), to deal
130
+ in the Software without restriction, including without limitation the rights
131
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
132
+ copies of the Software, and to permit persons to whom the Software is
133
+ furnished to do so, subject to the following conditions:
134
+
135
+ The above copyright notice and this permission notice shall be included in
136
+ all copies or substantial portions of the Software.
137
+
138
+ The software is provided "as is", without warranty of any kind, express or
139
+ implied, including but not limited to the warranties of merchantability,
140
+ fitness for a particular purpose and noninfringement. In no event shall the
141
+ authors or copyright holders be liable for any claim, damages or other
142
+ liability, whether in an action of contract, tort or otherwise, arising from,
143
+ out of or in connection with the software or the use or other dealings in
144
+ the software.
@@ -14,7 +14,7 @@ module Rack::Accept
14
14
  m = /^([^\s,]+?)(?:\s*;\s*q\s*=\s*(\d+(?:\.\d+)?))?$/.match(part)
15
15
 
16
16
  if m
17
- qvalues[m[1]] = normalize_qvalue((m[2] || 1).to_f)
17
+ qvalues[m[1].downcase] = normalize_qvalue((m[2] || 1).to_f)
18
18
  else
19
19
  raise "Invalid header value: #{part.inspect}"
20
20
  end
@@ -6,6 +6,7 @@ module Rack::Accept
6
6
  # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
7
7
  class Language
8
8
  include Header
9
+ attr_writer :first_level_match
9
10
 
10
11
  # The name of this header.
11
12
  def name
@@ -24,6 +25,7 @@ module Rack::Accept
24
25
  # +language+, ordered by precedence.
25
26
  def matches(language)
26
27
  values.select {|v|
28
+ v = v.match(/^(.+?)-/) ? $1 : v if @first_level_match
27
29
  v == language || v == '*' || (language.match(/^(.+?)-/) && v == $1)
28
30
  }.sort {|a, b|
29
31
  # "*" gets least precedence, any others are compared based on length.
@@ -1,6 +1,6 @@
1
1
  module Rack
2
2
  module Accept
3
- VERSION = [0, 4, 4]
3
+ VERSION = [0, 4, 5]
4
4
 
5
5
  # Returns the current version of Rack::Accept as a string.
6
6
  def self.version
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.files = Dir['doc/**/*'] +
19
19
  Dir['lib/**/*.rb'] +
20
20
  Dir['test/*.rb'] +
21
- %w< CHANGES rack-accept.gemspec Rakefile README >
21
+ %w< CHANGES rack-accept.gemspec Rakefile README.md >
22
22
 
23
23
  s.test_files = s.files.select {|path| path =~ /^test\/.*_test.rb/ }
24
24
 
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
27
27
 
28
28
  s.has_rdoc = true
29
29
  s.rdoc_options = %w< --line-numbers --inline-source --title Rack::Accept --main Rack::Accept >
30
- s.extra_rdoc_files = %w< CHANGES README >
30
+ s.extra_rdoc_files = %w< CHANGES README.md >
31
31
 
32
- s.homepage = 'http://mjijackson.com/rack-accept'
32
+ s.homepage = 'http://mjijackson.github.com/rack-accept'
33
33
  end
@@ -31,5 +31,17 @@ class LanguageTest < Test::Unit::TestCase
31
31
  assert_equal('en', l.best_of(%w< en da >))
32
32
  assert_equal('en-us', l.best_of(%w< en-us en-au >))
33
33
  assert_equal(nil, l.best_of(%w< da >))
34
+
35
+ l = L.new('en;q=0.5, en-GB, fr-CA')
36
+ assert_equal('en-gb', l.best_of(%w< en en-gb >))
37
+
38
+ l = L.new('en-gb;q=0.5, EN, fr-CA')
39
+ assert_equal('en', l.best_of(%w< en en-gb >))
40
+
41
+ l = L.new('en;q=0.5, fr-ca')
42
+ assert_equal('en', l.best_of(%w< en fr >))
43
+
44
+ l.first_level_match = true
45
+ assert_equal('fr', l.best_of(%w< en fr >))
34
46
  end
35
47
  end
@@ -36,6 +36,10 @@ class MediaTypeTest < Test::Unit::TestCase
36
36
  m = M.new('text/*')
37
37
  assert_equal('text/html', m.best_of(%w< text/html text/xml >))
38
38
  assert_equal('text/xml', m.best_of(%w< text/xml text/html >))
39
+
40
+ m = M.new('TEXT/*')
41
+ assert_equal('text/html', m.best_of(%w< text/html text/xml >))
42
+ assert_equal('text/xml', m.best_of(%w< text/xml text/html >))
39
43
  end
40
44
 
41
45
  def test_extension
metadata CHANGED
@@ -1,53 +1,47 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: rack-accept
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.5
4
5
  prerelease:
5
- version: 0.4.4
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Michael Jackson
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-05-03 00:00:00 -07:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2012-06-15 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: rack
18
- prerelease: false
19
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &70171348874000 !ruby/object:Gem::Requirement
20
17
  none: false
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
24
- version: "0.4"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0.4'
25
22
  type: :runtime
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
23
  prerelease: false
30
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70171348874000
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &70171348873580 !ruby/object:Gem::Requirement
31
28
  none: false
32
- requirements:
33
- - - ">="
34
- - !ruby/object:Gem::Version
35
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
36
33
  type: :development
37
- version_requirements: *id002
38
- description: HTTP Accept, Accept-Charset, Accept-Encoding, and Accept-Language for Ruby/Rack
34
+ prerelease: false
35
+ version_requirements: *70171348873580
36
+ description: HTTP Accept, Accept-Charset, Accept-Encoding, and Accept-Language for
37
+ Ruby/Rack
39
38
  email: mjijackson@gmail.com
40
39
  executables: []
41
-
42
40
  extensions: []
43
-
44
- extra_rdoc_files:
41
+ extra_rdoc_files:
45
42
  - CHANGES
46
- - README
47
- files:
48
- - doc/index.markdown
49
- - doc/license.markdown
50
- - doc/usage.markdown
43
+ - README.md
44
+ files:
51
45
  - lib/rack/accept/charset.rb
52
46
  - lib/rack/accept/context.rb
53
47
  - lib/rack/accept/encoding.rb
@@ -69,41 +63,38 @@ files:
69
63
  - CHANGES
70
64
  - rack-accept.gemspec
71
65
  - Rakefile
72
- - README
73
- has_rdoc: true
74
- homepage: http://mjijackson.com/rack-accept
66
+ - README.md
67
+ homepage: http://mjijackson.github.com/rack-accept
75
68
  licenses: []
76
-
77
69
  post_install_message:
78
- rdoc_options:
70
+ rdoc_options:
79
71
  - --line-numbers
80
72
  - --inline-source
81
73
  - --title
82
74
  - Rack::Accept
83
75
  - --main
84
76
  - Rack::Accept
85
- require_paths:
77
+ require_paths:
86
78
  - lib
87
- required_ruby_version: !ruby/object:Gem::Requirement
79
+ required_ruby_version: !ruby/object:Gem::Requirement
88
80
  none: false
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: "0"
93
- required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ! '>='
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
86
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- version: "0"
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
99
91
  requirements: []
100
-
101
92
  rubyforge_project:
102
- rubygems_version: 1.6.2
93
+ rubygems_version: 1.8.17
103
94
  signing_key:
104
95
  specification_version: 3
105
96
  summary: HTTP Accept* for Ruby/Rack
106
- test_files:
97
+ test_files:
107
98
  - test/charset_test.rb
108
99
  - test/context_test.rb
109
100
  - test/encoding_test.rb
data/README DELETED
@@ -1,127 +0,0 @@
1
- Rack::Accept
2
- ============
3
-
4
- Rack::Accept is a suite of tools for Ruby/Rack applications that eases the
5
- complexity of building and interpreting the Accept* family of HTTP request
6
- headers.
7
-
8
- Some features of the library are:
9
-
10
- * Strict adherence to RFC 2616, specifically section 14
11
- * Full support for the Accept, Accept-Charset, Accept-Encoding, and
12
- Accept-Language HTTP request headers
13
- * May be used as Rack middleware or standalone
14
- * A comprehensive test suite that covers many edge cases
15
-
16
- Installation
17
- ------------
18
-
19
- Using RubyGems:
20
-
21
- $ sudo gem install rack-accept
22
-
23
- From a local copy:
24
-
25
- $ git clone git://github.com/mjijackson/rack-accept.git
26
- $ cd rack-accept
27
- $ rake package && sudo rake install
28
-
29
- Usage
30
- -----
31
-
32
- Rack::Accept implements the Rack middleware interface and may be used with any
33
- Rack-based application. Simply insert the Rack::Accept module in your Rack
34
- middleware pipeline and access the Rack::Accept::Request object in the
35
- "rack-accept.request" environment key, as in the following example.
36
-
37
- require 'rack/accept'
38
-
39
- use Rack::Accept
40
-
41
- app = lambda do |env|
42
- accept = env['rack-accept.request']
43
- response = Rack::Response.new
44
-
45
- if accept.media_type?('text/html')
46
- response['Content-Type'] = 'text/html'
47
- response.write "<p>Hello. You accept text/html!</p>"
48
- else
49
- response['Content-Type'] = 'text/plain'
50
- response.write "Apparently you don't accept text/html. Too bad."
51
- end
52
-
53
- response.finish
54
- end
55
-
56
- run app
57
-
58
- Rack::Accept can also construct automatic 406 responses if you set up the types
59
- of media, character sets, encoding, or languages your server is able to serve
60
- ahead of time. If you pass a configuration block to your `use` statement it will
61
- yield the Rack::Accept::Context object that is used for that invocation.
62
-
63
- require 'rack/accept'
64
-
65
- use(Rack::Accept) do |context|
66
- # We only ever serve content in English or Japanese from this site, so if
67
- # the user doesn't accept either of these we will respond with a 406.
68
- context.languages = %w< en jp >
69
- end
70
-
71
- app = ...
72
-
73
- run app
74
-
75
- Note: You should think carefully before using Rack::Accept in this way.
76
- Many user agents are careless about the types of Accept headers they send, and
77
- depend on apps not being too picky. Instead of automatically sending a 406, you
78
- should probably only send one when absolutely necessary.
79
-
80
- Additionally, Rack::Accept may be used outside of a Rack context to provide
81
- any Ruby app the ability to construct and interpret Accept headers.
82
-
83
- require 'rack/accept'
84
-
85
- mtype = Rack::Accept::MediaType.new
86
- mtype.qvalues = { 'text/html' => 1, 'text/*' => 0.8, '*/*' => 0.5 }
87
- mtype.to_s # => "Accept: text/html, text/*;q=0.8, */*;q=0.5"
88
-
89
- cset = Rack::Accept::Charset.new('unicode-1-1, iso-8859-5;q=0.8')
90
- cset.best_of(%w< iso-8859-5 unicode-1-1 >) # => "unicode-1-1"
91
- cset.accept?('iso-8859-1') # => true
92
-
93
- The very last line in this example may look like a mistake to someone not
94
- familiar with the intricacies of the spec, but it's actually correct. It
95
- just puts emphasis on the convenience of using this library so you don't
96
- have to worry about these kinds of details.
97
-
98
- Four-letter Words
99
- -----------------
100
-
101
- Spec: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
102
- Code: http://github.com/mjijackson/rack-accept
103
- Bugs: http://github.com/mjijackson/rack-accept/issues
104
- Docs: http://mjijackson.com/rack-accept
105
-
106
- License
107
- -------
108
-
109
- Copyright 2010 Michael Jackson
110
-
111
- Permission is hereby granted, free of charge, to any person obtaining a copy
112
- of this software and associated documentation files (the "Software"), to deal
113
- in the Software without restriction, including without limitation the rights
114
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
115
- copies of the Software, and to permit persons to whom the Software is
116
- furnished to do so, subject to the following conditions:
117
-
118
- The above copyright notice and this permission notice shall be included in
119
- all copies or substantial portions of the Software.
120
-
121
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
122
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
123
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
124
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
125
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
126
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
127
- THE SOFTWARE.
@@ -1,35 +0,0 @@
1
- __Rack::Accept__ is a suite of tools for Ruby/Rack applications that eases the
2
- complexity of building and interpreting the Accept* family of [HTTP request
3
- headers][rfc].
4
-
5
- Some features of the library are:
6
-
7
- * Strict adherence to [RFC 2616][rfc], specifically [section 14][sec14]
8
- * Full support for the [Accept][sec14-1], [Accept-Charset][sec14-2],
9
- [Accept-Encoding][sec14-3], and [Accept-Language][sec14-4] HTTP request
10
- headers
11
- * May be used as [Rack][rack] middleware or standalone
12
- * A comprehensive [test suite][test] that covers many edge cases
13
-
14
- Installation
15
- ------------
16
-
17
- Using [RubyGems][rubygems]:
18
-
19
- $ sudo gem install rack-accept
20
-
21
- From a local copy:
22
-
23
- $ git clone git://github.com/mjijackson/rack-accept.git
24
- $ cd rack-accept
25
- $ rake package && sudo rake install
26
-
27
- [rfc]: http://www.w3.org/Protocols/rfc2616/rfc2616.html
28
- [sec14]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
29
- [sec14-1]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
30
- [sec14-2]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2
31
- [sec14-3]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
32
- [sec14-4]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
33
- [rack]: http://rack.rubyforge.org/
34
- [test]: http://github.com/mjijackson/rack-accept/tree/master/test/
35
- [rubygems]: http://rubygems.org/
@@ -1,22 +0,0 @@
1
- License
2
- -------
3
-
4
- Copyright 2010 Michael Jackson
5
-
6
- Permission is hereby granted, free of charge, to any person obtaining a copy
7
- of this software and associated documentation files (the "Software"), to deal
8
- in the Software without restriction, including without limitation the rights
9
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- copies of the Software, and to permit persons to whom the Software is
11
- furnished to do so, subject to the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be included in
14
- all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- THE SOFTWARE.
@@ -1,74 +0,0 @@
1
- Usage
2
- -----
3
-
4
- Rack::Accept implements the Rack middleware interface and may be used with any
5
- Rack-based application. Simply insert the Rack::Accept module in your Rack
6
- middleware pipeline and access the [Request][req] object in the
7
- "rack-accept.request" environment key, as in the following example.
8
-
9
- require 'rack/accept'
10
-
11
- use Rack::Accept
12
-
13
- app = lambda do |env|
14
- accept = env['rack-accept.request']
15
- response = Rack::Response.new
16
-
17
- if accept.media_type?('text/html')
18
- response['Content-Type'] = 'text/html'
19
- response.write "<p>Hello. You accept text/html!</p>"
20
- else
21
- response['Content-Type'] = 'text/plain'
22
- response.write "Apparently you don't accept text/html. Too bad."
23
- end
24
-
25
- response.finish
26
- end
27
-
28
- run app
29
-
30
- Rack::Accept can also construct automatic [406][406] responses if you set up
31
- the types of media, character sets, encoding, or languages your server is able
32
- to serve ahead of time. If you pass a configuration block to your `use`
33
- statement it will yield the [Context][ctx] object that is used for that
34
- invocation.
35
-
36
- require 'rack/accept'
37
-
38
- use(Rack::Accept) do |context|
39
- # We only ever serve content in English or Japanese from this site, so if
40
- # the user doesn't accept either of these we will respond with a 406.
41
- context.languages = %w< en jp >
42
- end
43
-
44
- app = ...
45
-
46
- run app
47
-
48
- __Note:__ You should think carefully before using Rack::Accept in this way.
49
- Many user agents are careless about the types of Accept headers they send, and
50
- depend on apps not being too picky. Instead of automatically sending a 406, you
51
- should probably only send one when absolutely necessary.
52
-
53
- Additionally, Rack::Accept may be used outside of a Rack context to provide
54
- any Ruby app the ability to construct and interpret Accept headers.
55
-
56
- require 'rack/accept'
57
-
58
- mtype = Rack::Accept::MediaType.new
59
- mtype.qvalues = { 'text/html' => 1, 'text/*' => 0.8, '*/*' => 0.5 }
60
- mtype.to_s # => "Accept: text/html, text/*;q=0.8, */*;q=0.5"
61
-
62
- cset = Rack::Accept::Charset.new('unicode-1-1, iso-8859-5;q=0.8')
63
- cset.best_of(%w< iso-8859-5 unicode-1-1 >) # => "unicode-1-1"
64
- cset.accept?('iso-8859-1') # => true
65
-
66
- The very last line in this example may look like a mistake to someone not
67
- familiar with the intricacies of [the spec][sec14-3], but it's actually
68
- correct. It just puts emphasis on the convenience of using this library so you
69
- don't have to worry about these kinds of details.
70
-
71
- [req]: api/classes/Rack/Accept/Request.html
72
- [406]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7
73
- [ctx]: api/classes/Rack/Accept/Context.html
74
- [sec14-3]: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3