aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/http
diff options
context:
space:
mode:
authorCarl Lerche <me@carllerche.com>2010-09-22 17:35:21 -0700
committerCarl Lerche <me@carllerche.com>2010-09-22 17:36:12 -0700
commit1da0dc2f906bbf6c248a33f8d18662fd1494cfba (patch)
treec04ef71ca8d2d635a083c2b1e5cc7100c57c5c0d /actionpack/lib/action_dispatch/http
parentde9b3385fc05211cf6f2e620ba885d517751e906 (diff)
downloadrails-1da0dc2f906bbf6c248a33f8d18662fd1494cfba.tar.gz
rails-1da0dc2f906bbf6c248a33f8d18662fd1494cfba.tar.bz2
rails-1da0dc2f906bbf6c248a33f8d18662fd1494cfba.zip
Improve performance of applications using file uploads by not busting the method cache on every request containing a file upload.
Diffstat (limited to 'actionpack/lib/action_dispatch/http')
-rw-r--r--actionpack/lib/action_dispatch/http/upload.rb49
1 files changed, 20 insertions, 29 deletions
diff --git a/actionpack/lib/action_dispatch/http/upload.rb b/actionpack/lib/action_dispatch/http/upload.rb
index 8ee4b81cdd..49465d820e 100644
--- a/actionpack/lib/action_dispatch/http/upload.rb
+++ b/actionpack/lib/action_dispatch/http/upload.rb
@@ -2,32 +2,27 @@ require 'active_support/core_ext/object/blank'
module ActionDispatch
module Http
- module UploadedFile
- def self.extended(object)
- object.class_eval do
- attr_accessor :original_path, :content_type
- alias_method :local_path, :path if method_defined?(:path)
- end
- end
+ class UploadedFile < Tempfile
+ attr_accessor :original_filename, :content_type, :tempfile, :headers
- # Take the basename of the upload's original filename.
- # This handles the full Windows paths given by Internet Explorer
- # (and perhaps other broken user agents) without affecting
- # those which give the lone filename.
- # The Windows regexp is adapted from Perl's File::Basename.
- def original_filename
- unless defined? @original_filename
- @original_filename =
- unless original_path.blank?
- if original_path =~ /^(?:.*[:\\\/])?(.*)/m
- $1
- else
- File.basename original_path
- end
- end
+ def initialize(hash)
+ @original_filename = hash[:filename]
+ @content_type = hash[:type]
+ @headers = hash[:head]
+
+ # To the untrained eye, this may appear as insanity. Given the alternatives,
+ # such as busting the method cache on every request or breaking backwards
+ # compatibility with is_a?(Tempfile), this solution is the best available
+ # option.
+ #
+ # TODO: Deprecate is_a?(Tempfile) and define a real API for this parameter
+ tempfile = hash[:tempfile]
+ tempfile.instance_variables.each do |ivar|
+ instance_variable_set(ivar, tempfile.instance_variable_get(ivar))
end
- @original_filename
end
+
+ alias local_path path
end
module Upload
@@ -35,11 +30,7 @@ module ActionDispatch
# file upload hash with UploadedFile objects
def normalize_parameters(value)
if Hash === value && value.has_key?(:tempfile)
- upload = value[:tempfile]
- upload.extend(UploadedFile)
- upload.original_path = value[:filename]
- upload.content_type = value[:type]
- upload
+ UploadedFile.new(value)
else
super
end
@@ -47,4 +38,4 @@ module ActionDispatch
private :normalize_parameters
end
end
-end \ No newline at end of file
+end