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