webmachine 1.2.2 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/CHANGELOG.md +57 -0
  4. data/Gemfile +20 -15
  5. data/README.md +89 -91
  6. data/RELEASING.md +21 -0
  7. data/Rakefile +5 -21
  8. data/documentation/adapters.md +41 -0
  9. data/documentation/authentication-and-authorization.md +37 -0
  10. data/documentation/configurator.md +19 -0
  11. data/documentation/error-handling.md +86 -0
  12. data/documentation/examples.md +224 -0
  13. data/documentation/how-it-works.md +76 -0
  14. data/documentation/routes.md +112 -0
  15. data/documentation/validation.md +159 -0
  16. data/documentation/versioning-apis.md +74 -0
  17. data/documentation/visual-debugger.md +38 -0
  18. data/examples/application.rb +2 -2
  19. data/examples/debugger.rb +1 -1
  20. data/lib/webmachine.rb +3 -1
  21. data/lib/webmachine/adapter.rb +7 -13
  22. data/lib/webmachine/adapters.rb +1 -2
  23. data/lib/webmachine/adapters/httpkit.rb +74 -0
  24. data/lib/webmachine/adapters/lazy_request_body.rb +1 -2
  25. data/lib/webmachine/adapters/rack.rb +70 -25
  26. data/lib/webmachine/adapters/rack_mapped.rb +42 -0
  27. data/lib/webmachine/adapters/reel.rb +22 -23
  28. data/lib/webmachine/adapters/webrick.rb +16 -16
  29. data/lib/webmachine/application.rb +2 -2
  30. data/lib/webmachine/chunked_body.rb +3 -4
  31. data/lib/webmachine/configuration.rb +1 -1
  32. data/lib/webmachine/constants.rb +75 -0
  33. data/lib/webmachine/decision/conneg.rb +12 -10
  34. data/lib/webmachine/decision/flow.rb +42 -32
  35. data/lib/webmachine/decision/fsm.rb +14 -21
  36. data/lib/webmachine/decision/helpers.rb +10 -38
  37. data/lib/webmachine/dispatcher.rb +13 -10
  38. data/lib/webmachine/dispatcher/route.rb +45 -9
  39. data/lib/webmachine/errors.rb +9 -3
  40. data/lib/webmachine/events.rb +2 -2
  41. data/lib/webmachine/header_negotiation.rb +25 -0
  42. data/lib/webmachine/headers.rb +8 -3
  43. data/lib/webmachine/locale/en.yml +7 -5
  44. data/lib/webmachine/media_type.rb +10 -8
  45. data/lib/webmachine/request.rb +67 -26
  46. data/lib/webmachine/rescueable_exception.rb +62 -0
  47. data/lib/webmachine/resource.rb +1 -1
  48. data/lib/webmachine/resource/callbacks.rb +11 -9
  49. data/lib/webmachine/response.rb +3 -5
  50. data/lib/webmachine/spec/IO_response.body +1 -0
  51. data/lib/webmachine/spec/adapter_lint.rb +83 -37
  52. data/lib/webmachine/spec/test_resource.rb +15 -4
  53. data/lib/webmachine/streaming/fiber_encoder.rb +1 -5
  54. data/lib/webmachine/streaming/io_encoder.rb +7 -1
  55. data/lib/webmachine/trace.rb +1 -0
  56. data/lib/webmachine/trace/fsm.rb +20 -10
  57. data/lib/webmachine/trace/resource_proxy.rb +2 -0
  58. data/lib/webmachine/translation.rb +2 -1
  59. data/lib/webmachine/version.rb +3 -3
  60. data/memory_test.rb +37 -0
  61. data/spec/spec_helper.rb +17 -9
  62. data/spec/webmachine/adapter_spec.rb +14 -15
  63. data/spec/webmachine/adapters/httpkit_spec.rb +10 -0
  64. data/spec/webmachine/adapters/rack_mapped_spec.rb +71 -0
  65. data/spec/webmachine/adapters/rack_spec.rb +32 -6
  66. data/spec/webmachine/adapters/reel_spec.rb +16 -12
  67. data/spec/webmachine/adapters/webrick_spec.rb +2 -2
  68. data/spec/webmachine/application_spec.rb +18 -17
  69. data/spec/webmachine/chunked_body_spec.rb +3 -3
  70. data/spec/webmachine/configuration_spec.rb +5 -5
  71. data/spec/webmachine/cookie_spec.rb +13 -13
  72. data/spec/webmachine/decision/conneg_spec.rb +49 -43
  73. data/spec/webmachine/decision/falsey_spec.rb +4 -4
  74. data/spec/webmachine/decision/flow_spec.rb +195 -145
  75. data/spec/webmachine/decision/fsm_spec.rb +81 -19
  76. data/spec/webmachine/decision/helpers_spec.rb +20 -20
  77. data/spec/webmachine/dispatcher/rfc3986_percent_decode_spec.rb +22 -0
  78. data/spec/webmachine/dispatcher/route_spec.rb +114 -32
  79. data/spec/webmachine/dispatcher_spec.rb +49 -24
  80. data/spec/webmachine/errors_spec.rb +1 -1
  81. data/spec/webmachine/etags_spec.rb +19 -19
  82. data/spec/webmachine/events_spec.rb +6 -6
  83. data/spec/webmachine/headers_spec.rb +14 -14
  84. data/spec/webmachine/media_type_spec.rb +36 -36
  85. data/spec/webmachine/request_spec.rb +70 -39
  86. data/spec/webmachine/rescueable_exception_spec.rb +15 -0
  87. data/spec/webmachine/resource/authentication_spec.rb +6 -6
  88. data/spec/webmachine/response_spec.rb +18 -12
  89. data/spec/webmachine/trace/fsm_spec.rb +8 -8
  90. data/spec/webmachine/trace/resource_proxy_spec.rb +9 -9
  91. data/spec/webmachine/trace/trace_store_spec.rb +5 -5
  92. data/spec/webmachine/trace_spec.rb +3 -3
  93. data/webmachine.gemspec +2 -6
  94. metadata +78 -228
  95. data/lib/webmachine/adapters/hatetepe.rb +0 -108
  96. data/lib/webmachine/adapters/mongrel.rb +0 -127
  97. data/lib/webmachine/dispatcher/not_found_resource.rb +0 -5
  98. data/lib/webmachine/fiber18.rb +0 -88
  99. data/spec/webmachine/adapters/hatetepe_spec.rb +0 -60
  100. data/spec/webmachine/adapters/mongrel_spec.rb +0 -16
@@ -1,9 +1,11 @@
1
- require 'stringio'
1
+ require 'stringio'
2
2
  require 'time'
3
3
  require 'webmachine/streaming'
4
4
  require 'webmachine/media_type'
5
5
  require 'webmachine/quoted_string'
6
6
  require 'webmachine/etags'
7
+ require 'webmachine/header_negotiation'
8
+ require 'webmachine/constants'
7
9
 
8
10
  module Webmachine
9
11
  module Decision
@@ -11,6 +13,7 @@ module Webmachine
11
13
  module Helpers
12
14
  include QuotedString
13
15
  include Streaming
16
+ include HeaderNegotiation
14
17
 
15
18
  # Determines if the response has a body/entity set.
16
19
  def has_response_body?
@@ -26,8 +29,8 @@ module Webmachine
26
29
  # Encodes the body in the selected charset and encoding.
27
30
  def encode_body
28
31
  body = response.body
29
- chosen_charset = metadata['Charset']
30
- chosen_encoding = metadata['Content-Encoding']
32
+ chosen_charset = metadata[CHARSET]
33
+ chosen_encoding = metadata[CONTENT_ENCODING]
31
34
  charsetter = resource.charsets_provided && resource.charsets_provided.find {|c,_| c == chosen_charset }.last || :charset_nop
32
35
  encoder = resource.encodings_provided[chosen_encoding]
33
36
  response.body = case body
@@ -47,10 +50,10 @@ module Webmachine
47
50
  end
48
51
  end
49
52
  if body_is_fixed_length?
50
- set_content_length
53
+ ensure_content_length(response)
51
54
  else
52
- response.headers.delete 'Content-Length'
53
- response.headers['Transfer-Encoding'] = 'chunked'
55
+ response.headers.delete CONTENT_LENGTH
56
+ response.headers[TRANSFER_ENCODING] = 'chunked'
54
57
  end
55
58
  end
56
59
 
@@ -88,42 +91,11 @@ module Webmachine
88
91
  end
89
92
  end
90
93
 
91
- # Ensures that responses have an appropriate Content-Length
92
- # header
93
- def ensure_content_length
94
- case
95
- when response.headers['Transfer-Encoding']
96
- return
97
- when [204, 205, 304].include?(response.code)
98
- response.headers.delete 'Content-Length'
99
- when has_response_body?
100
- set_content_length
101
- else
102
- response.headers['Content-Length'] = '0'
103
- end
104
- end
105
-
106
- # Ensures that responses have an appropriate Date header
107
- def ensure_date_header
108
- if (200..499).include?(response.code)
109
- response.headers['Date'] ||= Time.now.httpdate
110
- end
111
- end
112
-
113
- # Sets the Content-Length header on the response
114
- def set_content_length
115
- if response.body.respond_to?(:bytesize)
116
- response.headers['Content-Length'] = response.body.bytesize.to_s
117
- else
118
- response.headers['Content-Length'] = response.body.length.to_s
119
- end
120
- end
121
-
122
94
  # Determines whether the response is of a fixed lenghth, i.e. it
123
95
  # is a String or IO with known size.
124
96
  def body_is_fixed_length?
125
97
  response.body.respond_to?(:bytesize) &&
126
- Fixnum === response.body.bytesize
98
+ Integer === response.body.bytesize
127
99
  end
128
100
  end # module Helpers
129
101
  end # module Decision
@@ -1,12 +1,13 @@
1
- require 'forwardable'
1
+ require 'forwardable'
2
2
  require 'webmachine/decision'
3
3
  require 'webmachine/dispatcher/route'
4
- require 'webmachine/dispatcher/not_found_resource'
5
4
 
6
5
  module Webmachine
7
6
  # Handles dispatching incoming requests to the proper registered
8
7
  # resources and initializing the decision logic.
9
8
  class Dispatcher
9
+ WM_DISPATCH = 'wm.dispatch'.freeze
10
+
10
11
  # @return [Array<Route>] the list of routes that will be
11
12
  # dispatched to
12
13
  # @see #add_route
@@ -40,12 +41,16 @@ module Webmachine
40
41
  # @param [Request] request the request object
41
42
  # @param [Response] response the response object
42
43
  def dispatch(request, response)
43
- resource = find_resource(request, response)
44
- Webmachine::Events.instrument('wm.dispatch') do |payload|
45
- Webmachine::Decision::FSM.new(resource, request, response).run
46
- payload[:resource] = resource.class.name
47
- payload[:request] = request.dup
48
- payload[:code] = response.code
44
+ if resource = find_resource(request, response)
45
+ Webmachine::Events.instrument(WM_DISPATCH) do |payload|
46
+ Webmachine::Decision::FSM.new(resource, request, response).run
47
+
48
+ payload[:resource] = resource.class.name
49
+ payload[:request] = request.dup
50
+ payload[:code] = response.code
51
+ end
52
+ else
53
+ Webmachine.render_error(404, request, response)
49
54
  end
50
55
  end
51
56
 
@@ -61,8 +66,6 @@ module Webmachine
61
66
  def find_resource(request, response)
62
67
  if route = find_route(request)
63
68
  prepare_resource(route, request, response)
64
- else
65
- NotFoundResource.new(request, response)
66
69
  end
67
70
  end
68
71
 
@@ -1,12 +1,13 @@
1
- require 'webmachine/resource'
1
+ require 'webmachine/resource'
2
2
  require 'webmachine/translation'
3
+ require 'webmachine/constants'
3
4
 
4
5
  module Webmachine
5
6
  class Dispatcher
6
7
  # Pairs URIs with {Resource} classes in the {Dispatcher}. To
7
8
  # create routes, use {Dispatcher#add_route}.
8
9
  class Route
9
- include Webmachine::Translation
10
+ include Translation
10
11
 
11
12
  # @return [Class] the resource this route will dispatch to, a
12
13
  # subclass of {Resource}
@@ -22,13 +23,16 @@ module Webmachine
22
23
 
23
24
  # When used in a path specification, will match all remaining
24
25
  # segments
25
- MATCH_ALL = '*'.freeze
26
+ MATCH_ALL = :*
27
+
28
+ # String version of MATCH_ALL, deprecated. Use the symbol instead.
29
+ MATCH_ALL_STR = '*'.freeze
26
30
 
27
31
  # Creates a new Route that will associate a pattern to a
28
32
  # {Resource}.
29
33
  #
30
34
  # @example Standard route
31
- # Route.new(["*"], MyResource)
35
+ # Route.new([:*], MyResource)
32
36
  #
33
37
  # @example Guarded route
34
38
  # Route.new ["/notes"],
@@ -65,6 +69,8 @@ module Webmachine
65
69
  guards = args
66
70
  guards << Proc.new if block_given?
67
71
 
72
+ warn t('match_all_symbol') if path_spec.include? MATCH_ALL_STR
73
+
68
74
  @path_spec = path_spec
69
75
  @guards = guards
70
76
  @resource = resource
@@ -77,7 +83,7 @@ module Webmachine
77
83
  # should be dispatched to the {#resource}.
78
84
  # @param [Reqeust] request the request object
79
85
  def match?(request)
80
- tokens = request.uri.path.match(/^\/(.*)/)[1].split('/')
86
+ tokens = request.routing_tokens
81
87
  bind(tokens, {}) && guards.all? { |guard| guard.call(request) }
82
88
  end
83
89
 
@@ -85,9 +91,9 @@ module Webmachine
85
91
  # route, including path bindings.
86
92
  # @param [Request] request the request object
87
93
  def apply(request)
88
- request.disp_path = request.uri.path.match(/^\/(.*)/)[1]
94
+ request.disp_path = request.routing_tokens.join(SLASH)
89
95
  request.path_info = @bindings.dup
90
- tokens = request.disp_path.split('/')
96
+ tokens = request.routing_tokens
91
97
  depth, trailing = bind(tokens, request.path_info)
92
98
  request.path_tokens = trailing || []
93
99
  end
@@ -97,7 +103,7 @@ module Webmachine
97
103
  # accumulating variable bindings.
98
104
  # @param [Array<String>] tokens the list of path segments
99
105
  # @param [Hash] bindings where path bindings will be stored
100
- # @return [Fixnum, Array<Fixnum, Array>, false] either the depth
106
+ # @return [Integer, Array<Integer, Array>, false] either the depth
101
107
  # that the path matched at, the depth and tokens matched by
102
108
  # {MATCH_ALL}, or false if it didn't match.
103
109
  def bind(tokens, bindings)
@@ -107,12 +113,28 @@ module Webmachine
107
113
  case
108
114
  when spec.empty? && tokens.empty?
109
115
  return depth
116
+ when spec == [MATCH_ALL_STR]
117
+ return [depth, tokens]
110
118
  when spec == [MATCH_ALL]
111
119
  return [depth, tokens]
112
120
  when tokens.empty?
113
121
  return false
122
+ when Regexp === spec.first
123
+ matches = spec.first.match Route.rfc3986_percent_decode(tokens.first)
124
+ if matches
125
+ if spec.first.named_captures.empty?
126
+ bindings[:captures] = (bindings[:captures] || []) + matches.captures
127
+ else
128
+ spec.first.named_captures.reduce(bindings) do |bindings, (name, idxs)|
129
+ bindings[name.to_sym] = matches.captures[idxs.first-1]
130
+ bindings
131
+ end
132
+ end
133
+ else
134
+ return false
135
+ end
114
136
  when Symbol === spec.first
115
- bindings[spec.first] = tokens.first
137
+ bindings[spec.first] = Route.rfc3986_percent_decode(tokens.first)
116
138
  when spec.first == tokens.first
117
139
  else
118
140
  return false
@@ -123,6 +145,20 @@ module Webmachine
123
145
  end
124
146
  end
125
147
 
148
+ # Decode a string using the scheme described in RFC 3986 2.1. Percent-Encoding (https://www.ietf.org/rfc/rfc3986.txt)
149
+ def self.rfc3986_percent_decode(value)
150
+ s = StringScanner.new(value)
151
+ result = ''
152
+ until s.eos?
153
+ encoded_val = s.scan(/%([0-9a-fA-F]){2}/)
154
+ result << if encoded_val.nil?
155
+ s.getch
156
+ else
157
+ [encoded_val[1..-1]].pack('H*')
158
+ end
159
+ end
160
+ result
161
+ end
126
162
  end # class Route
127
163
  end # module Dispatcher
128
164
  end # module Webmachine
@@ -1,12 +1,15 @@
1
+ require 'webmachine/header_negotiation'
1
2
  require 'webmachine/translation'
3
+ require 'webmachine/constants'
2
4
  require 'webmachine/version'
3
5
 
4
6
  module Webmachine
7
+ extend HeaderNegotiation
5
8
  extend Translation
6
9
 
7
10
  # Renders a standard error message body for the response. The
8
11
  # standard messages are defined in localization files.
9
- # @param [Fixnum] code the response status code
12
+ # @param [Integer] code the response status code
10
13
  # @param [Request] req the request object
11
14
  # @param [Response] req the response object
12
15
  # @param [Hash] options keys to override the defaults when rendering
@@ -21,10 +24,13 @@ module Webmachine
21
24
  {:title => title,
22
25
  :message => message,
23
26
  :version => Webmachine::SERVER_STRING}.merge(options))
24
- res.headers['Content-Type'] = "text/html"
27
+ res.headers[CONTENT_TYPE] = TEXT_HTML
25
28
  end
29
+ ensure_content_length(res)
30
+ ensure_date_header(res)
26
31
  end
27
32
 
33
+
28
34
  # Superclass of all errors generated by Webmachine.
29
35
  class Error < ::StandardError; end
30
36
 
@@ -33,6 +39,6 @@ module Webmachine
33
39
 
34
40
  # Raised when the client has submitted an invalid request, e.g. in
35
41
  # the case where a request header is improperly formed. Raising this
36
- # exception will result in a 400 response.
42
+ # error will result in a 400 response.
37
43
  class MalformedRequest < Error; end
38
44
  end # module Webmachine
@@ -55,9 +55,9 @@ module Webmachine
55
55
  # and publish it. Notice that events get sent even if an error occurs
56
56
  # in the passed-in block.
57
57
  #
58
- # If an exception happens during an instrumentation the payload will
58
+ # If an error happens during an instrumentation the payload will
59
59
  # have a key `:exception` with an array of two elements as value:
60
- # a string with the name of the exception class, and the exception
60
+ # a string with the name of the error class, and the error
61
61
  # message. (when using the default
62
62
  # [AS::Notifications](http://rubydoc.info/gems/as-notifications/AS/Notifications)
63
63
  # backend)
@@ -0,0 +1,25 @@
1
+ require 'webmachine/constants'
2
+
3
+ module Webmachine
4
+ module HeaderNegotiation
5
+ def ensure_date_header(res)
6
+ if (200..499).include?(res.code)
7
+ res.headers[DATE] ||= Time.now.httpdate
8
+ end
9
+ end
10
+
11
+ def ensure_content_length(res)
12
+ body = res.body
13
+ case
14
+ when res.headers[TRANSFER_ENCODING]
15
+ return
16
+ when [204, 205, 304].include?(res.code)
17
+ res.headers.delete CONTENT_LENGTH
18
+ when body != nil
19
+ res.headers[CONTENT_LENGTH] = body.respond_to?(:bytesize) ? body.bytesize.to_s : body.length.to_s
20
+ else
21
+ res.headers[CONTENT_LENGTH] = '0'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,13 +1,18 @@
1
+ require 'webmachine/constants'
2
+
1
3
  module Webmachine
2
4
  # Case-insensitive Hash of Request headers
3
5
  class Headers < ::Hash
6
+ CGI_HTTP_MATCH = /^HTTP_(\w+)$/.freeze
7
+ CONTENT_TYPE_LENGTH_MATCH = /^(CONTENT_(?:TYPE|LENGTH))$/.freeze
8
+
4
9
  # Convert CGI-style Hash into Request headers
5
10
  # @param [Hash] env a hash of CGI-style env/headers
6
11
  # @return [Webmachine::Headers]
7
12
  def self.from_cgi(env)
8
13
  env.inject(new) do |h,(k,v)|
9
- if k =~ /^HTTP_(\w+)$/ || k =~ /^(CONTENT_(?:TYPE|LENGTH))$/
10
- h[$1.tr("_", "-")] = v
14
+ if k =~ CGI_HTTP_MATCH || k =~ CONTENT_TYPE_LENGTH_MATCH
15
+ h[$1.tr(UNDERSCORE, DASH)] = v
11
16
  end
12
17
  h
13
18
  end
@@ -43,7 +48,7 @@ module Webmachine
43
48
 
44
49
  # Returns the value for the given key. If the key can't be found,
45
50
  # there are several options:
46
- # With no other arguments, it will raise a KeyError exception;
51
+ # With no other arguments, it will raise a KeyError error;
47
52
  # if default is given, then that will be returned;
48
53
  # if the optional code block is specified, then that will be run and its
49
54
  # result returned.
@@ -1,10 +1,11 @@
1
1
  en:
2
2
  webmachine:
3
3
  errors:
4
- standard_body: "<!DOCTYPE html><html>
5
- <head><title>%{title}</title></head>
6
- <body><h1>%{title}</h1><p>%{message}</p>
7
- <address>%{version} server</address></body></html>"
4
+ standard_body: "<!DOCTYPE html><html>\n
5
+ <head><title>%{title}</title></head>\n
6
+ <body><h1>%{title}</h1>\n
7
+ <p>%{message}</p>\n
8
+ <address>%{version} server</address></body></html>\n"
8
9
  "400":
9
10
  title: 400 Malformed Request
10
11
  message: The request was malformed and could not be processed.
@@ -13,7 +14,7 @@ en:
13
14
  message: The requested document was not found on this server.
14
15
  "500":
15
16
  title: 500 Internal Server Error
16
- message: "The server encountered an error while processing this request: <pre>%{error}</pre>"
17
+ message: "The server encountered an error while processing this request: <pre>\n%{error}</pre>"
17
18
  "501":
18
19
  title: 501 Not Implemented
19
20
  message: "The server does not support the %{method} method."
@@ -26,3 +27,4 @@ en:
26
27
  invalid_media_type: "Invalid media type: %{type}"
27
28
  not_resource_class: "%{class} is not a subclass of Webmachine::Resource"
28
29
  process_post_invalid: "process_post returned %{result}"
30
+ match_all_symbol: '"*" as a path segment is deprecated and will be removed in a future release. Please use :*'
@@ -1,14 +1,16 @@
1
- require 'webmachine/translation'
1
+ require 'webmachine/translation'
2
+ require 'webmachine/constants'
3
+ require 'webmachine/dispatcher/route'
2
4
 
3
5
  module Webmachine
4
6
  # Encapsulates a MIME media type, with logic for matching types.
5
7
  class MediaType
6
8
  extend Translation
7
9
  # Matches valid media types
8
- MEDIA_TYPE_REGEX = /^\s*([^;\s]+)\s*((?:;\s*\S+\s*)*)\s*$/
10
+ MEDIA_TYPE_REGEX = /^\s*([^;\s]+)\s*((?:;\s*\S+\s*)*)\s*$/.freeze
9
11
 
10
12
  # Matches sub-type parameters
11
- PARAMS_REGEX = /;\s*([^=]+)(=([^;=\s]*))?/
13
+ PARAMS_REGEX = /;\s*([^=]+)(=([^;=\s]*))?/.freeze
12
14
 
13
15
  # Creates a new MediaType by parsing an alternate representation.
14
16
  # @param [MediaType, String, Array<String,Hash>] obj the raw type
@@ -48,7 +50,7 @@ module Webmachine
48
50
  # Detects whether the {MediaType} represents an open wildcard
49
51
  # type, that is, "*/*" without any {#params}.
50
52
  def matches_all?
51
- @type == "*/*" && @params.empty?
53
+ @type == MATCHES_ALL && @params.empty?
52
54
  end
53
55
 
54
56
  # @return [true,false] Are these two types strictly equal?
@@ -97,12 +99,12 @@ module Webmachine
97
99
 
98
100
  # @return [String] The major type, e.g. "application", "text", "image"
99
101
  def major
100
- type.split("/").first
102
+ type.split(SLASH).first
101
103
  end
102
104
 
103
105
  # @return [String] the minor or sub-type, e.g. "json", "html", "jpeg"
104
106
  def minor
105
- type.split("/").last
107
+ type.split(SLASH).last
106
108
  end
107
109
 
108
110
  # @param [MediaType] other the other type
@@ -110,10 +112,10 @@ module Webmachine
110
112
  # ignoring params and taking into account wildcards
111
113
  def type_matches?(other)
112
114
  other = self.class.parse(other)
113
- if ["*", "*/*", type].include?(other.type)
115
+ if [Dispatcher::Route::MATCH_ALL_STR, MATCHES_ALL, type].include?(other.type)
114
116
  true
115
117
  else
116
- other.major == major && other.minor == "*"
118
+ other.major == major && other.minor == Dispatcher::Route::MATCH_ALL_STR
117
119
  end
118
120
  end
119
121
  end # class MediaType