swiftiply 0.5.1 → 0.6.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.
Files changed (88) hide show
  1. data/CONTRIBUTORS +2 -0
  2. data/README +1 -1
  3. data/bin/echo_client +26 -0
  4. data/bin/swiftiply +21 -8
  5. data/ext/fastfilereader/extconf.rb +161 -0
  6. data/ext/fastfilereader/mapper.cpp +200 -0
  7. data/ext/fastfilereader/mapper.h +59 -0
  8. data/ext/fastfilereader/rubymain.cpp +127 -0
  9. data/external/test_support.rb +13 -0
  10. data/setup.rb +7 -2
  11. data/src/fastfilereader.rb +109 -0
  12. data/src/swiftcore/Swiftiply.rb +432 -103
  13. data/src/swiftcore/Swiftiply/support_pagecache.rb +56 -0
  14. data/src/swiftcore/Swiftiply/swiftiply_client.rb +57 -0
  15. data/src/swiftcore/evented_mongrel.rb +32 -4
  16. data/src/swiftcore/swiftiplied_mongrel.rb +50 -38
  17. data/src/swiftcore/types.rb +1583 -0
  18. data/swiftiply.gemspec +4 -4
  19. data/test/TC_ProxyBag.rb +185 -0
  20. data/test/TC_Swiftiply.rb +458 -0
  21. data/test/TC_Swiftiply/mongrel/evented_hello.rb +25 -0
  22. data/test/TC_Swiftiply/mongrel/swiftiplied_hello.rb +25 -0
  23. data/test/TC_Swiftiply/mongrel/threaded_hello.rb +25 -0
  24. data/test/TC_Swiftiply/slow_echo_client +26 -0
  25. metadata +34 -121
  26. data/src/ramaze/adapter/evented_mongrel.rb +0 -2
  27. data/src/ramaze/adapter/swiftiplied_mongrel.rb +0 -2
  28. data/test/rails/README +0 -182
  29. data/test/rails/Rakefile +0 -10
  30. data/test/rails/app/controllers/application.rb +0 -6
  31. data/test/rails/app/controllers/tests_controller.rb +0 -15
  32. data/test/rails/app/helpers/application_helper.rb +0 -3
  33. data/test/rails/config/boot.rb +0 -45
  34. data/test/rails/config/database.yml +0 -36
  35. data/test/rails/config/environment.rb +0 -60
  36. data/test/rails/config/environments/development.rb +0 -21
  37. data/test/rails/config/environments/production.rb +0 -18
  38. data/test/rails/config/environments/production_no_caching.rb +0 -18
  39. data/test/rails/config/environments/test.rb +0 -19
  40. data/test/rails/config/routes.rb +0 -23
  41. data/test/rails/doc/README_FOR_APP +0 -2
  42. data/test/rails/observe_ram.rb +0 -10
  43. data/test/rails/public/404.html +0 -30
  44. data/test/rails/public/500.html +0 -30
  45. data/test/rails/public/dispatch.cgi +0 -10
  46. data/test/rails/public/dispatch.fcgi +0 -24
  47. data/test/rails/public/dispatch.rb +0 -10
  48. data/test/rails/public/favicon.ico +0 -0
  49. data/test/rails/public/images/rails.png +0 -0
  50. data/test/rails/public/index.html +0 -277
  51. data/test/rails/public/javascripts/application.js +0 -2
  52. data/test/rails/public/javascripts/controls.js +0 -833
  53. data/test/rails/public/javascripts/dragdrop.js +0 -942
  54. data/test/rails/public/javascripts/effects.js +0 -1088
  55. data/test/rails/public/javascripts/prototype.js +0 -2515
  56. data/test/rails/public/robots.txt +0 -1
  57. data/test/rails/script/about +0 -3
  58. data/test/rails/script/breakpointer +0 -3
  59. data/test/rails/script/console +0 -3
  60. data/test/rails/script/destroy +0 -3
  61. data/test/rails/script/generate +0 -3
  62. data/test/rails/script/performance/benchmarker +0 -3
  63. data/test/rails/script/performance/profiler +0 -3
  64. data/test/rails/script/plugin +0 -3
  65. data/test/rails/script/process/inspector +0 -3
  66. data/test/rails/script/process/reaper +0 -3
  67. data/test/rails/script/process/spawner +0 -3
  68. data/test/rails/script/runner +0 -3
  69. data/test/rails/script/server +0 -3
  70. data/test/rails/test/test_helper.rb +0 -28
  71. data/test/ramaze/conf/benchmark.yaml +0 -35
  72. data/test/ramaze/conf/debug.yaml +0 -34
  73. data/test/ramaze/conf/live.yaml +0 -33
  74. data/test/ramaze/conf/silent.yaml +0 -31
  75. data/test/ramaze/conf/stage.yaml +0 -33
  76. data/test/ramaze/main.rb +0 -18
  77. data/test/ramaze/public/404.jpg +0 -0
  78. data/test/ramaze/public/css/coderay.css +0 -105
  79. data/test/ramaze/public/css/ramaze_error.css +0 -42
  80. data/test/ramaze/public/error.zmr +0 -77
  81. data/test/ramaze/public/favicon.ico +0 -0
  82. data/test/ramaze/public/js/jquery.js +0 -1923
  83. data/test/ramaze/public/ramaze.png +0 -0
  84. data/test/ramaze/src/controller/main.rb +0 -8
  85. data/test/ramaze/src/element/page.rb +0 -17
  86. data/test/ramaze/src/model.rb +0 -6
  87. data/test/ramaze/template/index.xhtml +0 -6
  88. data/test/ramaze/yaml.db +0 -0
@@ -0,0 +1,56 @@
1
+ # -*- coding: ISO-8859-1 -*-
2
+
3
+ # support_pagecache will be required by Swiftiply, as necessary, in order to
4
+ # enable support for Rails style page caching. The caching implementation is
5
+ # flexible, using /public/ as the cache directory by default, but allowing that
6
+ # default to be overridden, and looking for .html files by default, but also
7
+ # allowing that to be overridden.
8
+
9
+ module Swiftcore
10
+ module Swiftiply
11
+ class ProxyBag
12
+ DefaultCacheDir = 'public'.freeze
13
+ DefaultSuffixes = ['html'.freeze]
14
+ @suffix_list = {}
15
+ @cache_dir = {}
16
+
17
+ class << self
18
+ def add_suffix_list(list,name)
19
+ @suffix_list[name] = list
20
+ end
21
+
22
+ def remove_suffix_list(list,name)
23
+ @suffix_list.delete name
24
+ end
25
+
26
+ def add_cache_dir(dir,name)
27
+ @cache_dir[name] = dir
28
+ end
29
+
30
+ def remove_cache_dir(name)
31
+ @cache_dir.delete name
32
+ end
33
+
34
+ def find_static_file(dr,path_info,client_name)
35
+ path = File.join(dr,path_info)
36
+ if FileTest.exist?(path) and FileTest.file?(path)
37
+ path
38
+ elsif @suffix_list.has_key?(client_name)
39
+ path = File.join(dr,@cache_dir[client_name],path_info)
40
+ if FileTest.exist?(path) and FileTest.file?(path)
41
+ path
42
+ else
43
+ for suffix in @suffix_list[client_name] do
44
+ p = "#{path}.#{suffix}"
45
+ return p if FileTest.exist?(p) and FileTest.file?(p)
46
+ end
47
+ nil
48
+ end
49
+ else
50
+ nil
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,57 @@
1
+ # -*- coding: ISO-8859-1 -*-
2
+ require 'eventmachine'
3
+ require 'socket'
4
+
5
+ # This is a basic Swiftiply client implementation.
6
+
7
+ class SwiftiplyClientProtocol < EventMachine::Connection
8
+
9
+ attr_accessor :hostname, :port, :key, :ip, :id
10
+
11
+ C_dotdotdot = '...'.freeze
12
+ C0s = [0,0,0,0].freeze
13
+ CCCCC = 'CCCC'.freeze
14
+ CContentLength = 'Content-Length'.freeze
15
+ DefaultHeaders = {'Connection' => 'close', 'Content-Type' => 'text/plain'}
16
+
17
+ def self.connect(hostname = nil,port = nil,key = '')
18
+ key = key.to_s
19
+
20
+ connection = ::EventMachine.connect(hostname, port, self) do |conn|
21
+ conn.hostname = hostname
22
+ conn.port = port
23
+ conn.key = key
24
+ ip = conn.ip = conn.__get_ip(hostname)
25
+ conn.id = 'swiftclient' << ip.collect {|x| sprintf('%02x',x.to_i)}.join << sprintf('%04x',port.to_i)<< sprintf('%02x',key.length) << key
26
+ conn.set_comm_inactivity_timeout inactivity_timeout
27
+ end
28
+ end
29
+
30
+ def self.inactivity_timeout
31
+ @inactivity_timeout || 60
32
+ end
33
+
34
+ def self.inactivity_timeout=(val)
35
+ @inactivity_timeout = val
36
+ end
37
+
38
+ def connection_completed
39
+ send_data @id
40
+ end
41
+
42
+ def unbind
43
+ ::EventMachine.add_timer(rand(2)) {self.class.connect(@hostname,@port,@key)}
44
+ end
45
+
46
+ def send_http_data(data,h = {},status = 200, msg = C_dotdotdot)
47
+ headers = DefaultHeaders.merge(h)
48
+ headers[CContentLength] = data.length
49
+ header_string = ''
50
+ headers.each {|k,v| header_string << "#{k}: #{v}\r\n"}
51
+ send_data("HTTP/1.1 #{status} #{msg}\r\n#{header_string}\r\n#{data}")
52
+ end
53
+
54
+ def __get_ip hostname
55
+ Socket.gethostbyname(hostname)[3].unpack(CCCCC) rescue ip = C0s
56
+ end
57
+ end
@@ -126,10 +126,7 @@ module Mongrel
126
126
  response = HttpResponse.new(client)
127
127
 
128
128
  # Process each handler in registered order until we run out or one finalizes the response.
129
- handlers.each do |handler|
130
- handler.process(request, response)
131
- break if response.done
132
- end
129
+ dispatch_to_handlers(handlers,request,response)
133
130
 
134
131
  # And finally, if nobody closed the response off, we finalize it.
135
132
  unless response.done
@@ -143,6 +140,13 @@ module Mongrel
143
140
  client.close_connection_after_writing
144
141
  end
145
142
  end
143
+
144
+ def dispatch_to_handlers(handlers,request,response)
145
+ handlers.each do |handler|
146
+ handler.process(request, response)
147
+ break if response.done
148
+ end
149
+ end
146
150
  end
147
151
 
148
152
  class HttpRequest
@@ -188,4 +192,28 @@ module Mongrel
188
192
  @socket.close_connection_after_writing
189
193
  end
190
194
  end
195
+
196
+ class Configurator
197
+ # This version fixes a bug in the regular Mongrel version by adding
198
+ # initialization of groups.
199
+ def change_privilege(user, group)
200
+ if user and group
201
+ log "Initializing groups for {#user}:{#group}."
202
+ Process.initgroups(user,Etc.getgrnam(group).gid)
203
+ end
204
+
205
+ if group
206
+ log "Changing group to #{group}."
207
+ Process::GID.change_privilege(Etc.getgrnam(group).gid)
208
+ end
209
+
210
+ if user
211
+ log "Changing user to #{user}."
212
+ Process::UID.change_privilege(Etc.getpwnam(user).uid)
213
+ end
214
+ rescue Errno::EPERM
215
+ log "FAILED to change user:group #{user}:#{group}: #$!"
216
+ exit 1
217
+ end
218
+ end
191
219
  end
@@ -7,6 +7,8 @@
7
7
  begin
8
8
  load_attempted ||= false
9
9
  require 'eventmachine'
10
+ require 'swiftcore/Swiftiply/swiftiply_client'
11
+ require 'mongrel'
10
12
  rescue LoadError
11
13
  unless load_attempted
12
14
  load_attempted = true
@@ -15,30 +17,11 @@ rescue LoadError
15
17
  end
16
18
  end
17
19
 
18
- require 'mongrel'
19
-
20
20
  module Mongrel
21
- class MongrelProtocol < EventMachine::Connection
22
- def self.connect(hostname = nil,port = nil)
23
- @hostname ||= hostname
24
- @port ||= port
25
-
26
- ::EventMachine.connect(@hostname, @port, self) do |conn|
27
- conn.set_comm_inactivity_timeout 60
28
- end
29
- end
21
+ C0s = [0,0,0,0].freeze unless const_defined?(:C0s)
22
+ CCCCC = 'CCCC'.freeze unless const_defined?(:CCCCC)
30
23
 
31
- def self.hostname
32
- @hostname
33
- end
34
-
35
- def self.port
36
- @port
37
- end
38
-
39
- def connection_completed
40
- @completed = true
41
- end
24
+ class MongrelProtocol < SwiftiplyClientProtocol
42
25
 
43
26
  def post_init
44
27
  @parser = HttpParser.new
@@ -49,14 +32,6 @@ module Mongrel
49
32
  @linebuffer = ''
50
33
  end
51
34
 
52
- def unbind
53
- if @completed
54
- self.class.connect
55
- else
56
- ::EventMachine.add_timer(rand(4)) {self.class.connect}
57
- end
58
- end
59
-
60
35
  def receive_data data
61
36
  @linebuffer << data
62
37
  @nparsed = @parser.execute(@params, @linebuffer, @nparsed) unless @parser.finished?
@@ -112,11 +87,19 @@ module Mongrel
112
87
  end
113
88
 
114
89
  class HttpServer
115
- def initialize(host, port, num_processors=(2**30-1), timeout=0)
90
+ # There is no framework agnostic way to get that key value from the
91
+ # configuration into here; it'll require code specific to the way the
92
+ # different frameworks handle their configuration of Mongrel. So....
93
+ # The support is here, for swiftiplied_mongrels which are secured by
94
+ # a key. If someone want to donate any patches. Otherwise, this won't
95
+ # really be useful to most people until 0.7.0.
96
+
97
+ def initialize(host, port, num_processors=(2**30-1), timeout=0,key = '')
116
98
  @socket = nil
117
99
  @classifier = URIClassifier.new
118
100
  @host = host
119
101
  @port = port
102
+ @key = key
120
103
  @workers = ThreadGroup.new
121
104
  @timeout = timeout
122
105
  @num_processors = num_processors
@@ -125,12 +108,12 @@ module Mongrel
125
108
  end
126
109
 
127
110
  def run
128
- trap('INT') { raise StopServer }
129
- trap('TERM') { raise StopServer }
111
+ trap('INT') { EventMachine.stop_event_loop }
112
+ trap('TERM') { EventMachine.stop_event_loop }
130
113
  @acceptor = Thread.new do
131
114
  EventMachine.run do
132
115
  begin
133
- EventMachine.connect(@host,@port,MongrelProtocol)
116
+ MongrelProtocol.connect(@host,@port,@key)
134
117
  rescue StopServer
135
118
  EventMachine.stop_event_loop
136
119
  end
@@ -156,10 +139,7 @@ module Mongrel
156
139
  response = HttpResponse.new(client)
157
140
 
158
141
  # Process each handler in registered order until we run out or one finalizes the response.
159
- handlers.each do |handler|
160
- handler.process(request, response)
161
- break if response.done
162
- end
142
+ dispatch_to_handlers(handlers,request,response)
163
143
 
164
144
  # And finally, if nobody closed the response off, we finalize it.
165
145
  unless response.done
@@ -176,6 +156,14 @@ module Mongrel
176
156
  response.finished
177
157
  end
178
158
  end
159
+
160
+ def dispatch_to_handlers(handlers,request,response)
161
+ handlers.each do |handler|
162
+ handler.process(request, response)
163
+ break if response.done
164
+ end
165
+ end
166
+
179
167
  end
180
168
 
181
169
  class HttpRequest
@@ -216,4 +204,28 @@ module Mongrel
216
204
  send_body
217
205
  end
218
206
  end
207
+
208
+ class Configurator
209
+ # This version fixes a bug in the regular Mongrel version by adding
210
+ # initialization of groups.
211
+ def change_privilege(user, group)
212
+ if user and group
213
+ log "Initializing groups for {#user}:{#group}."
214
+ Process.initgroups(user,Etc.getgrnam(group).gid)
215
+ end
216
+
217
+ if group
218
+ log "Changing group to #{group}."
219
+ Process::GID.change_privilege(Etc.getgrnam(group).gid)
220
+ end
221
+
222
+ if user
223
+ log "Changing user to #{user}."
224
+ Process::UID.change_privilege(Etc.getpwnam(user).uid)
225
+ end
226
+ rescue Errno::EPERM
227
+ log "FAILED to change user:group #{user}:#{group}: #$!"
228
+ exit 1
229
+ end
230
+ end
219
231
  end
@@ -0,0 +1,1583 @@
1
+ #--
2
+ # MIME::Types for Ruby
3
+ # Version 1.15sc1
4
+ #
5
+ # This version of MIME::Types has been optimized for Swiftcore by Kirk Haines.
6
+ #
7
+ # Copyright (c) 2002 - 2004 Austin Ziegler
8
+ #
9
+ # $Id: types.rb,v 1.4 2006/02/12 21:27:22 austin Exp $
10
+ #
11
+ #++
12
+
13
+ # The namespace for MIME applications, tools, and libraries.
14
+ module MIME
15
+ # Reflects a MIME Content-Type which is in invalid format (e.g., it isn't
16
+ # in the form of type/subtype).
17
+ class InvalidContentType < RuntimeError; end
18
+
19
+ # The definition of one MIME content-type.
20
+ #
21
+ # == Usage
22
+ # require 'mime/types'
23
+ #
24
+ # plaintext = MIME::Types['text/plain']
25
+ # print plaintext.media_type # => 'text'
26
+ # print plaintext.sub_type # => 'plain'
27
+ #
28
+ # puts plaintext.extensions.join(" ") # => 'asc txt c cc h hh cpp'
29
+ #
30
+ # puts plaintext.encoding # => 8bit
31
+ # puts plaintext.binary? # => false
32
+ # puts plaintext.ascii? # => true
33
+ # puts plaintext == 'text/plain' # => true
34
+ # puts MIME::Type.simplified('x-appl/x-zip') # => 'appl/zip'
35
+ #
36
+ class Type
37
+ VERSION = '1.15sc1'
38
+
39
+ include Comparable
40
+
41
+ MEDIA_TYPE_RE = %r{([-\w.+]+)/([-\w.+]*)}o #:nodoc:
42
+ UNREG_RE = %r{[Xx]-}o #:nodoc:
43
+ ENCODING_RE = %r{(?:base64|7bit|8bit|quoted\-printable)}o #:nodoc:
44
+ PLATFORM_RE = %r|#{RUBY_PLATFORM}|o #:nodoc:
45
+
46
+ SIGNATURES = %w(application/pgp-keys application/pgp
47
+ application/pgp-signature application/pkcs10
48
+ application/pkcs7-mime application/pkcs7-signature
49
+ text/vcard) #:nodoc:
50
+
51
+ IANA_URL = "http://www.iana.org/assignments/media-types/%s/%s"
52
+ RFC_URL = "http://rfc-editor.org/rfc/rfc%s.txt"
53
+ DRAFT_URL = "http://datatracker.ietf.org/public/idindex.cgi?command=id_details&filename=%s"
54
+ LTSW_URL = "http://www.ltsw.se/knbase/internet/%s.htp"
55
+ CONTACT_URL = "http://www.iana.org/assignments/contact-people.htm#%s"
56
+
57
+ # Returns +true+ if the simplified type matches the current
58
+ def like?(other)
59
+ if other.respond_to?(:simplified)
60
+ @simplified == other.simplified
61
+ else
62
+ @simplified == Type.simplified(other)
63
+ end
64
+ end
65
+
66
+ # Compares the MIME::Type against the exact content type or the
67
+ # simplified type (the simplified type will be used if comparing against
68
+ # something that can be treated as a String with #to_s).
69
+ def <=>(other) #:nodoc:
70
+ if other.respond_to?(:content_type)
71
+ @content_type.downcase <=> other.content_type.downcase
72
+ elsif other.respond_to?(:to_s)
73
+ @simplified <=> Type.simplified(other.to_s)
74
+ else
75
+ @content_type.downcase <=> other.downcase
76
+ end
77
+ end
78
+
79
+ # Returns +true+ if the other object is a MIME::Type and the content
80
+ # types match.
81
+ def eql?(other) #:nodoc:
82
+ other.kind_of?(MIME::Type) and self == other
83
+ end
84
+
85
+ # Returns the whole MIME content-type string.
86
+ #
87
+ # text/plain => text/plain
88
+ # x-chemical/x-pdb => x-chemical/x-pdb
89
+ attr_reader :content_type
90
+ # Returns the media type of the simplified MIME type.
91
+ #
92
+ # text/plain => text
93
+ # x-chemical/x-pdb => chemical
94
+ attr_reader :media_type
95
+ # Returns the media type of the unmodified MIME type.
96
+ #
97
+ # text/plain => text
98
+ # x-chemical/x-pdb => x-chemical
99
+ attr_reader :raw_media_type
100
+ # Returns the sub-type of the simplified MIME type.
101
+ #
102
+ # text/plain => plain
103
+ # x-chemical/x-pdb => pdb
104
+ attr_reader :sub_type
105
+ # Returns the media type of the unmodified MIME type.
106
+ #
107
+ # text/plain => plain
108
+ # x-chemical/x-pdb => x-pdb
109
+ attr_reader :raw_sub_type
110
+ # The MIME types main- and sub-label can both start with <tt>x-</tt>,
111
+ # which indicates that it is a non-registered name. Of course, after
112
+ # registration this flag can disappear, adds to the confusing
113
+ # proliferation of MIME types. The simplified string has the <tt>x-</tt>
114
+ # removed and are translated to lowercase.
115
+ #
116
+ # text/plain => text/plain
117
+ # x-chemical/x-pdb => chemical/pdb
118
+ attr_reader :simplified
119
+ # The list of extensions which are known to be used for this MIME::Type.
120
+ # Non-array values will be coerced into an array with #to_a. Array
121
+ # values will be flattened and +nil+ values removed.
122
+ attr_accessor :extensions
123
+ remove_method :extensions= ;
124
+ def extensions=(ext) #:nodoc:
125
+ @extensions = ext.to_a.flatten.compact
126
+ end
127
+
128
+ # The encoding (7bit, 8bit, quoted-printable, or base64) required to
129
+ # transport the data of this content type safely across a network, which
130
+ # roughly corresponds to Content-Transfer-Encoding. A value of +nil+ or
131
+ # <tt>:default</tt> will reset the #encoding to the #default_encoding
132
+ # for the MIME::Type. Raises ArgumentError if the encoding provided is
133
+ # invalid.
134
+ #
135
+ # If the encoding is not provided on construction, this will be either
136
+ # 'quoted-printable' (for text/* media types) and 'base64' for eveything
137
+ # else.
138
+ attr_accessor :encoding
139
+ remove_method :encoding= ;
140
+ def encoding=(enc) #:nodoc:
141
+ if enc.nil? or enc == :default
142
+ @encoding = self.default_encoding
143
+ elsif enc =~ ENCODING_RE
144
+ @encoding = enc
145
+ else
146
+ raise ArgumentError, "The encoding must be nil, :default, base64, 7bit, 8bit, or quoted-printable."
147
+ end
148
+ end
149
+
150
+ # The regexp for the operating system that this MIME::Type is specific
151
+ # to.
152
+ attr_accessor :system
153
+ remove_method :system= ;
154
+ def system=(os) #:nodoc:
155
+ if os.nil? or os.kind_of?(Regexp)
156
+ @system = os
157
+ else
158
+ @system = %r|#{os}|
159
+ end
160
+ end
161
+ # Returns the default encoding for the MIME::Type based on the media
162
+ # type.
163
+ attr_reader :default_encoding
164
+ remove_method :default_encoding
165
+ def default_encoding
166
+ (@media_type == 'text') ? 'quoted-printable' : 'base64'
167
+ end
168
+
169
+ # Returns the media type or types that should be used instead of this
170
+ # media type, if it is obsolete. If there is no replacement media type,
171
+ # or it is not obsolete, +nil+ will be returned.
172
+ attr_reader :use_instead
173
+ remove_method :use_instead
174
+ def use_instead
175
+ return nil unless @obsolete
176
+ @use_instead
177
+ end
178
+
179
+ # Returns +true+ if the media type is obsolete.
180
+ def obsolete?
181
+ @obsolete ? true : false
182
+ end
183
+ # Sets the obsolescence indicator for this media type.
184
+ attr_writer :obsolete
185
+
186
+ # The documentation for this MIME::Type. Documentation about media
187
+ # types will be found on a media type definition as a comment.
188
+ # Documentation will be found through #docs.
189
+ attr_accessor :docs
190
+ remove_method :docs= ;
191
+ def docs=(d)
192
+ if d
193
+ a = d.scan(%r{use-instead:#{MEDIA_TYPE_RE}})
194
+
195
+ if a.empty?
196
+ @use_instead = nil
197
+ else
198
+ @use_instead = a.map { |el| "#{el[0]}/#{el[1]}" }
199
+ end
200
+ end
201
+ end
202
+
203
+ # The encoded URL list for this MIME::Type. See #urls for
204
+ attr_accessor :url
205
+ # The decoded URL list for this MIME::Type.
206
+ # The special URL value IANA will be translated into:
207
+ # http://www.iana.org/assignments/media-types/<mediatype>/<subtype>
208
+ #
209
+ # The special URL value RFC### will be translated into:
210
+ # http://www.rfc-editor.org/rfc/rfc###.txt
211
+ #
212
+ # The special URL value DRAFT:name will be translated into:
213
+ # https://datatracker.ietf.org/public/idindex.cgi?
214
+ # command=id_detail&filename=<name>
215
+ #
216
+ # The special URL value LTSW will be translated into:
217
+ # http://www.ltsw.se/knbase/internet/<mediatype>.htp
218
+ #
219
+ # The special URL value [token] will be translated into:
220
+ # http://www.iana.org/assignments/contact-people.htm#<token>
221
+ #
222
+ # These values will be accessible through #url, which always returns an
223
+ # array.
224
+ def urls
225
+ @url.map { |el|
226
+ case el
227
+ when %r{^IANA$}
228
+ IANA_URL % [ @media_type, @sub_type ]
229
+ when %r{^RFC(\d+)$}
230
+ RFC_URL % $1
231
+ when %r{^DRAFT:(.+)$}
232
+ DRAFT_URL % $1
233
+ when %r{^LTSW$}
234
+ LTSW_URL % @media_type
235
+ when %r{^\[([^\]]+)\]}
236
+ CONTACT_URL % $1
237
+ else
238
+ el
239
+ end
240
+ }
241
+ end
242
+
243
+ class << self
244
+ # The MIME types main- and sub-label can both start with <tt>x-</tt>,
245
+ # which indicates that it is a non-registered name. Of course, after
246
+ # registration this flag can disappear, adds to the confusing
247
+ # proliferation of MIME types. The simplified string has the
248
+ # <tt>x-</tt> removed and are translated to lowercase.
249
+ def simplified(content_type)
250
+ matchdata = MEDIA_TYPE_RE.match(content_type)
251
+
252
+ if matchdata.nil?
253
+ simplified = nil
254
+ else
255
+ media_type = matchdata.captures[0].downcase.gsub(UNREG_RE, '')
256
+ subtype = matchdata.captures[1].downcase.gsub(UNREG_RE, '')
257
+ simplified = "#{media_type}/#{subtype}"
258
+ end
259
+ simplified
260
+ end
261
+
262
+ # Creates a MIME::Type from an array in the form of:
263
+ # [type-name, [extensions], encoding, system]
264
+ #
265
+ # +extensions+, +encoding+, and +system+ are optional.
266
+ #
267
+ # MIME::Type.from_array("application/x-ruby", ['rb'], '8bit')
268
+ # MIME::Type.from_array(["application/x-ruby", ['rb'], '8bit'])
269
+ #
270
+ # These are equivalent to:
271
+ #
272
+ # MIME::Type.new('application/x-ruby') do |t|
273
+ # t.extensions = %w(rb)
274
+ # t.encoding = '8bit'
275
+ # end
276
+ def from_array(*args) #:yields MIME::Type.new:
277
+ # Dereferences the array one level, if necessary.
278
+ args = args[0] if args[0].kind_of?(Array)
279
+
280
+ if args.size.between?(1, 8)
281
+ m = MIME::Type.new(args[0]) do |t|
282
+ t.extensions = args[1] if args.size > 1
283
+ t.encoding = args[2] if args.size > 2
284
+ t.system = args[3] if args.size > 3
285
+ t.obsolete = args[4] if args.size > 4
286
+ t.docs = args[5] if args.size > 5
287
+ t.url = args[6] if args.size > 6
288
+ t.registered = args[7] if args.size > 7
289
+ end
290
+ yield m if block_given?
291
+ else
292
+ raise ArgumentError, "Array provided must contain between one and eight elements."
293
+ end
294
+ m
295
+ end
296
+
297
+ # Creates a MIME::Type from a hash. Keys are case-insensitive,
298
+ # dashes may be replaced with underscores, and the internal Symbol
299
+ # of the lowercase-underscore version can be used as well. That is,
300
+ # Content-Type can be provided as content-type, Content_Type,
301
+ # content_type, or :content_type.
302
+ #
303
+ # Known keys are <tt>Content-Type</tt>,
304
+ # <tt>Content-Transfer-Encoding</tt>, <tt>Extensions</tt>, and
305
+ # <tt>System</tt>.
306
+ #
307
+ # MIME::Type.from_hash('Content-Type' => 'text/x-yaml',
308
+ # 'Content-Transfer-Encoding' => '8bit',
309
+ # 'System' => 'linux',
310
+ # 'Extensions' => ['yaml', 'yml'])
311
+ #
312
+ # This is equivalent to:
313
+ #
314
+ # MIME::Type.new('text/x-yaml') do |t|
315
+ # t.encoding = '8bit'
316
+ # t.system = 'linux'
317
+ # t.extensions = ['yaml', 'yml']
318
+ # end
319
+ def from_hash(hash) #:yields MIME::Type.new:
320
+ type = {}
321
+ hash.each_pair do |k, v|
322
+ type[k.to_s.tr('-A-Z', '_a-z').to_sym] = v
323
+ end
324
+
325
+ m = MIME::Type.new(type[:content_type]) do |t|
326
+ t.extensions = type[:extensions]
327
+ t.encoding = type[:content_transfer_encoding]
328
+ t.system = type[:system]
329
+ t.obsolete = type[:obsolete]
330
+ t.docs = type[:docs]
331
+ t.url = type[:url]
332
+ t.registered = type[:registered]
333
+ end
334
+
335
+ yield m if block_given?
336
+ m
337
+ end
338
+
339
+ # Essentially a copy constructor.
340
+ #
341
+ # MIME::Type.from_mime_type(plaintext)
342
+ #
343
+ # is equivalent to:
344
+ #
345
+ # MIME::Type.new(plaintext.content_type.dup) do |t|
346
+ # t.extensions = plaintext.extensions.dup
347
+ # t.system = plaintext.system.dup
348
+ # t.encoding = plaintext.encoding.dup
349
+ # end
350
+ def from_mime_type(mime_type) #:yields the new MIME::Type:
351
+ m = MIME::Type.new(mime_type.content_type.dup) do |t|
352
+ t.extensions = mime_type.extensions.dup
353
+ t.system = mime_type.system.dup
354
+ t.encoding = mime_type.encoding.dup
355
+ end
356
+
357
+ yield m if block_given?
358
+ end
359
+ end
360
+
361
+ # Builds a MIME::Type object from the provided MIME Content Type value
362
+ # (e.g., 'text/plain' or 'applicaton/x-eruby'). The constructed object
363
+ # is yielded to an optional block for additional configuration, such as
364
+ # associating extensions and encoding information.
365
+ def initialize(content_type) #:yields self:
366
+ matchdata = MEDIA_TYPE_RE.match(content_type)
367
+
368
+ if matchdata.nil?
369
+ raise InvalidContentType, "Invalid Content-Type provided ('#{content_type}')"
370
+ end
371
+
372
+ @content_type = content_type
373
+ @raw_media_type = matchdata.captures[0]
374
+ @raw_sub_type = matchdata.captures[1]
375
+
376
+ @simplified = MIME::Type.simplified(@content_type)
377
+ matchdata = MEDIA_TYPE_RE.match(@simplified)
378
+ @media_type = matchdata.captures[0]
379
+ @sub_type = matchdata.captures[1]
380
+
381
+ self.extensions = nil
382
+ self.encoding = :default
383
+ self.system = nil
384
+ self.registered = true
385
+
386
+ yield self if block_given?
387
+ end
388
+
389
+ # MIME content-types which are not regestered by IANA nor defined in
390
+ # RFCs are required to start with <tt>x-</tt>. This counts as well for
391
+ # a new media type as well as a new sub-type of an existing media
392
+ # type. If either the media-type or the content-type begins with
393
+ # <tt>x-</tt>, this method will return +false+.
394
+ def registered?
395
+ if (@raw_media_type =~ UNREG_RE) || (@raw_sub_type =~ UNREG_RE)
396
+ false
397
+ else
398
+ @registered
399
+ end
400
+ end
401
+ attr_writer :registered #:nodoc:
402
+
403
+ # MIME types can be specified to be sent across a network in particular
404
+ # formats. This method returns +true+ when the MIME type encoding is set
405
+ # to <tt>base64</tt>.
406
+ def binary?
407
+ @encoding == 'base64'
408
+ end
409
+
410
+ # MIME types can be specified to be sent across a network in particular
411
+ # formats. This method returns +false+ when the MIME type encoding is
412
+ # set to <tt>base64</tt>.
413
+ def ascii?
414
+ not binary?
415
+ end
416
+
417
+ # Returns +true+ when the simplified MIME type is in the list of known
418
+ # digital signatures.
419
+ def signature?
420
+ SIGNATURES.include?(@simplified.downcase)
421
+ end
422
+
423
+ # Returns +true+ if the MIME::Type is specific to an operating system.
424
+ def system?
425
+ not @system.nil?
426
+ end
427
+
428
+ # Returns +true+ if the MIME::Type is specific to the current operating
429
+ # system as represented by RUBY_PLATFORM.
430
+ def platform?
431
+ system? and (RUBY_PLATFORM =~ @system)
432
+ end
433
+
434
+ # Returns +true+ if the MIME::Type specifies an extension list,
435
+ # indicating that it is a complete MIME::Type.
436
+ def complete?
437
+ not @extensions.empty?
438
+ end
439
+
440
+ # Returns the MIME type as a string.
441
+ def to_s
442
+ @content_type
443
+ end
444
+
445
+ # Returns the MIME type as a string for implicit conversions.
446
+ def to_str
447
+ @content_type
448
+ end
449
+
450
+ # Returns the MIME type as an array suitable for use with
451
+ # MIME::Type.from_array.
452
+ def to_a
453
+ [ @content_type, @extensions, @encoding, @system, @obsolete, @docs,
454
+ @url, registered? ]
455
+ end
456
+
457
+ # Returns the MIME type as an array suitable for use with
458
+ # MIME::Type.from_hash.
459
+ def to_hash
460
+ { 'Content-Type' => @content_type,
461
+ 'Content-Transfer-Encoding' => @encoding,
462
+ 'Extensions' => @extensions,
463
+ 'System' => @system,
464
+ 'Obsolete' => @obsolete,
465
+ 'Docs' => @docs,
466
+ 'URL' => @url,
467
+ 'Registered' => registered?,
468
+ }
469
+ end
470
+ end
471
+
472
+ # = MIME::Types
473
+ # MIME types are used in MIME-compliant communications, as in e-mail or
474
+ # HTTP traffic, to indicate the type of content which is transmitted.
475
+ # MIME::Types provides the ability for detailed information about MIME
476
+ # entities (provided as a set of MIME::Type objects) to be determined and
477
+ # used programmatically. There are many types defined by RFCs and vendors,
478
+ # so the list is long but not complete; don't hesitate to ask to add
479
+ # additional information. This library follows the IANA collection of MIME
480
+ # types (see below for reference).
481
+ #
482
+ # == Description
483
+ # MIME types are used in MIME entities, as in email or HTTP traffic. It is
484
+ # useful at times to have information available about MIME types (or,
485
+ # inversely, about files). A MIME::Type stores the known information about
486
+ # one MIME type.
487
+ #
488
+ # == Usage
489
+ # require 'mime/types'
490
+ #
491
+ # plaintext = MIME::Types['text/plain']
492
+ # print plaintext.media_type # => 'text'
493
+ # print plaintext.sub_type # => 'plain'
494
+ #
495
+ # puts plaintext.extensions.join(" ") # => 'asc txt c cc h hh cpp'
496
+ #
497
+ # puts plaintext.encoding # => 8bit
498
+ # puts plaintext.binary? # => false
499
+ # puts plaintext.ascii? # => true
500
+ # puts plaintext.obsolete? # => false
501
+ # puts plaintext.registered? # => true
502
+ # puts plaintext == 'text/plain' # => true
503
+ # puts MIME::Type.simplified('x-appl/x-zip') # => 'appl/zip'
504
+ #
505
+ # This module is built to conform to the MIME types of RFCs 2045 and 2231.
506
+ # It follows the official IANA registry at
507
+ # http://www.iana.org/assignments/media-types/ and
508
+ # ftp://ftp.iana.org/assignments/media-types with some unofficial types
509
+ # added from the the collection at
510
+ # http://www.ltsw.se/knbase/internet/mime.htp
511
+ #
512
+ # This is originally based on Perl MIME::Types by Mark Overmeer.
513
+ #
514
+ # = Author
515
+ # Copyright:: Copyright (c) 2002 - 2006 by Austin Ziegler
516
+ # <austin@rubyforge.org>
517
+ # Version:: 1.15
518
+ # Based On:: Perl
519
+ # MIME::Types[http://search.cpan.org/author/MARKOV/MIME-Types-1.15/MIME/Types.pm],
520
+ # Copyright (c) 2001 - 2005 by Mark Overmeer
521
+ # <mimetypes@overmeer.net>.
522
+ # Licence:: Ruby's, Perl Artistic, or GPL version 2 (or later)
523
+ # See Also:: http://www.iana.org/assignments/media-types/
524
+ # http://www.ltsw.se/knbase/internet/mime.htp
525
+ #
526
+ class Types
527
+ Cdot = '.'.freeze
528
+
529
+ # The released version of Ruby MIME::Types
530
+ VERSION = '1.15'
531
+
532
+ # The data version.
533
+ attr_reader :data_version
534
+
535
+ def initialize(data_version = nil)
536
+ @type_variants = Hash.new { |h, k| h[k] = [] }
537
+ @extension_index = Hash.new { |h, k| h[k] = [] }
538
+ @simplified_index = {}
539
+ end
540
+
541
+ def add_type_variant(mime_type) #:nodoc:
542
+ @type_variants[mime_type.simplified] << mime_type
543
+ end
544
+
545
+ def index_extensions(mime_type) #:nodoc:
546
+ mime_type.extensions.each { |ext| @extension_index[ext] << mime_type }
547
+ end
548
+
549
+ def simplified_extensions(mime_type) #:nodoc:
550
+ mime_type.extensions.each { |ext| @simplified_index[ext] ||= mime_type }
551
+ end
552
+
553
+ @__types__ = self.new(VERSION)
554
+
555
+ # Returns a list of MIME::Type objects, which may be empty. The optional
556
+ # flag parameters are :complete (finds only complete MIME::Type objects)
557
+ # and :platform (finds only MIME::Types for the current platform). It is
558
+ # possible for multiple matches to be returned for either type (in the
559
+ # example below, 'text/plain' returns two values -- one for the general
560
+ # case, and one for VMS systems.
561
+ #
562
+ # puts "\nMIME::Types['text/plain']"
563
+ # MIME::Types['text/plain'].each { |t| puts t.to_a.join(", ") }
564
+ #
565
+ # puts "\nMIME::Types[/^image/, :complete => true]"
566
+ # MIME::Types[/^image/, :complete => true].each do |t|
567
+ # puts t.to_a.join(", ")
568
+ # end
569
+ def [](type_id, flags = {})
570
+ if type_id.kind_of?(Regexp)
571
+ matches = []
572
+ @type_variants.each_key do |k|
573
+ matches << @type_variants[k] if k =~ type_id
574
+ end
575
+ matches.flatten!
576
+ elsif type_id.kind_of?(MIME::Type)
577
+ matches = [type_id]
578
+ else
579
+ matches = @type_variants[MIME::Type.simplified(type_id)]
580
+ end
581
+
582
+ matches.delete_if { |e| not e.complete? } if flags[:complete]
583
+ matches.delete_if { |e| not e.platform? } if flags[:platform]
584
+ matches
585
+ end
586
+
587
+ # Return the list of MIME::Types which belongs to the file based on its
588
+ # filename extension. If +platform+ is +true+, then only file types that
589
+ # are specific to the current platform will be returned.
590
+ #
591
+ # puts "MIME::Types.type_for('citydesk.xml')
592
+ # => "#{MIME::Types.type_for('citydesk.xml')}"
593
+ # puts "MIME::Types.type_for('citydesk.gif')
594
+ # => "#{MIME::Types.type_for('citydesk.gif')}"
595
+ def type_for(filename, platform = false)
596
+ #ext = filename.chomp.downcase.gsub(/.*\./o, '')
597
+ pos = filename.rindex(Cdot)
598
+ ext = pos ? filename[pos+1..-1] : nil
599
+ list = @extension_index[ext]
600
+ list.delete_if { |e| not e.platform? } if platform
601
+ list
602
+ end
603
+
604
+ def simple_type_for(filename)
605
+ pos = filename.rindex(Cdot)
606
+ pos ? @simplified_index[filename[pos+1..-1]] : nil
607
+ end
608
+
609
+ # A synonym for MIME::Types.type_for
610
+ def of(filename, platform = false)
611
+ type_for(filename, platform)
612
+ end
613
+
614
+ # Add one or more MIME::Type objects to the set of known types. Each
615
+ # type should be experimental (e.g., 'application/x-ruby'). If the type
616
+ # is already known, a warning will be displayed.
617
+ #
618
+ # <b>Please inform the maintainer of this module when registered types
619
+ # are missing.</b>
620
+ def add(*types)
621
+ types.each do |mime_type|
622
+ if @type_variants.include?(mime_type.simplified)
623
+ if @type_variants[mime_type.simplified].include?(mime_type)
624
+ warn "Type #{mime_type} already registered as a variant of #{mime_type.simplified}."
625
+ end
626
+ end
627
+ add_type_variant(mime_type)
628
+ index_extensions(mime_type)
629
+ simplified_extensions(mime_type)
630
+ end
631
+ end
632
+
633
+ class <<self
634
+ def add_type_variant(mime_type) #:nodoc:
635
+ @__types__.add_type_variant(mime_type)
636
+ end
637
+
638
+ def index_extensions(mime_type) #:nodoc:
639
+ @__types__.index_extensions(mime_type)
640
+ end
641
+
642
+ def simplified_extensions(mime_type) #:nodoc:
643
+ @__types__.simplified_extensions(mime_type)
644
+ end
645
+
646
+ # Returns a list of MIME::Type objects, which may be empty. The
647
+ # optional flag parameters are :complete (finds only complete
648
+ # MIME::Type objects) and :platform (finds only MIME::Types for the
649
+ # current platform). It is possible for multiple matches to be
650
+ # returned for either type (in the example below, 'text/plain' returns
651
+ # two values -- one for the general case, and one for VMS systems.
652
+ #
653
+ # puts "\nMIME::Types['text/plain']"
654
+ # MIME::Types['text/plain'].each { |t| puts t.to_a.join(", ") }
655
+ #
656
+ # puts "\nMIME::Types[/^image/, :complete => true]"
657
+ # MIME::Types[/^image/, :complete => true].each do |t|
658
+ # puts t.to_a.join(", ")
659
+ # end
660
+ def [](type_id, flags = {})
661
+ @__types__[type_id, flags]
662
+ end
663
+
664
+ # Return the list of MIME::Types which belongs to the file based on
665
+ # its filename extension. If +platform+ is +true+, then only file
666
+ # types that are specific to the current platform will be returned.
667
+ #
668
+ # puts "MIME::Types.type_for('citydesk.xml')
669
+ # => "#{MIME::Types.type_for('citydesk.xml')}"
670
+ # puts "MIME::Types.type_for('citydesk.gif')
671
+ # => "#{MIME::Types.type_for('citydesk.gif')}"
672
+ def type_for(filename, platform = false)
673
+ @__types__.type_for(filename, platform)
674
+ end
675
+
676
+ def simple_type_for(filename)
677
+ @__types__.simple_type_for(filename)
678
+ end
679
+
680
+ # A synonym for MIME::Types.type_for
681
+ def of(filename, platform = false)
682
+ @__types__.type_for(filename, platform)
683
+ end
684
+
685
+ # Add one or more MIME::Type objects to the set of known types. Each
686
+ # type should be experimental (e.g., 'application/x-ruby'). If the
687
+ # type is already known, a warning will be displayed.
688
+ #
689
+ # <b>Please inform the maintainer of this module when registered types
690
+ # are missing.</b>
691
+ def add(*types)
692
+ @__types__.add(*types)
693
+ end
694
+ end
695
+ end
696
+ end
697
+
698
+ # Build the type list
699
+ data_mime_type = <<MIME_TYPES
700
+ # What follows is the compiled list of known media types, IANA-registered
701
+ # ones first, one per line.
702
+ #
703
+ # [*][!][os:]mt/st[<ws>@ext][<ws>:enc][<ws>'url-list][<ws>=docs]
704
+ #
705
+ # == *
706
+ # An unofficial MIME type. This should be used if an only if the MIME type
707
+ # is not properly specified.
708
+ #
709
+ # == !
710
+ # An obsolete MIME type.
711
+ #
712
+ # == os:
713
+ # Platform-specific MIME type definition.
714
+ #
715
+ # == mt
716
+ # The media type.
717
+ #
718
+ # == st
719
+ # The media subtype.
720
+ #
721
+ # == <ws>@ext
722
+ # The list of comma-separated extensions.
723
+ #
724
+ # == <ws>:enc
725
+ # The encoding.
726
+ #
727
+ # == <ws>'url-list
728
+ # The list of comma-separated URLs.
729
+ #
730
+ # == <ws>=docs
731
+ # The documentation string.
732
+ #
733
+ # That is, everything except the media type and the subtype is optional.
734
+ #
735
+ # -- Austin Ziegler, 2006.02.12
736
+
737
+ # Registered: application/*
738
+ !application/xhtml-voice+xml 'DRAFT:draft-mccobb-xplusv-media-type
739
+ application/CSTAdata+xml 'IANA,[Ecma International Helpdesk]
740
+ application/EDI-Consent 'RFC1767
741
+ application/EDI-X12 'RFC1767
742
+ application/EDIFACT 'RFC1767
743
+ application/activemessage 'IANA,[Shapiro]
744
+ application/andrew-inset 'IANA,[Borenstein]
745
+ application/applefile :base64 'IANA,[Faltstrom]
746
+ application/atom+xml 'RFC4287
747
+ application/atomicmail 'IANA,[Borenstein]
748
+ application/batch-SMTP 'RFC2442
749
+ application/beep+xml 'RFC3080
750
+ application/cals-1840 'RFC1895
751
+ application/ccxml+xml 'DRAFT:draft-froumentin-voice-mediatypes
752
+ application/cnrp+xml 'RFCCNRP
753
+ application/commonground 'IANA,[Glazer]
754
+ application/conference-info+xml 'DRAFT:draft-ietf-sipping-conference-package
755
+ application/cpl+xml 'RFC3880
756
+ application/csta+xml 'IANA,[Ecma International Helpdesk]
757
+ application/cybercash 'IANA,[Eastlake]
758
+ application/dca-rft 'IANA,[Campbell]
759
+ application/dec-dx 'IANA,[Campbell]
760
+ application/dialog-info+xml 'DRAFT:draft-ietf-sipping-dialog-package
761
+ application/dicom 'RFC3240
762
+ application/dns 'RFC4027
763
+ application/dvcs 'RFC3029
764
+ application/ecmascript 'DRAFT:draft-hoehrmann-script-types
765
+ application/epp+xml 'RFC3730
766
+ application/eshop 'IANA,[Katz]
767
+ application/fastinfoset 'IANA,[ITU-T ASN.1 Rapporteur]
768
+ application/fastsoap 'IANA,[ITU-T ASN.1 Rapporteur]
769
+ application/fits 'RFC4047
770
+ application/font-tdpfr @pfr 'RFC3073
771
+ application/http 'RFC2616
772
+ application/hyperstudio @stk 'IANA,[Domino]
773
+ application/iges 'IANA,[Parks]
774
+ application/im-iscomposing+xml 'RFC3994
775
+ application/index 'RFC2652
776
+ application/index.cmd 'RFC2652
777
+ application/index.obj 'RFC2652
778
+ application/index.response 'RFC2652
779
+ application/index.vnd 'RFC2652
780
+ application/iotp 'RFC2935
781
+ application/ipp 'RFC2910
782
+ application/isup 'RFC3204
783
+ application/javascript @js :8bit 'DRAFT:draft-hoehrmann-script-types
784
+ application/kpml-request+xml 'DRAFT:draft-ietf-sipping-kpml
785
+ application/kpml-response+xml 'DRAFT:draft-ietf-sipping-kpml
786
+ application/mac-binhex40 @hqx :8bit 'IANA,[Faltstrom]
787
+ application/macwriteii 'IANA,[Lindner]
788
+ application/marc 'RFC2220
789
+ application/mathematica 'IANA,[Van Nostern]
790
+ application/mbox 'DRAFT:draft-hall-mime-app-mbox
791
+ application/mikey 'RFC3830
792
+ application/mp4 'DRAFT:draft-lim-mpeg4-mime
793
+ application/mpeg4-generic 'RFC3640
794
+ application/mpeg4-iod 'DRAFT:draft-lim-mpeg4-mime
795
+ application/mpeg4-iod-xmt 'DRAFT:draft-lim-mpeg4-mime
796
+ application/msword @doc,dot :base64 'IANA,[Lindner]
797
+ application/news-message-id 'RFC1036,[Spencer]
798
+ application/news-transmission 'RFC1036,[Spencer]
799
+ application/nss 'IANA,[Hammer]
800
+ application/ocsp-request 'RFC2560
801
+ application/ocsp-response 'RFC2560
802
+ application/octet-stream @bin,dms,lha,lzh,exe,class,ani,pgp :base64 'RFC2045,RFC2046
803
+ application/oda @oda 'RFC2045,RFC2046
804
+ application/ogg @ogg 'RFC3534
805
+ application/parityfec 'RFC3009
806
+ application/pdf @pdf :base64 'RFC3778
807
+ application/pgp-encrypted :7bit 'RFC3156
808
+ application/pgp-keys :7bit 'RFC3156
809
+ application/pgp-signature @sig :base64 'RFC3156
810
+ application/pidf+xml 'IANA,RFC3863
811
+ application/pkcs10 @p10 'RFC2311
812
+ application/pkcs7-mime @p7m,p7c 'RFC2311
813
+ application/pkcs7-signature @p7s 'RFC2311
814
+ application/pkix-cert @cer 'RFC2585
815
+ application/pkix-crl @crl 'RFC2585
816
+ application/pkix-pkipath @pkipath 'DRAFT:draft-ietf-tls-rfc3546bis
817
+ application/pkixcmp @pki 'RFC2510
818
+ application/pls+xml 'DRAFT:draft-froumentin-voice-mediatypes
819
+ application/poc-settings+xml 'DRAFT:draft-garcia-sipping-poc-isb-am
820
+ application/postscript @ai,eps,ps :8bit 'RFC2045,RFC2046
821
+ application/prs.alvestrand.titrax-sheet 'IANA,[Alvestrand]
822
+ application/prs.cww @cw,cww 'IANA,[Rungchavalnont]
823
+ application/prs.nprend @rnd,rct 'IANA,[Doggett]
824
+ application/prs.plucker 'IANA,[Janssen]
825
+ application/qsig 'RFC3204
826
+ application/rdf+xml @rdf 'RFC3870
827
+ application/reginfo+xml 'RFC3680
828
+ application/remote-printing 'IANA,RFC1486,[Rose]
829
+ application/resource-lists+xml 'DRAFT:draft-ietf-simple-xcap-list-usage
830
+ application/riscos 'IANA,[Smith]
831
+ application/rlmi+xml 'DRAFT:draft-ietf-simple-event-list
832
+ application/rls-services+xml 'DRAFT:draft-ietf-simple-xcap-list-usage
833
+ application/rtf @rtf 'IANA,[Lindner]
834
+ application/rtx 'DRAFT:draft-ietf-avt-rtp-retransmission
835
+ application/samlassertion+xml 'IANA,[OASIS Security Services Technical Committee (SSTC)]
836
+ application/samlmetadata+xml 'IANA,[OASIS Security Services Technical Committee (SSTC)]
837
+ application/sbml+xml 'RFC3823
838
+ application/sdp 'RFC2327
839
+ application/set-payment 'IANA,[Korver]
840
+ application/set-payment-initiation 'IANA,[Korver]
841
+ application/set-registration 'IANA,[Korver]
842
+ application/set-registration-initiation 'IANA,[Korver]
843
+ application/sgml @sgml 'RFC1874
844
+ application/sgml-open-catalog @soc 'IANA,[Grosso]
845
+ application/shf+xml 'RFC4194
846
+ application/sieve @siv 'RFC3028
847
+ application/simple-filter+xml 'DRAFT:draft-ietf-simple-filter-format
848
+ application/simple-message-summary 'RFC3842
849
+ application/slate 'IANA,[Crowley]
850
+ application/soap+fastinfoset 'IANA,[ITU-T ASN.1 Rapporteur]
851
+ application/soap+xml 'RFC3902
852
+ application/spirits-event+xml 'RFC3910
853
+ application/srgs 'DRAFT:draft-froumentin-voice-mediatypes
854
+ application/srgs+xml 'DRAFT:draft-froumentin-voice-mediatypes
855
+ application/ssml+xml 'DRAFT:draft-froumentin-voice-mediatypes
856
+ application/timestamp-query 'RFC3161
857
+ application/timestamp-reply 'RFC3161
858
+ application/tve-trigger 'IANA,[Welsh]
859
+ application/vemmi 'RFC2122
860
+ application/vnd.3M.Post-it-Notes 'IANA,[O'Brien]
861
+ application/vnd.3gpp.pic-bw-large @plb 'IANA,[Meredith]
862
+ application/vnd.3gpp.pic-bw-small @psb 'IANA,[Meredith]
863
+ application/vnd.3gpp.pic-bw-var @pvb 'IANA,[Meredith]
864
+ application/vnd.3gpp.sms @sms 'IANA,[Meredith]
865
+ application/vnd.FloGraphIt 'IANA,[Floersch]
866
+ application/vnd.Kinar @kne,knp,sdf 'IANA,[Thakkar]
867
+ application/vnd.Mobius.DAF 'IANA,[Kabayama]
868
+ application/vnd.Mobius.DIS 'IANA,[Kabayama]
869
+ application/vnd.Mobius.MBK 'IANA,[Devasia]
870
+ application/vnd.Mobius.MQY 'IANA,[Devasia]
871
+ application/vnd.Mobius.MSL 'IANA,[Kabayama]
872
+ application/vnd.Mobius.PLC 'IANA,[Kabayama]
873
+ application/vnd.Mobius.TXF 'IANA,[Kabayama]
874
+ application/vnd.Quark.QuarkXPress @qxd,qxt,qwd,qwt,qxl,qxb :8bit 'IANA,[Scheidler]
875
+ application/vnd.RenLearn.rlprint 'IANA,[Wick]
876
+ application/vnd.accpac.simply.aso 'IANA,[Leow]
877
+ application/vnd.accpac.simply.imp 'IANA,[Leow]
878
+ application/vnd.acucobol 'IANA,[Lubin]
879
+ application/vnd.acucorp @atc,acutc :7bit 'IANA,[Lubin]
880
+ application/vnd.adobe.xfdf @xfdf 'IANA,[Perelman]
881
+ application/vnd.aether.imp 'IANA,[Moskowitz]
882
+ application/vnd.amiga.ami @ami 'IANA,[Blumberg]
883
+ application/vnd.apple.installer+xml 'IANA,[Bierman]
884
+ application/vnd.audiograph 'IANA,[Slusanschi]
885
+ application/vnd.autopackage 'IANA,[Hearn]
886
+ application/vnd.blueice.multipass @mpm 'IANA,[Holmstrom]
887
+ application/vnd.bmi 'IANA,[Gotoh]
888
+ application/vnd.businessobjects 'IANA,[Imoucha]
889
+ application/vnd.cinderella @cdy 'IANA,[Kortenkamp]
890
+ application/vnd.claymore 'IANA,[Simpson]
891
+ application/vnd.commerce-battelle 'IANA,[Applebaum]
892
+ application/vnd.commonspace 'IANA,[Chandhok]
893
+ application/vnd.contact.cmsg 'IANA,[Patz]
894
+ application/vnd.cosmocaller @cmc 'IANA,[Dellutri]
895
+ application/vnd.criticaltools.wbs+xml @wbs 'IANA,[Spiller]
896
+ application/vnd.ctc-posml 'IANA,[Kohlhepp]
897
+ application/vnd.cups-postscript 'IANA,[Sweet]
898
+ application/vnd.cups-raster 'IANA,[Sweet]
899
+ application/vnd.cups-raw 'IANA,[Sweet]
900
+ application/vnd.curl @curl 'IANA,[Byrnes]
901
+ application/vnd.cybank 'IANA,[Helmee]
902
+ application/vnd.data-vision.rdz @rdz 'IANA,[Fields]
903
+ application/vnd.dna 'IANA,[Searcy]
904
+ application/vnd.dpgraph 'IANA,[Parker]
905
+ application/vnd.dreamfactory @dfac 'IANA,[Appleton]
906
+ application/vnd.dxr 'IANA,[Duffy]
907
+ application/vnd.ecdis-update 'IANA,[Buettgenbach]
908
+ application/vnd.ecowin.chart 'IANA,[Olsson]
909
+ application/vnd.ecowin.filerequest 'IANA,[Olsson]
910
+ application/vnd.ecowin.fileupdate 'IANA,[Olsson]
911
+ application/vnd.ecowin.series 'IANA,[Olsson]
912
+ application/vnd.ecowin.seriesrequest 'IANA,[Olsson]
913
+ application/vnd.ecowin.seriesupdate 'IANA,[Olsson]
914
+ application/vnd.enliven 'IANA,[Santinelli]
915
+ application/vnd.epson.esf 'IANA,[Hoshina]
916
+ application/vnd.epson.msf 'IANA,[Hoshina]
917
+ application/vnd.epson.quickanime 'IANA,[Gu]
918
+ application/vnd.epson.salt 'IANA,[Nagatomo]
919
+ application/vnd.epson.ssf 'IANA,[Hoshina]
920
+ application/vnd.ericsson.quickcall 'IANA,[Tidwell]
921
+ application/vnd.eudora.data 'IANA,[Resnick]
922
+ application/vnd.fdf 'IANA,[Zilles]
923
+ application/vnd.ffsns 'IANA,[Holstage]
924
+ application/vnd.fints 'IANA,[Hammann]
925
+ application/vnd.fluxtime.clip 'IANA,[Winter]
926
+ application/vnd.framemaker 'IANA,[Wexler]
927
+ application/vnd.fsc.weblaunch @fsc :7bit 'IANA,[D.Smith]
928
+ application/vnd.fujitsu.oasys 'IANA,[Togashi]
929
+ application/vnd.fujitsu.oasys2 'IANA,[Togashi]
930
+ application/vnd.fujitsu.oasys3 'IANA,[Okudaira]
931
+ application/vnd.fujitsu.oasysgp 'IANA,[Sugimoto]
932
+ application/vnd.fujitsu.oasysprs 'IANA,[Ogita]
933
+ application/vnd.fujixerox.ddd 'IANA,[Onda]
934
+ application/vnd.fujixerox.docuworks 'IANA,[Taguchi]
935
+ application/vnd.fujixerox.docuworks.binder 'IANA,[Matsumoto]
936
+ application/vnd.fut-misnet 'IANA,[Pruulmann]
937
+ application/vnd.genomatix.tuxedo @txd 'IANA,[Frey]
938
+ application/vnd.grafeq 'IANA,[Tupper]
939
+ application/vnd.groove-account 'IANA,[Joseph]
940
+ application/vnd.groove-help 'IANA,[Joseph]
941
+ application/vnd.groove-identity-message 'IANA,[Joseph]
942
+ application/vnd.groove-injector 'IANA,[Joseph]
943
+ application/vnd.groove-tool-message 'IANA,[Joseph]
944
+ application/vnd.groove-tool-template 'IANA,[Joseph]
945
+ application/vnd.groove-vcard 'IANA,[Joseph]
946
+ application/vnd.hbci @hbci,hbc,kom,upa,pkd,bpd 'IANA,[Hammann]
947
+ application/vnd.hcl-bireports 'IANA,[Serres]
948
+ application/vnd.hhe.lesson-player @les 'IANA,[Jones]
949
+ application/vnd.hp-HPGL @plt,hpgl 'IANA,[Pentecost]
950
+ application/vnd.hp-PCL 'IANA,[Pentecost]
951
+ application/vnd.hp-PCLXL 'IANA,[Pentecost]
952
+ application/vnd.hp-hpid 'IANA,[Gupta]
953
+ application/vnd.hp-hps 'IANA,[Aubrey]
954
+ application/vnd.httphone 'IANA,[Lefevre]
955
+ application/vnd.hzn-3d-crossword 'IANA,[Minnis]
956
+ application/vnd.ibm.MiniPay 'IANA,[Herzberg]
957
+ application/vnd.ibm.afplinedata 'IANA,[Buis]
958
+ application/vnd.ibm.electronic-media @emm 'IANA,[Tantlinger]
959
+ application/vnd.ibm.modcap 'IANA,[Hohensee]
960
+ application/vnd.ibm.rights-management @irm 'IANA,[Tantlinger]
961
+ application/vnd.ibm.secure-container @sc 'IANA,[Tantlinger]
962
+ application/vnd.informix-visionary 'IANA,[Gales]
963
+ application/vnd.intercon.formnet 'IANA,[Gurak]
964
+ application/vnd.intertrust.digibox 'IANA,[Tomasello]
965
+ application/vnd.intertrust.nncp 'IANA,[Tomasello]
966
+ application/vnd.intu.qbo 'IANA,[Scratchley]
967
+ application/vnd.intu.qfx 'IANA,[Scratchley]
968
+ application/vnd.ipunplugged.rcprofile @rcprofile 'IANA,[Ersson]
969
+ application/vnd.irepository.package+xml @irp 'IANA,[Knowles]
970
+ application/vnd.is-xpr 'IANA,[Natarajan]
971
+ application/vnd.japannet-directory-service 'IANA,[Fujii]
972
+ application/vnd.japannet-jpnstore-wakeup 'IANA,[Yoshitake]
973
+ application/vnd.japannet-payment-wakeup 'IANA,[Fujii]
974
+ application/vnd.japannet-registration 'IANA,[Yoshitake]
975
+ application/vnd.japannet-registration-wakeup 'IANA,[Fujii]
976
+ application/vnd.japannet-setstore-wakeup 'IANA,[Yoshitake]
977
+ application/vnd.japannet-verification 'IANA,[Yoshitake]
978
+ application/vnd.japannet-verification-wakeup 'IANA,[Fujii]
979
+ application/vnd.jisp @jisp 'IANA,[Deckers]
980
+ application/vnd.kahootz 'IANA,[Macdonald]
981
+ application/vnd.kde.karbon @karbon 'IANA,[Faure]
982
+ application/vnd.kde.kchart @chrt 'IANA,[Faure]
983
+ application/vnd.kde.kformula @kfo 'IANA,[Faure]
984
+ application/vnd.kde.kivio @flw 'IANA,[Faure]
985
+ application/vnd.kde.kontour @kon 'IANA,[Faure]
986
+ application/vnd.kde.kpresenter @kpr,kpt 'IANA,[Faure]
987
+ application/vnd.kde.kspread @ksp 'IANA,[Faure]
988
+ application/vnd.kde.kword @kwd,kwt 'IANA,[Faure]
989
+ application/vnd.kenameaapp @htke 'IANA,[DiGiorgio-Haag]
990
+ application/vnd.kidspiration @kia 'IANA,[Bennett]
991
+ application/vnd.koan 'IANA,[Cole]
992
+ application/vnd.liberty-request+xml 'IANA,[McDowell]
993
+ application/vnd.llamagraphics.life-balance.desktop @lbd 'IANA,[White]
994
+ application/vnd.llamagraphics.life-balance.exchange+xml @lbe 'IANA,[White]
995
+ application/vnd.lotus-1-2-3 @wks,123 'IANA,[Wattenberger]
996
+ application/vnd.lotus-approach 'IANA,[Wattenberger]
997
+ application/vnd.lotus-freelance 'IANA,[Wattenberger]
998
+ application/vnd.lotus-notes 'IANA,[Laramie]
999
+ application/vnd.lotus-organizer 'IANA,[Wattenberger]
1000
+ application/vnd.lotus-screencam 'IANA,[Wattenberger]
1001
+ application/vnd.lotus-wordpro 'IANA,[Wattenberger]
1002
+ application/vnd.marlin.drm.mdcf 'IANA,[Ellison]
1003
+ application/vnd.mcd @mcd 'IANA,[Gotoh]
1004
+ application/vnd.mediastation.cdkey 'IANA,[Flurry]
1005
+ application/vnd.meridian-slingshot 'IANA,[Wedel]
1006
+ application/vnd.mfmp @mfm 'IANA,[Ikeda]
1007
+ application/vnd.micrografx.flo @flo 'IANA,[Prevo]
1008
+ application/vnd.micrografx.igx @igx 'IANA,[Prevo]
1009
+ application/vnd.mif @mif 'IANA,[Wexler]
1010
+ application/vnd.minisoft-hp3000-save 'IANA,[Bartram]
1011
+ application/vnd.mitsubishi.misty-guard.trustweb 'IANA,[Tanaka]
1012
+ application/vnd.mophun.application @mpn 'IANA,[Wennerstrom]
1013
+ application/vnd.mophun.certificate @mpc 'IANA,[Wennerstrom]
1014
+ application/vnd.motorola.flexsuite 'IANA,[Patton]
1015
+ application/vnd.motorola.flexsuite.adsi 'IANA,[Patton]
1016
+ application/vnd.motorola.flexsuite.fis 'IANA,[Patton]
1017
+ application/vnd.motorola.flexsuite.gotap 'IANA,[Patton]
1018
+ application/vnd.motorola.flexsuite.kmr 'IANA,[Patton]
1019
+ application/vnd.motorola.flexsuite.ttc 'IANA,[Patton]
1020
+ application/vnd.motorola.flexsuite.wem 'IANA,[Patton]
1021
+ application/vnd.mozilla.xul+xml @xul 'IANA,[McDaniel]
1022
+ application/vnd.ms-artgalry @cil 'IANA,[Slawson]
1023
+ application/vnd.ms-asf @asf 'IANA,[Fleischman]
1024
+ application/vnd.ms-cab-compressed @cab 'IANA,[Scarborough]
1025
+ application/vnd.ms-excel @xls,xlt :base64 'IANA,[Gill]
1026
+ application/vnd.ms-fontobject 'IANA,[Scarborough]
1027
+ application/vnd.ms-ims 'IANA,[Ledoux]
1028
+ application/vnd.ms-lrm @lrm 'IANA,[Ledoux]
1029
+ application/vnd.ms-powerpoint @ppt,pps,pot :base64 'IANA,[Gill]
1030
+ application/vnd.ms-project @mpp :base64 'IANA,[Gill]
1031
+ application/vnd.ms-tnef :base64 'IANA,[Gill]
1032
+ application/vnd.ms-works :base64 'IANA,[Gill]
1033
+ application/vnd.ms-wpl @wpl :base64 'IANA,[Plastina]
1034
+ application/vnd.mseq @mseq 'IANA,[Le Bodic]
1035
+ application/vnd.msign 'IANA,[Borcherding]
1036
+ application/vnd.music-niff 'IANA,[Butler]
1037
+ application/vnd.musician 'IANA,[Adams]
1038
+ application/vnd.nervana @ent,entity,req,request,bkm,kcm 'IANA,[Judkins]
1039
+ application/vnd.netfpx 'IANA,[Mutz]
1040
+ application/vnd.noblenet-directory 'IANA,[Solomon]
1041
+ application/vnd.noblenet-sealer 'IANA,[Solomon]
1042
+ application/vnd.noblenet-web 'IANA,[Solomon]
1043
+ application/vnd.nokia.landmark+wbxml 'IANA,[Nokia]
1044
+ application/vnd.nokia.landmark+xml 'IANA,[Nokia]
1045
+ application/vnd.nokia.landmarkcollection+xml 'IANA,[Nokia]
1046
+ application/vnd.nokia.radio-preset @rpst 'IANA,[Nokia]
1047
+ application/vnd.nokia.radio-presets @rpss 'IANA,[Nokia]
1048
+ application/vnd.novadigm.EDM 'IANA,[Swenson]
1049
+ application/vnd.novadigm.EDX 'IANA,[Swenson]
1050
+ application/vnd.novadigm.EXT 'IANA,[Swenson]
1051
+ application/vnd.obn 'IANA,[Hessling]
1052
+ application/vnd.omads-email+xml 'IANA,[OMA Data Synchronization Working Group]
1053
+ application/vnd.omads-file+xml 'IANA,[OMA Data Synchronization Working Group]
1054
+ application/vnd.omads-folder+xml 'IANA,[OMA Data Synchronization Working Group]
1055
+ application/vnd.osa.netdeploy 'IANA,[Klos]
1056
+ application/vnd.osgi.dp 'IANA,[Kriens]
1057
+ application/vnd.palm @prc,pdb,pqa,oprc :base64 'IANA,[Peacock]
1058
+ application/vnd.paos.xml 'IANA,[Kemp]
1059
+ application/vnd.pg.format 'IANA,[Gandert]
1060
+ application/vnd.pg.osasli 'IANA,[Gandert]
1061
+ application/vnd.piaccess.application-licence 'IANA,[Maneos]
1062
+ application/vnd.picsel @efif 'IANA,[Naccarato]
1063
+ application/vnd.powerbuilder6 'IANA,[Guy]
1064
+ application/vnd.powerbuilder6-s 'IANA,[Guy]
1065
+ application/vnd.powerbuilder7 'IANA,[Shilts]
1066
+ application/vnd.powerbuilder7-s 'IANA,[Shilts]
1067
+ application/vnd.powerbuilder75 'IANA,[Shilts]
1068
+ application/vnd.powerbuilder75-s 'IANA,[Shilts]
1069
+ application/vnd.preminet 'IANA,[Tenhunen]
1070
+ application/vnd.previewsystems.box 'IANA,[Smolgovsky]
1071
+ application/vnd.proteus.magazine 'IANA,[Hoch]
1072
+ application/vnd.publishare-delta-tree 'IANA,[Ben-Kiki]
1073
+ application/vnd.pvi.ptid1 @pti,ptid 'IANA,[Lamb]
1074
+ application/vnd.pwg-multiplexed 'RFC3391
1075
+ application/vnd.pwg-xhtml-print+xml 'IANA,[Wright]
1076
+ application/vnd.rapid 'IANA,[Szekely]
1077
+ application/vnd.ruckus.download 'IANA,[Harris]
1078
+ application/vnd.s3sms 'IANA,[Tarkkala]
1079
+ application/vnd.sealed.doc @sdoc,sdo,s1w 'IANA,[Petersen]
1080
+ application/vnd.sealed.eml @seml,sem 'IANA,[Petersen]
1081
+ application/vnd.sealed.mht @smht,smh 'IANA,[Petersen]
1082
+ application/vnd.sealed.net 'IANA,[Lambert]
1083
+ application/vnd.sealed.ppt @sppt,spp,s1p 'IANA,[Petersen]
1084
+ application/vnd.sealed.xls @sxls,sxl,s1e 'IANA,[Petersen]
1085
+ application/vnd.sealedmedia.softseal.html @stml,stm,s1h 'IANA,[Petersen]
1086
+ application/vnd.sealedmedia.softseal.pdf @spdf,spd,s1a 'IANA,[Petersen]
1087
+ application/vnd.seemail @see 'IANA,[Webb]
1088
+ application/vnd.sema 'IANA,[Hansson]
1089
+ application/vnd.shana.informed.formdata 'IANA,[Selzler]
1090
+ application/vnd.shana.informed.formtemplate 'IANA,[Selzler]
1091
+ application/vnd.shana.informed.interchange 'IANA,[Selzler]
1092
+ application/vnd.shana.informed.package 'IANA,[Selzler]
1093
+ application/vnd.smaf @mmf 'IANA,[Takahashi]
1094
+ application/vnd.sss-cod 'IANA,[Dani]
1095
+ application/vnd.sss-dtf 'IANA,[Bruno]
1096
+ application/vnd.sss-ntf 'IANA,[Bruno]
1097
+ application/vnd.street-stream 'IANA,[Levitt]
1098
+ application/vnd.sus-calendar @sus,susp 'IANA,[Niedfeldt]
1099
+ application/vnd.svd 'IANA,[Becker]
1100
+ application/vnd.swiftview-ics 'IANA,[Widener]
1101
+ application/vnd.syncml.+xml 'IANA,[OMA Data Synchronization Working Group]
1102
+ application/vnd.syncml.ds.notification 'IANA,[OMA Data Synchronization Working Group]
1103
+ application/vnd.triscape.mxs 'IANA,[Simonoff]
1104
+ application/vnd.trueapp 'IANA,[Hepler]
1105
+ application/vnd.truedoc 'IANA,[Chase]
1106
+ application/vnd.ufdl 'IANA,[Manning]
1107
+ application/vnd.uiq.theme 'IANA,[Ocock]
1108
+ application/vnd.uplanet.alert 'IANA,[Martin]
1109
+ application/vnd.uplanet.alert-wbxml 'IANA,[Martin]
1110
+ application/vnd.uplanet.bearer-choice 'IANA,[Martin]
1111
+ application/vnd.uplanet.bearer-choice-wbxml 'IANA,[Martin]
1112
+ application/vnd.uplanet.cacheop 'IANA,[Martin]
1113
+ application/vnd.uplanet.cacheop-wbxml 'IANA,[Martin]
1114
+ application/vnd.uplanet.channel 'IANA,[Martin]
1115
+ application/vnd.uplanet.channel-wbxml 'IANA,[Martin]
1116
+ application/vnd.uplanet.list 'IANA,[Martin]
1117
+ application/vnd.uplanet.list-wbxml 'IANA,[Martin]
1118
+ application/vnd.uplanet.listcmd 'IANA,[Martin]
1119
+ application/vnd.uplanet.listcmd-wbxml 'IANA,[Martin]
1120
+ application/vnd.uplanet.signal 'IANA,[Martin]
1121
+ application/vnd.vcx 'IANA,[T.Sugimoto]
1122
+ application/vnd.vectorworks 'IANA,[Pharr]
1123
+ application/vnd.vidsoft.vidconference @vsc :8bit 'IANA,[Hess]
1124
+ application/vnd.visio @vsd,vst,vsw,vss 'IANA,[Sandal]
1125
+ application/vnd.visionary @vis 'IANA,[Aravindakumar]
1126
+ application/vnd.vividence.scriptfile 'IANA,[Risher]
1127
+ application/vnd.vsf 'IANA,[Rowe]
1128
+ application/vnd.wap.sic @sic 'IANA,[WAP-Forum]
1129
+ application/vnd.wap.slc @slc 'IANA,[WAP-Forum]
1130
+ application/vnd.wap.wbxml @wbxml 'IANA,[Stark]
1131
+ application/vnd.wap.wmlc @wmlc 'IANA,[Stark]
1132
+ application/vnd.wap.wmlscriptc @wmlsc 'IANA,[Stark]
1133
+ application/vnd.webturbo @wtb 'IANA,[Rehem]
1134
+ application/vnd.wordperfect @wpd 'IANA,[Scarborough]
1135
+ application/vnd.wqd @wqd 'IANA,[Bostrom]
1136
+ application/vnd.wrq-hp3000-labelled 'IANA,[Bartram]
1137
+ application/vnd.wt.stf 'IANA,[Wohler]
1138
+ application/vnd.wv.csp+wbxml @wv 'IANA,[Salmi]
1139
+ application/vnd.wv.csp+xml :8bit 'IANA,[Ingimundarson]
1140
+ application/vnd.wv.ssp+xml :8bit 'IANA,[Ingimundarson]
1141
+ application/vnd.xara 'IANA,[Matthewman]
1142
+ application/vnd.xfdl 'IANA,[Manning]
1143
+ application/vnd.yamaha.hv-dic @hvd 'IANA,[Yamamoto]
1144
+ application/vnd.yamaha.hv-script @hvs 'IANA,[Yamamoto]
1145
+ application/vnd.yamaha.hv-voice @hvp 'IANA,[Yamamoto]
1146
+ application/vnd.yamaha.smaf-audio @saf 'IANA,[Shinoda]
1147
+ application/vnd.yamaha.smaf-phrase @spf 'IANA,[Shinoda]
1148
+ application/vnd.yellowriver-custom-menu 'IANA,[Yellow]
1149
+ application/vnd.zzazz.deck+xml 'IANA,[Hewett]
1150
+ application/voicexml+xml 'DRAFT:draft-froumentin-voice-mediatypes
1151
+ application/watcherinfo+xml @wif 'RFC3858
1152
+ application/whoispp-query 'RFC2957
1153
+ application/whoispp-response 'RFC2958
1154
+ application/wita 'IANA,[Campbell]
1155
+ application/wordperfect5.1 @wp5,wp 'IANA,[Lindner]
1156
+ application/x400-bp 'RFC1494
1157
+ application/xcap-att+xml 'DRAFT:draft-ietf-simple-xcap
1158
+ application/xcap-caps+xml 'DRAFT:draft-ietf-simple-xcap
1159
+ application/xcap-el+xml 'DRAFT:draft-ietf-simple-xcap
1160
+ application/xcap-error+xml 'DRAFT:draft-ietf-simple-xcap
1161
+ application/xhtml+xml @xhtml :8bit 'RFC3236
1162
+ application/xml @xml :8bit 'RFC3023
1163
+ application/xml-dtd :8bit 'RFC3023
1164
+ application/xml-external-parsed-entity 'RFC3023
1165
+ application/xmpp+xml 'RFC3923
1166
+ application/xop+xml 'IANA,[Nottingham]
1167
+ application/xv+xml 'DRAFT:draft-mccobb-xv-media-type
1168
+ application/zip @zip :base64 'IANA,[Lindner]
1169
+
1170
+ # Registered: audio/*
1171
+ !audio/vnd.qcelp 'IANA,RFC3625 =use-instead:audio/QCELP
1172
+ audio/32kadpcm 'RFC2421,RFC2422
1173
+ audio/3gpp @3gpp 'RFC3839,DRAFT:draft-gellens-bucket
1174
+ audio/3gpp2 'DRAFT:draft-garudadri-avt-3gpp2-mime
1175
+ audio/AMR @amr :base64 'RFC3267
1176
+ audio/AMR-WB @awb :base64 'RFC3267
1177
+ audio/BV16 'RFC4298
1178
+ audio/BV32 'RFC4298
1179
+ audio/CN 'RFC3389
1180
+ audio/DAT12 'RFC3190
1181
+ audio/DVI4 'RFC3555
1182
+ audio/EVRC @evc 'RFC3558
1183
+ audio/EVRC-QCP 'RFC3625
1184
+ audio/EVRC0 'RFC3558
1185
+ audio/G722 'RFC3555
1186
+ audio/G7221 'RFC3047
1187
+ audio/G723 'RFC3555
1188
+ audio/G726-16 'RFC3555
1189
+ audio/G726-24 'RFC3555
1190
+ audio/G726-32 'RFC3555
1191
+ audio/G726-40 'RFC3555
1192
+ audio/G728 'RFC3555
1193
+ audio/G729 'RFC3555
1194
+ audio/G729D 'RFC3555
1195
+ audio/G729E 'RFC3555
1196
+ audio/GSM 'RFC3555
1197
+ audio/GSM-EFR 'RFC3555
1198
+ audio/L16 @l16 'RFC3555
1199
+ audio/L20 'RFC3190
1200
+ audio/L24 'RFC3190
1201
+ audio/L8 'RFC3555
1202
+ audio/LPC 'RFC3555
1203
+ audio/MP4A-LATM 'RFC3016
1204
+ audio/MPA 'RFC3555
1205
+ audio/PCMA 'RFC3555
1206
+ audio/PCMU 'RFC3555
1207
+ audio/QCELP @qcp 'RFC3555'RFC3625
1208
+ audio/RED 'RFC3555
1209
+ audio/SMV @smv 'RFC3558
1210
+ audio/SMV-QCP 'RFC3625
1211
+ audio/SMV0 'RFC3558
1212
+ audio/VDVI 'RFC3555
1213
+ audio/VMR-WB 'DRAFT:draft-ietf-avt-rtp-vmr-wb,DRAFT:draft-ietf-avt-rtp-vmr-wb-extension
1214
+ audio/ac3 'RFC4184
1215
+ audio/amr-wb+ 'DRAFT:draft-ietf-avt-rtp-amrwbplus
1216
+ audio/basic @au,snd :base64 'RFC2045,RFC2046
1217
+ audio/clearmode 'RFC4040
1218
+ audio/dsr-es201108 'RFC3557
1219
+ audio/dsr-es202050 'RFC4060
1220
+ audio/dsr-es202211 'RFC4060
1221
+ audio/dsr-es202212 'RFC4060
1222
+ audio/iLBC 'RFC3952
1223
+ audio/mp4 'DRAFT:draft-lim-mpeg4-mime
1224
+ audio/mpa-robust 'RFC3119
1225
+ audio/mpeg @mpga,mp2,mp3 :base64 'RFC3003
1226
+ audio/mpeg4-generic 'RFC3640
1227
+ audio/parityfec 'RFC3009
1228
+ audio/prs.sid @sid,psid 'IANA,[Walleij]
1229
+ audio/rtx 'DRAFT:draft-ietf-avt-rtp-retransmission
1230
+ audio/t140c 'DRAFT:draft-ietf-avt-audio-t140c
1231
+ audio/telephone-event 'RFC2833
1232
+ audio/tone 'RFC2833
1233
+ audio/vnd.3gpp.iufp 'IANA,[Belling]
1234
+ audio/vnd.audiokoz 'IANA,[DeBarros]
1235
+ audio/vnd.cisco.nse 'IANA,[Kumar]
1236
+ audio/vnd.cmles.radio-events 'IANA,[Goulet]
1237
+ audio/vnd.cns.anp1 'IANA,[McLaughlin]
1238
+ audio/vnd.cns.inf1 'IANA,[McLaughlin]
1239
+ audio/vnd.digital-winds @eol :7bit 'IANA,[Strazds]
1240
+ audio/vnd.dlna.adts 'IANA,[Heredia]
1241
+ audio/vnd.everad.plj @plj 'IANA,[Cicelsky]
1242
+ audio/vnd.lucent.voice @lvp 'IANA,[Vaudreuil]
1243
+ audio/vnd.nokia.mobile-xmf @mxmf 'IANA,[Nokia Corporation]
1244
+ audio/vnd.nortel.vbk @vbk 'IANA,[Parsons]
1245
+ audio/vnd.nuera.ecelp4800 @ecelp4800 'IANA,[Fox]
1246
+ audio/vnd.nuera.ecelp7470 @ecelp7470 'IANA,[Fox]
1247
+ audio/vnd.nuera.ecelp9600 @ecelp9600 'IANA,[Fox]
1248
+ audio/vnd.octel.sbc 'IANA,[Vaudreuil]
1249
+ audio/vnd.rhetorex.32kadpcm 'IANA,[Vaudreuil]
1250
+ audio/vnd.sealedmedia.softseal.mpeg @smp3,smp,s1m 'IANA,[Petersen]
1251
+ audio/vnd.vmx.cvsd 'IANA,[Vaudreuil]
1252
+
1253
+ # Registered: image/*
1254
+ image/cgm 'IANA =Computer Graphics Metafile [Francis]
1255
+ image/fits 'RFC4047
1256
+ image/g3fax 'RFC1494
1257
+ image/gif @gif :base64 'RFC2045,RFC2046
1258
+ image/ief @ief :base64 'RFC1314 =Image Exchange Format
1259
+ image/jp2 @jp2 :base64 'IANA,RFC3745
1260
+ image/jpeg @jpeg,jpg,jpe :base64 'RFC2045,RFC2046
1261
+ image/jpm @jpm :base64 'IANA,RFC3745
1262
+ image/jpx @jpx :base64 'IANA,RFC3745
1263
+ image/naplps 'IANA,[Ferber]
1264
+ image/png @png :base64 'IANA,[Randers-Pehrson]
1265
+ image/prs.btif 'IANA,[Simon]
1266
+ image/prs.pti 'IANA,[Laun]
1267
+ image/t38 'RFC3362
1268
+ image/tiff @tiff,tif :base64 'RFC3302 =Tag Image File Format
1269
+ image/tiff-fx 'RFC3950 =Tag Image File Format Fax eXtended
1270
+ image/vnd.adobe.photoshop 'IANA,[Scarborough]
1271
+ image/vnd.cns.inf2 'IANA,[McLaughlin]
1272
+ image/vnd.djvu @djvu,djv 'IANA,[Bottou]
1273
+ image/vnd.dwg @dwg 'IANA,[Moline]
1274
+ image/vnd.dxf 'IANA,[Moline]
1275
+ image/vnd.fastbidsheet 'IANA,[Becker]
1276
+ image/vnd.fpx 'IANA,[Spencer]
1277
+ image/vnd.fst 'IANA,[Fuldseth]
1278
+ image/vnd.fujixerox.edmics-mmr 'IANA,[Onda]
1279
+ image/vnd.fujixerox.edmics-rlc 'IANA,[Onda]
1280
+ image/vnd.globalgraphics.pgb @pgb 'IANA,[Bailey]
1281
+ image/vnd.microsoft.icon @ico 'IANA,[Butcher]
1282
+ image/vnd.mix 'IANA,[Reddy]
1283
+ image/vnd.ms-modi @mdi 'IANA,[Vaughan]
1284
+ image/vnd.net-fpx 'IANA,[Spencer]
1285
+ image/vnd.sealed.png @spng,spn,s1n 'IANA,[Petersen]
1286
+ image/vnd.sealedmedia.softseal.gif @sgif,sgi,s1g 'IANA,[Petersen]
1287
+ image/vnd.sealedmedia.softseal.jpg @sjpg,sjp,s1j 'IANA,[Petersen]
1288
+ image/vnd.svf 'IANA,[Moline]
1289
+ image/vnd.wap.wbmp @wbmp 'IANA,[Stark]
1290
+ image/vnd.xiff 'IANA,[S.Martin]
1291
+
1292
+ # Registered: message/*
1293
+ message/CPIM 'RFC3862
1294
+ message/delivery-status 'RFC1894
1295
+ message/disposition-notification 'RFC2298
1296
+ message/external-body :8bit 'RFC2046
1297
+ message/http 'RFC2616
1298
+ message/news :8bit 'RFC1036,[H.Spencer]
1299
+ message/partial :8bit 'RFC2046
1300
+ message/rfc822 :8bit 'RFC2046
1301
+ message/s-http 'RFC2660
1302
+ message/sip 'RFC3261
1303
+ message/sipfrag 'RFC3420
1304
+ message/tracking-status 'RFC3886
1305
+
1306
+ # Registered: model/*
1307
+ model/iges @igs,iges 'IANA,[Parks]
1308
+ model/mesh @msh,mesh,silo 'RFC2077
1309
+ model/vnd.dwf 'IANA,[Pratt]
1310
+ model/vnd.flatland.3dml 'IANA,[Powers]
1311
+ model/vnd.gdl 'IANA,[Babits]
1312
+ model/vnd.gs-gdl 'IANA,[Babits]
1313
+ model/vnd.gtw 'IANA,[Ozaki]
1314
+ model/vnd.mts 'IANA,[Rabinovitch]
1315
+ model/vnd.parasolid.transmit.binary @x_b,xmt_bin 'IANA,[Parasolid]
1316
+ model/vnd.parasolid.transmit.text @x_t,xmt_txt :quoted-printable 'IANA,[Parasolid]
1317
+ model/vnd.vtu 'IANA,[Rabinovitch]
1318
+ model/vrml @wrl,vrml 'RFC2077
1319
+
1320
+ # Registered: multipart/*
1321
+ multipart/alternative :8bit 'RFC2045,RFC2046
1322
+ multipart/appledouble :8bit 'IANA,[Faltstrom]
1323
+ multipart/byteranges 'RFC2068
1324
+ multipart/digest :8bit 'RFC2045,RFC2046
1325
+ multipart/encrypted 'RFC1847
1326
+ multipart/form-data 'RFC2388
1327
+ multipart/header-set 'IANA,[Crocker]
1328
+ multipart/mixed :8bit 'RFC2045,RFC2046
1329
+ multipart/parallel :8bit 'RFC2045,RFC2046
1330
+ multipart/related 'RFC2387
1331
+ multipart/report 'RFC1892
1332
+ multipart/signed 'RFC1847
1333
+ multipart/voice-message 'RFC2421,RFC2423
1334
+
1335
+ # Registered: text/*
1336
+ !text/ecmascript 'DRAFT:draft-hoehrmann-script-types
1337
+ !text/javascript 'DRAFT:draft-hoehrmann-script-types
1338
+ text/calendar 'RFC2445
1339
+ text/css @css :8bit 'RFC2318
1340
+ text/csv @csv :8bit 'RFC4180
1341
+ text/directory 'RFC2425
1342
+ text/dns 'RFC4027
1343
+ text/enriched 'RFC1896
1344
+ text/html @html,htm,htmlx,shtml,htx :8bit 'RFC2854
1345
+ text/parityfec 'RFC3009
1346
+ text/plain @txt,asc,c,cc,h,hh,cpp,hpp,dat,hlp 'RFC2046,RFC3676
1347
+ text/prs.fallenstein.rst @rst 'IANA,[Fallenstein]
1348
+ text/prs.lines.tag 'IANA,[Lines]
1349
+ text/RED 'RFC4102
1350
+ text/rfc822-headers 'RFC1892
1351
+ text/richtext @rtx :8bit 'RFC2045,RFC2046
1352
+ text/rtf @rtf :8bit 'IANA,[Lindner]
1353
+ text/rtx 'DRAFT:draft-ietf-avt-rtp-retransmission
1354
+ text/sgml @sgml,sgm 'RFC1874
1355
+ text/t140 'RFC4103
1356
+ text/tab-separated-values @tsv 'IANA,[Lindner]
1357
+ text/troff @t,tr,roff,troff :8bit 'DRAFT:draft-lilly-text-troff
1358
+ text/uri-list 'RFC2483
1359
+ text/vnd.abc 'IANA,[Allen]
1360
+ text/vnd.curl 'IANA,[Byrnes]
1361
+ text/vnd.DMClientScript 'IANA,[Bradley]
1362
+ text/vnd.esmertec.theme-descriptor 'IANA,[Eilemann]
1363
+ text/vnd.fly 'IANA,[Gurney]
1364
+ text/vnd.fmi.flexstor 'IANA,[Hurtta]
1365
+ text/vnd.in3d.3dml 'IANA,[Powers]
1366
+ text/vnd.in3d.spot 'IANA,[Powers]
1367
+ text/vnd.IPTC.NewsML '[IPTC]
1368
+ text/vnd.IPTC.NITF '[IPTC]
1369
+ text/vnd.latex-z 'IANA,[Lubos]
1370
+ text/vnd.motorola.reflex 'IANA,[Patton]
1371
+ text/vnd.ms-mediapackage 'IANA,[Nelson]
1372
+ text/vnd.net2phone.commcenter.command @ccc 'IANA,[Xie]
1373
+ text/vnd.sun.j2me.app-descriptor @jad :8bit 'IANA,[G.Adams]
1374
+ text/vnd.wap.si @si 'IANA,[WAP-Forum]
1375
+ text/vnd.wap.sl @sl 'IANA,[WAP-Forum]
1376
+ text/vnd.wap.wml @wml 'IANA,[Stark]
1377
+ text/vnd.wap.wmlscript @wmls 'IANA,[Stark]
1378
+ text/xml @xml,dtd :8bit 'RFC3023
1379
+ text/xml-external-parsed-entity 'RFC3023
1380
+ vms:text/plain @doc :8bit
1381
+
1382
+ # Registered: video/*
1383
+ video/3gpp @3gp,3gpp 'RFC3839,DRAFT:draft-gellens-mime-bucket
1384
+ video/3gpp-tt 'DRAFT:draft-ietf-avt-rtp-3gpp-timed-text
1385
+ video/3gpp2 'DRAFT:draft-garudadri-avt-3gpp2-mime
1386
+ video/BMPEG 'RFC3555
1387
+ video/BT656 'RFC3555
1388
+ video/CelB 'RFC3555
1389
+ video/DV 'RFC3189
1390
+ video/H261 'RFC3555
1391
+ video/H263 'RFC3555
1392
+ video/H263-1998 'RFC3555
1393
+ video/H263-2000 'RFC3555
1394
+ video/H264 'RFC3984
1395
+ video/JPEG 'RFC3555
1396
+ video/MJ2 @mj2,mjp2 'RFC3745
1397
+ video/MP1S 'RFC3555
1398
+ video/MP2P 'RFC3555
1399
+ video/MP2T 'RFC3555
1400
+ video/mp4 'DRAFT:draft-lim-mpeg4-mime
1401
+ video/MP4V-ES 'RFC3016
1402
+ video/mpeg @mp2,mpe,mp3g,mpg :base64 'RFC2045,RFC2046
1403
+ video/mpeg4-generic 'RFC3640
1404
+ video/MPV 'RFC3555
1405
+ video/nv 'RFC3555
1406
+ video/parityfec 'RFC3009
1407
+ video/pointer 'RFC2862
1408
+ video/quicktime @qt,mov :base64 'IANA,[Lindner]
1409
+ video/raw 'RFC4175
1410
+ video/rtx 'DRAFT:draft-ietf-avt-rtp-retransmission
1411
+ video/SMPTE292M 'RFC3497
1412
+ video/vnd.dlna.mpeg-tts 'IANA,[Heredia]
1413
+ video/vnd.fvt 'IANA,[Fuldseth]
1414
+ video/vnd.motorola.video 'IANA,[McGinty]
1415
+ video/vnd.motorola.videop 'IANA,[McGinty]
1416
+ video/vnd.mpegurl @mxu,m4u :8bit 'IANA,[Recktenwald]
1417
+ video/vnd.nokia.interleaved-multimedia @nim 'IANA,[Kangaslampi]
1418
+ video/vnd.objectvideo @mp4 'IANA,[Clark]
1419
+ video/vnd.sealed.mpeg1 @s11 'IANA,[Petersen]
1420
+ video/vnd.sealed.mpeg4 @smpg,s14 'IANA,[Petersen]
1421
+ video/vnd.sealed.swf @sswf,ssw 'IANA,[Petersen]
1422
+ video/vnd.sealedmedia.softseal.mov @smov,smo,s1q 'IANA,[Petersen]
1423
+ video/vnd.vivo @viv,vivo 'IANA,[Wolfe]
1424
+
1425
+ # Unregistered: application/*
1426
+ !application/x-troff 'LTSW =use-instead:text/troff
1427
+ application/x-bcpio @bcpio 'LTSW
1428
+ application/x-compressed @z,Z :base64 'LTSW
1429
+ application/x-cpio @cpio :base64 'LTSW
1430
+ application/x-csh @csh :8bit 'LTSW
1431
+ application/x-dvi @dvi :base64 'LTSW
1432
+ application/x-gtar @gtar,tgz,tbz2,tbz :base64 'LTSW
1433
+ application/x-gzip @gz :base64 'LTSW
1434
+ application/x-hdf @hdf 'LTSW
1435
+ application/x-java-archive @jar 'LTSW
1436
+ application/x-java-jnlp-file @jnlp 'LTSW
1437
+ application/x-java-serialized-object @ser 'LTSW
1438
+ application/x-java-vm @class 'LTSW
1439
+ application/x-latex @ltx,latex :8bit 'LTSW
1440
+ application/x-mif @mif 'LTSW
1441
+ application/x-rtf 'LTSW =use-instead:application/rtf
1442
+ application/x-sh @sh 'LTSW
1443
+ application/x-shar @shar 'LTSW
1444
+ application/x-stuffit @sit :base64 'LTSW
1445
+ application/x-sv4cpio @sv4cpio :base64 'LTSW
1446
+ application/x-sv4crc @sv4crc :base64 'LTSW
1447
+ application/x-tar @tar :base64 'LTSW
1448
+ application/x-tcl @tcl :8bit 'LTSW
1449
+ application/x-tex @tex :8bit
1450
+ application/x-texinfo @texinfo,texi :8bit
1451
+ application/x-troff-man @man :8bit 'LTSW
1452
+ application/x-troff-me @me 'LTSW
1453
+ application/x-troff-ms @ms 'LTSW
1454
+ application/x-ustar @ustar :base64 'LTSW
1455
+ application/x-wais-source @src 'LTSW
1456
+ mac:application/x-mac @bin :base64
1457
+ *!application/cals1840 'LTSW =use-instead:application/cals-1840
1458
+ *!application/remote_printing 'LTSW =use-instead:application/remote-printing
1459
+ *!application/x-u-star 'LTSW =use-instead:application/x-ustar
1460
+ *!application/x400.bp 'LTSW =use-instead:application/x400-bp
1461
+ *application/acad 'LTSW
1462
+ *application/clariscad 'LTSW
1463
+ *application/drafting 'LTSW
1464
+ *application/dxf 'LTSW
1465
+ *application/excel @xls,xlt 'LTSW
1466
+ *application/fractals 'LTSW
1467
+ *application/i-deas 'LTSW
1468
+ *application/macbinary 'LTSW
1469
+ *application/netcdf @nc,cdf 'LTSW
1470
+ *application/powerpoint @ppt,pps,pot :base64 'LTSW
1471
+ *application/pro_eng 'LTSW
1472
+ *application/set 'LTSW
1473
+ *application/SLA 'LTSW
1474
+ *application/solids 'LTSW
1475
+ *application/STEP 'LTSW
1476
+ *application/vda 'LTSW
1477
+ *application/word @doc,dot 'LTSW
1478
+
1479
+ # Unregistered: audio/*
1480
+ audio/x-aiff @aif,aifc,aiff :base64
1481
+ audio/x-midi @mid,midi,kar :base64
1482
+ audio/x-pn-realaudio @rm,ram :base64
1483
+ audio/x-pn-realaudio-plugin @rpm
1484
+ audio/x-realaudio @ra :base64
1485
+ audio/x-wav @wav :base64
1486
+
1487
+ # Unregistered: image/*
1488
+ *image/vnd.dgn @dgn =use-instead:image/x-vnd.dgn
1489
+ image/x-bmp @bmp
1490
+ image/x-cmu-raster @ras
1491
+ image/x-paintshoppro @psp,pspimage :base64
1492
+ image/x-pict
1493
+ image/x-portable-anymap @pnm :base64
1494
+ image/x-portable-bitmap @pbm :base64
1495
+ image/x-portable-graymap @pgm :base64
1496
+ image/x-portable-pixmap @ppm :base64
1497
+ image/x-rgb @rgb :base64
1498
+ image/x-targa @tga
1499
+ image/x-vnd.dgn @dgn
1500
+ image/x-win-bmp
1501
+ image/x-xbitmap @xbm :7bit
1502
+ image/x-xbm @xbm :7bit
1503
+ image/x-xpixmap @xpm :8bit
1504
+ image/x-xwindowdump @xwd :base64
1505
+ *!image/cmu-raster =use-instead:image/x-cmu-raster
1506
+ *!image/vnd.net.fpx =use-instead:image/vnd.net-fpx
1507
+ *image/bmp @bmp
1508
+ *image/targa @tga
1509
+
1510
+ # Unregistered: multipart/*
1511
+ multipart/x-gzip
1512
+ multipart/x-mixed-replace
1513
+ multipart/x-tar
1514
+ multipart/x-ustar
1515
+ multipart/x-www-form-urlencoded
1516
+ multipart/x-zip
1517
+ *!multipart/parallel =use-instead:multipart/parallel
1518
+
1519
+ # Unregistered: text/*
1520
+ *text/comma-separated-values @csv :8bit
1521
+ *text/vnd.flatland.3dml =use-instead:model/vnd.flatland.3dml
1522
+ text/x-vnd.flatland.3dml =use-instead:model/vnd.flatland.3dml
1523
+ text/x-setext @etx
1524
+ text/x-vcalendar @vcs :8bit
1525
+ text/x-vcard @vcf :8bit
1526
+ text/x-yaml @yaml,yml :8bit
1527
+
1528
+ # Unregistered: video/*
1529
+ *video/dl @dl :base64
1530
+ *video/gl @gl :base64
1531
+ video/x-msvideo @avi :base64
1532
+ video/x-sgi-movie @movie :base64
1533
+
1534
+ # Unregistered: other/*
1535
+ x-chemical/x-pdb @pdb
1536
+ x-chemical/x-xyz @xyz
1537
+ x-conference/x-cooltalk @ice
1538
+ x-drawing/dwf @dwf
1539
+ x-world/x-vrml @wrl,vrml
1540
+ MIME_TYPES
1541
+
1542
+ _re = %r{
1543
+ ^
1544
+ ([*])? # 0: Unregistered?
1545
+ (!)? # 1: Obsolete?
1546
+ (?:(\w+):)? # 2: Platform marker
1547
+ #{MIME::Type::MEDIA_TYPE_RE} # 3,4: Media type
1548
+ (?:\s@([^\s]+))? # 5: Extensions
1549
+ (?:\s:(#{MIME::Type::ENCODING_RE}))? # 6: Encoding
1550
+ (?:\s'(.+))? # 7: URL list
1551
+ (?:\s=(.+))? # 8: Documentation
1552
+ $
1553
+ }x
1554
+
1555
+ data_mime_type.each do |i|
1556
+ item = i.chomp.strip.gsub(%r{#.*}o, '')
1557
+ next if item.empty?
1558
+
1559
+ m = _re.match(item).captures
1560
+
1561
+ unregistered, obsolete, platform, mediatype, subtype, extensions,
1562
+ encoding, urls, docs = *m
1563
+
1564
+ extensions &&= extensions.split(/,/)
1565
+ urls &&= urls.split(/,/)
1566
+
1567
+ mime_type = MIME::Type.new("#{mediatype}/#{subtype}") do |t|
1568
+ t.extensions = extensions
1569
+ t.encoding = encoding
1570
+ t.system = platform
1571
+ t.obsolete = obsolete
1572
+ t.registered = false if unregistered
1573
+ t.docs = docs
1574
+ t.url = urls
1575
+ end
1576
+
1577
+ MIME::Types.add_type_variant(mime_type)
1578
+ MIME::Types.index_extensions(mime_type)
1579
+ MIME::Types.simplified_extensions(mime_type)
1580
+ end
1581
+
1582
+ _re = nil
1583
+ data_mime_type = nil