5 module EventManager # :nodoc:
9 @events.clear if @events
16 def register_event(event)
17 (@events ||= []) << event
20 def determine_event(verb, path, if_nil = :present_error)
21 event = events.find(method(if_nil)) do |e|
22 e.verb == verb && e.recognize(path)
27 determine_event(:get, '404', :not_found)
31 Event.new(:get, 'not_found', false) do
34 if request.path_info == '/' && request.request_method == 'GET'
35 erb :default_index, :views_directory => SINATRA_ROOT + '/files'
37 erb :not_found, :views_directory => SINATRA_ROOT + '/files'
46 cattr_accessor :logger
47 cattr_accessor :after_filters
48 cattr_accessor :before_filters
52 self.before_filters = []
53 self.after_filters = []
55 def self.before_attend(method_name = nil, options ={}, &block)
56 setup_filter(:before_filters, method_name, options, &block)
59 def self.after_attend(method_name = nil, options = {}, &block)
60 setup_filter(:after_filters, method_name, options, &block)
63 def self.setup_filter(filter_set_name, method_name, options = {}, &block)
64 raise "Must specify method or block" if method_name.nil? and !block_given?
65 value = if block_given?
70 insert_index = options[:infront] == true ? 0 : -1
71 send(filter_set_name).insert(insert_index, value)
74 after_attend :log_event
76 attr_reader :path, :verb
78 def initialize(verb, path, register = true, &block)
81 @route = Route.new(path)
83 EventManager.register_event(self) if register
87 request.params.merge!(@route.params)
88 context = EventContext.new(request)
90 caught = catch(:halt) do
91 call_filters(before_filters, context)
94 when :filter_chain_completed
96 context.instance_eval(&@block) if @block
105 context.status caught
107 context.body context.body || body || ''
108 call_filters(after_filters, context)
115 @route.recognize(path)
121 if Options.use_mutex?
122 @@mutex.synchronize do
131 # calls a filter chain according to rules.
132 def call_filters(filter_set, context)
133 filter_set.each do |filter|
138 context.instance_eval(&filter)
141 :filter_chain_completed
146 class StaticEvent < Event # :nodoc:
148 def initialize(path, root, register = true)
150 super(:get, path, register)
154 filename = physical_path_for(path)
155 File.exists?(filename) && File.file?(filename)
158 def physical_path_for(path)
159 path.gsub(/^#{@path}/, @root)
163 @filename = physical_path_for(request.path_info)
164 context = EventContext.new(request)
166 context.header 'Content-Type' => MIME_TYPES[File.extname(@filename)[1..-1]]
167 context.header 'Content-Length' => File.size(@filename).to_s
172 File.open(@filename, "rb") do |file|
173 while part = file.read(8192)
182 "ai" => "application/postscript",
183 "asc" => "text/plain",
184 "avi" => "video/x-msvideo",
185 "bin" => "application/octet-stream",
186 "bmp" => "image/bmp",
187 "class" => "application/octet-stream",
188 "cer" => "application/pkix-cert",
189 "crl" => "application/pkix-crl",
190 "crt" => "application/x-x509-ca-cert",
191 #"crl" => "application/x-pkcs7-crl",
193 "dms" => "application/octet-stream",
194 "doc" => "application/msword",
195 "dvi" => "application/x-dvi",
196 "eps" => "application/postscript",
197 "etx" => "text/x-setext",
198 "exe" => "application/octet-stream",
199 "gif" => "image/gif",
200 "htm" => "text/html",
201 "html" => "text/html",
202 "jpe" => "image/jpeg",
203 "jpeg" => "image/jpeg",
204 "jpg" => "image/jpeg",
205 "lha" => "application/octet-stream",
206 "lzh" => "application/octet-stream",
207 "mov" => "video/quicktime",
208 "mpe" => "video/mpeg",
209 "mpeg" => "video/mpeg",
210 "mpg" => "video/mpeg",
211 "pbm" => "image/x-portable-bitmap",
212 "pdf" => "application/pdf",
213 "pgm" => "image/x-portable-graymap",
214 "png" => "image/png",
215 "pnm" => "image/x-portable-anymap",
216 "ppm" => "image/x-portable-pixmap",
217 "ppt" => "application/vnd.ms-powerpoint",
218 "ps" => "application/postscript",
219 "qt" => "video/quicktime",
220 "ras" => "image/x-cmu-raster",
221 "rb" => "text/plain",
222 "rd" => "text/plain",
223 "rtf" => "application/rtf",
224 "sgm" => "text/sgml",
225 "sgml" => "text/sgml",
226 "tif" => "image/tiff",
227 "tiff" => "image/tiff",
228 "txt" => "text/plain",
229 "xbm" => "image/x-xbitmap",
230 "xls" => "application/vnd.ms-excel",
232 "xpm" => "image/x-xpixmap",
233 "xwd" => "image/x-xwindowdump",
234 "zip" => "application/zip",