waitress-core 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +21 -0
  4. data/Rakefile +4 -0
  5. data/bin/waitress +22 -0
  6. data/ext/Thanks.md +1 -0
  7. data/ext/waitress_http11/ext_help.h +15 -0
  8. data/ext/waitress_http11/extconf.rb +6 -0
  9. data/ext/waitress_http11/http11.c +532 -0
  10. data/ext/waitress_http11/http11_parser.c +1216 -0
  11. data/ext/waitress_http11/http11_parser.h +49 -0
  12. data/ext/waitress_http11/http11_parser.java.rl +171 -0
  13. data/ext/waitress_http11/http11_parser.rl +165 -0
  14. data/ext/waitress_http11/http11_parser_common.rl +55 -0
  15. data/ext/waitress_http11/http11_wrb_parser.h +83 -0
  16. data/lib/waitress.rb +98 -0
  17. data/lib/waitress/chef.rb +110 -0
  18. data/lib/waitress/configure.rb +116 -0
  19. data/lib/waitress/handlers/dirhandler.rb +39 -0
  20. data/lib/waitress/handlers/handler.rb +57 -0
  21. data/lib/waitress/handlers/handler404.rb +25 -0
  22. data/lib/waitress/handlers/libhandler.rb +58 -0
  23. data/lib/waitress/kernel.rb +182 -0
  24. data/lib/waitress/parse/query.rb +60 -0
  25. data/lib/waitress/request.rb +45 -0
  26. data/lib/waitress/resources/default_config.rb +52 -0
  27. data/lib/waitress/resources/http/404.html +18 -0
  28. data/lib/waitress/resources/http/css/hack.css +37 -0
  29. data/lib/waitress/resources/http/css/waitress.css +57 -0
  30. data/lib/waitress/resources/http/fonts/eot/latin/hack-bold-latin-webfont.eot +0 -0
  31. data/lib/waitress/resources/http/fonts/eot/latin/hack-bolditalic-latin-webfont.eot +0 -0
  32. data/lib/waitress/resources/http/fonts/eot/latin/hack-italic-latin-webfont.eot +0 -0
  33. data/lib/waitress/resources/http/fonts/eot/latin/hack-regular-latin-webfont.eot +0 -0
  34. data/lib/waitress/resources/http/fonts/svg/latin/hack-bold-latin-webfont.svg +241 -0
  35. data/lib/waitress/resources/http/fonts/svg/latin/hack-bolditalic-latin-webfont.svg +241 -0
  36. data/lib/waitress/resources/http/fonts/svg/latin/hack-italic-latin-webfont.svg +241 -0
  37. data/lib/waitress/resources/http/fonts/svg/latin/hack-regular-latin-webfont.svg +241 -0
  38. data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-bold-latin-webfont.ttf +0 -0
  39. data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-bolditalic-latin-webfont.ttf +0 -0
  40. data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-italic-latin-webfont.ttf +0 -0
  41. data/lib/waitress/resources/http/fonts/web-ttf/latin/hack-regular-latin-webfont.ttf +0 -0
  42. data/lib/waitress/resources/http/fonts/woff/latin/hack-bold-latin-webfont.woff +0 -0
  43. data/lib/waitress/resources/http/fonts/woff/latin/hack-bolditalic-latin-webfont.woff +0 -0
  44. data/lib/waitress/resources/http/fonts/woff/latin/hack-italic-latin-webfont.woff +0 -0
  45. data/lib/waitress/resources/http/fonts/woff/latin/hack-regular-latin-webfont.woff +0 -0
  46. data/lib/waitress/resources/http/fonts/woff2/latin/hack-bold-latin-webfont.woff2 +0 -0
  47. data/lib/waitress/resources/http/fonts/woff2/latin/hack-bolditalic-latin-webfont.woff2 +0 -0
  48. data/lib/waitress/resources/http/fonts/woff2/latin/hack-italic-latin-webfont.woff2 +0 -0
  49. data/lib/waitress/resources/http/fonts/woff2/latin/hack-regular-latin-webfont.woff2 +0 -0
  50. data/lib/waitress/resources/http/img/404.png +0 -0
  51. data/lib/waitress/resources/http/index.html +15 -0
  52. data/lib/waitress/response.rb +104 -0
  53. data/lib/waitress/server.rb +115 -0
  54. data/lib/waitress/util.rb +713 -0
  55. data/lib/waitress/version.rb +3 -0
  56. data/lib/waitress/vhost.rb +217 -0
  57. data/lib/waitress_http11.so +0 -0
  58. data/waitress-core.gemspec +27 -0
  59. metadata +187 -0
@@ -0,0 +1,15 @@
1
+ <html>
2
+ <head>
3
+ <title> Welcome to Waitress </title>
4
+ <link rel="stylesheet" href="css/hack.css">
5
+ <link rel="stylesheet" href="css/waitress.css">
6
+ </head>
7
+ <body>
8
+ <div id="maincontainer">
9
+ <div class="titlecontainer">
10
+ <h1> Waitress </h1>
11
+ <h2> Please take a seat and let me take your order </h2>
12
+ </div>
13
+ </div>
14
+ </body>
15
+ </html>
@@ -0,0 +1,104 @@
1
+ module Waitress
2
+ # The response class is used to cook responses to be served to the client.
3
+ # This class contains things like response headers, status codes and the response
4
+ # body itself
5
+ class Response
6
+
7
+ def initialize
8
+ @headers = {}
9
+ status 200
10
+ default_headers
11
+ @isdone = false
12
+ end
13
+
14
+ # Returns true if the response has already been sent to the client
15
+ def done?
16
+ @isdone
17
+ end
18
+
19
+ # Mark the response as done (already sent to the client)
20
+ def done state=true
21
+ @isdone = state
22
+ end
23
+
24
+ # Apply the default headers to this response
25
+ def default_headers
26
+ header "Server", "Waitress #{Waitress::VERSION} (#{RUBY_PLATFORM})"
27
+ end
28
+
29
+ # Apply the given Status code to the response, such as 200, 404, 500 or
30
+ # any other code listed in the HTTP protocol specification
31
+ def status status_code
32
+ @status = status_code
33
+ @status_msg = Waitress::Util.status @status
34
+ header "Status", "#{@status} #{@status_msg}"
35
+ end
36
+
37
+ # Set the mimetype (Content-Type header) of this response to the one matching
38
+ # the given file extension as matched by the +Waitress::Util+ class
39
+ # +filext+:: The file extension to match, e.g. .html, .css, .js
40
+ def mime filext
41
+ m = Waitress::Util.mime filext
42
+ header "Content-Type", m
43
+ end
44
+
45
+ # Set the mimetype (Content-Type header) of this response to the one given.
46
+ # +type+:: The mime type to use, e.g. application/json, text/html,
47
+ # application/scon
48
+ def mime_raw type
49
+ header "Content-Type", type
50
+ end
51
+
52
+ # Set a header for the response. This header will be encoded to the http
53
+ # response
54
+ # Params:
55
+ # +header+:: The name of the header. e.g. "Content-Type"
56
+ # +data+:: The data to be encoded into the header. e.g. "text/html"
57
+ def header header, data
58
+ @headers[header] = data
59
+ end
60
+
61
+ # Set the Body IO object for the response. This IO object will be read from
62
+ # when the webpage is served, so usually this is a File reference or a StringIO
63
+ # +io+:: The io object to use. Not required if you just want to get the IO object
64
+ def body_io io=:get
65
+ @io = io unless io == :get
66
+ @io
67
+ end
68
+
69
+ # Append something to the Body IO. If the Body IO is a StringIO, this will usually be
70
+ # a String. This is mostly used for the 'echo' function
71
+ def append obj
72
+ @io.write obj
73
+ end
74
+
75
+ # Set the body to be a String. This will replace the BodyIO with a StringIO
76
+ # containing the string
77
+ # +str+:: The new string to replace the BodyIO with
78
+ def body str
79
+ body_io StringIO.new(str)
80
+ end
81
+
82
+ # Serve the response to the given socket. This will write the Headers, Response
83
+ # Code and Body.
84
+ def serve sock
85
+ unless done?
86
+ sock.write "HTTP/1.1 #{@status} #{@status_msg}\r\n"
87
+ @headers.each do |k, v|
88
+ sock.write "#{k}: #{v}\r\n"
89
+ end
90
+ sock.write "\r\n"
91
+ unless @io.nil?
92
+ @io.pos = 0
93
+ until @io.eof?
94
+ s = @io.read(4096)
95
+ sock.write s
96
+ end
97
+ end
98
+ done
99
+ sock.close
100
+ end
101
+ end
102
+
103
+ end
104
+ end
@@ -0,0 +1,115 @@
1
+ require 'socket'
2
+ require 'thread'
3
+
4
+ module Waitress
5
+
6
+ # The Waitress HTTPServer. This class is responsible for handling traffic from
7
+ # clients and delegating it to the correct Virtual Host to further handle.
8
+ # New threads and Processes are spawned for each connection to the server
9
+ class HttpServer < Array
10
+
11
+ class HttpParams < Hash
12
+ attr_accessor :http_body
13
+ end
14
+
15
+ # Create a new Server instance with the given ports. If no ports are given,
16
+ # port 80 will be used as a default
17
+ def initialize(*ports)
18
+ ports << 80 if ports.length == 0
19
+ @ports = ports
20
+ end
21
+
22
+ # Set or Get the ports for this server. If arguments are provided, the ports
23
+ # for this server will be replaced with the ones listed. If no arguments are provided,
24
+ # this method simply returns the ports
25
+ def ports *ports
26
+ @ports = *ports unless ports.length == 0
27
+ @ports
28
+ end
29
+
30
+ # Start the server. If arguments are provided, it will run with the ports
31
+ # declared in the arguments, otherwise, it will use the ports it already has
32
+ # set (or 80 for the default)
33
+ def run *ports
34
+ @ports = ports unless ports.length == 0
35
+ @threads = @ports.map { |x| Thread.new { launch_port x } }
36
+ self.each do |vhost|
37
+ vhost.on_server_start self
38
+ end
39
+ self
40
+ end
41
+
42
+ # Join the server, blocking the current thread in order to keep the server alive.
43
+ def join
44
+ @threads.each { |x| x.join }
45
+ end
46
+
47
+ # Handle a client based on an IO stream, if you plan to serve on a non-socket
48
+ # connection
49
+ def read_io io
50
+ handle_client io
51
+ end
52
+
53
+ :private
54
+ def launch_port port
55
+ @server = TCPServer.new port
56
+ while true
57
+ client = @server.accept
58
+ go do
59
+ begin
60
+ handle_client client
61
+ rescue => e
62
+ puts "Server Error: #{e} (Fix This!)"
63
+ puts e.backtrace
64
+ end
65
+ end
66
+ end
67
+ end
68
+
69
+ def handle_client client_socket
70
+ begin
71
+ data = client_socket.readpartial(8196)
72
+ rescue
73
+ client_socket.close unless client_socket.closed?
74
+ return
75
+ end
76
+
77
+ gofork do
78
+ parser = Waitress::HttpParser.new
79
+ params = HttpParams.new
80
+ parser.execute(params, data, 0)
81
+ build_request params, client_socket
82
+ end.wait
83
+ client_socket.close
84
+ end
85
+
86
+ def build_request headers, client_socket
87
+ request_headers = {}
88
+ headers.each do |k,v|
89
+ if k.start_with? "HTTP_HEAD_"
90
+ request_headers[k.sub(/HTTP_HEAD_/, "")] = v
91
+ end
92
+ end
93
+ request = Waitress::Request.new(
94
+ headers["REQUEST_METHOD"], headers["REQUEST_PATH"], headers["REQUEST_URI"],
95
+ headers["QUERY_STRING"], headers["HTTP_VERSION"], headers.http_body, request_headers
96
+ )
97
+ handle_request request, client_socket
98
+ end
99
+
100
+ def handle_request request, client
101
+ match, pri = self[0], nil
102
+ self.each do |vhost|
103
+ if (request.headers['Host'].to_s =~ vhost.domain) != nil
104
+ match = vhost if pri.nil? || vhost.priority > pri
105
+ end
106
+ end
107
+
108
+ if match.nil?
109
+ # Subdomain not found (or default)
110
+ else
111
+ match.handle_request request, client
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,713 @@
1
+ module Waitress
2
+ # A small utility class responsible for determining Mime Types, Status responses
3
+ # and host details such as Operating System
4
+ class Util
5
+
6
+ # Match a file extension to a valid Mime Type to be used in Content-Type
7
+ # headers
8
+ # +ext+:: The file extension to map
9
+ # +default+:: The default value to use if a match is not found. Defaults to
10
+ # application/octet-stream
11
+ def self.mime ext, default='application/octet-stream'
12
+ MIME_TYPES.fetch(ext.to_s.downcase, default)
13
+ end
14
+
15
+ # Get the status message for a status code. This matches codes used by the
16
+ # HTTP protocol to their message, e.g. 200 -> OK, 404 -> Not Found, etc
17
+ # +code+:: The Status Code to match.
18
+ def self.status code
19
+ STATUS[code]
20
+ end
21
+
22
+ # Get the host Operating System of the system.
23
+ def self.os
24
+ RbConfig::CONFIG['host_os']
25
+ end
26
+
27
+ STATUS = {
28
+ 100 => "Continue",
29
+ 101 => "Switching Protocols",
30
+ 102 => "Processing",
31
+
32
+ 200 => "OK",
33
+ 201 => "Created",
34
+ 202 => "Accepted",
35
+ 203 => "Non-Authoritative Information",
36
+ 204 => "No Content",
37
+ 205 => "Reset Content",
38
+ 206 => "Partial Content",
39
+ 207 => "Multi-Status",
40
+ 208 => "Already Reported",
41
+ 226 => "IM Used",
42
+
43
+ 300 => "Multiple Choices",
44
+ 301 => "Moved Permanently",
45
+ 302 => "Found",
46
+ 303 => "See Other",
47
+ 304 => "Not Modified",
48
+ 305 => "Use Proxy",
49
+ 307 => "Temporary Redirect",
50
+ 308 => "Permanent Redirect",
51
+
52
+ 400 => "Bad Request",
53
+ 401 => "Unauthorized",
54
+ 403 => "Forbidden",
55
+ 404 => "Not Found",
56
+ 405 => "Method Not Allowed",
57
+ 406 => "Not Acceptable",
58
+ 407 => "Proxy Authentication Required",
59
+ 408 => "Request Timeout",
60
+ 409 => "Conflict",
61
+ 410 => "Gone",
62
+ 411 => "Length Required",
63
+ 412 => "Precondition Failed",
64
+ 413 => "Payload Too Large",
65
+ 414 => "Request-URI Too Long",
66
+ 415 => "Unsupported Media Type",
67
+ 416 => "Requested Range Not Satifiable",
68
+ 417 => "Expectation Failed",
69
+ 418 => "I'm a teapot",
70
+ 426 => "Update Required",
71
+ 429 => "Too Many Requests",
72
+
73
+ 500 => "Internal Server Error",
74
+ 501 => "Not Implemented",
75
+ 502 => "Bad Gateway",
76
+ 503 => "Service Unavailable",
77
+ 504 => "Gateway Timeout",
78
+ 505 => "HTTP Version Not Supported",
79
+ 520 => "Unknown Error"
80
+ }
81
+
82
+ # Taken from Rack::Mime
83
+ MIME_TYPES = {
84
+ ".123" => "application/vnd.lotus-1-2-3",
85
+ ".3dml" => "text/vnd.in3d.3dml",
86
+ ".3g2" => "video/3gpp2",
87
+ ".3gp" => "video/3gpp",
88
+ ".a" => "application/octet-stream",
89
+ ".acc" => "application/vnd.americandynamics.acc",
90
+ ".ace" => "application/x-ace-compressed",
91
+ ".acu" => "application/vnd.acucobol",
92
+ ".aep" => "application/vnd.audiograph",
93
+ ".afp" => "application/vnd.ibm.modcap",
94
+ ".ai" => "application/postscript",
95
+ ".aif" => "audio/x-aiff",
96
+ ".aiff" => "audio/x-aiff",
97
+ ".ami" => "application/vnd.amiga.ami",
98
+ ".appcache" => "text/cache-manifest",
99
+ ".apr" => "application/vnd.lotus-approach",
100
+ ".asc" => "application/pgp-signature",
101
+ ".asf" => "video/x-ms-asf",
102
+ ".asm" => "text/x-asm",
103
+ ".aso" => "application/vnd.accpac.simply.aso",
104
+ ".asx" => "video/x-ms-asf",
105
+ ".atc" => "application/vnd.acucorp",
106
+ ".atom" => "application/atom+xml",
107
+ ".atomcat" => "application/atomcat+xml",
108
+ ".atomsvc" => "application/atomsvc+xml",
109
+ ".atx" => "application/vnd.antix.game-component",
110
+ ".au" => "audio/basic",
111
+ ".avi" => "video/x-msvideo",
112
+ ".bat" => "application/x-msdownload",
113
+ ".bcpio" => "application/x-bcpio",
114
+ ".bdm" => "application/vnd.syncml.dm+wbxml",
115
+ ".bh2" => "application/vnd.fujitsu.oasysprs",
116
+ ".bin" => "application/octet-stream",
117
+ ".bmi" => "application/vnd.bmi",
118
+ ".bmp" => "image/bmp",
119
+ ".box" => "application/vnd.previewsystems.box",
120
+ ".btif" => "image/prs.btif",
121
+ ".bz" => "application/x-bzip",
122
+ ".bz2" => "application/x-bzip2",
123
+ ".c" => "text/x-c",
124
+ ".c4g" => "application/vnd.clonk.c4group",
125
+ ".cab" => "application/vnd.ms-cab-compressed",
126
+ ".cc" => "text/x-c",
127
+ ".ccxml" => "application/ccxml+xml",
128
+ ".cdbcmsg" => "application/vnd.contact.cmsg",
129
+ ".cdkey" => "application/vnd.mediastation.cdkey",
130
+ ".cdx" => "chemical/x-cdx",
131
+ ".cdxml" => "application/vnd.chemdraw+xml",
132
+ ".cdy" => "application/vnd.cinderella",
133
+ ".cer" => "application/pkix-cert",
134
+ ".cgm" => "image/cgm",
135
+ ".chat" => "application/x-chat",
136
+ ".chm" => "application/vnd.ms-htmlhelp",
137
+ ".chrt" => "application/vnd.kde.kchart",
138
+ ".cif" => "chemical/x-cif",
139
+ ".cii" => "application/vnd.anser-web-certificate-issue-initiation",
140
+ ".cil" => "application/vnd.ms-artgalry",
141
+ ".cla" => "application/vnd.claymore",
142
+ ".class" => "application/octet-stream",
143
+ ".clkk" => "application/vnd.crick.clicker.keyboard",
144
+ ".clkp" => "application/vnd.crick.clicker.palette",
145
+ ".clkt" => "application/vnd.crick.clicker.template",
146
+ ".clkw" => "application/vnd.crick.clicker.wordbank",
147
+ ".clkx" => "application/vnd.crick.clicker",
148
+ ".clp" => "application/x-msclip",
149
+ ".cmc" => "application/vnd.cosmocaller",
150
+ ".cmdf" => "chemical/x-cmdf",
151
+ ".cml" => "chemical/x-cml",
152
+ ".cmp" => "application/vnd.yellowriver-custom-menu",
153
+ ".cmx" => "image/x-cmx",
154
+ ".com" => "application/x-msdownload",
155
+ ".conf" => "text/plain",
156
+ ".cpio" => "application/x-cpio",
157
+ ".cpp" => "text/x-c",
158
+ ".cpt" => "application/mac-compactpro",
159
+ ".crd" => "application/x-mscardfile",
160
+ ".crl" => "application/pkix-crl",
161
+ ".crt" => "application/x-x509-ca-cert",
162
+ ".csh" => "application/x-csh",
163
+ ".csml" => "chemical/x-csml",
164
+ ".csp" => "application/vnd.commonspace",
165
+ ".css" => "text/css",
166
+ ".csv" => "text/csv",
167
+ ".curl" => "application/vnd.curl",
168
+ ".cww" => "application/prs.cww",
169
+ ".cxx" => "text/x-c",
170
+ ".daf" => "application/vnd.mobius.daf",
171
+ ".davmount" => "application/davmount+xml",
172
+ ".dcr" => "application/x-director",
173
+ ".dd2" => "application/vnd.oma.dd2+xml",
174
+ ".ddd" => "application/vnd.fujixerox.ddd",
175
+ ".deb" => "application/x-debian-package",
176
+ ".der" => "application/x-x509-ca-cert",
177
+ ".dfac" => "application/vnd.dreamfactory",
178
+ ".diff" => "text/x-diff",
179
+ ".dis" => "application/vnd.mobius.dis",
180
+ ".djv" => "image/vnd.djvu",
181
+ ".djvu" => "image/vnd.djvu",
182
+ ".dll" => "application/x-msdownload",
183
+ ".dmg" => "application/octet-stream",
184
+ ".dna" => "application/vnd.dna",
185
+ ".doc" => "application/msword",
186
+ ".docm" => "application/vnd.ms-word.document.macroEnabled.12",
187
+ ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
188
+ ".dot" => "application/msword",
189
+ ".dotm" => "application/vnd.ms-word.template.macroEnabled.12",
190
+ ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
191
+ ".dp" => "application/vnd.osgi.dp",
192
+ ".dpg" => "application/vnd.dpgraph",
193
+ ".dsc" => "text/prs.lines.tag",
194
+ ".dtd" => "application/xml-dtd",
195
+ ".dts" => "audio/vnd.dts",
196
+ ".dtshd" => "audio/vnd.dts.hd",
197
+ ".dv" => "video/x-dv",
198
+ ".dvi" => "application/x-dvi",
199
+ ".dwf" => "model/vnd.dwf",
200
+ ".dwg" => "image/vnd.dwg",
201
+ ".dxf" => "image/vnd.dxf",
202
+ ".dxp" => "application/vnd.spotfire.dxp",
203
+ ".ear" => "application/java-archive",
204
+ ".ecelp4800" => "audio/vnd.nuera.ecelp4800",
205
+ ".ecelp7470" => "audio/vnd.nuera.ecelp7470",
206
+ ".ecelp9600" => "audio/vnd.nuera.ecelp9600",
207
+ ".ecma" => "application/ecmascript",
208
+ ".edm" => "application/vnd.novadigm.edm",
209
+ ".edx" => "application/vnd.novadigm.edx",
210
+ ".efif" => "application/vnd.picsel",
211
+ ".ei6" => "application/vnd.pg.osasli",
212
+ ".eml" => "message/rfc822",
213
+ ".eol" => "audio/vnd.digital-winds",
214
+ ".eot" => "application/vnd.ms-fontobject",
215
+ ".eps" => "application/postscript",
216
+ ".es3" => "application/vnd.eszigno3+xml",
217
+ ".esf" => "application/vnd.epson.esf",
218
+ ".etx" => "text/x-setext",
219
+ ".exe" => "application/x-msdownload",
220
+ ".ext" => "application/vnd.novadigm.ext",
221
+ ".ez" => "application/andrew-inset",
222
+ ".ez2" => "application/vnd.ezpix-album",
223
+ ".ez3" => "application/vnd.ezpix-package",
224
+ ".f" => "text/x-fortran",
225
+ ".f77" => "text/x-fortran",
226
+ ".f90" => "text/x-fortran",
227
+ ".fbs" => "image/vnd.fastbidsheet",
228
+ ".fdf" => "application/vnd.fdf",
229
+ ".fe_launch" => "application/vnd.denovo.fcselayout-link",
230
+ ".fg5" => "application/vnd.fujitsu.oasysgp",
231
+ ".fli" => "video/x-fli",
232
+ ".flo" => "application/vnd.micrografx.flo",
233
+ ".flv" => "video/x-flv",
234
+ ".flw" => "application/vnd.kde.kivio",
235
+ ".flx" => "text/vnd.fmi.flexstor",
236
+ ".fly" => "text/vnd.fly",
237
+ ".fm" => "application/vnd.framemaker",
238
+ ".fnc" => "application/vnd.frogans.fnc",
239
+ ".for" => "text/x-fortran",
240
+ ".fpx" => "image/vnd.fpx",
241
+ ".fsc" => "application/vnd.fsc.weblaunch",
242
+ ".fst" => "image/vnd.fst",
243
+ ".ftc" => "application/vnd.fluxtime.clip",
244
+ ".fti" => "application/vnd.anser-web-funds-transfer-initiation",
245
+ ".fvt" => "video/vnd.fvt",
246
+ ".fzs" => "application/vnd.fuzzysheet",
247
+ ".g3" => "image/g3fax",
248
+ ".gac" => "application/vnd.groove-account",
249
+ ".gdl" => "model/vnd.gdl",
250
+ ".gem" => "application/octet-stream",
251
+ ".gemspec" => "text/x-script.ruby",
252
+ ".ghf" => "application/vnd.groove-help",
253
+ ".gif" => "image/gif",
254
+ ".gim" => "application/vnd.groove-identity-message",
255
+ ".gmx" => "application/vnd.gmx",
256
+ ".gph" => "application/vnd.flographit",
257
+ ".gqf" => "application/vnd.grafeq",
258
+ ".gram" => "application/srgs",
259
+ ".grv" => "application/vnd.groove-injector",
260
+ ".grxml" => "application/srgs+xml",
261
+ ".gtar" => "application/x-gtar",
262
+ ".gtm" => "application/vnd.groove-tool-message",
263
+ ".gtw" => "model/vnd.gtw",
264
+ ".gv" => "text/vnd.graphviz",
265
+ ".gz" => "application/x-gzip",
266
+ ".h" => "text/x-c",
267
+ ".h261" => "video/h261",
268
+ ".h263" => "video/h263",
269
+ ".h264" => "video/h264",
270
+ ".hbci" => "application/vnd.hbci",
271
+ ".hdf" => "application/x-hdf",
272
+ ".hh" => "text/x-c",
273
+ ".hlp" => "application/winhlp",
274
+ ".hpgl" => "application/vnd.hp-hpgl",
275
+ ".hpid" => "application/vnd.hp-hpid",
276
+ ".hps" => "application/vnd.hp-hps",
277
+ ".hqx" => "application/mac-binhex40",
278
+ ".htc" => "text/x-component",
279
+ ".htke" => "application/vnd.kenameaapp",
280
+ ".htm" => "text/html",
281
+ ".html" => "text/html",
282
+ ".hvd" => "application/vnd.yamaha.hv-dic",
283
+ ".hvp" => "application/vnd.yamaha.hv-voice",
284
+ ".hvs" => "application/vnd.yamaha.hv-script",
285
+ ".icc" => "application/vnd.iccprofile",
286
+ ".ice" => "x-conference/x-cooltalk",
287
+ ".ico" => "image/vnd.microsoft.icon",
288
+ ".ics" => "text/calendar",
289
+ ".ief" => "image/ief",
290
+ ".ifb" => "text/calendar",
291
+ ".ifm" => "application/vnd.shana.informed.formdata",
292
+ ".igl" => "application/vnd.igloader",
293
+ ".igs" => "model/iges",
294
+ ".igx" => "application/vnd.micrografx.igx",
295
+ ".iif" => "application/vnd.shana.informed.interchange",
296
+ ".imp" => "application/vnd.accpac.simply.imp",
297
+ ".ims" => "application/vnd.ms-ims",
298
+ ".ipk" => "application/vnd.shana.informed.package",
299
+ ".irm" => "application/vnd.ibm.rights-management",
300
+ ".irp" => "application/vnd.irepository.package+xml",
301
+ ".iso" => "application/octet-stream",
302
+ ".itp" => "application/vnd.shana.informed.formtemplate",
303
+ ".ivp" => "application/vnd.immervision-ivp",
304
+ ".ivu" => "application/vnd.immervision-ivu",
305
+ ".jad" => "text/vnd.sun.j2me.app-descriptor",
306
+ ".jam" => "application/vnd.jam",
307
+ ".jar" => "application/java-archive",
308
+ ".java" => "text/x-java-source",
309
+ ".jisp" => "application/vnd.jisp",
310
+ ".jlt" => "application/vnd.hp-jlyt",
311
+ ".jnlp" => "application/x-java-jnlp-file",
312
+ ".joda" => "application/vnd.joost.joda-archive",
313
+ ".jp2" => "image/jp2",
314
+ ".jpeg" => "image/jpeg",
315
+ ".jpg" => "image/jpeg",
316
+ ".jpgv" => "video/jpeg",
317
+ ".jpm" => "video/jpm",
318
+ ".js" => "application/javascript",
319
+ ".json" => "application/json",
320
+ ".karbon" => "application/vnd.kde.karbon",
321
+ ".kfo" => "application/vnd.kde.kformula",
322
+ ".kia" => "application/vnd.kidspiration",
323
+ ".kml" => "application/vnd.google-earth.kml+xml",
324
+ ".kmz" => "application/vnd.google-earth.kmz",
325
+ ".kne" => "application/vnd.kinar",
326
+ ".kon" => "application/vnd.kde.kontour",
327
+ ".kpr" => "application/vnd.kde.kpresenter",
328
+ ".ksp" => "application/vnd.kde.kspread",
329
+ ".ktz" => "application/vnd.kahootz",
330
+ ".kwd" => "application/vnd.kde.kword",
331
+ ".latex" => "application/x-latex",
332
+ ".lbd" => "application/vnd.llamagraphics.life-balance.desktop",
333
+ ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml",
334
+ ".les" => "application/vnd.hhe.lesson-player",
335
+ ".link66" => "application/vnd.route66.link66+xml",
336
+ ".log" => "text/plain",
337
+ ".lostxml" => "application/lost+xml",
338
+ ".lrm" => "application/vnd.ms-lrm",
339
+ ".ltf" => "application/vnd.frogans.ltf",
340
+ ".lvp" => "audio/vnd.lucent.voice",
341
+ ".lwp" => "application/vnd.lotus-wordpro",
342
+ ".m3u" => "audio/x-mpegurl",
343
+ ".m4a" => "audio/mp4a-latm",
344
+ ".m4v" => "video/mp4",
345
+ ".ma" => "application/mathematica",
346
+ ".mag" => "application/vnd.ecowin.chart",
347
+ ".man" => "text/troff",
348
+ ".manifest" => "text/cache-manifest",
349
+ ".mathml" => "application/mathml+xml",
350
+ ".mbk" => "application/vnd.mobius.mbk",
351
+ ".mbox" => "application/mbox",
352
+ ".mc1" => "application/vnd.medcalcdata",
353
+ ".mcd" => "application/vnd.mcd",
354
+ ".mdb" => "application/x-msaccess",
355
+ ".mdi" => "image/vnd.ms-modi",
356
+ ".mdoc" => "text/troff",
357
+ ".me" => "text/troff",
358
+ ".mfm" => "application/vnd.mfmp",
359
+ ".mgz" => "application/vnd.proteus.magazine",
360
+ ".mid" => "audio/midi",
361
+ ".midi" => "audio/midi",
362
+ ".mif" => "application/vnd.mif",
363
+ ".mime" => "message/rfc822",
364
+ ".mj2" => "video/mj2",
365
+ ".mlp" => "application/vnd.dolby.mlp",
366
+ ".mmd" => "application/vnd.chipnuts.karaoke-mmd",
367
+ ".mmf" => "application/vnd.smaf",
368
+ ".mml" => "application/mathml+xml",
369
+ ".mmr" => "image/vnd.fujixerox.edmics-mmr",
370
+ ".mng" => "video/x-mng",
371
+ ".mny" => "application/x-msmoney",
372
+ ".mov" => "video/quicktime",
373
+ ".movie" => "video/x-sgi-movie",
374
+ ".mp3" => "audio/mpeg",
375
+ ".mp4" => "video/mp4",
376
+ ".mp4a" => "audio/mp4",
377
+ ".mp4s" => "application/mp4",
378
+ ".mp4v" => "video/mp4",
379
+ ".mpc" => "application/vnd.mophun.certificate",
380
+ ".mpeg" => "video/mpeg",
381
+ ".mpg" => "video/mpeg",
382
+ ".mpga" => "audio/mpeg",
383
+ ".mpkg" => "application/vnd.apple.installer+xml",
384
+ ".mpm" => "application/vnd.blueice.multipass",
385
+ ".mpn" => "application/vnd.mophun.application",
386
+ ".mpp" => "application/vnd.ms-project",
387
+ ".mpy" => "application/vnd.ibm.minipay",
388
+ ".mqy" => "application/vnd.mobius.mqy",
389
+ ".mrc" => "application/marc",
390
+ ".ms" => "text/troff",
391
+ ".mscml" => "application/mediaservercontrol+xml",
392
+ ".mseq" => "application/vnd.mseq",
393
+ ".msf" => "application/vnd.epson.msf",
394
+ ".msh" => "model/mesh",
395
+ ".msi" => "application/x-msdownload",
396
+ ".msl" => "application/vnd.mobius.msl",
397
+ ".msty" => "application/vnd.muvee.style",
398
+ ".mts" => "model/vnd.mts",
399
+ ".mus" => "application/vnd.musician",
400
+ ".mvb" => "application/x-msmediaview",
401
+ ".mwf" => "application/vnd.mfer",
402
+ ".mxf" => "application/mxf",
403
+ ".mxl" => "application/vnd.recordare.musicxml",
404
+ ".mxml" => "application/xv+xml",
405
+ ".mxs" => "application/vnd.triscape.mxs",
406
+ ".mxu" => "video/vnd.mpegurl",
407
+ ".n" => "application/vnd.nokia.n-gage.symbian.install",
408
+ ".nc" => "application/x-netcdf",
409
+ ".ngdat" => "application/vnd.nokia.n-gage.data",
410
+ ".nlu" => "application/vnd.neurolanguage.nlu",
411
+ ".nml" => "application/vnd.enliven",
412
+ ".nnd" => "application/vnd.noblenet-directory",
413
+ ".nns" => "application/vnd.noblenet-sealer",
414
+ ".nnw" => "application/vnd.noblenet-web",
415
+ ".npx" => "image/vnd.net-fpx",
416
+ ".nsf" => "application/vnd.lotus-notes",
417
+ ".oa2" => "application/vnd.fujitsu.oasys2",
418
+ ".oa3" => "application/vnd.fujitsu.oasys3",
419
+ ".oas" => "application/vnd.fujitsu.oasys",
420
+ ".obd" => "application/x-msbinder",
421
+ ".oda" => "application/oda",
422
+ ".odc" => "application/vnd.oasis.opendocument.chart",
423
+ ".odf" => "application/vnd.oasis.opendocument.formula",
424
+ ".odg" => "application/vnd.oasis.opendocument.graphics",
425
+ ".odi" => "application/vnd.oasis.opendocument.image",
426
+ ".odp" => "application/vnd.oasis.opendocument.presentation",
427
+ ".ods" => "application/vnd.oasis.opendocument.spreadsheet",
428
+ ".odt" => "application/vnd.oasis.opendocument.text",
429
+ ".oga" => "audio/ogg",
430
+ ".ogg" => "application/ogg",
431
+ ".ogv" => "video/ogg",
432
+ ".ogx" => "application/ogg",
433
+ ".org" => "application/vnd.lotus-organizer",
434
+ ".otc" => "application/vnd.oasis.opendocument.chart-template",
435
+ ".otf" => "application/vnd.oasis.opendocument.formula-template",
436
+ ".otg" => "application/vnd.oasis.opendocument.graphics-template",
437
+ ".oth" => "application/vnd.oasis.opendocument.text-web",
438
+ ".oti" => "application/vnd.oasis.opendocument.image-template",
439
+ ".otm" => "application/vnd.oasis.opendocument.text-master",
440
+ ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template",
441
+ ".ott" => "application/vnd.oasis.opendocument.text-template",
442
+ ".oxt" => "application/vnd.openofficeorg.extension",
443
+ ".p" => "text/x-pascal",
444
+ ".p10" => "application/pkcs10",
445
+ ".p12" => "application/x-pkcs12",
446
+ ".p7b" => "application/x-pkcs7-certificates",
447
+ ".p7m" => "application/pkcs7-mime",
448
+ ".p7r" => "application/x-pkcs7-certreqresp",
449
+ ".p7s" => "application/pkcs7-signature",
450
+ ".pas" => "text/x-pascal",
451
+ ".pbd" => "application/vnd.powerbuilder6",
452
+ ".pbm" => "image/x-portable-bitmap",
453
+ ".pcl" => "application/vnd.hp-pcl",
454
+ ".pclxl" => "application/vnd.hp-pclxl",
455
+ ".pcx" => "image/x-pcx",
456
+ ".pdb" => "chemical/x-pdb",
457
+ ".pdf" => "application/pdf",
458
+ ".pem" => "application/x-x509-ca-cert",
459
+ ".pfr" => "application/font-tdpfr",
460
+ ".pgm" => "image/x-portable-graymap",
461
+ ".pgn" => "application/x-chess-pgn",
462
+ ".pgp" => "application/pgp-encrypted",
463
+ ".pic" => "image/x-pict",
464
+ ".pict" => "image/pict",
465
+ ".pkg" => "application/octet-stream",
466
+ ".pki" => "application/pkixcmp",
467
+ ".pkipath" => "application/pkix-pkipath",
468
+ ".pl" => "text/x-script.perl",
469
+ ".plb" => "application/vnd.3gpp.pic-bw-large",
470
+ ".plc" => "application/vnd.mobius.plc",
471
+ ".plf" => "application/vnd.pocketlearn",
472
+ ".pls" => "application/pls+xml",
473
+ ".pm" => "text/x-script.perl-module",
474
+ ".pml" => "application/vnd.ctc-posml",
475
+ ".png" => "image/png",
476
+ ".pnm" => "image/x-portable-anymap",
477
+ ".pntg" => "image/x-macpaint",
478
+ ".portpkg" => "application/vnd.macports.portpkg",
479
+ ".pot" => "application/vnd.ms-powerpoint",
480
+ ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12",
481
+ ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template",
482
+ ".ppa" => "application/vnd.ms-powerpoint",
483
+ ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12",
484
+ ".ppd" => "application/vnd.cups-ppd",
485
+ ".ppm" => "image/x-portable-pixmap",
486
+ ".pps" => "application/vnd.ms-powerpoint",
487
+ ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
488
+ ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
489
+ ".ppt" => "application/vnd.ms-powerpoint",
490
+ ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
491
+ ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation",
492
+ ".prc" => "application/vnd.palm",
493
+ ".pre" => "application/vnd.lotus-freelance",
494
+ ".prf" => "application/pics-rules",
495
+ ".ps" => "application/postscript",
496
+ ".psb" => "application/vnd.3gpp.pic-bw-small",
497
+ ".psd" => "image/vnd.adobe.photoshop",
498
+ ".ptid" => "application/vnd.pvi.ptid1",
499
+ ".pub" => "application/x-mspublisher",
500
+ ".pvb" => "application/vnd.3gpp.pic-bw-var",
501
+ ".pwn" => "application/vnd.3m.post-it-notes",
502
+ ".py" => "text/x-script.python",
503
+ ".pya" => "audio/vnd.ms-playready.media.pya",
504
+ ".pyv" => "video/vnd.ms-playready.media.pyv",
505
+ ".qam" => "application/vnd.epson.quickanime",
506
+ ".qbo" => "application/vnd.intu.qbo",
507
+ ".qfx" => "application/vnd.intu.qfx",
508
+ ".qps" => "application/vnd.publishare-delta-tree",
509
+ ".qt" => "video/quicktime",
510
+ ".qtif" => "image/x-quicktime",
511
+ ".qxd" => "application/vnd.quark.quarkxpress",
512
+ ".ra" => "audio/x-pn-realaudio",
513
+ ".rake" => "text/x-script.ruby",
514
+ ".ram" => "audio/x-pn-realaudio",
515
+ ".rar" => "application/x-rar-compressed",
516
+ ".ras" => "image/x-cmu-raster",
517
+ ".rb" => "text/x-script.ruby",
518
+ ".rcprofile" => "application/vnd.ipunplugged.rcprofile",
519
+ ".rdf" => "application/rdf+xml",
520
+ ".rdz" => "application/vnd.data-vision.rdz",
521
+ ".rep" => "application/vnd.businessobjects",
522
+ ".rgb" => "image/x-rgb",
523
+ ".rif" => "application/reginfo+xml",
524
+ ".rl" => "application/resource-lists+xml",
525
+ ".rlc" => "image/vnd.fujixerox.edmics-rlc",
526
+ ".rld" => "application/resource-lists-diff+xml",
527
+ ".rm" => "application/vnd.rn-realmedia",
528
+ ".rmp" => "audio/x-pn-realaudio-plugin",
529
+ ".rms" => "application/vnd.jcp.javame.midlet-rms",
530
+ ".rnc" => "application/relax-ng-compact-syntax",
531
+ ".roff" => "text/troff",
532
+ ".rpm" => "application/x-redhat-package-manager",
533
+ ".rpss" => "application/vnd.nokia.radio-presets",
534
+ ".rpst" => "application/vnd.nokia.radio-preset",
535
+ ".rq" => "application/sparql-query",
536
+ ".rs" => "application/rls-services+xml",
537
+ ".rsd" => "application/rsd+xml",
538
+ ".rss" => "application/rss+xml",
539
+ ".rtf" => "application/rtf",
540
+ ".rtx" => "text/richtext",
541
+ ".ru" => "text/x-script.ruby",
542
+ ".s" => "text/x-asm",
543
+ ".saf" => "application/vnd.yamaha.smaf-audio",
544
+ ".sbml" => "application/sbml+xml",
545
+ ".sc" => "application/vnd.ibm.secure-container",
546
+ ".scd" => "application/x-msschedule",
547
+ ".scm" => "application/vnd.lotus-screencam",
548
+ ".scon" => "application/scon",
549
+ ".scq" => "application/scvp-cv-request",
550
+ ".scs" => "application/scvp-cv-response",
551
+ ".sdkm" => "application/vnd.solent.sdkm+xml",
552
+ ".sdp" => "application/sdp",
553
+ ".see" => "application/vnd.seemail",
554
+ ".sema" => "application/vnd.sema",
555
+ ".semd" => "application/vnd.semd",
556
+ ".semf" => "application/vnd.semf",
557
+ ".setpay" => "application/set-payment-initiation",
558
+ ".setreg" => "application/set-registration-initiation",
559
+ ".sfd" => "application/vnd.hydrostatix.sof-data",
560
+ ".sfs" => "application/vnd.spotfire.sfs",
561
+ ".sgm" => "text/sgml",
562
+ ".sgml" => "text/sgml",
563
+ ".sh" => "application/x-sh",
564
+ ".shar" => "application/x-shar",
565
+ ".shf" => "application/shf+xml",
566
+ ".sig" => "application/pgp-signature",
567
+ ".sit" => "application/x-stuffit",
568
+ ".sitx" => "application/x-stuffitx",
569
+ ".skp" => "application/vnd.koan",
570
+ ".slt" => "application/vnd.epson.salt",
571
+ ".smi" => "application/smil+xml",
572
+ ".snd" => "audio/basic",
573
+ ".so" => "application/octet-stream",
574
+ ".spf" => "application/vnd.yamaha.smaf-phrase",
575
+ ".spl" => "application/x-futuresplash",
576
+ ".spot" => "text/vnd.in3d.spot",
577
+ ".spp" => "application/scvp-vp-response",
578
+ ".spq" => "application/scvp-vp-request",
579
+ ".src" => "application/x-wais-source",
580
+ ".srx" => "application/sparql-results+xml",
581
+ ".sse" => "application/vnd.kodak-descriptor",
582
+ ".ssf" => "application/vnd.epson.ssf",
583
+ ".ssml" => "application/ssml+xml",
584
+ ".stf" => "application/vnd.wt.stf",
585
+ ".stk" => "application/hyperstudio",
586
+ ".str" => "application/vnd.pg.format",
587
+ ".sus" => "application/vnd.sus-calendar",
588
+ ".sv4cpio" => "application/x-sv4cpio",
589
+ ".sv4crc" => "application/x-sv4crc",
590
+ ".svd" => "application/vnd.svd",
591
+ ".svg" => "image/svg+xml",
592
+ ".svgz" => "image/svg+xml",
593
+ ".swf" => "application/x-shockwave-flash",
594
+ ".swi" => "application/vnd.arastra.swi",
595
+ ".t" => "text/troff",
596
+ ".tao" => "application/vnd.tao.intent-module-archive",
597
+ ".tar" => "application/x-tar",
598
+ ".tbz" => "application/x-bzip-compressed-tar",
599
+ ".tcap" => "application/vnd.3gpp2.tcap",
600
+ ".tcl" => "application/x-tcl",
601
+ ".tex" => "application/x-tex",
602
+ ".texi" => "application/x-texinfo",
603
+ ".texinfo" => "application/x-texinfo",
604
+ ".text" => "text/plain",
605
+ ".tif" => "image/tiff",
606
+ ".tiff" => "image/tiff",
607
+ ".tmo" => "application/vnd.tmobile-livetv",
608
+ ".torrent" => "application/x-bittorrent",
609
+ ".tpl" => "application/vnd.groove-tool-template",
610
+ ".tpt" => "application/vnd.trid.tpt",
611
+ ".tr" => "text/troff",
612
+ ".tra" => "application/vnd.trueapp",
613
+ ".trm" => "application/x-msterminal",
614
+ ".tsv" => "text/tab-separated-values",
615
+ ".ttf" => "application/octet-stream",
616
+ ".twd" => "application/vnd.simtech-mindmapper",
617
+ ".txd" => "application/vnd.genomatix.tuxedo",
618
+ ".txf" => "application/vnd.mobius.txf",
619
+ ".txt" => "text/plain",
620
+ ".ufd" => "application/vnd.ufdl",
621
+ ".umj" => "application/vnd.umajin",
622
+ ".unityweb" => "application/vnd.unity",
623
+ ".uoml" => "application/vnd.uoml+xml",
624
+ ".uri" => "text/uri-list",
625
+ ".ustar" => "application/x-ustar",
626
+ ".utz" => "application/vnd.uiq.theme",
627
+ ".uu" => "text/x-uuencode",
628
+ ".vcd" => "application/x-cdlink",
629
+ ".vcf" => "text/x-vcard",
630
+ ".vcg" => "application/vnd.groove-vcard",
631
+ ".vcs" => "text/x-vcalendar",
632
+ ".vcx" => "application/vnd.vcx",
633
+ ".vis" => "application/vnd.visionary",
634
+ ".viv" => "video/vnd.vivo",
635
+ ".vrml" => "model/vrml",
636
+ ".vsd" => "application/vnd.visio",
637
+ ".vsf" => "application/vnd.vsf",
638
+ ".vtu" => "model/vnd.vtu",
639
+ ".vxml" => "application/voicexml+xml",
640
+ ".war" => "application/java-archive",
641
+ ".wav" => "audio/x-wav",
642
+ ".wax" => "audio/x-ms-wax",
643
+ ".wbmp" => "image/vnd.wap.wbmp",
644
+ ".wbs" => "application/vnd.criticaltools.wbs+xml",
645
+ ".wbxml" => "application/vnd.wap.wbxml",
646
+ ".webm" => "video/webm",
647
+ ".wm" => "video/x-ms-wm",
648
+ ".wma" => "audio/x-ms-wma",
649
+ ".wmd" => "application/x-ms-wmd",
650
+ ".wmf" => "application/x-msmetafile",
651
+ ".wml" => "text/vnd.wap.wml",
652
+ ".wmlc" => "application/vnd.wap.wmlc",
653
+ ".wmls" => "text/vnd.wap.wmlscript",
654
+ ".wmlsc" => "application/vnd.wap.wmlscriptc",
655
+ ".wmv" => "video/x-ms-wmv",
656
+ ".wmx" => "video/x-ms-wmx",
657
+ ".wmz" => "application/x-ms-wmz",
658
+ ".woff" => "application/font-woff",
659
+ ".woff2" => "application/font-woff2",
660
+ ".wpd" => "application/vnd.wordperfect",
661
+ ".wpl" => "application/vnd.ms-wpl",
662
+ ".wps" => "application/vnd.ms-works",
663
+ ".wqd" => "application/vnd.wqd",
664
+ ".wri" => "application/x-mswrite",
665
+ ".wrl" => "model/vrml",
666
+ ".wsdl" => "application/wsdl+xml",
667
+ ".wspolicy" => "application/wspolicy+xml",
668
+ ".wtb" => "application/vnd.webturbo",
669
+ ".wvx" => "video/x-ms-wvx",
670
+ ".x3d" => "application/vnd.hzn-3d-crossword",
671
+ ".xar" => "application/vnd.xara",
672
+ ".xbd" => "application/vnd.fujixerox.docuworks.binder",
673
+ ".xbm" => "image/x-xbitmap",
674
+ ".xdm" => "application/vnd.syncml.dm+xml",
675
+ ".xdp" => "application/vnd.adobe.xdp+xml",
676
+ ".xdw" => "application/vnd.fujixerox.docuworks",
677
+ ".xenc" => "application/xenc+xml",
678
+ ".xer" => "application/patch-ops-error+xml",
679
+ ".xfdf" => "application/vnd.adobe.xfdf",
680
+ ".xfdl" => "application/vnd.xfdl",
681
+ ".xhtml" => "application/xhtml+xml",
682
+ ".xif" => "image/vnd.xiff",
683
+ ".xla" => "application/vnd.ms-excel",
684
+ ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12",
685
+ ".xls" => "application/vnd.ms-excel",
686
+ ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
687
+ ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
688
+ ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12",
689
+ ".xlt" => "application/vnd.ms-excel",
690
+ ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
691
+ ".xml" => "application/xml",
692
+ ".xo" => "application/vnd.olpc-sugar",
693
+ ".xop" => "application/xop+xml",
694
+ ".xpm" => "image/x-xpixmap",
695
+ ".xpr" => "application/vnd.is-xpr",
696
+ ".xps" => "application/vnd.ms-xpsdocument",
697
+ ".xpw" => "application/vnd.intercon.formnet",
698
+ ".xsl" => "application/xml",
699
+ ".xslt" => "application/xslt+xml",
700
+ ".xsm" => "application/vnd.syncml+xml",
701
+ ".xspf" => "application/xspf+xml",
702
+ ".xul" => "application/vnd.mozilla.xul+xml",
703
+ ".xwd" => "image/x-xwindowdump",
704
+ ".xyz" => "chemical/x-xyz",
705
+ ".yaml" => "text/yaml",
706
+ ".yml" => "text/yaml",
707
+ ".zaz" => "application/vnd.zzazz.deck+xml",
708
+ ".zip" => "application/zip",
709
+ ".zmm" => "application/vnd.handheld-entertainment+xml",
710
+ }
711
+
712
+ end
713
+ end