mongrel_upload_progress 0.1 → 0.2

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