Class: Rack::Uploads

Inherits:
Object
  • Object
show all
Defined in:
lib/rack/uploads/middleware.rb,
lib/rack/uploads/uploaded_file.rb

Defined Under Namespace

Classes: UploadedFile, UploadedNginxFile

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ Uploads

Returns a new instance of Uploads.



4
5
6
7
8
# File 'lib/rack/uploads/middleware.rb', line 4

def initialize(app, options={})
  @app = app
  @session_authorized = options[:session_authorized] || true
  @nginx = options[:nginx] || [{ :tmp_path => "_tmp_path", :filename => "_file_name" }]
end

Instance Method Details

#call(env) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/rack/uploads/middleware.rb', line 22

def call(env)
  req = Rack::Request.new(env)
  if req.post? && req.form_data?
    return not_authorized unless @session_authorized == true || (@session_authorized.respond_to?(:call) && @session_authorized.call(req) == true)
    uploads = extract_uploads_from_arguments(req, req.params)
    env['rack.uploads'] = uploads if uploads.size > 0
  end
  resp = @app.call(env)
  if uploads && uploads.size > 0
    uploads.each { |upload| upload.cleanup }
  end
  resp
end

#extract_uploads_from_arguments(req, params, uploads = []) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/rack/uploads/middleware.rb', line 10

def extract_uploads_from_arguments(req, params, uploads=[])
  params.each do |key,param|
    if param_file = file(req, key, param)
      uploads << param_file
      params[key] = param_file
    elsif param.instance_of?(Hash)
      uploads = extract_uploads_from_arguments(req, param, uploads)
    end
  end
  uploads
end

#file(req, key, param) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/rack/uploads/middleware.rb', line 40

def file(req, key, param)
  return UploadedFile.new(key, param) if param.instance_of?(Hash) && param[:tempfile]
  @nginx.each do |nginx|
    if key =~ %r{^(.+)#{nginx[:tmp_path]}$}
      tmp_path = param
      filename = req.params["#{$1}#{nginx[:filename]}"]
      return UploadedNginxFile.new($1, {:filename => filename, :temp_path => tmp_path}) if ::File.exist?(tmp_path) && filename
    end
  end
  nil
end

#invalid_request ⇒ Object



52
53
54
# File 'lib/rack/uploads/middleware.rb', line 52

def invalid_request
  [400, {}, 'Invalid Request']
end

#multipart?(req) ⇒ Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/rack/uploads/middleware.rb', line 36

def multipart?(req)
  req.media_type == "multipart/form-data"
end

#not_authorized ⇒ Object



56
57
58
# File 'lib/rack/uploads/middleware.rb', line 56

def not_authorized
  [403, {}, 'Not Authorized']
end