mongrel_upload_progress 0.1 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -15,14 +15,14 @@ setup_rdoc ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc']
15
15
  desc "Does a full compile, test run"
16
16
  task :default => [:test, :package]
17
17
 
18
- version="0.1"
18
+ version="0.2"
19
19
  name="mongrel_upload_progress"
20
20
 
21
21
  setup_gem(name, version) do |spec|
22
22
  spec.summary = "The mongrel_upload_progress GemPlugin"
23
23
  spec.description = spec.summary
24
24
  spec.author="Nobody"
25
- spec.add_dependency('mongrel', '>= 0.3.13')
25
+ spec.add_dependency('mongrel', '>= 0.3.13.3')
26
26
  spec.add_dependency('gem_plugin', '>= 0.2.1')
27
27
  spec.files += Dir.glob("resources/**/*")
28
28
  end
@@ -1,67 +1,98 @@
1
1
  require 'mongrel'
2
2
  require 'gem_plugin'
3
3
 
4
- class Mongrel::Uploads
5
- include Singleton
4
+ class Upload < GemPlugin::Plugin "/handlers"
5
+ include Mongrel::HttpHandlerPlugin
6
+
7
+ def initialize(options = {})
8
+ @path_info = options[:path_info]
9
+ @frequency = options[:frequency] || 3
10
+ @request_notify = true
11
+ if options[:drb]
12
+ require 'drb'
13
+ DRb.start_service
14
+ Mongrel.const_set :Uploads, DRbObject.new(nil, options[:drb])
15
+ else
16
+ Mongrel.const_set :Uploads, Mongrel::UploadProgress.new
17
+ end
18
+ Mongrel::Uploads.debug = true if options[:debug]
19
+ end
20
+
21
+ def request_begins(params)
22
+ upload_notify(:add, params, params[Mongrel::Const::CONTENT_LENGTH].to_i)
23
+ end
24
+
25
+ def request_progress(params, clen, total)
26
+ upload_notify(:mark, params, clen)
27
+ end
28
+
29
+ def process(request, response)
30
+ upload_notify(:finish, request.params)
31
+ end
32
+
33
+ private
34
+ def upload_notify(action, params, *args)
35
+ return unless params['PATH_INFO'] == @path_info &&
36
+ params[Mongrel::Const::REQUEST_METHOD] == 'POST' &&
37
+ upload_id = Mongrel::HttpRequest.query_parse(params['QUERY_STRING'])['upload_id']
38
+ if action == :mark
39
+ last_checked_time = instance_variable_get(checked_var(upload_id)) rescue nil
40
+ return unless last_checked_time && Time.now - last_checked_time > @frequency
41
+ end
42
+ return unless Mongrel::Uploads.send(action, upload_id, *args)
43
+ instance_variable_set(checked_var(upload_id), (action == :finish ? nil : Time.now))
44
+ end
45
+
46
+ def checked_var(key)
47
+ key && "@checked_#{key}"
48
+ end
49
+ end
6
50
 
51
+ # Keeps track of the status of all currently processing uploads
52
+ class Mongrel::UploadProgress
53
+ attr_accessor :debug
7
54
  def initialize
8
- @guard = Mutex.new
55
+ @guard = Mutex.new
9
56
  @counters = {}
10
57
  end
11
58
 
12
59
  def check(upid)
13
- @counters[upid]
60
+ puts "#{upid}: Checking" if @debug
61
+ instance_variable_get(upload_var(upid)) rescue nil
14
62
  end
15
63
 
16
64
  def add(upid, size)
17
- stats = {'size' => size, 'received' => 0}
18
65
  @guard.synchronize do
19
- @counters[upid] = stats
66
+ @counters[upid] = Time.now
67
+ instance_variable_set(upload_var(upid), {:size => size, :received => 0})
68
+ puts "#{upid}: Added" if @debug
20
69
  end
70
+ true
71
+ rescue NameError # bad upid instance var
72
+ puts $!.message
73
+ @guard.synchronize { @counters[upid] = nil }
21
74
  end
22
75
 
23
76
  def mark(upid, len)
24
- upload = @counters[upid]
25
- recvd = upload['size'] - len
26
- @guard.synchronize do
27
- upload['received'] = recvd
28
- end
77
+ puts "#{upid}: Marking" if @debug
78
+ status = check(upid)
79
+ status[:received] = status[:size] - len if status
29
80
  end
30
81
 
31
82
  def finish(upid)
32
- upload = @counters[upid]
33
- recvd = upload['size']
34
83
  @guard.synchronize do
35
- upload['received'] = recvd
84
+ puts "#{upid}: Finished" if @debug
85
+ instance_variable_set(upload_var(upid), nil) if @counters.delete(upid)
36
86
  end
87
+ true
37
88
  end
38
- end
39
-
40
- class Upload < GemPlugin::Plugin "/handlers"
41
- include Mongrel::HttpHandlerPlugin
42
-
43
- def initialize(options = {})
44
- @path_info = options[:path_info]
45
- @request_notify = true
46
- end
47
-
48
- def request_begins(params)
49
- upload_notify(:add, params, params[Mongrel::Const::CONTENT_LENGTH].to_i) if params['PATH_INFO'] == @path_info
50
- end
51
-
52
- def request_progress(params, clen, total)
53
- upload_notify(:mark, params, clen) if params['PATH_INFO'] == @path_info
89
+
90
+ def list
91
+ @counters.keys.sort
54
92
  end
55
-
56
- def process(request, response)
57
- upload_notify(:finish, request.params) if request.params['PATH_INFO'] == @path_info
58
- end
59
-
93
+
60
94
  private
61
- def upload_notify(action, params, *args)
62
- upload_id = Mongrel::HttpRequest.query_parse(params['QUERY_STRING'])['upload_id']
63
- if params[Mongrel::Const::REQUEST_METHOD] == 'POST' && upload_id
64
- Mongrel::Uploads.instance.send(action, upload_id, *args) if upload_id
95
+ def upload_var(key)
96
+ key && "@upload_#{key}"
65
97
  end
66
- end
67
- end
98
+ end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: mongrel_upload_progress
5
5
  version: !ruby/object:Gem::Version
6
- version: "0.1"
7
- date: 2006-06-25 00:00:00 -04:00
6
+ version: "0.2"
7
+ date: 2006-09-11 00:00:00 -07:00
8
8
  summary: The mongrel_upload_progress GemPlugin
9
9
  require_paths:
10
10
  - lib
@@ -56,7 +56,7 @@ dependencies:
56
56
  requirements:
57
57
  - - ">="
58
58
  - !ruby/object:Gem::Version
59
- version: 0.3.13
59
+ version: 0.3.13.3
60
60
  version:
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: gem_plugin