waves 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/bin/waves +4 -3
  2. data/doc/VERSION +1 -1
  3. data/lib/waves.rb +52 -40
  4. data/lib/{caches → waves/caches}/file.rb +3 -1
  5. data/lib/waves/caches/memcached.rb +56 -0
  6. data/lib/{caches → waves/caches}/simple.rb +6 -7
  7. data/lib/{caches → waves/caches}/synchronized.rb +15 -1
  8. data/lib/{commands → waves/commands}/console.rb +4 -4
  9. data/lib/{commands → waves/commands}/generate.rb +6 -5
  10. data/lib/{commands → waves/commands}/help.rb +0 -0
  11. data/lib/{commands → waves/commands}/server.rb +1 -1
  12. data/lib/{dispatchers → waves/dispatchers}/base.rb +17 -31
  13. data/lib/waves/dispatchers/default.rb +19 -0
  14. data/lib/{ext → waves/ext}/float.rb +0 -0
  15. data/lib/{ext → waves/ext}/hash.rb +0 -0
  16. data/lib/{ext → waves/ext}/integer.rb +16 -1
  17. data/lib/{ext → waves/ext}/kernel.rb +3 -7
  18. data/lib/{ext → waves/ext}/module.rb +3 -3
  19. data/lib/{ext → waves/ext}/object.rb +2 -0
  20. data/lib/waves/ext/string.rb +73 -0
  21. data/lib/{ext → waves/ext}/symbol.rb +0 -1
  22. data/lib/{ext → waves/ext}/tempfile.rb +0 -0
  23. data/lib/waves/ext/time.rb +5 -0
  24. data/lib/{foundations → waves/foundations}/classic.rb +9 -21
  25. data/lib/{foundations → waves/foundations}/compact.rb +15 -20
  26. data/lib/waves/foundations/rest.rb +311 -0
  27. data/lib/waves/helpers/basic.rb +13 -0
  28. data/lib/{helpers → waves/helpers}/doc_type.rb +3 -0
  29. data/lib/waves/helpers/form.rb +94 -0
  30. data/lib/waves/helpers/formatting.rb +14 -0
  31. data/lib/waves/layers/mvc.rb +65 -0
  32. data/lib/{layers → waves/layers}/mvc/controllers.rb +0 -0
  33. data/lib/{layers → waves/layers}/mvc/extensions.rb +23 -11
  34. data/lib/{layers → waves/layers}/orm/migration.rb +0 -0
  35. data/lib/{layers → waves/layers}/orm/providers/active_record.rb +2 -5
  36. data/lib/{layers → waves/layers}/orm/providers/active_record/migrations/empty.rb.erb +0 -0
  37. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/generate.rb +1 -1
  38. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/schema.rb +1 -1
  39. data/lib/{layers → waves/layers}/orm/providers/data_mapper.rb +0 -0
  40. data/lib/{layers → waves/layers}/orm/providers/filebase.rb +0 -0
  41. data/lib/{layers → waves/layers}/orm/providers/sequel.rb +28 -29
  42. data/lib/{layers → waves/layers}/orm/providers/sequel/migrations/empty.rb.erb +0 -0
  43. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/generate.rb +1 -1
  44. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/schema.rb +2 -0
  45. data/lib/waves/layers/rack/rack_cache.rb +32 -0
  46. data/lib/waves/layers/renderers/erubis.rb +52 -0
  47. data/lib/waves/layers/renderers/haml.rb +67 -0
  48. data/lib/waves/layers/renderers/markaby.rb +41 -0
  49. data/lib/waves/layers/text/inflect/english.rb +42 -0
  50. data/lib/waves/matchers/accept.rb +47 -0
  51. data/lib/waves/matchers/ext.rb +27 -0
  52. data/lib/waves/matchers/path.rb +72 -0
  53. data/lib/waves/matchers/query.rb +43 -0
  54. data/lib/waves/matchers/request.rb +86 -0
  55. data/lib/waves/matchers/requested.rb +31 -0
  56. data/lib/{matchers → waves/matchers}/resource.rb +8 -1
  57. data/lib/waves/matchers/traits.rb +30 -0
  58. data/lib/waves/matchers/uri.rb +69 -0
  59. data/lib/waves/media/mime_types.rb +542 -0
  60. data/lib/waves/renderers/mixin.rb +9 -0
  61. data/lib/waves/request/accept.rb +92 -0
  62. data/lib/{runtime → waves/request}/request.rb +77 -61
  63. data/lib/waves/resources/file_mixin.rb +11 -0
  64. data/lib/{resources → waves/resources}/mixin.rb +42 -44
  65. data/lib/waves/resources/paths.rb +132 -0
  66. data/lib/waves/response/client_errors.rb +10 -0
  67. data/lib/waves/response/packaged.rb +19 -0
  68. data/lib/waves/response/redirects.rb +35 -0
  69. data/lib/{runtime → waves/response}/response.rb +29 -11
  70. data/lib/{runtime → waves/response}/response_mixin.rb +30 -17
  71. data/lib/waves/runtime/applications.rb +18 -0
  72. data/lib/{runtime → waves/runtime}/configuration.rb +31 -25
  73. data/lib/waves/runtime/console.rb +24 -0
  74. data/lib/{runtime → waves/runtime}/logger.rb +3 -3
  75. data/lib/{runtime → waves/runtime}/mocks.rb +2 -2
  76. data/lib/waves/runtime/rackup.rb +37 -0
  77. data/lib/waves/runtime/runtime.rb +48 -0
  78. data/lib/waves/runtime/server.rb +33 -0
  79. data/lib/{servers → waves/servers}/base.rb +0 -0
  80. data/lib/{servers → waves/servers}/mongrel.rb +0 -0
  81. data/lib/{servers → waves/servers}/webrick.rb +0 -0
  82. data/lib/{tasks → waves/tasks}/gem.rb +0 -0
  83. data/lib/{tasks → waves/tasks}/generate.rb +0 -0
  84. data/lib/waves/views/cassy.rb +173 -0
  85. data/lib/{views → waves/views}/errors.rb +8 -7
  86. data/lib/waves/views/mixin.rb +23 -0
  87. data/lib/waves/views/templated.rb +40 -0
  88. data/samples/basic/basic_startup.rb +70 -0
  89. data/samples/basic/config.ru +9 -0
  90. data/samples/blog/configurations/development.rb +17 -16
  91. data/samples/blog/configurations/production.rb +0 -11
  92. data/samples/blog/resources/entry.rb +3 -3
  93. data/samples/blog/resources/map.rb +10 -3
  94. data/samples/blog/startup.rb +4 -3
  95. data/templates/classic/Rakefile +28 -29
  96. data/templates/classic/configurations/default.rb.erb +8 -3
  97. data/templates/classic/configurations/development.rb.erb +1 -20
  98. data/templates/classic/configurations/production.rb.erb +2 -16
  99. data/templates/classic/public/images/favicon.ico +0 -0
  100. data/templates/classic/resources/server.rb.erb +9 -0
  101. data/templates/classic/startup.rb.erb +3 -3
  102. data/templates/classic/views/css.rb.erb +14 -0
  103. data/templates/classic/views/default.rb.erb +17 -0
  104. data/templates/classic/views/errors.rb.erb +10 -0
  105. data/templates/classic/views/pages.rb.erb +14 -0
  106. data/templates/compact/startup.rb.erb +8 -3
  107. data/test/ext/object.rb +55 -0
  108. data/test/ext/shortcuts.rb +73 -0
  109. data/test/helpers.rb +17 -0
  110. data/test/match/accept.rb +78 -0
  111. data/test/match/ext.rb +156 -0
  112. data/test/match/methods.rb +22 -0
  113. data/test/match/params.rb +33 -0
  114. data/test/match/path.rb +106 -0
  115. data/test/match/query.rb +60 -0
  116. data/test/match/request.rb +91 -0
  117. data/test/match/requested.rb +149 -0
  118. data/test/match/uri.rb +136 -0
  119. data/test/process/request.rb +75 -0
  120. data/test/process/resource.rb +53 -0
  121. data/test/resources/path.rb +166 -0
  122. data/test/runtime/configurations.rb +19 -0
  123. data/test/runtime/request.rb +63 -0
  124. data/test/runtime/response.rb +85 -0
  125. data/test/views/views.rb +40 -0
  126. metadata +243 -157
  127. data/lib/caches/memcached.rb +0 -40
  128. data/lib/dispatchers/default.rb +0 -25
  129. data/lib/ext/string.rb +0 -20
  130. data/lib/helpers/basic.rb +0 -11
  131. data/lib/helpers/extended.rb +0 -21
  132. data/lib/helpers/form.rb +0 -42
  133. data/lib/helpers/formatting.rb +0 -30
  134. data/lib/helpers/layouts.rb +0 -37
  135. data/lib/helpers/model.rb +0 -37
  136. data/lib/helpers/view.rb +0 -22
  137. data/lib/layers/inflect/english.rb +0 -67
  138. data/lib/layers/mvc.rb +0 -54
  139. data/lib/layers/renderers/erubis.rb +0 -60
  140. data/lib/layers/renderers/haml.rb +0 -47
  141. data/lib/layers/renderers/markaby.rb +0 -29
  142. data/lib/matchers/accept.rb +0 -21
  143. data/lib/matchers/base.rb +0 -30
  144. data/lib/matchers/content_type.rb +0 -17
  145. data/lib/matchers/path.rb +0 -67
  146. data/lib/matchers/query.rb +0 -21
  147. data/lib/matchers/request.rb +0 -27
  148. data/lib/matchers/traits.rb +0 -19
  149. data/lib/matchers/uri.rb +0 -20
  150. data/lib/renderers/mixin.rb +0 -36
  151. data/lib/resources/paths.rb +0 -34
  152. data/lib/runtime/console.rb +0 -23
  153. data/lib/runtime/mime_types.rb +0 -536
  154. data/lib/runtime/monitor.rb +0 -32
  155. data/lib/runtime/runtime.rb +0 -67
  156. data/lib/runtime/server.rb +0 -20
  157. data/lib/runtime/session.rb +0 -27
  158. data/lib/runtime/worker.rb +0 -86
  159. data/lib/views/mixin.rb +0 -62
  160. data/samples/blog/blog.db +0 -0
  161. data/samples/blog/log/waves.production +0 -3
  162. data/templates/classic/resources/map.rb.erb +0 -8
  163. data/templates/classic/templates/errors/not_found_404.mab +0 -7
  164. data/templates/classic/templates/errors/server_error_500.mab +0 -7
  165. data/templates/classic/templates/layouts/default.mab +0 -14
  166. data/templates/classic/tmp/sessions/.gitignore +0 -0
@@ -0,0 +1,31 @@
1
+ module Waves
2
+ module Matchers
3
+
4
+ #
5
+ # Matches the MIME-type of the URI path (using the extension)
6
+ # and, failing that, falls back to the accept header
7
+ #
8
+ # Use :extension or :ext for matching the extension itself or
9
+ # :accept to match the actual HTTP Accept header
10
+ #
11
+
12
+ class Requested
13
+
14
+ def initialize( val ) ; @val = val ; end
15
+
16
+ def call( request )
17
+ request.requested.include?( @val )
18
+ end
19
+
20
+ # Proc-like interface
21
+ #
22
+ def [](request)
23
+ call request
24
+ end
25
+
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -2,6 +2,14 @@ module Waves
2
2
 
3
3
  module Matchers
4
4
 
5
+ #
6
+ # todo:
7
+ # hmmm ... it turns out there don't seem to be a whole lot
8
+ # of matchers that aren't request-based. and by "whole lot"
9
+ # i really mean "any" ... so maybe we don't need this extra
10
+ # layer of abstraction? -dan
11
+ #
12
+
5
13
  class Resource
6
14
 
7
15
  def initialize( options )
@@ -10,7 +18,6 @@ module Waves
10
18
 
11
19
  def call( resource ) ; @matcher.call( resource.request ) ; end
12
20
  def []( *args ) ; call( *args ) ; end
13
-
14
21
 
15
22
  end
16
23
 
@@ -0,0 +1,30 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ # @todo Umm.. what all can exist here? --rue
6
+ #
7
+ class Traits
8
+ def initialize(pattern)
9
+ raise ArgumentError, "No traits given!" unless pattern
10
+ @pattern = pattern
11
+ end
12
+
13
+ def call( request )
14
+ @pattern.all? do | key, val |
15
+ ( val.is_a? Proc and val.call( request.traits[ key ] ) ) or val === request.traits[ key ]
16
+ end
17
+ end
18
+
19
+ # Proc-like interface
20
+ #
21
+ def [](request)
22
+ call request
23
+ end
24
+
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,69 @@
1
+ module Waves
2
+
3
+ module Matchers
4
+
5
+ # Matcher for the whole URL.
6
+ #
7
+ class URI
8
+
9
+ attr_accessor :constraints
10
+
11
+ def initialize(options)
12
+
13
+ # Simplest to fake it if there is no path to match
14
+ @path = if options[:path]
15
+ Waves::Matchers::Path.new( options[:path] )
16
+ else
17
+ lambda { {} }
18
+ end
19
+
20
+ @constraints = {}
21
+
22
+ @constraints[:host] = options[:host] if options[:host]
23
+ @constraints[:port] = options[:port] if options[:port]
24
+ @constraints[:scheme] = options[:scheme] if options[:scheme]
25
+
26
+ raise ArgumentError, "No URI matching" if !@path and @constraints.empty?
27
+ end
28
+
29
+ # Match resource URL.
30
+ #
31
+ # This returns the set of captures if matching!
32
+ #
33
+ def call(request)
34
+ if captures = @path.call(request) and test(request)
35
+ captures
36
+ end
37
+ end
38
+
39
+ #
40
+ # @todo This could maybe be optimised by detecting
41
+ # empty constraints before calling. Not high
42
+ # importance. --rue
43
+ #
44
+ def test(request)
45
+ constraints.all? {|key, val|
46
+ if val.nil? or val == true
47
+ true
48
+ else
49
+ if val.respond_to? :call
50
+ val.call( request )
51
+ else
52
+ val == request.send( key ) or val === request.send( key ) or request.send( key ) === val
53
+ end
54
+ end
55
+ }
56
+ end
57
+
58
+ # Proc-like interface
59
+ #
60
+ def [](request)
61
+ call request
62
+ end
63
+
64
+
65
+ end
66
+
67
+ end
68
+
69
+ end
@@ -0,0 +1,542 @@
1
+ # @todo Maybe split this out into 5-20 really common MIME types
2
+ # and allow importing the rest with some switch (and of
3
+ # course just introducing them.) This *might* lead to some
4
+ # space/runtime savings. --rue
5
+ #
6
+ module Waves
7
+
8
+ # Mapping from file extensions to MIME types.
9
+ #
10
+ # Each extension may have multiple types. Originally
11
+ # taken from Mongrel.
12
+ #
13
+
14
+ MimeTypes = Hash.new {|h, k| h[k] = [] }
15
+
16
+ # Build up MimeTypes
17
+ MimeTypes[".skd"] << "application/x-koan"
18
+ MimeTypes[".el"] << "text/x-script.elisp"
19
+ MimeTypes[".iges"] << "application/iges"
20
+ MimeTypes[".iefs"] << "image/ief"
21
+ MimeTypes[".omcr"] << "application/x-omcregerator"
22
+ MimeTypes[".spc"] << "text/x-speech"
23
+ MimeTypes[".mng"] << "video/x-mng"
24
+ MimeTypes[".deb"] << "application/octet-stream"
25
+ MimeTypes[".mzz"] << "application/x-vnd.audioexplosion.mzz"
26
+ MimeTypes[".csh"] << "text/x-script.csh"
27
+ MimeTypes[".pfx"] << "application/x-pkcs12"
28
+ MimeTypes[".lhx"] << "application/octet-stream"
29
+ MimeTypes[".xls"] << "application/excel"
30
+ MimeTypes[".wsc"] << "text/scriplet"
31
+ MimeTypes[".tsp"] << "audio/tsplayer"
32
+ MimeTypes[".ccad"] << "application/clariscad"
33
+ MimeTypes[".mpga"] << "audio/mpeg"
34
+ MimeTypes[".pps"] << "application/mspowerpoint"
35
+ MimeTypes[".htt"] << "text/webviewhtml"
36
+ MimeTypes[".texinfo"] << "application/x-texinfo"
37
+ MimeTypes[".p10"] << "application/x-pkcs10"
38
+ MimeTypes[".xlt"] << "application/excel"
39
+ MimeTypes[".ppt"] << "application/mspowerpoint"
40
+ MimeTypes[".es"] << "application/x-esrehber"
41
+ MimeTypes[".fdf"] << "application/vnd.fdf"
42
+ MimeTypes[".def"] << "text/plain"
43
+ MimeTypes[".p12"] << "application/x-pkcs12"
44
+ MimeTypes[".pdb"] << "application/x-pilot"
45
+ MimeTypes[".fpx"] << "image/vnd.net-fpx"
46
+ MimeTypes[".xlv"] << "application/excel"
47
+ MimeTypes[".tk"] << "application/x-tcl"
48
+ MimeTypes[".msi"] << "application/octet-stream"
49
+ MimeTypes[".xlw"] << "application/excel"
50
+ MimeTypes[".xgz"] << "xgl/drawing"
51
+ MimeTypes[".wsrc"] << "application/x-wais-source"
52
+ MimeTypes[".vrt"] << "x-world/x-vrt"
53
+ MimeTypes[".htx"] << "text/html"
54
+ MimeTypes[".js"] << "text/javascript"
55
+ MimeTypes[".fif"] << "image/fif"
56
+ MimeTypes[".pic"] << "image/pict"
57
+ MimeTypes[".doc"] << "application/msword"
58
+ MimeTypes[".setpay"] << "application/set-payment-initiation"
59
+ MimeTypes[".skm"] << "application/x-koan"
60
+ MimeTypes[".tsv"] << "text/tab-separated-values"
61
+ MimeTypes[".pdf"] << "application/pdf"
62
+ MimeTypes[".txt"] << "text/plain"
63
+ MimeTypes[".ppz"] << "application/mspowerpoint"
64
+ MimeTypes[".spl"] << "application/futuresplash"
65
+ MimeTypes[".msm"] << "application/octet-stream"
66
+ MimeTypes[".rexx"] << "text/x-script.rexx"
67
+ MimeTypes[".skp"] << "application/x-koan"
68
+ MimeTypes[".rtx"] << "text/richtext"
69
+ MimeTypes[".jpeg"] << "image/jpeg"
70
+ MimeTypes[".tr"] << "application/x-troff"
71
+ MimeTypes[".css"] << "text/css"
72
+ MimeTypes[".lam"] << "audio/x-liveaudio"
73
+ MimeTypes[".msp"] << "application/octet-stream"
74
+ MimeTypes[".sv4cpio"] << "application/x-sv4cpio"
75
+ MimeTypes[".cc"] << "text/plain"
76
+ MimeTypes[".tbk"] << "application/x-tbook"
77
+ MimeTypes[".class"] << "application/octet-stream"
78
+ MimeTypes[".png"] << "image/png"
79
+ MimeTypes[".acgi"] << "text/html"
80
+ MimeTypes[".psd"] << "application/octet-stream"
81
+ MimeTypes[".skt"] << "application/x-koan"
82
+ MimeTypes[".spr"] << "application/x-sprite"
83
+ MimeTypes[".idc"] << "text/plain"
84
+ MimeTypes[".bas"] << "text/plain"
85
+ MimeTypes[".gtar"] << "application/x-gtar"
86
+ MimeTypes[".bcpio"] << "application/x-bcpio"
87
+ MimeTypes[".xof"] << "x-world/x-vrml"
88
+ MimeTypes[".der"] << "application/x-x509-ca-cert"
89
+ MimeTypes[".mbd"] << "application/mbedlet"
90
+ MimeTypes[".rmi"] << "audio/mid"
91
+ MimeTypes[".turbot"] << "image/florian"
92
+ MimeTypes[".mc"] << "application/x-magic-cap-package-1.0"
93
+ MimeTypes[".ra"] << "audio/x-realaudio"
94
+ MimeTypes[".xpix"] << "application/x-vnd.ls-xpix"
95
+ MimeTypes[".wiz"] << "application/msword"
96
+ MimeTypes[".cxx"] << "text/plain"
97
+ MimeTypes[".me"] << "application/x-troff-me"
98
+ MimeTypes[".lzh"] << "application/x-lzh"
99
+ MimeTypes[".hh"] << "text/plain"
100
+ MimeTypes[".arc"] << "application/octet-stream"
101
+ MimeTypes[".rmm"] << "audio/x-pn-realaudio"
102
+ MimeTypes[".pnm"] << "image/x-portable-anymap"
103
+ MimeTypes[".zsh"] << "text/x-script.zsh"
104
+ MimeTypes[".sid"] << "audio/x-psid"
105
+ MimeTypes[".pfunk"] << "audio/make.my.funk"
106
+ MimeTypes[".zip"] << "application/zip"
107
+ MimeTypes[".wbmp"] << "image/vnd.wap.wbmp"
108
+ MimeTypes[".rmp"] << "audio/x-pn-realaudio-plugin"
109
+ MimeTypes[".iii"] << "application/x-iphone"
110
+ MimeTypes[".snd"] << "audio/x-adpcm"
111
+ MimeTypes[".rf"] << "image/vnd.rn-realflash"
112
+ MimeTypes[".mvb"] << "application/x-msmediaview"
113
+ MimeTypes[".qtc"] << "video/x-qtc"
114
+ MimeTypes[".rast"] << "image/cmu-raster"
115
+ MimeTypes[".arj"] << "application/octet-stream"
116
+ MimeTypes[".ear"] << "application/java-archive"
117
+ MimeTypes[".mm"] << "application/x-meme"
118
+ MimeTypes[".funk"] << "audio/make"
119
+ MimeTypes[".smil"] << "application/smil"
120
+ MimeTypes[".f90"] << "text/x-fortran"
121
+ MimeTypes[".vda"] << "application/vda"
122
+ MimeTypes[".tgz"] << "application/x-compressed"
123
+ MimeTypes[".clp"] << "application/x-msclip"
124
+ MimeTypes[".word"] << "application/msword"
125
+ MimeTypes[".rm"] << "audio/x-pn-realaudio"
126
+ MimeTypes[".sdp"] << "application/x-sdp"
127
+ MimeTypes[".uri"] << "text/uri-list"
128
+ MimeTypes[".latex"] << "application/x-latex"
129
+ MimeTypes[".mpeg"] << "video/mpeg"
130
+ MimeTypes[".ssi"] << "text/x-server-parsed-html"
131
+ MimeTypes[".qti"] << "image/x-quicktime"
132
+ MimeTypes[".m3u"] << "audio/x-mpegurl"
133
+ MimeTypes[".dhh"] << "application/david-heinemeier-hansson"
134
+ MimeTypes[".sdr"] << "application/sounder"
135
+ MimeTypes[".rp"] << "image/vnd.rn-realpix"
136
+ MimeTypes[".ms"] << "application/x-troff-ms"
137
+ MimeTypes[".dmg"] << "application/octet-stream"
138
+ MimeTypes[".deepv"] << "application/x-deepv"
139
+ MimeTypes[".iso"] << "application/octet-stream"
140
+ MimeTypes[".eps"] << "application/postscript"
141
+ MimeTypes[".jfif-tbnl"] << "image/jpeg"
142
+ MimeTypes[".ssm"] << "application/streamingmedia"
143
+ MimeTypes[".lzx"] << "application/x-lzx"
144
+ MimeTypes[".isp"] << "application/x-internet-signup"
145
+ MimeTypes[".wp"] << "application/wordperfect"
146
+ MimeTypes[".ins"] << "application/x-internett-signup"
147
+ MimeTypes[".art"] << "image/x-jg"
148
+ MimeTypes[".mv"] << "video/x-sgi-movie"
149
+ MimeTypes[".fli"] << "video/x-fli"
150
+ MimeTypes[".sit"] << "application/x-stuffit"
151
+ MimeTypes[".rt"] << "text/vnd.rn-realtext"
152
+ MimeTypes[".movie"] << "video/x-sgi-movie"
153
+ MimeTypes[".hpg"] << "application/vnd.hp-hpgl"
154
+ MimeTypes[".htmls"] << "text/html"
155
+ MimeTypes[".sprite"] << "application/x-sprite"
156
+ MimeTypes[".ram"] << "audio/x-pn-realaudio"
157
+ MimeTypes[".pbm"] << "image/x-portable-bitmap"
158
+ MimeTypes[".ncm"] << "application/vnd.nokia.configuration-message"
159
+ MimeTypes[".bin"] << "application/octet-stream"
160
+ MimeTypes[".pm4"] << "application/x-pagemaker"
161
+ MimeTypes[".bsh"] << "application/x-bsh"
162
+ MimeTypes[".lsf"] << "video/x-la-asf"
163
+ MimeTypes[".oda"] << "application/oda"
164
+ MimeTypes[".rv"] << "video/vnd.rn-realvideo"
165
+ MimeTypes[".pm5"] << "application/x-pagemaker"
166
+ MimeTypes[".atom"] << "application/atom+xml"
167
+ MimeTypes[".my"] << "audio/make"
168
+ MimeTypes[".vsd"] << "application/x-visio"
169
+ MimeTypes[".dwg"] << "image/x-dwg"
170
+ MimeTypes[".dcr"] << "application/x-director"
171
+ MimeTypes[".isu"] << "video/x-isvideo"
172
+ MimeTypes[".xyz"] << "chemical/x-pdb"
173
+ MimeTypes[".texi"] << "application/x-texinfo"
174
+ MimeTypes[".part"] << "application/pro_eng"
175
+ MimeTypes[".pgm"] << "image/x-portable-greymap"
176
+ MimeTypes[".g3"] << "image/g3fax"
177
+ MimeTypes[".ai"] << "application/postscript"
178
+ MimeTypes[".flo"] << "image/florian"
179
+ MimeTypes[".a"] << "application/octet-stream"
180
+ MimeTypes[".xwd"] << "image/x-xwindowdump"
181
+ MimeTypes[".vdo"] << "video/vdo"
182
+ MimeTypes[".rar"] << "application/x-rar-compressed"
183
+ MimeTypes[".sst"] << "application/vnd.ms-pkicertstore"
184
+ MimeTypes[".wmlsc"] << "application/vnd.wap.wmlscriptc"
185
+ MimeTypes[".web"] << "application/vnd.xara"
186
+ MimeTypes[".uris"] << "text/uri-list"
187
+ MimeTypes[".ras"] << "image/x-cmu-raster"
188
+ MimeTypes[".c"] << "text/plain"
189
+ MimeTypes[".cod"] << "image/cis-cod"
190
+ MimeTypes[".qd3"] << "x-world/x-3dmf"
191
+ MimeTypes[".flr"] << "x-world/x-vrml"
192
+ MimeTypes[".xml"] << "text/xml"
193
+ MimeTypes[".hpgl"] << "application/vnd.hp-hpgl"
194
+ MimeTypes[".dms"] << "application/octet-stream"
195
+ MimeTypes[".afl"] << "video/animaflex"
196
+ MimeTypes[".rpm"] << "audio/x-pn-realaudio-plugin"
197
+ MimeTypes[".mjf"] << "audio/x-vnd.audioexplosion.mjuicemediafile"
198
+ MimeTypes[".f"] << "text/x-fortran"
199
+ MimeTypes[".java"] << "text/x-java-source"
200
+ MimeTypes[".mod"] << "audio/mod"
201
+ MimeTypes[".jardiff"] << "application/x-java-archive-diff"
202
+ MimeTypes[".g"] << "text/plain"
203
+ MimeTypes[".wk1"] << "application/x-123"
204
+ MimeTypes[".h"] << "text/plain"
205
+ MimeTypes[".lsp"] << "text/x-script.lisp"
206
+ MimeTypes[".sbk"] << "application/x-tbook"
207
+ MimeTypes[".run"] << "application/x-makeself"
208
+ MimeTypes[".mp2"] << "audio/mpeg"
209
+ MimeTypes[".flv"] << "video/x-flv"
210
+ MimeTypes[".wmlc"] << "application/vnd.wap.wmlc"
211
+ MimeTypes[".s3m"] << "audio/s3m"
212
+ MimeTypes[".mp3"] << "audio/mpeg"
213
+ MimeTypes[".pot"] << "application/vnd.ms-powerpoint"
214
+ MimeTypes[".exe"] << "application/octet-stream"
215
+ MimeTypes[".list"] << "text/plain"
216
+ MimeTypes[".tex"] << "application/x-tex"
217
+ MimeTypes[".flx"] << "text/vnd.fmi.flexstor"
218
+ MimeTypes[".text"] << "text/plain"
219
+ MimeTypes[".x-png"] << "image/png"
220
+ MimeTypes[".viv"] << "video/vnd.vivo"
221
+ MimeTypes[".niff"] << "image/x-niff"
222
+ MimeTypes[".drw"] << "application/drafting"
223
+ MimeTypes[".lst"] << "text/plain"
224
+ MimeTypes[".kar"] << "music/x-karaoke"
225
+ MimeTypes[".cer"] << "application/x-x509-ca-cert"
226
+ MimeTypes[".m"] << "text/x-m"
227
+ MimeTypes[".com"] << "text/plain"
228
+ MimeTypes[".pl"] << "text/x-script.perl"
229
+ MimeTypes[".uue"] << "text/x-uuencode"
230
+ MimeTypes[".qcp"] << "audio/vnd.qcelp"
231
+ MimeTypes[".au"] << "audio/x-au"
232
+ MimeTypes[".plx"] << "application/x-pixclscript"
233
+ MimeTypes[".nws"] << "message/rfc822"
234
+ MimeTypes[".sgm"] << "text/x-sgml"
235
+ MimeTypes[".hdf"] << "application/x-hdf"
236
+ MimeTypes[".pm"] << "text/x-script.perl-module"
237
+ MimeTypes[".wp5"] << "application/wordperfect"
238
+ MimeTypes[".saveme"] << "application/octet-stream"
239
+ MimeTypes[".svf"] << "image/x-dwg"
240
+ MimeTypes[".wp6"] << "application/wordperfect"
241
+ MimeTypes[".vst"] << "application/x-visio"
242
+ MimeTypes[".svg"] << "image/svg+xml"
243
+ MimeTypes[".o"] << "application/octet-stream"
244
+ MimeTypes[".igs"] << "application/iges"
245
+ MimeTypes[".pvu"] << "paleovu/x-pv"
246
+ MimeTypes[".mhtml"] << "message/rfc822"
247
+ MimeTypes[".p"] << "text/x-pascal"
248
+ MimeTypes[".m1v"] << "video/mpeg"
249
+ MimeTypes[".lsx"] << "video/x-la-asf"
250
+ MimeTypes[".xaf"] << "x-world/x-vrml"
251
+ MimeTypes[".f77"] << "text/x-fortran"
252
+ MimeTypes[".xmz"] << "xgl/movie"
253
+ MimeTypes[".vsw"] << "application/x-visio"
254
+ MimeTypes[".book"] << "application/book"
255
+ MimeTypes[".aps"] << "application/mime"
256
+ MimeTypes[".cpio"] << "application/x-cpio"
257
+ MimeTypes[".s"] << "text/x-asm"
258
+ MimeTypes[".ps"] << "application/postscript"
259
+ MimeTypes[".wtk"] << "application/x-wintalk"
260
+ MimeTypes[".mjpg"] << "video/x-motion-jpeg"
261
+ MimeTypes[".t"] << "application/x-troff"
262
+ MimeTypes[".dump"] << "application/octet-stream"
263
+ MimeTypes[".jcm"] << "application/x-java-commerce"
264
+ MimeTypes[".env"] << "application/x-envoy"
265
+ MimeTypes[".cha"] << "application/x-chat"
266
+ MimeTypes[".w6w"] << "application/msword"
267
+ MimeTypes[".sdml"] << "text/plain"
268
+ MimeTypes[".tcl"] << "text/x-script.tcl"
269
+ MimeTypes[".rng"] << "application/vnd.nokia.ringing-tone"
270
+ MimeTypes[".ivr"] << "i-world/i-vrml"
271
+ MimeTypes[".vqe"] << "audio/x-twinvq-plugin"
272
+ MimeTypes[".uu"] << "text/x-uuencode"
273
+ MimeTypes[".pem"] << "application/x-x509-ca-cert"
274
+ MimeTypes[".nap"] << "image/naplps"
275
+ MimeTypes[".qd3d"] << "x-world/x-3dmf"
276
+ MimeTypes[".shar"] << "application/x-shar"
277
+ MimeTypes[".vqf"] << "audio/x-twinvq"
278
+ MimeTypes[".mov"] << "video/quicktime"
279
+ MimeTypes[".pyc"] << "applicaiton/x-bytecode.python"
280
+ MimeTypes[".py"] << "text/x-script.phyton"
281
+ MimeTypes[".z"] << "application/x-compressed"
282
+ MimeTypes[".wmls"] << "text/vnd.wap.wmlscript"
283
+ MimeTypes[".sea"] << "application/x-sea"
284
+ MimeTypes[".mcd"] << "application/x-mathcad"
285
+ MimeTypes[".unis"] << "text/uri-list"
286
+ MimeTypes[".svr"] << "x-world/x-svr"
287
+ MimeTypes[".elc"] << "application/x-elc"
288
+ MimeTypes[".ief"] << "image/ief"
289
+ MimeTypes[".aif"] << "audio/aiff"
290
+ MimeTypes[".xhtml"] << "application/xhtml+xml"
291
+ MimeTypes[".gzip"] << "application/x-gzip"
292
+ MimeTypes[".nc"] << "application/x-netcdf"
293
+ MimeTypes[".mcf"] << "text/mcf"
294
+ MimeTypes[".step"] << "application/step"
295
+ MimeTypes[".xpi"] << "application/x-xpinstall"
296
+ MimeTypes[".imap"] << "application/x-httpd-imap"
297
+ MimeTypes[".mime"] << "www/mime"
298
+ MimeTypes[".ivy"] << "application/x-livescreen"
299
+ MimeTypes[".dl"] << "video/dl"
300
+ MimeTypes[".for"] << "text/x-fortran"
301
+ MimeTypes[".crd"] << "application/x-mscardfile"
302
+ MimeTypes[".vql"] << "audio/x-twinvq-plugin"
303
+ MimeTypes[".mme"] << "application/base64"
304
+ MimeTypes[".jnlp"] << "application/x-java-jnlp-file"
305
+ MimeTypes[".xpm"] << "image/xpm"
306
+ MimeTypes[".trm"] << "application/x-msterminal"
307
+ MimeTypes[".ani"] << "application/x-navi-animation"
308
+ MimeTypes[".mrc"] << "application/marc"
309
+ MimeTypes[".asf"] << "video/x-ms-asf"
310
+ MimeTypes[".cco"] << "application/x-cocoa"
311
+ MimeTypes[".zoo"] << "application/octet-stream"
312
+ MimeTypes[".vrml"] << "x-world/x-vrml"
313
+ MimeTypes[".dp"] << "application/commonground"
314
+ MimeTypes[".html"] << "text/html"
315
+ MimeTypes[".qtif"] << "image/x-quicktime"
316
+ MimeTypes[".sh"] << "text/x-script.sh"
317
+ MimeTypes[".wmf"] << "windows/metafile"
318
+ MimeTypes[".pot"] << "application/vnd.ms-powerpoint"
319
+ MimeTypes[".aip"] << "text/x-audiosoft-intra"
320
+ MimeTypes[".wcm"] << "application/vnd.ms-works"
321
+ MimeTypes[".ksh"] << "text/x-script.ksh"
322
+ MimeTypes[".mcp"] << "application/netmc"
323
+ MimeTypes[".ip"] << "application/x-ip2"
324
+ MimeTypes[".sgml"] << "text/x-sgml"
325
+ MimeTypes[".pov"] << "model/x-pov"
326
+ MimeTypes[".rss"] << "text/xml"
327
+ MimeTypes[".mml"] << "text/mathml"
328
+ MimeTypes[".crl"] << "application/pkix-crl"
329
+ MimeTypes[".uni"] << "text/uri-list"
330
+ MimeTypes[".uil"] << "text/x-uil"
331
+ MimeTypes[".rgb"] << "image/x-rgb"
332
+ MimeTypes[".hlb"] << "text/x-script"
333
+ MimeTypes[".asm"] << "text/x-asm"
334
+ MimeTypes[".sl"] << "application/x-seelogo"
335
+ MimeTypes[".rnx"] << "application/vnd.rn-realplayer"
336
+ MimeTypes[".dif"] << "video/x-dv"
337
+ MimeTypes[".dv"] << "video/x-dv"
338
+ MimeTypes[".chat"] << "application/x-chat"
339
+ MimeTypes[".inf"] << "application/inf"
340
+ MimeTypes[".it"] << "audio/it"
341
+ MimeTypes[".pma"] << "application/x-perfmon"
342
+ MimeTypes[".xl"] << "application/excel"
343
+ MimeTypes[".wri"] << "application/mswrite"
344
+ MimeTypes[".wml"] << "text/vnd.wap.wml"
345
+ MimeTypes[".sol"] << "application/solids"
346
+ MimeTypes[".asp"] << "text/asp"
347
+ MimeTypes[".xm"] << "audio/xm"
348
+ MimeTypes[".jfif"] << "image/pjpeg"
349
+ MimeTypes[".nif"] << "image/x-niff"
350
+ MimeTypes[".fmf"] << "video/x-atomic3d-feature"
351
+ MimeTypes[".iv"] << "application/x-inventor"
352
+ MimeTypes[".pmc"] << "application/x-perfmon"
353
+ MimeTypes[".mht"] << "message/rfc822"
354
+ MimeTypes[".roff"] << "application/x-troff"
355
+ MimeTypes[".stl"] << "application/x-navistyle"
356
+ MimeTypes[".talk"] << "text/x-speech"
357
+ MimeTypes[".asr"] << "video/x-ms-asf"
358
+ MimeTypes[".set"] << "application/set"
359
+ MimeTypes[".wrl"] << "application/x-world"
360
+ MimeTypes[".jam"] << "audio/x-jam"
361
+ MimeTypes[".abc"] << "text/vnd.abc"
362
+ MimeTypes[".stm"] << "text/html"
363
+ MimeTypes[".jpe"] << "image/jpeg"
364
+ MimeTypes[".sv4crc"] << "application/x-sv4crc"
365
+ MimeTypes[".voc"] << "audio/x-voc"
366
+ MimeTypes[".prc"] << "application/x-pilot"
367
+ MimeTypes[".m2a"] << "audio/mpeg"
368
+ MimeTypes[".nsc"] << "application/x-conference"
369
+ MimeTypes[".help"] << "application/x-helpfile"
370
+ MimeTypes[".hgl"] << "application/vnd.hp-hpgl"
371
+ MimeTypes[".crt"] << "application/x-x509-ca-cert"
372
+ MimeTypes[".xif"] << "image/vnd.xiff"
373
+ MimeTypes[".pcl"] << "application/x-pcl"
374
+ MimeTypes[".log"] << "text/plain"
375
+ MimeTypes[".jpg"] << "image/jpeg"
376
+ MimeTypes[".ustar"] << "multipart/x-ustar"
377
+ MimeTypes[".cmx"] << "image/x-cmx"
378
+ MimeTypes[".pre"] << "application/x-freelance"
379
+ MimeTypes[".axs"] << "application/olescript"
380
+ MimeTypes[".bz2"] << "application/x-bzip2"
381
+ MimeTypes[".mpv2"] << "video/mpeg"
382
+ MimeTypes[".moov"] << "video/quicktime"
383
+ MimeTypes[".prf"] << "application/pics-rules"
384
+ MimeTypes[".dxf"] << "image/x-dwg"
385
+ MimeTypes[".stp"] << "application/step"
386
+ MimeTypes[".conf"] << "text/plain"
387
+ MimeTypes[".asx"] << "video/x-ms-asf"
388
+ MimeTypes[".la"] << "audio/x-nspaudio"
389
+ MimeTypes[".jar"] << "application/java-archive"
390
+ MimeTypes[".wmv"] << "video/x-ms-wmv"
391
+ MimeTypes[".unv"] << "application/i-deas"
392
+ MimeTypes[".boo"] << "application/book"
393
+ MimeTypes[".ima"] << "application/x-ima"
394
+ MimeTypes[".dir"] << "application/x-director"
395
+ MimeTypes[".frl"] << "application/freeloader"
396
+ MimeTypes[".wb1"] << "application/x-qpro"
397
+ MimeTypes[".hlp"] << "application/hlp"
398
+ MimeTypes[".tar"] << "application/x-tar"
399
+ MimeTypes[".scd"] << "application/x-msschedule"
400
+ MimeTypes[".pml"] << "application/x-perfmon"
401
+ MimeTypes[".evy"] << "application/x-envoy"
402
+ MimeTypes[".gif"] << "image/gif"
403
+ MimeTypes[".jav"] << "text/x-java-source"
404
+ MimeTypes[".pct"] << "image/x-pict"
405
+ MimeTypes[".mpa"] << "audio/mpeg"
406
+ MimeTypes[".xdr"] << "video/x-amt-demorun"
407
+ MimeTypes[".bm"] << "image/bmp"
408
+ MimeTypes[".mpc"] << "application/x-project"
409
+ MimeTypes[".qif"] << "image/x-quicktime"
410
+ MimeTypes[".gl"] << "video/x-gl"
411
+ MimeTypes[".img"] << "application/octet-stream"
412
+ MimeTypes[".gsd"] << "audio/x-gsm"
413
+ MimeTypes[".xsl"] << "application/xslt+xml"
414
+ MimeTypes[".pcx"] << "image/x-pcx"
415
+ MimeTypes[".pmr"] << "application/x-perfmon"
416
+ MimeTypes[".jps"] << "image/x-jps"
417
+ MimeTypes[".mpe"] << "video/mpeg"
418
+ MimeTypes[".src"] << "application/x-wais-source"
419
+ MimeTypes[".man"] << "application/x-troff-man"
420
+ MimeTypes[".wpd"] << "application/wordperfect"
421
+ MimeTypes[".vew"] << "application/groupwise"
422
+ MimeTypes[".dxr"] << "application/x-director"
423
+ MimeTypes[".mpg"] << "video/mpeg"
424
+ MimeTypes[".ico"] << "image/x-icon"
425
+ MimeTypes[".wq1"] << "application/x-lotus"
426
+ MimeTypes[".scm"] << "video/x-scm"
427
+ MimeTypes[".map"] << "application/x-navimap"
428
+ MimeTypes[".nix"] << "application/x-mix-transfer"
429
+ MimeTypes[".vos"] << "video/vosaic"
430
+ MimeTypes[".boz"] << "application/x-bzip2"
431
+ MimeTypes[".jut"] << "image/jutvision"
432
+ MimeTypes[".cat"] << "application/octet-stream"
433
+ MimeTypes[".lha"] << "application/x-lha"
434
+ MimeTypes[".p7a"] << "application/x-pkcs7-signature"
435
+ MimeTypes[".avi"] << "video/avi"
436
+ MimeTypes[".prt"] << "application/pro_eng"
437
+ MimeTypes[".pmw"] << "application/x-perfmon"
438
+ MimeTypes[".smi"] << "application/smil"
439
+ MimeTypes[".p7b"] << "application/x-pkcs7-certificates"
440
+ MimeTypes[".mar"] << "text/plain"
441
+ MimeTypes[".xsr"] << "video/x-amt-showrun"
442
+ MimeTypes[".tiff"] << "image/tiff"
443
+ MimeTypes[".hqx"] << "application/binhex"
444
+ MimeTypes[".p7c"] << "application/x-pkcs7-mime"
445
+ MimeTypes[".lma"] << "audio/x-nspaudio"
446
+ MimeTypes[".swf"] << "application/x-shockwave-flash"
447
+ MimeTypes[".war"] << "application/java-archive"
448
+ MimeTypes[".vcd"] << "application/x-cdlink"
449
+ MimeTypes[".cpp"] << "text/x-c"
450
+ MimeTypes[".gsm"] << "audio/x-gsm"
451
+ MimeTypes[".vox"] << "audio/voxware"
452
+ MimeTypes[".m2v"] << "video/mpeg"
453
+ MimeTypes[".ltx"] << "application/x-latex"
454
+ MimeTypes[".xla"] << "application/excel"
455
+ MimeTypes[".vcf"] << "text/x-vcard"
456
+ MimeTypes[".sct"] << "text/scriptlet"
457
+ MimeTypes[".ppa"] << "application/vnd.ms-powerpoint"
458
+ MimeTypes[".aifc"] << "audio/aiff"
459
+ MimeTypes[".hta"] << "application/hta"
460
+ MimeTypes[".bz"] << "application/x-bzip"
461
+ MimeTypes[".omcd"] << "application/x-omcdatamaker"
462
+ MimeTypes[".mpp"] << "application/vnd.ms-project"
463
+ MimeTypes[".pict"] << "image/pict"
464
+ MimeTypes[".gsp"] << "application/x-gsp"
465
+ MimeTypes[".xlb"] << "application/excel"
466
+ MimeTypes[".wav"] << "audio/x-wav"
467
+ MimeTypes[".eot"] << "application/octet-stream"
468
+ MimeTypes[".cpt"] << "application/x-cpt"
469
+ MimeTypes[".naplps"] << "image/naplps"
470
+ MimeTypes[".htc"] << "text/x-component"
471
+ MimeTypes[".xlc"] << "application/excel"
472
+ MimeTypes[".vmd"] << "application/vocaltec-media-desc"
473
+ MimeTypes[".tif"] << "image/tiff"
474
+ MimeTypes[".pkg"] << "application/x-newton-compatible-pkg"
475
+ MimeTypes[".jng"] << "image/x-jng"
476
+ MimeTypes[".qt"] << "video/quicktime"
477
+ MimeTypes[".tcsh"] << "text/x-script.tcsh"
478
+ MimeTypes[".aiff"] << "audio/aiff"
479
+ MimeTypes[".xld"] << "application/excel"
480
+ MimeTypes[".pub"] << "application/x-mspublisher"
481
+ MimeTypes[".pwz"] << "application/vnd.ms-powerpoint"
482
+ MimeTypes[".gss"] << "application/x-gss"
483
+ MimeTypes[".avs"] << "video/avs-video"
484
+ MimeTypes[".gz"] << "application/x-compressed"
485
+ MimeTypes[".wks"] << "application/vnd.ms-works"
486
+ MimeTypes[".uls"] << "text/iuls"
487
+ MimeTypes[".dll"] << "application/octet-stream"
488
+ MimeTypes[".vmf"] << "application/vocaltec-media-file"
489
+ MimeTypes[".mdb"] << "application/x-msaccess"
490
+ MimeTypes[".nvd"] << "application/x-navidoc"
491
+ MimeTypes[".mpt"] << "application/x-project"
492
+ MimeTypes[".p7m"] << "application/x-pkcs7-mime"
493
+ MimeTypes[".xbm"] << "image/xbm"
494
+ MimeTypes[".cdf"] << "application/cdf"
495
+ MimeTypes[".wps"] << "application/vnd.ms-works"
496
+ MimeTypes[".rtf"] << "text/richtext"
497
+ MimeTypes[".mpv"] << "application/x-project"
498
+ MimeTypes[".m13"] << "application/x-msmediaview"
499
+ MimeTypes[".dvi"] << "application/x-dvi"
500
+ MimeTypes[".shtml"] << "text/x-server-parsed-html"
501
+ MimeTypes[".vivo"] << "video/vnd.vivo"
502
+ MimeTypes[".setreg"] << "application/set-registration-initiation"
503
+ MimeTypes[".etx"] << "text/x-setext"
504
+ MimeTypes[".bmp"] << "image/bmp"
505
+ MimeTypes[".m14"] << "application/x-msmediaview"
506
+ MimeTypes[".wdb"] << "application/vnd.ms-works"
507
+ MimeTypes[".mpx"] << "application/x-project"
508
+ MimeTypes[".midi"] << "audio/x-midi"
509
+ MimeTypes[".pas"] << "text/pascal"
510
+ MimeTypes[".xlk"] << "application/excel"
511
+ MimeTypes[".w60"] << "application/wordperfect6.0"
512
+ MimeTypes[".tsi"] << "audio/tsp-audio"
513
+ MimeTypes[".mid"] << "audio/x-midi"
514
+ MimeTypes[".p7r"] << "application/x-pkcs7-certreqresp"
515
+ MimeTypes[".xll"] << "application/excel"
516
+ MimeTypes[".w61"] << "application/wordperfect6.1"
517
+ MimeTypes[".ppm"] << "image/x-portable-pixmap"
518
+ MimeTypes[".p7s"] << "application/x-pkcs7-signature"
519
+ MimeTypes[".htm"] << "text/html"
520
+ MimeTypes[".pko"] << "application/ynd.ms-pkipko"
521
+ MimeTypes[".xlm"] << "application/excel"
522
+ MimeTypes[".vcs"] << "text/x-vcalendar"
523
+ MimeTypes[".omc"] << "application/x-omc"
524
+ MimeTypes[".mif"] << "application/x-mif"
525
+
526
+ # MIME type to extension mapping.
527
+ #
528
+ # Broadly the inverse of MimeTypes, but there may be
529
+ # some differences in usage. MimeExts type indexes
530
+ # always point to an Array of extensions.
531
+ #
532
+ # @see MimeTypes
533
+ #
534
+ MimeExts = Hash.new {|h, k| h[k] = [] }
535
+
536
+ # Build MimeExts
537
+ MimeTypes.each {|key, values|
538
+ values.each {|value| MimeExts[value] << key }
539
+ }
540
+
541
+ end
542
+