about summary refs log tree commit diff
path: root/app/models
diff options
context:
space:
mode:
authorYamagishi Kazutoshi <ykzts@desire.sh>2018-06-05 01:58:36 +0900
committerEugen Rochko <eugen@zeonfederated.com>2018-06-04 18:58:36 +0200
commitdc73241bd9a529edc5573e10b5899cb47ca479ae (patch)
treea236108cb7aba8461caf1fdba75c5e284bf70eff /app/models
parent1637d24af4ada9baafb2eb7c3bacd2e1dfce171a (diff)
Detect extname from Content-Type (#7733)
Diffstat (limited to 'app/models')
-rw-r--r--app/models/concerns/remotable.rb34
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