Struct.new(:frequency, :backend, :upload_id)
JSON protocol based on Lighttpd’s mod_uploadprogress trac.lighttpd.net/trac/wiki/Docs:ModUploadProgress
We use this in case length is nil when clients send chunked uploads
our default response headers, we need to set no-transform to prevent deflaters from compressing our already-small small input and also to prevent buffering/corking of the response inside deflater buffers.
# File lib/upr/json.rb, line 31
31: def initialize(options = {})
32: super(options[:frequency] || 1, options[:backend], options[:upload_id])
33:
34: # support :drb for compatibility with mongrel_upload_progress
35: if options[:drb]
36: backend and raise ArgumentError, ":backend and :drb are incompatible"
37: require 'drb'
38: DRb.start_service
39: self.backend = DRbObject.new(nil, options[:drb])
40: elsif String === backend
41: # allow people to use strings in case their backend gets
42: # lazy-loaded (like an ActiveRecord model)
43: self.backend = eval(backend)
44: elsif backend.nil?
45: raise ArgumentError, "backend MUST be specified"
46: end
47:
48: # only for use with rails_proc
49: upload_id.nil? and self.upload_id = options[:env]
50: end
# File lib/upr/json.rb, line 126
126: def _error_msg(msg)
127: _json_object(:state => 'error', :status => 400, :message => msg)
128: end
# File lib/upr/json.rb, line 130
130: def _json_object(options)
131: # $stderr.syswrite "#{options.inspect} #{$upr.inspect}\n"
132: options.to_json
133: end
# File lib/upr/json.rb, line 63
63: def _once
64: if status = backend.read(upload_id)
65: if status.done?
66: _json_object(:state => 'done')
67: elsif status.seen == 0
68: _json_object(:state => 'starting')
69: elsif status.error?
70: _error_msg("upload failed")
71: else
72: _update_msg(status)
73: end
74: else
75: timeout = Time.now + 2
76: until status = backend.read(upload_id)
77: SLEEP_CLASS.sleep(0.1)
78: return _error_msg("couldn't get status") if Time.now > timeout
79: end
80: _json_object(:state => 'starting')
81: end
82: end
# File lib/upr/json.rb, line 135
135: def _update_msg(status)
136: raise "client error" if status.error?
137: received = status.seen
138: size = status.length || INT_MAX
139: _json_object(:state => 'uploading', :size => size, :received => received)
140: end
Rack interface reservced for future use with streaming AJAX
# File lib/upr/json.rb, line 120
120: def _wrap(env, uid)
121: _self = dup
122: _self.upload_id = uid
123: [ 200, RESPONSE_HEADERS.dup, _self ]
124: end
Rack interface reservced for future use with streaming AJAX
# File lib/upr/json.rb, line 85
85: def call(env)
86: if uid = extract_upload_id(env)
87: _wrap(env, uid)
88: else
89: [ 400, RESPONSE_HEADERS.dup, [ _error_msg("upload_id not given") ] ]
90: end
91: end
Rack interface reservced for future use with streaming AJAX
# File lib/upr/json.rb, line 94
94: def each(&block)
95: sleeper = defined?(Actor) ? Actor : Kernel
96: timeout = Time.now + 2
97: eol = ";\n"
98: yield _json_object(:state => 'starting') << eol
99: begin
100: until status = backend.read(upload_id)
101: sleeper.sleep(0.1)
102: break if Time.now > timeout
103: end
104: if status
105: begin
106: yield _update_msg(status) << eol
107: break if status.done?
108: sleeper.sleep(frequency)
109: end while status = backend.read(upload_id)
110: yield _json_object(:state => 'done') << eol
111: else
112: yield _error_msg("couldn't get status") << eol
113: end
114: rescue => e
115: yield _error_msg(e.message) << eol
116: end
117: end
# File lib/upr/json.rb, line 52
52: def rails_render_options
53: env = upload_id
54: self.upload_id = extract_upload_id(env)
55: text = if Rack::Request.new(env).GET.include?("long")
56: Proc.new { |response,output| each { |line| output.write(line) } }
57: else
58: _once
59: end
60: { :content_type => 'application/json', :text => text }
61: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.