waitress-core 0.0.1

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 (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