rack 1.3.10 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rack might be problematic. Click here for more details.

Files changed (83) hide show
  1. data/COPYING +1 -1
  2. data/KNOWN-ISSUES +0 -9
  3. data/README.rdoc +4 -118
  4. data/Rakefile +15 -0
  5. data/SPEC +3 -5
  6. data/lib/rack.rb +0 -12
  7. data/lib/rack/auth/abstract/request.rb +1 -5
  8. data/lib/rack/auth/basic.rb +1 -1
  9. data/lib/rack/auth/digest/nonce.rb +1 -1
  10. data/lib/rack/backports/uri/common_18.rb +28 -14
  11. data/lib/rack/backports/uri/common_192.rb +17 -14
  12. data/lib/rack/body_proxy.rb +0 -10
  13. data/lib/rack/builder.rb +26 -18
  14. data/lib/rack/cascade.rb +1 -12
  15. data/lib/rack/chunked.rb +2 -0
  16. data/lib/rack/content_type.rb +7 -1
  17. data/lib/rack/deflater.rb +1 -5
  18. data/lib/rack/directory.rb +5 -1
  19. data/lib/rack/file.rb +26 -9
  20. data/lib/rack/handler.rb +2 -2
  21. data/lib/rack/head.rb +0 -1
  22. data/lib/rack/lint.rb +3 -5
  23. data/lib/rack/methodoverride.rb +10 -4
  24. data/lib/rack/mime.rb +606 -171
  25. data/lib/rack/mock.rb +2 -1
  26. data/lib/rack/multipart.rb +2 -2
  27. data/lib/rack/multipart/parser.rb +3 -10
  28. data/lib/rack/reloader.rb +1 -1
  29. data/lib/rack/request.rb +45 -13
  30. data/lib/rack/response.rb +15 -14
  31. data/lib/rack/sendfile.rb +8 -6
  32. data/lib/rack/server.rb +4 -30
  33. data/lib/rack/session/abstract/id.rb +25 -6
  34. data/lib/rack/session/cookie.rb +12 -16
  35. data/lib/rack/static.rb +21 -8
  36. data/lib/rack/urlmap.rb +28 -13
  37. data/lib/rack/utils.rb +22 -28
  38. data/rack.gemspec +5 -5
  39. data/test/builder/end.ru +2 -0
  40. data/test/cgi/lighttpd.conf +1 -0
  41. data/test/cgi/sample_rackup.ru +1 -1
  42. data/test/cgi/test+directory/test+file +1 -0
  43. data/test/cgi/test.ru +1 -1
  44. data/test/gemloader.rb +6 -2
  45. data/test/spec_auth_basic.rb +4 -9
  46. data/test/spec_auth_digest.rb +3 -16
  47. data/test/spec_body_proxy.rb +0 -4
  48. data/test/spec_builder.rb +63 -20
  49. data/test/spec_cascade.rb +10 -13
  50. data/test/spec_cgi.rb +1 -1
  51. data/test/spec_chunked.rb +39 -12
  52. data/test/spec_commonlogger.rb +4 -3
  53. data/test/spec_conditionalget.rb +16 -12
  54. data/test/spec_content_length.rb +1 -1
  55. data/test/spec_content_type.rb +6 -0
  56. data/test/spec_deflater.rb +2 -2
  57. data/test/spec_directory.rb +12 -0
  58. data/test/spec_fastcgi.rb +1 -1
  59. data/test/spec_file.rb +58 -8
  60. data/test/spec_head.rb +6 -18
  61. data/test/spec_lint.rb +2 -2
  62. data/test/spec_methodoverride.rb +15 -0
  63. data/test/spec_mock.rb +6 -2
  64. data/test/spec_mongrel.rb +8 -8
  65. data/test/spec_multipart.rb +10 -63
  66. data/test/spec_request.rb +94 -21
  67. data/test/spec_response.rb +22 -24
  68. data/test/spec_sendfile.rb +3 -0
  69. data/test/spec_server.rb +2 -49
  70. data/test/spec_session_cookie.rb +58 -22
  71. data/test/spec_session_memcache.rb +31 -1
  72. data/test/spec_session_pool.rb +10 -4
  73. data/test/spec_static.rb +8 -0
  74. data/test/spec_thin.rb +2 -2
  75. data/test/spec_utils.rb +38 -35
  76. data/test/spec_webrick.rb +5 -3
  77. data/test/static/index.html +1 -0
  78. metadata +13 -18
  79. data/contrib/rack.png +0 -0
  80. data/contrib/rack.svg +0 -150
  81. data/lib/rack/backports/uri/common_193.rb +0 -29
  82. data/test/builder/line.ru +0 -1
  83. data/test/spec_auth.rb +0 -57
@@ -4,7 +4,7 @@ module Rack
4
4
  # status codes).
5
5
 
6
6
  class Cascade
7
- NotFound = [404, {}, []]
7
+ NotFound = [404, {"Content-Type" => "text/plain"}, []]
8
8
 
9
9
  attr_reader :apps
10
10
 
@@ -19,19 +19,8 @@ module Rack
19
19
  def call(env)
20
20
  result = NotFound
21
21
 
22
- last_body = nil
23
-
24
22
  @apps.each do |app|
25
- # The SPEC says that the body must be closed after it has been iterated
26
- # by the server, or if it is replaced by a middleware action. Cascade
27
- # replaces the body each time a cascade happens. It is assumed that nil
28
- # does not respond to close, otherwise the previous application body
29
- # will be closed. The final application body will not be closed, as it
30
- # will be passed to the server as a result.
31
- last_body.close if last_body.respond_to? :close
32
-
33
23
  result = app.call(env)
34
- last_body = result[2]
35
24
  break unless @catch.include?(result[0].to_i)
36
25
  end
37
26
 
@@ -23,6 +23,8 @@ module Rack
23
23
  @body.each do |chunk|
24
24
  size = bytesize(chunk)
25
25
  next if size == 0
26
+
27
+ chunk = chunk.dup.force_encoding(Encoding::BINARY) if chunk.respond_to?(:force_encoding)
26
28
  yield [size.to_s(16), term, chunk, term].join
27
29
  end
28
30
  yield TAIL
@@ -9,6 +9,8 @@ module Rack
9
9
  #
10
10
  # When no content type argument is provided, "text/html" is assumed.
11
11
  class ContentType
12
+ include Rack::Utils
13
+
12
14
  def initialize(app, content_type = "text/html")
13
15
  @app, @content_type = app, content_type
14
16
  end
@@ -16,7 +18,11 @@ module Rack
16
18
  def call(env)
17
19
  status, headers, body = @app.call(env)
18
20
  headers = Utils::HeaderHash.new(headers)
19
- headers['Content-Type'] ||= @content_type
21
+
22
+ unless STATUS_WITH_NO_ENTITY_BODY.include?(status)
23
+ headers['Content-Type'] ||= @content_type
24
+ end
25
+
20
26
  [status, headers, body]
21
27
  end
22
28
  end
@@ -45,7 +45,6 @@ module Rack
45
45
  when "identity"
46
46
  [status, headers, body]
47
47
  when nil
48
- body.close if body.respond_to?(:close)
49
48
  message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found."
50
49
  [406, {"Content-Type" => "text/plain", "Content-Length" => message.length.to_s}, [message]]
51
50
  end
@@ -65,7 +64,6 @@ module Rack
65
64
  gzip.write(part)
66
65
  gzip.flush
67
66
  }
68
- ensure
69
67
  @body.close if @body.respond_to?(:close)
70
68
  gzip.close
71
69
  @writer = nil
@@ -92,11 +90,9 @@ module Rack
92
90
  def each
93
91
  deflater = ::Zlib::Deflate.new(*DEFLATE_ARGS)
94
92
  @body.each { |part| yield deflater.deflate(part, Zlib::SYNC_FLUSH) }
93
+ @body.close if @body.respond_to?(:close)
95
94
  yield deflater.finish
96
95
  nil
97
- ensure
98
- @body.close if @body.respond_to?(:close)
99
- deflater.close
100
96
  end
101
97
  end
102
98
  end
@@ -80,13 +80,17 @@ table { width:100%%; }
80
80
  @files = [['../','Parent Directory','','','']]
81
81
  glob = F.join(@path, '*')
82
82
 
83
+ url_head = ([@script_name] + @path_info.split('/')).map do |part|
84
+ Rack::Utils.escape part
85
+ end
86
+
83
87
  Dir[glob].sort.each do |node|
84
88
  stat = stat(node)
85
89
  next unless stat
86
90
  basename = F.basename(node)
87
91
  ext = F.extname(node)
88
92
 
89
- url = F.join(@script_name, @path_info, basename)
93
+ url = F.join(*url_head + [Rack::Utils.escape(basename)])
90
94
  size = stat.size
91
95
  type = stat.directory? ? 'directory' : Mime.mime_type(ext)
92
96
  size = stat.directory? ? '-' : filesize_format(size)
@@ -13,6 +13,7 @@ module Rack
13
13
 
14
14
  class File
15
15
  SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact)
16
+ ALLOWED_VERBS = %w[GET HEAD]
16
17
 
17
18
  attr_accessor :root
18
19
  attr_accessor :path
@@ -32,10 +33,24 @@ module Rack
32
33
  F = ::File
33
34
 
34
35
  def _call(env)
36
+ unless ALLOWED_VERBS.include? env["REQUEST_METHOD"]
37
+ return fail(403, "Forbidden")
38
+ end
39
+
35
40
  @path_info = Utils.unescape(env["PATH_INFO"])
36
41
  parts = @path_info.split SEPS
37
42
 
38
- return fail(403, "Forbidden") if parts.include? ".."
43
+ parts.inject(0) do |depth, part|
44
+ case part
45
+ when '', '.'
46
+ depth
47
+ when '..'
48
+ return fail(403, "Forbidden") if depth - 1 < 0
49
+ depth - 1
50
+ else
51
+ depth + 1
52
+ end
53
+ end
39
54
 
40
55
  @path = F.join(@root, *parts)
41
56
 
@@ -53,22 +68,24 @@ module Rack
53
68
  end
54
69
 
55
70
  def serving(env)
56
- # NOTE:
57
- # We check via File::size? whether this file provides size info
58
- # via stat (e.g. /proc files often don't), otherwise we have to
59
- # figure it out by reading the whole file into memory.
60
- size = F.size?(@path) || Utils.bytesize(F.read(@path))
61
-
71
+ last_modified = F.mtime(@path).httpdate
72
+ return [304, {}, []] if env['HTTP_IF_MODIFIED_SINCE'] == last_modified
62
73
  response = [
63
74
  200,
64
75
  {
65
- "Last-Modified" => F.mtime(@path).httpdate,
76
+ "Last-Modified" => last_modified,
66
77
  "Content-Type" => Mime.mime_type(F.extname(@path), 'text/plain')
67
78
  },
68
- self
79
+ env["REQUEST_METHOD"] == "HEAD" ? [] : self
69
80
  ]
70
81
  response[1].merge! 'Cache-Control' => @cache_control if @cache_control
71
82
 
83
+ # NOTE:
84
+ # We check via File::size? whether this file provides size info
85
+ # via stat (e.g. /proc files often don't), otherwise we have to
86
+ # figure it out by reading the whole file into memory.
87
+ size = F.size?(@path) || Utils.bytesize(F.read(@path))
88
+
72
89
  ranges = Rack::Utils.byte_ranges(env, size)
73
90
  if ranges.nil? || ranges.length > 1
74
91
  # No ranges, or multiple ranges (which we don't support):
@@ -1,7 +1,7 @@
1
1
  module Rack
2
2
  # *Handlers* connect web servers with Rack.
3
3
  #
4
- # Rack includes Handlers for Mongrel, WEBrick, FastCGI, CGI, SCGI
4
+ # Rack includes Handlers for Thin, WEBrick, FastCGI, CGI, SCGI
5
5
  # and LiteSpeed.
6
6
  #
7
7
  # Handlers usually are activated by calling <tt>MyHandler.run(myapp)</tt>.
@@ -38,7 +38,7 @@ module Rack
38
38
  Rack::Handler::CGI
39
39
  else
40
40
  begin
41
- Rack::Handler::Mongrel
41
+ Rack::Handler::Thin
42
42
  rescue LoadError
43
43
  Rack::Handler::WEBrick
44
44
  end
@@ -9,7 +9,6 @@ class Head
9
9
  status, headers, body = @app.call(env)
10
10
 
11
11
  if env["REQUEST_METHOD"] == "HEAD"
12
- body.close if body.respond_to? :close
13
12
  [status, headers, []]
14
13
  else
15
14
  [status, headers, body]
@@ -464,7 +464,7 @@ module Rack
464
464
  def check_content_type(status, headers)
465
465
  headers.each { |key, value|
466
466
  ## There must be a <tt>Content-Type</tt>, except when the
467
- ## +Status+ is 1xx, 204 or 304, in which case there must be none
467
+ ## +Status+ is 1xx, 204, 205 or 304, in which case there must be none
468
468
  ## given.
469
469
  if key.downcase == "content-type"
470
470
  assert("Content-Type header found in #{status} response, not allowed") {
@@ -483,7 +483,7 @@ module Rack
483
483
  headers.each { |key, value|
484
484
  if key.downcase == 'content-length'
485
485
  ## There must not be a <tt>Content-Length</tt> header when the
486
- ## +Status+ is 1xx, 204 or 304.
486
+ ## +Status+ is 1xx, 204, 205 or 304.
487
487
  assert("Content-Length header found in #{status} response, not allowed") {
488
488
  not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i
489
489
  }
@@ -528,9 +528,7 @@ module Rack
528
528
  ## The Body itself should not be an instance of String, as this will
529
529
  ## break in Ruby 1.9.
530
530
  ##
531
- ## If the Body responds to +close+, it will be called after iteration. If
532
- ## the body is replaced by a middleware after action, the original body
533
- ## must be closed first, if it repsonds to close.
531
+ ## If the Body responds to +close+, it will be called after iteration.
534
532
  # XXX howto: assert("Body has not been closed") { @closed }
535
533
 
536
534
 
@@ -11,10 +11,7 @@ module Rack
11
11
 
12
12
  def call(env)
13
13
  if env["REQUEST_METHOD"] == "POST"
14
- req = Request.new(env)
15
- method = req.POST[METHOD_OVERRIDE_PARAM_KEY] ||
16
- env[HTTP_METHOD_OVERRIDE_HEADER]
17
- method = method.to_s.upcase
14
+ method = method_override(env)
18
15
  if HTTP_METHODS.include?(method)
19
16
  env["rack.methodoverride.original_method"] = env["REQUEST_METHOD"]
20
17
  env["REQUEST_METHOD"] = method
@@ -23,5 +20,14 @@ module Rack
23
20
 
24
21
  @app.call(env)
25
22
  end
23
+
24
+ def method_override(env)
25
+ req = Request.new(env)
26
+ method = req.POST[METHOD_OVERRIDE_PARAM_KEY] ||
27
+ env[HTTP_METHOD_OVERRIDE_HEADER]
28
+ method.to_s.upcase
29
+ rescue EOFError
30
+ ""
31
+ end
26
32
  end
27
33
  end
@@ -37,177 +37,612 @@ module Rack
37
37
  # Rack::Mime::MIME_TYPES.merge!(Mongrel::DirHandler::MIME_TYPES)
38
38
 
39
39
  MIME_TYPES = {
40
- ".3gp" => "video/3gpp",
41
- ".a" => "application/octet-stream",
42
- ".ai" => "application/postscript",
43
- ".aif" => "audio/x-aiff",
44
- ".aiff" => "audio/x-aiff",
45
- ".asc" => "application/pgp-signature",
46
- ".asf" => "video/x-ms-asf",
47
- ".asm" => "text/x-asm",
48
- ".asx" => "video/x-ms-asf",
49
- ".atom" => "application/atom+xml",
50
- ".au" => "audio/basic",
51
- ".avi" => "video/x-msvideo",
52
- ".bat" => "application/x-msdownload",
53
- ".bin" => "application/octet-stream",
54
- ".bmp" => "image/bmp",
55
- ".bz2" => "application/x-bzip2",
56
- ".c" => "text/x-c",
57
- ".cab" => "application/vnd.ms-cab-compressed",
58
- ".cc" => "text/x-c",
59
- ".chm" => "application/vnd.ms-htmlhelp",
60
- ".class" => "application/octet-stream",
61
- ".com" => "application/x-msdownload",
62
- ".conf" => "text/plain",
63
- ".cpp" => "text/x-c",
64
- ".crt" => "application/x-x509-ca-cert",
65
- ".css" => "text/css",
66
- ".csv" => "text/csv",
67
- ".cxx" => "text/x-c",
68
- ".deb" => "application/x-debian-package",
69
- ".der" => "application/x-x509-ca-cert",
70
- ".diff" => "text/x-diff",
71
- ".djv" => "image/vnd.djvu",
72
- ".djvu" => "image/vnd.djvu",
73
- ".dll" => "application/x-msdownload",
74
- ".dmg" => "application/octet-stream",
75
- ".doc" => "application/msword",
76
- ".dot" => "application/msword",
77
- ".dtd" => "application/xml-dtd",
78
- ".dvi" => "application/x-dvi",
79
- ".ear" => "application/java-archive",
80
- ".eml" => "message/rfc822",
81
- ".eps" => "application/postscript",
82
- ".exe" => "application/x-msdownload",
83
- ".f" => "text/x-fortran",
84
- ".f77" => "text/x-fortran",
85
- ".f90" => "text/x-fortran",
86
- ".flv" => "video/x-flv",
87
- ".for" => "text/x-fortran",
88
- ".gem" => "application/octet-stream",
89
- ".gemspec" => "text/x-script.ruby",
90
- ".gif" => "image/gif",
91
- ".gz" => "application/x-gzip",
92
- ".h" => "text/x-c",
93
- ".htc" => "text/x-component",
94
- ".hh" => "text/x-c",
95
- ".htm" => "text/html",
96
- ".html" => "text/html",
97
- ".ico" => "image/vnd.microsoft.icon",
98
- ".ics" => "text/calendar",
99
- ".ifb" => "text/calendar",
100
- ".iso" => "application/octet-stream",
101
- ".jar" => "application/java-archive",
102
- ".java" => "text/x-java-source",
103
- ".jnlp" => "application/x-java-jnlp-file",
104
- ".jpeg" => "image/jpeg",
105
- ".jpg" => "image/jpeg",
106
- ".js" => "application/javascript",
107
- ".json" => "application/json",
108
- ".log" => "text/plain",
109
- ".m3u" => "audio/x-mpegurl",
110
- ".m4v" => "video/mp4",
111
- ".man" => "text/troff",
112
- ".manifest"=> "text/cache-manifest",
113
- ".mathml" => "application/mathml+xml",
114
- ".mbox" => "application/mbox",
115
- ".mdoc" => "text/troff",
116
- ".me" => "text/troff",
117
- ".mid" => "audio/midi",
118
- ".midi" => "audio/midi",
119
- ".mime" => "message/rfc822",
120
- ".mml" => "application/mathml+xml",
121
- ".mng" => "video/x-mng",
122
- ".mov" => "video/quicktime",
123
- ".mp3" => "audio/mpeg",
124
- ".mp4" => "video/mp4",
125
- ".mp4v" => "video/mp4",
126
- ".mpeg" => "video/mpeg",
127
- ".mpg" => "video/mpeg",
128
- ".ms" => "text/troff",
129
- ".msi" => "application/x-msdownload",
130
- ".odp" => "application/vnd.oasis.opendocument.presentation",
131
- ".ods" => "application/vnd.oasis.opendocument.spreadsheet",
132
- ".odt" => "application/vnd.oasis.opendocument.text",
133
- ".ogg" => "application/ogg",
134
- ".ogv" => "video/ogg",
135
- ".p" => "text/x-pascal",
136
- ".pas" => "text/x-pascal",
137
- ".pbm" => "image/x-portable-bitmap",
138
- ".pdf" => "application/pdf",
139
- ".pem" => "application/x-x509-ca-cert",
140
- ".pgm" => "image/x-portable-graymap",
141
- ".pgp" => "application/pgp-encrypted",
142
- ".pkg" => "application/octet-stream",
143
- ".pl" => "text/x-script.perl",
144
- ".pm" => "text/x-script.perl-module",
145
- ".png" => "image/png",
146
- ".pnm" => "image/x-portable-anymap",
147
- ".ppm" => "image/x-portable-pixmap",
148
- ".pps" => "application/vnd.ms-powerpoint",
149
- ".ppt" => "application/vnd.ms-powerpoint",
150
- ".ps" => "application/postscript",
151
- ".psd" => "image/vnd.adobe.photoshop",
152
- ".py" => "text/x-script.python",
153
- ".qt" => "video/quicktime",
154
- ".ra" => "audio/x-pn-realaudio",
155
- ".rake" => "text/x-script.ruby",
156
- ".ram" => "audio/x-pn-realaudio",
157
- ".rar" => "application/x-rar-compressed",
158
- ".rb" => "text/x-script.ruby",
159
- ".rdf" => "application/rdf+xml",
160
- ".roff" => "text/troff",
161
- ".rpm" => "application/x-redhat-package-manager",
162
- ".rss" => "application/rss+xml",
163
- ".rtf" => "application/rtf",
164
- ".ru" => "text/x-script.ruby",
165
- ".s" => "text/x-asm",
166
- ".sgm" => "text/sgml",
167
- ".sgml" => "text/sgml",
168
- ".sh" => "application/x-sh",
169
- ".sig" => "application/pgp-signature",
170
- ".snd" => "audio/basic",
171
- ".so" => "application/octet-stream",
172
- ".svg" => "image/svg+xml",
173
- ".svgz" => "image/svg+xml",
174
- ".swf" => "application/x-shockwave-flash",
175
- ".t" => "text/troff",
176
- ".tar" => "application/x-tar",
177
- ".tbz" => "application/x-bzip-compressed-tar",
178
- ".tcl" => "application/x-tcl",
179
- ".tex" => "application/x-tex",
180
- ".texi" => "application/x-texinfo",
181
- ".texinfo" => "application/x-texinfo",
182
- ".text" => "text/plain",
183
- ".tif" => "image/tiff",
184
- ".tiff" => "image/tiff",
185
- ".torrent" => "application/x-bittorrent",
186
- ".tr" => "text/troff",
187
- ".ttf" => "application/octet-stream",
188
- ".txt" => "text/plain",
189
- ".vcf" => "text/x-vcard",
190
- ".vcs" => "text/x-vcalendar",
191
- ".vrml" => "model/vrml",
192
- ".war" => "application/java-archive",
193
- ".wav" => "audio/x-wav",
194
- ".webm" => "video/webm",
195
- ".wma" => "audio/x-ms-wma",
196
- ".wmv" => "video/x-ms-wmv",
197
- ".wmx" => "video/x-ms-wmx",
198
- ".woff" => "application/octet-stream",
199
- ".wrl" => "model/vrml",
200
- ".wsdl" => "application/wsdl+xml",
201
- ".xbm" => "image/x-xbitmap",
202
- ".xhtml" => "application/xhtml+xml",
203
- ".xls" => "application/vnd.ms-excel",
204
- ".xml" => "application/xml",
205
- ".xpm" => "image/x-xpixmap",
206
- ".xsl" => "application/xml",
207
- ".xslt" => "application/xslt+xml",
208
- ".yaml" => "text/yaml",
209
- ".yml" => "text/yaml",
210
- ".zip" => "application/zip",
40
+ ".123" => "application/vnd.lotus-1-2-3",
41
+ ".3dml" => "text/vnd.in3d.3dml",
42
+ ".3g2" => "video/3gpp2",
43
+ ".3gp" => "video/3gpp",
44
+ ".a" => "application/octet-stream",
45
+ ".acc" => "application/vnd.americandynamics.acc",
46
+ ".ace" => "application/x-ace-compressed",
47
+ ".acu" => "application/vnd.acucobol",
48
+ ".aep" => "application/vnd.audiograph",
49
+ ".afp" => "application/vnd.ibm.modcap",
50
+ ".ai" => "application/postscript",
51
+ ".aif" => "audio/x-aiff",
52
+ ".aiff" => "audio/x-aiff",
53
+ ".ami" => "application/vnd.amiga.ami",
54
+ ".appcache" => "text/cache-manifest",
55
+ ".apr" => "application/vnd.lotus-approach",
56
+ ".asc" => "application/pgp-signature",
57
+ ".asf" => "video/x-ms-asf",
58
+ ".asm" => "text/x-asm",
59
+ ".aso" => "application/vnd.accpac.simply.aso",
60
+ ".asx" => "video/x-ms-asf",
61
+ ".atc" => "application/vnd.acucorp",
62
+ ".atom" => "application/atom+xml",
63
+ ".atomcat" => "application/atomcat+xml",
64
+ ".atomsvc" => "application/atomsvc+xml",
65
+ ".atx" => "application/vnd.antix.game-component",
66
+ ".au" => "audio/basic",
67
+ ".avi" => "video/x-msvideo",
68
+ ".bat" => "application/x-msdownload",
69
+ ".bcpio" => "application/x-bcpio",
70
+ ".bdm" => "application/vnd.syncml.dm+wbxml",
71
+ ".bh2" => "application/vnd.fujitsu.oasysprs",
72
+ ".bin" => "application/octet-stream",
73
+ ".bmi" => "application/vnd.bmi",
74
+ ".bmp" => "image/bmp",
75
+ ".box" => "application/vnd.previewsystems.box",
76
+ ".btif" => "image/prs.btif",
77
+ ".bz" => "application/x-bzip",
78
+ ".bz2" => "application/x-bzip2",
79
+ ".c" => "text/x-c",
80
+ ".c4g" => "application/vnd.clonk.c4group",
81
+ ".cab" => "application/vnd.ms-cab-compressed",
82
+ ".cc" => "text/x-c",
83
+ ".ccxml" => "application/ccxml+xml",
84
+ ".cdbcmsg" => "application/vnd.contact.cmsg",
85
+ ".cdkey" => "application/vnd.mediastation.cdkey",
86
+ ".cdx" => "chemical/x-cdx",
87
+ ".cdxml" => "application/vnd.chemdraw+xml",
88
+ ".cdy" => "application/vnd.cinderella",
89
+ ".cer" => "application/pkix-cert",
90
+ ".cgm" => "image/cgm",
91
+ ".chat" => "application/x-chat",
92
+ ".chm" => "application/vnd.ms-htmlhelp",
93
+ ".chrt" => "application/vnd.kde.kchart",
94
+ ".cif" => "chemical/x-cif",
95
+ ".cii" => "application/vnd.anser-web-certificate-issue-initiation",
96
+ ".cil" => "application/vnd.ms-artgalry",
97
+ ".cla" => "application/vnd.claymore",
98
+ ".class" => "application/octet-stream",
99
+ ".clkk" => "application/vnd.crick.clicker.keyboard",
100
+ ".clkp" => "application/vnd.crick.clicker.palette",
101
+ ".clkt" => "application/vnd.crick.clicker.template",
102
+ ".clkw" => "application/vnd.crick.clicker.wordbank",
103
+ ".clkx" => "application/vnd.crick.clicker",
104
+ ".clp" => "application/x-msclip",
105
+ ".cmc" => "application/vnd.cosmocaller",
106
+ ".cmdf" => "chemical/x-cmdf",
107
+ ".cml" => "chemical/x-cml",
108
+ ".cmp" => "application/vnd.yellowriver-custom-menu",
109
+ ".cmx" => "image/x-cmx",
110
+ ".com" => "application/x-msdownload",
111
+ ".conf" => "text/plain",
112
+ ".cpio" => "application/x-cpio",
113
+ ".cpp" => "text/x-c",
114
+ ".cpt" => "application/mac-compactpro",
115
+ ".crd" => "application/x-mscardfile",
116
+ ".crl" => "application/pkix-crl",
117
+ ".crt" => "application/x-x509-ca-cert",
118
+ ".csh" => "application/x-csh",
119
+ ".csml" => "chemical/x-csml",
120
+ ".csp" => "application/vnd.commonspace",
121
+ ".css" => "text/css",
122
+ ".csv" => "text/csv",
123
+ ".curl" => "application/vnd.curl",
124
+ ".cww" => "application/prs.cww",
125
+ ".cxx" => "text/x-c",
126
+ ".daf" => "application/vnd.mobius.daf",
127
+ ".davmount" => "application/davmount+xml",
128
+ ".dcr" => "application/x-director",
129
+ ".dd2" => "application/vnd.oma.dd2+xml",
130
+ ".ddd" => "application/vnd.fujixerox.ddd",
131
+ ".deb" => "application/x-debian-package",
132
+ ".der" => "application/x-x509-ca-cert",
133
+ ".dfac" => "application/vnd.dreamfactory",
134
+ ".diff" => "text/x-diff",
135
+ ".dis" => "application/vnd.mobius.dis",
136
+ ".djv" => "image/vnd.djvu",
137
+ ".djvu" => "image/vnd.djvu",
138
+ ".dll" => "application/x-msdownload",
139
+ ".dmg" => "application/octet-stream",
140
+ ".dna" => "application/vnd.dna",
141
+ ".doc" => "application/msword",
142
+ ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
143
+ ".dot" => "application/msword",
144
+ ".dp" => "application/vnd.osgi.dp",
145
+ ".dpg" => "application/vnd.dpgraph",
146
+ ".dsc" => "text/prs.lines.tag",
147
+ ".dtd" => "application/xml-dtd",
148
+ ".dts" => "audio/vnd.dts",
149
+ ".dtshd" => "audio/vnd.dts.hd",
150
+ ".dv" => "video/x-dv",
151
+ ".dvi" => "application/x-dvi",
152
+ ".dwf" => "model/vnd.dwf",
153
+ ".dwg" => "image/vnd.dwg",
154
+ ".dxf" => "image/vnd.dxf",
155
+ ".dxp" => "application/vnd.spotfire.dxp",
156
+ ".ear" => "application/java-archive",
157
+ ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
158
+ ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
159
+ ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
160
+ ".ecma" => "application/ecmascript",
161
+ ".edm" => "application/vnd.novadigm.edm",
162
+ ".edx" => "application/vnd.novadigm.edx",
163
+ ".efif" => "application/vnd.picsel",
164
+ ".ei6" => "application/vnd.pg.osasli",
165
+ ".eml" => "message/rfc822",
166
+ ".eol" => "audio/vnd.digital-winds",
167
+ ".eot" => "application/vnd.ms-fontobject",
168
+ ".eps" => "application/postscript",
169
+ ".es3" => "application/vnd.eszigno3+xml",
170
+ ".esf" => "application/vnd.epson.esf",
171
+ ".etx" => "text/x-setext",
172
+ ".exe" => "application/x-msdownload",
173
+ ".ext" => "application/vnd.novadigm.ext",
174
+ ".ez" => "application/andrew-inset",
175
+ ".ez2" => "application/vnd.ezpix-album",
176
+ ".ez3" => "application/vnd.ezpix-package",
177
+ ".f" => "text/x-fortran",
178
+ ".f77" => "text/x-fortran",
179
+ ".f90" => "text/x-fortran",
180
+ ".fbs" => "image/vnd.fastbidsheet",
181
+ ".fdf" => "application/vnd.fdf",
182
+ ".fe_launch" => "application/vnd.denovo.fcselayout-link",
183
+ ".fg5" => "application/vnd.fujitsu.oasysgp",
184
+ ".fli" => "video/x-fli",
185
+ ".flo" => "application/vnd.micrografx.flo",
186
+ ".flv" => "video/x-flv",
187
+ ".flw" => "application/vnd.kde.kivio",
188
+ ".flx" => "text/vnd.fmi.flexstor",
189
+ ".fly" => "text/vnd.fly",
190
+ ".fm" => "application/vnd.framemaker",
191
+ ".fnc" => "application/vnd.frogans.fnc",
192
+ ".for" => "text/x-fortran",
193
+ ".fpx" => "image/vnd.fpx",
194
+ ".fsc" => "application/vnd.fsc.weblaunch",
195
+ ".fst" => "image/vnd.fst",
196
+ ".ftc" => "application/vnd.fluxtime.clip",
197
+ ".fti" => "application/vnd.anser-web-funds-transfer-initiation",
198
+ ".fvt" => "video/vnd.fvt",
199
+ ".fzs" => "application/vnd.fuzzysheet",
200
+ ".g3" => "image/g3fax",
201
+ ".gac" => "application/vnd.groove-account",
202
+ ".gdl" => "model/vnd.gdl",
203
+ ".gem" => "application/octet-stream",
204
+ ".gemspec" => "text/x-script.ruby",
205
+ ".ghf" => "application/vnd.groove-help",
206
+ ".gif" => "image/gif",
207
+ ".gim" => "application/vnd.groove-identity-message",
208
+ ".gmx" => "application/vnd.gmx",
209
+ ".gph" => "application/vnd.flographit",
210
+ ".gqf" => "application/vnd.grafeq",
211
+ ".gram" => "application/srgs",
212
+ ".grv" => "application/vnd.groove-injector",
213
+ ".grxml" => "application/srgs+xml",
214
+ ".gtar" => "application/x-gtar",
215
+ ".gtm" => "application/vnd.groove-tool-message",
216
+ ".gtw" => "model/vnd.gtw",
217
+ ".gv" => "text/vnd.graphviz",
218
+ ".gz" => "application/x-gzip",
219
+ ".h" => "text/x-c",
220
+ ".h261" => "video/h261",
221
+ ".h263" => "video/h263",
222
+ ".h264" => "video/h264",
223
+ ".hbci" => "application/vnd.hbci",
224
+ ".hdf" => "application/x-hdf",
225
+ ".hh" => "text/x-c",
226
+ ".hlp" => "application/winhlp",
227
+ ".hpgl" => "application/vnd.hp-hpgl",
228
+ ".hpid" => "application/vnd.hp-hpid",
229
+ ".hps" => "application/vnd.hp-hps",
230
+ ".hqx" => "application/mac-binhex40",
231
+ ".htc" => "text/x-component",
232
+ ".htke" => "application/vnd.kenameaapp",
233
+ ".htm" => "text/html",
234
+ ".html" => "text/html",
235
+ ".hvd" => "application/vnd.yamaha.hv-dic",
236
+ ".hvp" => "application/vnd.yamaha.hv-voice",
237
+ ".hvs" => "application/vnd.yamaha.hv-script",
238
+ ".icc" => "application/vnd.iccprofile",
239
+ ".ice" => "x-conference/x-cooltalk",
240
+ ".ico" => "image/vnd.microsoft.icon",
241
+ ".ics" => "text/calendar",
242
+ ".ief" => "image/ief",
243
+ ".ifb" => "text/calendar",
244
+ ".ifm" => "application/vnd.shana.informed.formdata",
245
+ ".igl" => "application/vnd.igloader",
246
+ ".igs" => "model/iges",
247
+ ".igx" => "application/vnd.micrografx.igx",
248
+ ".iif" => "application/vnd.shana.informed.interchange",
249
+ ".imp" => "application/vnd.accpac.simply.imp",
250
+ ".ims" => "application/vnd.ms-ims",
251
+ ".ipk" => "application/vnd.shana.informed.package",
252
+ ".irm" => "application/vnd.ibm.rights-management",
253
+ ".irp" => "application/vnd.irepository.package+xml",
254
+ ".iso" => "application/octet-stream",
255
+ ".itp" => "application/vnd.shana.informed.formtemplate",
256
+ ".ivp" => "application/vnd.immervision-ivp",
257
+ ".ivu" => "application/vnd.immervision-ivu",
258
+ ".jad" => "text/vnd.sun.j2me.app-descriptor",
259
+ ".jam" => "application/vnd.jam",
260
+ ".jar" => "application/java-archive",
261
+ ".java" => "text/x-java-source",
262
+ ".jisp" => "application/vnd.jisp",
263
+ ".jlt" => "application/vnd.hp-jlyt",
264
+ ".jnlp" => "application/x-java-jnlp-file",
265
+ ".joda" => "application/vnd.joost.joda-archive",
266
+ ".jp2" => "image/jp2",
267
+ ".jpeg" => "image/jpeg",
268
+ ".jpg" => "image/jpeg",
269
+ ".jpgv" => "video/jpeg",
270
+ ".jpm" => "video/jpm",
271
+ ".js" => "application/javascript",
272
+ ".json" => "application/json",
273
+ ".karbon" => "application/vnd.kde.karbon",
274
+ ".kfo" => "application/vnd.kde.kformula",
275
+ ".kia" => "application/vnd.kidspiration",
276
+ ".kml" => "application/vnd.google-earth.kml+xml",
277
+ ".kmz" => "application/vnd.google-earth.kmz",
278
+ ".kne" => "application/vnd.kinar",
279
+ ".kon" => "application/vnd.kde.kontour",
280
+ ".kpr" => "application/vnd.kde.kpresenter",
281
+ ".ksp" => "application/vnd.kde.kspread",
282
+ ".ktz" => "application/vnd.kahootz",
283
+ ".kwd" => "application/vnd.kde.kword",
284
+ ".latex" => "application/x-latex",
285
+ ".lbd" => "application/vnd.llamagraphics.life-balance.desktop",
286
+ ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml",
287
+ ".les" => "application/vnd.hhe.lesson-player",
288
+ ".link66" => "application/vnd.route66.link66+xml",
289
+ ".log" => "text/plain",
290
+ ".lostxml" => "application/lost+xml",
291
+ ".lrm" => "application/vnd.ms-lrm",
292
+ ".ltf" => "application/vnd.frogans.ltf",
293
+ ".lvp" => "audio/vnd.lucent.voice",
294
+ ".lwp" => "application/vnd.lotus-wordpro",
295
+ ".m3u" => "audio/x-mpegurl",
296
+ ".m4a" => "audio/mp4a-latm",
297
+ ".m4v" => "video/mp4",
298
+ ".ma" => "application/mathematica",
299
+ ".mag" => "application/vnd.ecowin.chart",
300
+ ".man" => "text/troff",
301
+ ".manifest" => "text/cache-manifest",
302
+ ".mathml" => "application/mathml+xml",
303
+ ".mbk" => "application/vnd.mobius.mbk",
304
+ ".mbox" => "application/mbox",
305
+ ".mc1" => "application/vnd.medcalcdata",
306
+ ".mcd" => "application/vnd.mcd",
307
+ ".mdb" => "application/x-msaccess",
308
+ ".mdi" => "image/vnd.ms-modi",
309
+ ".mdoc" => "text/troff",
310
+ ".me" => "text/troff",
311
+ ".mfm" => "application/vnd.mfmp",
312
+ ".mgz" => "application/vnd.proteus.magazine",
313
+ ".mid" => "audio/midi",
314
+ ".midi" => "audio/midi",
315
+ ".mif" => "application/vnd.mif",
316
+ ".mime" => "message/rfc822",
317
+ ".mj2" => "video/mj2",
318
+ ".mlp" => "application/vnd.dolby.mlp",
319
+ ".mmd" => "application/vnd.chipnuts.karaoke-mmd",
320
+ ".mmf" => "application/vnd.smaf",
321
+ ".mml" => "application/mathml+xml",
322
+ ".mmr" => "image/vnd.fujixerox.edmics-mmr",
323
+ ".mng" => "video/x-mng",
324
+ ".mny" => "application/x-msmoney",
325
+ ".mov" => "video/quicktime",
326
+ ".movie" => "video/x-sgi-movie",
327
+ ".mp3" => "audio/mpeg",
328
+ ".mp4" => "video/mp4",
329
+ ".mp4a" => "audio/mp4",
330
+ ".mp4s" => "application/mp4",
331
+ ".mp4v" => "video/mp4",
332
+ ".mpc" => "application/vnd.mophun.certificate",
333
+ ".mpeg" => "video/mpeg",
334
+ ".mpg" => "video/mpeg",
335
+ ".mpga" => "audio/mpeg",
336
+ ".mpkg" => "application/vnd.apple.installer+xml",
337
+ ".mpm" => "application/vnd.blueice.multipass",
338
+ ".mpn" => "application/vnd.mophun.application",
339
+ ".mpp" => "application/vnd.ms-project",
340
+ ".mpy" => "application/vnd.ibm.minipay",
341
+ ".mqy" => "application/vnd.mobius.mqy",
342
+ ".mrc" => "application/marc",
343
+ ".ms" => "text/troff",
344
+ ".mscml" => "application/mediaservercontrol+xml",
345
+ ".mseq" => "application/vnd.mseq",
346
+ ".msf" => "application/vnd.epson.msf",
347
+ ".msh" => "model/mesh",
348
+ ".msi" => "application/x-msdownload",
349
+ ".msl" => "application/vnd.mobius.msl",
350
+ ".msty" => "application/vnd.muvee.style",
351
+ ".mts" => "model/vnd.mts",
352
+ ".mus" => "application/vnd.musician",
353
+ ".mvb" => "application/x-msmediaview",
354
+ ".mwf" => "application/vnd.mfer",
355
+ ".mxf" => "application/mxf",
356
+ ".mxl" => "application/vnd.recordare.musicxml",
357
+ ".mxml" => "application/xv+xml",
358
+ ".mxs" => "application/vnd.triscape.mxs",
359
+ ".mxu" => "video/vnd.mpegurl",
360
+ ".n" => "application/vnd.nokia.n-gage.symbian.install",
361
+ ".nc" => "application/x-netcdf",
362
+ ".ngdat" => "application/vnd.nokia.n-gage.data",
363
+ ".nlu" => "application/vnd.neurolanguage.nlu",
364
+ ".nml" => "application/vnd.enliven",
365
+ ".nnd" => "application/vnd.noblenet-directory",
366
+ ".nns" => "application/vnd.noblenet-sealer",
367
+ ".nnw" => "application/vnd.noblenet-web",
368
+ ".npx" => "image/vnd.net-fpx",
369
+ ".nsf" => "application/vnd.lotus-notes",
370
+ ".oa2" => "application/vnd.fujitsu.oasys2",
371
+ ".oa3" => "application/vnd.fujitsu.oasys3",
372
+ ".oas" => "application/vnd.fujitsu.oasys",
373
+ ".obd" => "application/x-msbinder",
374
+ ".oda" => "application/oda",
375
+ ".odc" => "application/vnd.oasis.opendocument.chart",
376
+ ".odf" => "application/vnd.oasis.opendocument.formula",
377
+ ".odg" => "application/vnd.oasis.opendocument.graphics",
378
+ ".odi" => "application/vnd.oasis.opendocument.image",
379
+ ".odp" => "application/vnd.oasis.opendocument.presentation",
380
+ ".ods" => "application/vnd.oasis.opendocument.spreadsheet",
381
+ ".odt" => "application/vnd.oasis.opendocument.text",
382
+ ".oga" => "audio/ogg",
383
+ ".ogg" => "application/ogg",
384
+ ".ogv" => "video/ogg",
385
+ ".ogx" => "application/ogg",
386
+ ".org" => "application/vnd.lotus-organizer",
387
+ ".otc" => "application/vnd.oasis.opendocument.chart-template",
388
+ ".otf" => "application/vnd.oasis.opendocument.formula-template",
389
+ ".otg" => "application/vnd.oasis.opendocument.graphics-template",
390
+ ".oth" => "application/vnd.oasis.opendocument.text-web",
391
+ ".oti" => "application/vnd.oasis.opendocument.image-template",
392
+ ".otm" => "application/vnd.oasis.opendocument.text-master",
393
+ ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
394
+ ".ott" => "application/vnd.oasis.opendocument.text-template",
395
+ ".oxt" => "application/vnd.openofficeorg.extension",
396
+ ".p" => "text/x-pascal",
397
+ ".p10" => "application/pkcs10",
398
+ ".p12" => "application/x-pkcs12",
399
+ ".p7b" => "application/x-pkcs7-certificates",
400
+ ".p7m" => "application/pkcs7-mime",
401
+ ".p7r" => "application/x-pkcs7-certreqresp",
402
+ ".p7s" => "application/pkcs7-signature",
403
+ ".pas" => "text/x-pascal",
404
+ ".pbd" => "application/vnd.powerbuilder6",
405
+ ".pbm" => "image/x-portable-bitmap",
406
+ ".pcl" => "application/vnd.hp-pcl",
407
+ ".pclxl" => "application/vnd.hp-pclxl",
408
+ ".pcx" => "image/x-pcx",
409
+ ".pdb" => "chemical/x-pdb",
410
+ ".pdf" => "application/pdf",
411
+ ".pem" => "application/x-x509-ca-cert",
412
+ ".pfr" => "application/font-tdpfr",
413
+ ".pgm" => "image/x-portable-graymap",
414
+ ".pgn" => "application/x-chess-pgn",
415
+ ".pgp" => "application/pgp-encrypted",
416
+ ".pic" => "image/x-pict",
417
+ ".pict" => "image/pict",
418
+ ".pkg" => "application/octet-stream",
419
+ ".pki" => "application/pkixcmp",
420
+ ".pkipath" => "application/pkix-pkipath",
421
+ ".pl" => "text/x-script.perl",
422
+ ".plb" => "application/vnd.3gpp.pic-bw-large",
423
+ ".plc" => "application/vnd.mobius.plc",
424
+ ".plf" => "application/vnd.pocketlearn",
425
+ ".pls" => "application/pls+xml",
426
+ ".pm" => "text/x-script.perl-module",
427
+ ".pml" => "application/vnd.ctc-posml",
428
+ ".png" => "image/png",
429
+ ".pnm" => "image/x-portable-anymap",
430
+ ".pntg" => "image/x-macpaint",
431
+ ".portpkg" => "application/vnd.macports.portpkg",
432
+ ".ppd" => "application/vnd.cups-ppd",
433
+ ".ppm" => "image/x-portable-pixmap",
434
+ ".pps" => "application/vnd.ms-powerpoint",
435
+ ".ppt" => "application/vnd.ms-powerpoint",
436
+ ".prc" => "application/vnd.palm",
437
+ ".pre" => "application/vnd.lotus-freelance",
438
+ ".prf" => "application/pics-rules",
439
+ ".ps" => "application/postscript",
440
+ ".psb" => "application/vnd.3gpp.pic-bw-small",
441
+ ".psd" => "image/vnd.adobe.photoshop",
442
+ ".ptid" => "application/vnd.pvi.ptid1",
443
+ ".pub" => "application/x-mspublisher",
444
+ ".pvb" => "application/vnd.3gpp.pic-bw-var",
445
+ ".pwn" => "application/vnd.3m.post-it-notes",
446
+ ".py" => "text/x-script.python",
447
+ ".pya" => "audio/vnd.ms-playready.media.pya",
448
+ ".pyv" => "video/vnd.ms-playready.media.pyv",
449
+ ".qam" => "application/vnd.epson.quickanime",
450
+ ".qbo" => "application/vnd.intu.qbo",
451
+ ".qfx" => "application/vnd.intu.qfx",
452
+ ".qps" => "application/vnd.publishare-delta-tree",
453
+ ".qt" => "video/quicktime",
454
+ ".qtif" => "image/x-quicktime",
455
+ ".qxd" => "application/vnd.quark.quarkxpress",
456
+ ".ra" => "audio/x-pn-realaudio",
457
+ ".rake" => "text/x-script.ruby",
458
+ ".ram" => "audio/x-pn-realaudio",
459
+ ".rar" => "application/x-rar-compressed",
460
+ ".ras" => "image/x-cmu-raster",
461
+ ".rb" => "text/x-script.ruby",
462
+ ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
463
+ ".rdf" => "application/rdf+xml",
464
+ ".rdz" => "application/vnd.data-vision.rdz",
465
+ ".rep" => "application/vnd.businessobjects",
466
+ ".rgb" => "image/x-rgb",
467
+ ".rif" => "application/reginfo+xml",
468
+ ".rl" => "application/resource-lists+xml",
469
+ ".rlc" => "image/vnd.fujixerox.edmics-rlc",
470
+ ".rld" => "application/resource-lists-diff+xml",
471
+ ".rm" => "application/vnd.rn-realmedia",
472
+ ".rmp" => "audio/x-pn-realaudio-plugin",
473
+ ".rms" => "application/vnd.jcp.javame.midlet-rms",
474
+ ".rnc" => "application/relax-ng-compact-syntax",
475
+ ".roff" => "text/troff",
476
+ ".rpm" => "application/x-redhat-package-manager",
477
+ ".rpss" => "application/vnd.nokia.radio-presets",
478
+ ".rpst" => "application/vnd.nokia.radio-preset",
479
+ ".rq" => "application/sparql-query",
480
+ ".rs" => "application/rls-services+xml",
481
+ ".rsd" => "application/rsd+xml",
482
+ ".rss" => "application/rss+xml",
483
+ ".rtf" => "application/rtf",
484
+ ".rtx" => "text/richtext",
485
+ ".ru" => "text/x-script.ruby",
486
+ ".s" => "text/x-asm",
487
+ ".saf" => "application/vnd.yamaha.smaf-audio",
488
+ ".sbml" => "application/sbml+xml",
489
+ ".sc" => "application/vnd.ibm.secure-container",
490
+ ".scd" => "application/x-msschedule",
491
+ ".scm" => "application/vnd.lotus-screencam",
492
+ ".scq" => "application/scvp-cv-request",
493
+ ".scs" => "application/scvp-cv-response",
494
+ ".sdkm" => "application/vnd.solent.sdkm+xml",
495
+ ".sdp" => "application/sdp",
496
+ ".see" => "application/vnd.seemail",
497
+ ".sema" => "application/vnd.sema",
498
+ ".semd" => "application/vnd.semd",
499
+ ".semf" => "application/vnd.semf",
500
+ ".setpay" => "application/set-payment-initiation",
501
+ ".setreg" => "application/set-registration-initiation",
502
+ ".sfd" => "application/vnd.hydrostatix.sof-data",
503
+ ".sfs" => "application/vnd.spotfire.sfs",
504
+ ".sgm" => "text/sgml",
505
+ ".sgml" => "text/sgml",
506
+ ".sh" => "application/x-sh",
507
+ ".shar" => "application/x-shar",
508
+ ".shf" => "application/shf+xml",
509
+ ".sig" => "application/pgp-signature",
510
+ ".sit" => "application/x-stuffit",
511
+ ".sitx" => "application/x-stuffitx",
512
+ ".skp" => "application/vnd.koan",
513
+ ".slt" => "application/vnd.epson.salt",
514
+ ".smi" => "application/smil+xml",
515
+ ".snd" => "audio/basic",
516
+ ".so" => "application/octet-stream",
517
+ ".spf" => "application/vnd.yamaha.smaf-phrase",
518
+ ".spl" => "application/x-futuresplash",
519
+ ".spot" => "text/vnd.in3d.spot",
520
+ ".spp" => "application/scvp-vp-response",
521
+ ".spq" => "application/scvp-vp-request",
522
+ ".src" => "application/x-wais-source",
523
+ ".srx" => "application/sparql-results+xml",
524
+ ".sse" => "application/vnd.kodak-descriptor",
525
+ ".ssf" => "application/vnd.epson.ssf",
526
+ ".ssml" => "application/ssml+xml",
527
+ ".stf" => "application/vnd.wt.stf",
528
+ ".stk" => "application/hyperstudio",
529
+ ".str" => "application/vnd.pg.format",
530
+ ".sus" => "application/vnd.sus-calendar",
531
+ ".sv4cpio" => "application/x-sv4cpio",
532
+ ".sv4crc" => "application/x-sv4crc",
533
+ ".svd" => "application/vnd.svd",
534
+ ".svg" => "image/svg+xml",
535
+ ".svgz" => "image/svg+xml",
536
+ ".swf" => "application/x-shockwave-flash",
537
+ ".swi" => "application/vnd.arastra.swi",
538
+ ".t" => "text/troff",
539
+ ".tao" => "application/vnd.tao.intent-module-archive",
540
+ ".tar" => "application/x-tar",
541
+ ".tbz" => "application/x-bzip-compressed-tar",
542
+ ".tcap" => "application/vnd.3gpp2.tcap",
543
+ ".tcl" => "application/x-tcl",
544
+ ".tex" => "application/x-tex",
545
+ ".texi" => "application/x-texinfo",
546
+ ".texinfo" => "application/x-texinfo",
547
+ ".text" => "text/plain",
548
+ ".tif" => "image/tiff",
549
+ ".tiff" => "image/tiff",
550
+ ".tmo" => "application/vnd.tmobile-livetv",
551
+ ".torrent" => "application/x-bittorrent",
552
+ ".tpl" => "application/vnd.groove-tool-template",
553
+ ".tpt" => "application/vnd.trid.tpt",
554
+ ".tr" => "text/troff",
555
+ ".tra" => "application/vnd.trueapp",
556
+ ".trm" => "application/x-msterminal",
557
+ ".tsv" => "text/tab-separated-values",
558
+ ".ttf" => "application/octet-stream",
559
+ ".twd" => "application/vnd.simtech-mindmapper",
560
+ ".txd" => "application/vnd.genomatix.tuxedo",
561
+ ".txf" => "application/vnd.mobius.txf",
562
+ ".txt" => "text/plain",
563
+ ".ufd" => "application/vnd.ufdl",
564
+ ".umj" => "application/vnd.umajin",
565
+ ".unityweb" => "application/vnd.unity",
566
+ ".uoml" => "application/vnd.uoml+xml",
567
+ ".uri" => "text/uri-list",
568
+ ".ustar" => "application/x-ustar",
569
+ ".utz" => "application/vnd.uiq.theme",
570
+ ".uu" => "text/x-uuencode",
571
+ ".vcd" => "application/x-cdlink",
572
+ ".vcf" => "text/x-vcard",
573
+ ".vcg" => "application/vnd.groove-vcard",
574
+ ".vcs" => "text/x-vcalendar",
575
+ ".vcx" => "application/vnd.vcx",
576
+ ".vis" => "application/vnd.visionary",
577
+ ".viv" => "video/vnd.vivo",
578
+ ".vrml" => "model/vrml",
579
+ ".vsd" => "application/vnd.visio",
580
+ ".vsf" => "application/vnd.vsf",
581
+ ".vtu" => "model/vnd.vtu",
582
+ ".vxml" => "application/voicexml+xml",
583
+ ".war" => "application/java-archive",
584
+ ".wav" => "audio/x-wav",
585
+ ".wax" => "audio/x-ms-wax",
586
+ ".wbmp" => "image/vnd.wap.wbmp",
587
+ ".wbs" => "application/vnd.criticaltools.wbs+xml",
588
+ ".wbxml" => "application/vnd.wap.wbxml",
589
+ ".webm" => "video/webm",
590
+ ".wm" => "video/x-ms-wm",
591
+ ".wma" => "audio/x-ms-wma",
592
+ ".wmd" => "application/x-ms-wmd",
593
+ ".wmf" => "application/x-msmetafile",
594
+ ".wml" => "text/vnd.wap.wml",
595
+ ".wmlc" => "application/vnd.wap.wmlc",
596
+ ".wmls" => "text/vnd.wap.wmlscript",
597
+ ".wmlsc" => "application/vnd.wap.wmlscriptc",
598
+ ".wmv" => "video/x-ms-wmv",
599
+ ".wmx" => "video/x-ms-wmx",
600
+ ".wmz" => "application/x-ms-wmz",
601
+ ".woff" => "application/octet-stream",
602
+ ".wpd" => "application/vnd.wordperfect",
603
+ ".wpl" => "application/vnd.ms-wpl",
604
+ ".wps" => "application/vnd.ms-works",
605
+ ".wqd" => "application/vnd.wqd",
606
+ ".wri" => "application/x-mswrite",
607
+ ".wrl" => "model/vrml",
608
+ ".wsdl" => "application/wsdl+xml",
609
+ ".wspolicy" => "application/wspolicy+xml",
610
+ ".wtb" => "application/vnd.webturbo",
611
+ ".wvx" => "video/x-ms-wvx",
612
+ ".x3d" => "application/vnd.hzn-3d-crossword",
613
+ ".xar" => "application/vnd.xara",
614
+ ".xbd" => "application/vnd.fujixerox.docuworks.binder",
615
+ ".xbm" => "image/x-xbitmap",
616
+ ".xdm" => "application/vnd.syncml.dm+xml",
617
+ ".xdp" => "application/vnd.adobe.xdp+xml",
618
+ ".xdw" => "application/vnd.fujixerox.docuworks",
619
+ ".xenc" => "application/xenc+xml",
620
+ ".xer" => "application/patch-ops-error+xml",
621
+ ".xfdf" => "application/vnd.adobe.xfdf",
622
+ ".xfdl" => "application/vnd.xfdl",
623
+ ".xhtml" => "application/xhtml+xml",
624
+ ".xif" => "image/vnd.xiff",
625
+ ".xls" => "application/vnd.ms-excel",
626
+ ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
627
+ ".xml" => "application/xml",
628
+ ".xo" => "application/vnd.olpc-sugar",
629
+ ".xop" => "application/xop+xml",
630
+ ".xpm" => "image/x-xpixmap",
631
+ ".xpr" => "application/vnd.is-xpr",
632
+ ".xps" => "application/vnd.ms-xpsdocument",
633
+ ".xpw" => "application/vnd.intercon.formnet",
634
+ ".xsl" => "application/xml",
635
+ ".xslt" => "application/xslt+xml",
636
+ ".xsm" => "application/vnd.syncml+xml",
637
+ ".xspf" => "application/xspf+xml",
638
+ ".xul" => "application/vnd.mozilla.xul+xml",
639
+ ".xwd" => "image/x-xwindowdump",
640
+ ".xyz" => "chemical/x-xyz",
641
+ ".yaml" => "text/yaml",
642
+ ".yml" => "text/yaml",
643
+ ".zaz" => "application/vnd.zzazz.deck+xml",
644
+ ".zip" => "application/zip",
645
+ ".zmm" => "application/vnd.handheld-entertainment+xml",
211
646
  }
212
647
  end
213
648
  end