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 +2 -2
- data/lib/mongrel_upload_progress/init.rb +72 -41
- metadata +3 -3
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.
|
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
|
5
|
-
include
|
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
|
55
|
+
@guard = Mutex.new
|
9
56
|
@counters = {}
|
10
57
|
end
|
11
58
|
|
12
59
|
def check(upid)
|
13
|
-
@
|
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] =
|
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
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
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
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
62
|
-
|
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
|
-
|
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.
|
7
|
-
date: 2006-
|
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
|