diff options
author | Yamagishi Kazutoshi <ykzts@desire.sh> | 2018-06-05 01:58:36 +0900 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2018-06-04 18:58:36 +0200 |
commit | dc73241bd9a529edc5573e10b5899cb47ca479ae (patch) | |
tree | a236108cb7aba8461caf1fdba75c5e284bf70eff | |
parent | 1637d24af4ada9baafb2eb7c3bacd2e1dfce171a (diff) |
Detect extname from Content-Type (#7733)
-rw-r--r-- | app/models/concerns/remotable.rb | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/app/models/concerns/remotable.rb b/app/models/concerns/remotable.rb index c17f04776..dc2e12b67 100644 --- a/app/models/concerns/remotable.rb +++ b/app/models/concerns/remotable.rb @@ -24,14 +24,16 @@ module Remotable Request.new(:get, url).perform do |response| next if response.code != 200 - matches = response.headers['content-disposition']&.match(/filename="([^"]*)"/) - filename = matches.nil? ? parsed_url.path.split('/').last : matches[1] + content_type = parse_content_type(response.headers['content-type']) + extname = detect_extname_from_content_type(content_type) + + if extname.nil? + matches = response.headers['content-disposition']&.match(/filename="([^"]*)"/) + filename = matches.nil? ? parsed_url.path.split('/').last : matches[1] + extname = filename.nil? ? '' : File.extname(filename) + end + basename = SecureRandom.hex(8) - extname = if filename.nil? - '' - else - File.extname(filename) - end send("#{attachment_name}=", StringIO.new(response.body_with_limit(limit))) send("#{attachment_name}_file_name=", basename + extname) @@ -57,4 +59,22 @@ module Remotable end end end + + private + + def detect_extname_from_content_type(content_type) + return if content_type.nil? + + type = MIME::Types[content_type].first + + return if type.nil? + + type.extensions.first + end + + def parse_content_type(content_type) + return if content_type.nil? + + content_type.split(/\s*;\s*/).first + end end |