halorgium-actionpack 3.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. data/CHANGELOG +5179 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README +409 -0
  4. data/lib/abstract_controller.rb +16 -0
  5. data/lib/abstract_controller/base.rb +158 -0
  6. data/lib/abstract_controller/callbacks.rb +113 -0
  7. data/lib/abstract_controller/exceptions.rb +12 -0
  8. data/lib/abstract_controller/helpers.rb +151 -0
  9. data/lib/abstract_controller/layouts.rb +250 -0
  10. data/lib/abstract_controller/localized_cache.rb +49 -0
  11. data/lib/abstract_controller/logger.rb +61 -0
  12. data/lib/abstract_controller/rendering_controller.rb +188 -0
  13. data/lib/action_controller.rb +72 -0
  14. data/lib/action_controller/base.rb +168 -0
  15. data/lib/action_controller/caching.rb +80 -0
  16. data/lib/action_controller/caching/actions.rb +163 -0
  17. data/lib/action_controller/caching/fragments.rb +116 -0
  18. data/lib/action_controller/caching/pages.rb +154 -0
  19. data/lib/action_controller/caching/sweeping.rb +97 -0
  20. data/lib/action_controller/deprecated.rb +4 -0
  21. data/lib/action_controller/deprecated/integration_test.rb +2 -0
  22. data/lib/action_controller/deprecated/performance_test.rb +1 -0
  23. data/lib/action_controller/dispatch/dispatcher.rb +57 -0
  24. data/lib/action_controller/metal.rb +129 -0
  25. data/lib/action_controller/metal/benchmarking.rb +73 -0
  26. data/lib/action_controller/metal/compatibility.rb +145 -0
  27. data/lib/action_controller/metal/conditional_get.rb +86 -0
  28. data/lib/action_controller/metal/configuration.rb +28 -0
  29. data/lib/action_controller/metal/cookies.rb +105 -0
  30. data/lib/action_controller/metal/exceptions.rb +55 -0
  31. data/lib/action_controller/metal/filter_parameter_logging.rb +77 -0
  32. data/lib/action_controller/metal/flash.rb +162 -0
  33. data/lib/action_controller/metal/head.rb +27 -0
  34. data/lib/action_controller/metal/helpers.rb +115 -0
  35. data/lib/action_controller/metal/hide_actions.rb +47 -0
  36. data/lib/action_controller/metal/http_authentication.rb +312 -0
  37. data/lib/action_controller/metal/layouts.rb +171 -0
  38. data/lib/action_controller/metal/mime_responds.rb +317 -0
  39. data/lib/action_controller/metal/rack_convenience.rb +27 -0
  40. data/lib/action_controller/metal/redirector.rb +22 -0
  41. data/lib/action_controller/metal/render_options.rb +103 -0
  42. data/lib/action_controller/metal/rendering_controller.rb +57 -0
  43. data/lib/action_controller/metal/request_forgery_protection.rb +108 -0
  44. data/lib/action_controller/metal/rescuable.rb +13 -0
  45. data/lib/action_controller/metal/responder.rb +200 -0
  46. data/lib/action_controller/metal/session.rb +15 -0
  47. data/lib/action_controller/metal/session_management.rb +45 -0
  48. data/lib/action_controller/metal/streaming.rb +188 -0
  49. data/lib/action_controller/metal/testing.rb +39 -0
  50. data/lib/action_controller/metal/url_for.rb +41 -0
  51. data/lib/action_controller/metal/verification.rb +130 -0
  52. data/lib/action_controller/middleware.rb +38 -0
  53. data/lib/action_controller/notifications.rb +10 -0
  54. data/lib/action_controller/polymorphic_routes.rb +183 -0
  55. data/lib/action_controller/record_identifier.rb +91 -0
  56. data/lib/action_controller/testing/process.rb +111 -0
  57. data/lib/action_controller/testing/test_case.rb +345 -0
  58. data/lib/action_controller/translation.rb +13 -0
  59. data/lib/action_controller/url_rewriter.rb +204 -0
  60. data/lib/action_controller/vendor/html-scanner.rb +16 -0
  61. data/lib/action_controller/vendor/html-scanner/html/document.rb +68 -0
  62. data/lib/action_controller/vendor/html-scanner/html/node.rb +537 -0
  63. data/lib/action_controller/vendor/html-scanner/html/sanitizer.rb +176 -0
  64. data/lib/action_controller/vendor/html-scanner/html/selector.rb +828 -0
  65. data/lib/action_controller/vendor/html-scanner/html/tokenizer.rb +105 -0
  66. data/lib/action_controller/vendor/html-scanner/html/version.rb +11 -0
  67. data/lib/action_dispatch.rb +70 -0
  68. data/lib/action_dispatch/http/headers.rb +33 -0
  69. data/lib/action_dispatch/http/mime_type.rb +231 -0
  70. data/lib/action_dispatch/http/mime_types.rb +23 -0
  71. data/lib/action_dispatch/http/request.rb +539 -0
  72. data/lib/action_dispatch/http/response.rb +290 -0
  73. data/lib/action_dispatch/http/status_codes.rb +42 -0
  74. data/lib/action_dispatch/http/utils.rb +20 -0
  75. data/lib/action_dispatch/middleware/callbacks.rb +50 -0
  76. data/lib/action_dispatch/middleware/params_parser.rb +79 -0
  77. data/lib/action_dispatch/middleware/rescue.rb +26 -0
  78. data/lib/action_dispatch/middleware/session/abstract_store.rb +208 -0
  79. data/lib/action_dispatch/middleware/session/cookie_store.rb +235 -0
  80. data/lib/action_dispatch/middleware/session/mem_cache_store.rb +47 -0
  81. data/lib/action_dispatch/middleware/show_exceptions.rb +143 -0
  82. data/lib/action_dispatch/middleware/stack.rb +116 -0
  83. data/lib/action_dispatch/middleware/static.rb +44 -0
  84. data/lib/action_dispatch/middleware/string_coercion.rb +29 -0
  85. data/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb +24 -0
  86. data/lib/action_dispatch/middleware/templates/rescues/_trace.erb +26 -0
  87. data/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb +10 -0
  88. data/lib/action_dispatch/middleware/templates/rescues/layout.erb +29 -0
  89. data/lib/action_dispatch/middleware/templates/rescues/missing_template.erb +2 -0
  90. data/lib/action_dispatch/middleware/templates/rescues/routing_error.erb +10 -0
  91. data/lib/action_dispatch/middleware/templates/rescues/template_error.erb +21 -0
  92. data/lib/action_dispatch/middleware/templates/rescues/unknown_action.erb +2 -0
  93. data/lib/action_dispatch/routing.rb +381 -0
  94. data/lib/action_dispatch/routing/deprecated_mapper.rb +878 -0
  95. data/lib/action_dispatch/routing/mapper.rb +327 -0
  96. data/lib/action_dispatch/routing/route.rb +49 -0
  97. data/lib/action_dispatch/routing/route_set.rb +497 -0
  98. data/lib/action_dispatch/testing/assertions.rb +8 -0
  99. data/lib/action_dispatch/testing/assertions/dom.rb +35 -0
  100. data/lib/action_dispatch/testing/assertions/model.rb +19 -0
  101. data/lib/action_dispatch/testing/assertions/response.rb +145 -0
  102. data/lib/action_dispatch/testing/assertions/routing.rb +144 -0
  103. data/lib/action_dispatch/testing/assertions/selector.rb +639 -0
  104. data/lib/action_dispatch/testing/assertions/tag.rb +123 -0
  105. data/lib/action_dispatch/testing/integration.rb +504 -0
  106. data/lib/action_dispatch/testing/performance_test.rb +15 -0
  107. data/lib/action_dispatch/testing/test_request.rb +83 -0
  108. data/lib/action_dispatch/testing/test_response.rb +131 -0
  109. data/lib/action_pack.rb +24 -0
  110. data/lib/action_pack/version.rb +9 -0
  111. data/lib/action_view.rb +58 -0
  112. data/lib/action_view/base.rb +308 -0
  113. data/lib/action_view/context.rb +44 -0
  114. data/lib/action_view/erb/util.rb +48 -0
  115. data/lib/action_view/helpers.rb +62 -0
  116. data/lib/action_view/helpers/active_model_helper.rb +306 -0
  117. data/lib/action_view/helpers/ajax_helper.rb +68 -0
  118. data/lib/action_view/helpers/asset_tag_helper.rb +830 -0
  119. data/lib/action_view/helpers/atom_feed_helper.rb +198 -0
  120. data/lib/action_view/helpers/cache_helper.rb +39 -0
  121. data/lib/action_view/helpers/capture_helper.rb +168 -0
  122. data/lib/action_view/helpers/date_helper.rb +988 -0
  123. data/lib/action_view/helpers/debug_helper.rb +38 -0
  124. data/lib/action_view/helpers/form_helper.rb +1102 -0
  125. data/lib/action_view/helpers/form_options_helper.rb +600 -0
  126. data/lib/action_view/helpers/form_tag_helper.rb +495 -0
  127. data/lib/action_view/helpers/javascript_helper.rb +208 -0
  128. data/lib/action_view/helpers/number_helper.rb +311 -0
  129. data/lib/action_view/helpers/prototype_helper.rb +1309 -0
  130. data/lib/action_view/helpers/raw_output_helper.rb +9 -0
  131. data/lib/action_view/helpers/record_identification_helper.rb +20 -0
  132. data/lib/action_view/helpers/record_tag_helper.rb +58 -0
  133. data/lib/action_view/helpers/sanitize_helper.rb +259 -0
  134. data/lib/action_view/helpers/scriptaculous_helper.rb +226 -0
  135. data/lib/action_view/helpers/tag_helper.rb +151 -0
  136. data/lib/action_view/helpers/text_helper.rb +594 -0
  137. data/lib/action_view/helpers/translation_helper.rb +39 -0
  138. data/lib/action_view/helpers/url_helper.rb +639 -0
  139. data/lib/action_view/locale/en.yml +117 -0
  140. data/lib/action_view/paths.rb +80 -0
  141. data/lib/action_view/render/partials.rb +342 -0
  142. data/lib/action_view/render/rendering.rb +134 -0
  143. data/lib/action_view/safe_buffer.rb +28 -0
  144. data/lib/action_view/template/error.rb +101 -0
  145. data/lib/action_view/template/handler.rb +36 -0
  146. data/lib/action_view/template/handlers.rb +52 -0
  147. data/lib/action_view/template/handlers/builder.rb +17 -0
  148. data/lib/action_view/template/handlers/erb.rb +53 -0
  149. data/lib/action_view/template/handlers/rjs.rb +18 -0
  150. data/lib/action_view/template/resolver.rb +165 -0
  151. data/lib/action_view/template/template.rb +131 -0
  152. data/lib/action_view/template/text.rb +38 -0
  153. data/lib/action_view/test_case.rb +163 -0
  154. metadata +236 -0
@@ -0,0 +1,105 @@
1
+ require 'strscan'
2
+
3
+ module HTML #:nodoc:
4
+
5
+ # A simple HTML tokenizer. It simply breaks a stream of text into tokens, where each
6
+ # token is a string. Each string represents either "text", or an HTML element.
7
+ #
8
+ # This currently assumes valid XHTML, which means no free < or > characters.
9
+ #
10
+ # Usage:
11
+ #
12
+ # tokenizer = HTML::Tokenizer.new(text)
13
+ # while token = tokenizer.next
14
+ # p token
15
+ # end
16
+ class Tokenizer #:nodoc:
17
+
18
+ # The current (byte) position in the text
19
+ attr_reader :position
20
+
21
+ # The current line number
22
+ attr_reader :line
23
+
24
+ # Create a new Tokenizer for the given text.
25
+ def initialize(text)
26
+ @scanner = StringScanner.new(text)
27
+ @position = 0
28
+ @line = 0
29
+ @current_line = 1
30
+ end
31
+
32
+ # Return the next token in the sequence, or +nil+ if there are no more tokens in
33
+ # the stream.
34
+ def next
35
+ return nil if @scanner.eos?
36
+ @position = @scanner.pos
37
+ @line = @current_line
38
+ if @scanner.check(/<\S/)
39
+ update_current_line(scan_tag)
40
+ else
41
+ update_current_line(scan_text)
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ # Treat the text at the current position as a tag, and scan it. Supports
48
+ # comments, doctype tags, and regular tags, and ignores less-than and
49
+ # greater-than characters within quoted strings.
50
+ def scan_tag
51
+ tag = @scanner.getch
52
+ if @scanner.scan(/!--/) # comment
53
+ tag << @scanner.matched
54
+ tag << (@scanner.scan_until(/--\s*>/) || @scanner.scan_until(/\Z/))
55
+ elsif @scanner.scan(/!\[CDATA\[/)
56
+ tag << @scanner.matched
57
+ tag << (@scanner.scan_until(/\]\]>/) || @scanner.scan_until(/\Z/))
58
+ elsif @scanner.scan(/!/) # doctype
59
+ tag << @scanner.matched
60
+ tag << consume_quoted_regions
61
+ else
62
+ tag << consume_quoted_regions
63
+ end
64
+ tag
65
+ end
66
+
67
+ # Scan all text up to the next < character and return it.
68
+ def scan_text
69
+ "#{@scanner.getch}#{@scanner.scan(/[^<]*/)}"
70
+ end
71
+
72
+ # Counts the number of newlines in the text and updates the current line
73
+ # accordingly.
74
+ def update_current_line(text)
75
+ text.scan(/\r?\n/) { @current_line += 1 }
76
+ end
77
+
78
+ # Skips over quoted strings, so that less-than and greater-than characters
79
+ # within the strings are ignored.
80
+ def consume_quoted_regions
81
+ text = ""
82
+ loop do
83
+ match = @scanner.scan_until(/['"<>]/) or break
84
+
85
+ delim = @scanner.matched
86
+ if delim == "<"
87
+ match = match.chop
88
+ @scanner.pos -= 1
89
+ end
90
+
91
+ text << match
92
+ break if delim == "<" || delim == ">"
93
+
94
+ # consume the quoted region
95
+ while match = @scanner.scan_until(/[\\#{delim}]/)
96
+ text << match
97
+ break if @scanner.matched == delim
98
+ text << @scanner.getch # skip the escaped character
99
+ end
100
+ end
101
+ text
102
+ end
103
+ end
104
+
105
+ end
@@ -0,0 +1,11 @@
1
+ module HTML #:nodoc:
2
+ module Version #:nodoc:
3
+
4
+ MAJOR = 0
5
+ MINOR = 5
6
+ TINY = 3
7
+
8
+ STRING = [ MAJOR, MINOR, TINY ].join(".")
9
+
10
+ end
11
+ end
@@ -0,0 +1,70 @@
1
+ #--
2
+ # Copyright (c) 2004-2009 David Heinemeier Hansson
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ require 'rack'
25
+
26
+ module Rack
27
+ autoload :Test, 'rack/test'
28
+ end
29
+
30
+ module ActionDispatch
31
+ autoload :Request, 'action_dispatch/http/request'
32
+ autoload :Response, 'action_dispatch/http/response'
33
+ autoload :StatusCodes, 'action_dispatch/http/status_codes'
34
+ autoload :Utils, 'action_dispatch/http/utils'
35
+
36
+ autoload :Callbacks, 'action_dispatch/middleware/callbacks'
37
+ autoload :MiddlewareStack, 'action_dispatch/middleware/stack'
38
+ autoload :ParamsParser, 'action_dispatch/middleware/params_parser'
39
+ autoload :Rescue, 'action_dispatch/middleware/rescue'
40
+ autoload :ShowExceptions, 'action_dispatch/middleware/show_exceptions'
41
+ autoload :Static, 'action_dispatch/middleware/static'
42
+ autoload :StringCoercion, 'action_dispatch/middleware/string_coercion'
43
+
44
+ autoload :Routing, 'action_dispatch/routing'
45
+
46
+ autoload :Assertions, 'action_dispatch/testing/assertions'
47
+ autoload :Integration, 'action_dispatch/testing/integration'
48
+ autoload :IntegrationTest, 'action_dispatch/testing/integration'
49
+ autoload :PerformanceTest, 'action_dispatch/testing/performance_test'
50
+ autoload :TestRequest, 'action_dispatch/testing/test_request'
51
+ autoload :TestResponse, 'action_dispatch/testing/test_response'
52
+
53
+ autoload :HTML, 'action_controller/vendor/html-scanner'
54
+
55
+ module Http
56
+ autoload :Headers, 'action_dispatch/http/headers'
57
+ end
58
+
59
+ module Session
60
+ autoload :AbstractStore, 'action_dispatch/middleware/session/abstract_store'
61
+ autoload :CookieStore, 'action_dispatch/middleware/session/cookie_store'
62
+ autoload :MemCacheStore, 'action_dispatch/middleware/session/mem_cache_store'
63
+ end
64
+ end
65
+
66
+ autoload :Mime, 'action_dispatch/http/mime_type'
67
+
68
+ activesupport_path = "#{File.dirname(__FILE__)}/../../activesupport/lib"
69
+ $:.unshift activesupport_path if File.directory?(activesupport_path)
70
+ require 'active_support'
@@ -0,0 +1,33 @@
1
+ require 'active_support/memoizable'
2
+
3
+ module ActionDispatch
4
+ module Http
5
+ class Headers < ::Hash
6
+ extend ActiveSupport::Memoizable
7
+
8
+ def initialize(*args)
9
+ if args.size == 1 && args[0].is_a?(Hash)
10
+ super()
11
+ update(args[0])
12
+ else
13
+ super
14
+ end
15
+ end
16
+
17
+ def [](header_name)
18
+ if include?(header_name)
19
+ super
20
+ else
21
+ super(env_name(header_name))
22
+ end
23
+ end
24
+
25
+ private
26
+ # Converts a HTTP header name to an environment variable name.
27
+ def env_name(header_name)
28
+ "HTTP_#{header_name.upcase.gsub(/-/, '_')}"
29
+ end
30
+ memoize :env_name
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,231 @@
1
+ require 'set'
2
+ require 'active_support/core_ext/class/attribute_accessors'
3
+
4
+ module Mime
5
+ class Mimes < Array
6
+ def symbols
7
+ @symbols ||= map {|m| m.to_sym }
8
+ end
9
+
10
+ %w(<< concat shift unshift push pop []= clear compact! collect!
11
+ delete delete_at delete_if flatten! map! insert reject! reverse!
12
+ replace slice! sort! uniq!).each do |method|
13
+ module_eval <<-CODE
14
+ def #{method}(*args)
15
+ @symbols = nil
16
+ super
17
+ end
18
+ CODE
19
+ end
20
+ end
21
+
22
+ SET = Mimes.new
23
+ EXTENSION_LOOKUP = {}
24
+ LOOKUP = Hash.new { |h, k| h[k] = Type.new(k) unless k.blank? }
25
+
26
+ def self.[](type)
27
+ return type if type.is_a?(Type)
28
+ Type.lookup_by_extension(type.to_s)
29
+ end
30
+
31
+ # Encapsulates the notion of a mime type. Can be used at render time, for example, with:
32
+ #
33
+ # class PostsController < ActionController::Base
34
+ # def show
35
+ # @post = Post.find(params[:id])
36
+ #
37
+ # respond_to do |format|
38
+ # format.html
39
+ # format.ics { render :text => post.to_ics, :mime_type => Mime::Type["text/calendar"] }
40
+ # format.xml { render :xml => @people.to_xml }
41
+ # end
42
+ # end
43
+ # end
44
+ class Type
45
+ @@html_types = Set.new [:html, :all]
46
+ cattr_reader :html_types
47
+
48
+ # These are the content types which browsers can generate without using ajax, flash, etc
49
+ # i.e. following a link, getting an image or posting a form. CSRF protection
50
+ # only needs to protect against these types.
51
+ @@browser_generated_types = Set.new [:html, :url_encoded_form, :multipart_form, :text]
52
+ cattr_reader :browser_generated_types
53
+ attr_reader :symbol
54
+
55
+ @@unverifiable_types = Set.new [:text, :json, :csv, :xml, :rss, :atom, :yaml]
56
+ def self.unverifiable_types
57
+ ActiveSupport::Deprecation.warn("unverifiable_types is deprecated and has no effect", caller)
58
+ @@unverifiable_types
59
+ end
60
+
61
+ # A simple helper class used in parsing the accept header
62
+ class AcceptItem #:nodoc:
63
+ attr_accessor :order, :name, :q
64
+
65
+ def initialize(order, name, q=nil)
66
+ @order = order
67
+ @name = name.strip
68
+ q ||= 0.0 if @name == Mime::ALL # default wilcard match to end of list
69
+ @q = ((q || 1.0).to_f * 100).to_i
70
+ end
71
+
72
+ def to_s
73
+ @name
74
+ end
75
+
76
+ def <=>(item)
77
+ result = item.q <=> q
78
+ result = order <=> item.order if result == 0
79
+ result
80
+ end
81
+
82
+ def ==(item)
83
+ name == (item.respond_to?(:name) ? item.name : item)
84
+ end
85
+ end
86
+
87
+ class << self
88
+ def lookup(string)
89
+ LOOKUP[string]
90
+ end
91
+
92
+ def lookup_by_extension(extension)
93
+ EXTENSION_LOOKUP[extension.to_s]
94
+ end
95
+
96
+ # Registers an alias that's not used on mime type lookup, but can be referenced directly. Especially useful for
97
+ # rendering different HTML versions depending on the user agent, like an iPhone.
98
+ def register_alias(string, symbol, extension_synonyms = [])
99
+ register(string, symbol, [], extension_synonyms, true)
100
+ end
101
+
102
+ def register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false)
103
+ Mime.instance_eval { const_set symbol.to_s.upcase, Type.new(string, symbol, mime_type_synonyms) }
104
+
105
+ SET << Mime.const_get(symbol.to_s.upcase)
106
+
107
+ ([string] + mime_type_synonyms).each { |string| LOOKUP[string] = SET.last } unless skip_lookup
108
+ ([symbol.to_s] + extension_synonyms).each { |ext| EXTENSION_LOOKUP[ext] = SET.last }
109
+ end
110
+
111
+ def parse(accept_header)
112
+ if accept_header !~ /,/
113
+ [Mime::Type.lookup(accept_header)]
114
+ else
115
+ # keep track of creation order to keep the subsequent sort stable
116
+ list = []
117
+ accept_header.split(/,/).each_with_index do |header, index|
118
+ params, q = header.split(/;\s*q=/)
119
+ if params
120
+ params.strip!
121
+ list << AcceptItem.new(index, params, q) unless params.empty?
122
+ end
123
+ end
124
+ list.sort!
125
+
126
+ # Take care of the broken text/xml entry by renaming or deleting it
127
+ text_xml = list.index("text/xml")
128
+ app_xml = list.index(Mime::XML.to_s)
129
+
130
+ if text_xml && app_xml
131
+ # set the q value to the max of the two
132
+ list[app_xml].q = [list[text_xml].q, list[app_xml].q].max
133
+
134
+ # make sure app_xml is ahead of text_xml in the list
135
+ if app_xml > text_xml
136
+ list[app_xml], list[text_xml] = list[text_xml], list[app_xml]
137
+ app_xml, text_xml = text_xml, app_xml
138
+ end
139
+
140
+ # delete text_xml from the list
141
+ list.delete_at(text_xml)
142
+
143
+ elsif text_xml
144
+ list[text_xml].name = Mime::XML.to_s
145
+ end
146
+
147
+ # Look for more specific XML-based types and sort them ahead of app/xml
148
+
149
+ if app_xml
150
+ idx = app_xml
151
+ app_xml_type = list[app_xml]
152
+
153
+ while(idx < list.length)
154
+ type = list[idx]
155
+ break if type.q < app_xml_type.q
156
+ if type.name =~ /\+xml$/
157
+ list[app_xml], list[idx] = list[idx], list[app_xml]
158
+ app_xml = idx
159
+ end
160
+ idx += 1
161
+ end
162
+ end
163
+
164
+ list.map! { |i| Mime::Type.lookup(i.name) }.uniq!
165
+ list
166
+ end
167
+ end
168
+ end
169
+
170
+ def initialize(string, symbol = nil, synonyms = [])
171
+ @symbol, @synonyms = symbol, synonyms
172
+ @string = string
173
+ end
174
+
175
+ def to_s
176
+ @string
177
+ end
178
+
179
+ def to_str
180
+ to_s
181
+ end
182
+
183
+ def to_sym
184
+ @symbol || @string.to_sym
185
+ end
186
+
187
+ def ===(list)
188
+ if list.is_a?(Array)
189
+ (@synonyms + [ self ]).any? { |synonym| list.include?(synonym) }
190
+ else
191
+ super
192
+ end
193
+ end
194
+
195
+ def ==(mime_type)
196
+ return false if mime_type.blank?
197
+ (@synonyms + [ self ]).any? do |synonym|
198
+ synonym.to_s == mime_type.to_s || synonym.to_sym == mime_type.to_sym
199
+ end
200
+ end
201
+
202
+ def =~(mime_type)
203
+ return false if mime_type.blank?
204
+ regexp = Regexp.new(Regexp.quote(mime_type.to_s))
205
+ (@synonyms + [ self ]).any? do |synonym|
206
+ synonym.to_s =~ regexp
207
+ end
208
+ end
209
+
210
+ # Returns true if Action Pack should check requests using this Mime Type for possible request forgery. See
211
+ # ActionController::RequestForgeryProtection.
212
+ def verify_request?
213
+ @@browser_generated_types.include?(to_sym)
214
+ end
215
+
216
+ def html?
217
+ @@html_types.include?(to_sym) || @string =~ /html/
218
+ end
219
+
220
+ private
221
+ def method_missing(method, *args)
222
+ if method.to_s =~ /(\w+)\?$/
223
+ $1.downcase.to_sym == to_sym
224
+ else
225
+ super
226
+ end
227
+ end
228
+ end
229
+ end
230
+
231
+ require 'action_dispatch/http/mime_types'