diff options
Diffstat (limited to 'projects/mongrel_upload_progress/lib/mongrel_upload_progress/init.rb')
-rw-r--r-- | projects/mongrel_upload_progress/lib/mongrel_upload_progress/init.rb | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/projects/mongrel_upload_progress/lib/mongrel_upload_progress/init.rb b/projects/mongrel_upload_progress/lib/mongrel_upload_progress/init.rb deleted file mode 100644 index 5ef1f7e..0000000 --- a/projects/mongrel_upload_progress/lib/mongrel_upload_progress/init.rb +++ /dev/null @@ -1,90 +0,0 @@ -require 'mongrel' -require 'gem_plugin' - -class Upload < GemPlugin::Plugin "/handlers" - include Mongrel::HttpHandlerPlugin - - def initialize(options = {}) - @path_info = Array(options[:path_info]) - @frequency = options[:frequency] || 3 - @request_notify = true - if options[:drb] - require 'drb' - DRb.start_service - Mongrel.const_set :Uploads, DRbObject.new(nil, options[:drb]) - else - Mongrel.const_set :Uploads, Mongrel::UploadProgress.new - end - Mongrel::Uploads.debug = true if options[:debug] - end - - def request_begins(params) - upload_notify(:add, params, params[Mongrel::Const::CONTENT_LENGTH].to_i) - end - - def request_progress(params, clen, total) - upload_notify(:mark, params, clen) - end - - def process(request, response) - upload_notify(:finish, request.params) - end - - private - def upload_notify(action, params, *args) - return unless @path_info.include?(params['PATH_INFO']) && - params[Mongrel::Const::REQUEST_METHOD] == 'POST' && - upload_id = Mongrel::HttpRequest.query_parse(params['QUERY_STRING'])['upload_id'] - if action == :mark - last_checked_time = Mongrel::Uploads.last_checked(upload_id) - return unless last_checked_time && Time.now - last_checked_time > @frequency - end - Mongrel::Uploads.send(action, upload_id, *args) - Mongrel::Uploads.update_checked_time(upload_id) unless action == :finish - end -end - -# Keeps track of the status of all currently processing uploads -class Mongrel::UploadProgress - attr_accessor :debug - def initialize - @guard = Mutex.new - @counters = {} - end - - def check(upid) - @counters[upid].last rescue nil - end - - def last_checked(upid) - @counters[upid].first rescue nil - end - - def update_checked_time(upid) - @guard.synchronize { @counters[upid][0] = Time.now } - end - - def add(upid, size) - @guard.synchronize do - @counters[upid] = [Time.now, {:size => size, :received => 0}] - puts "#{upid}: Added" if @debug - end - end - - def mark(upid, len) - return unless status = check(upid) - puts "#{upid}: Marking" if @debug - @guard.synchronize { status[:received] = status[:size] - len } - end - - def finish(upid) - @guard.synchronize do - puts "#{upid}: Finished" if @debug - @counters.delete(upid) - end - end - - def list - @counters.keys.sort - end -end
\ No newline at end of file |