Skip to content
This repository has been archived by the owner on Jul 13, 2023. It is now read-only.

Commit

Permalink
The uri io adapter should use the content-disposition filename
Browse files Browse the repository at this point in the history
The uri io adapter now seeks for the content-disposition header if this
is pressent the value filename is taken instead of the last path segment
for the resource file name.

[fixes #2210]
  • Loading branch information
netmask authored and tute committed May 16, 2016
1 parent 87e5ef5 commit 98e0c34
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 22 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
* Improvement: the `URI adapter` now uses the content-disposition header to name the downloaded file.
* Improvement: Add `fog_options` configuration to send options to fog when storing files.

4.3.6 (3/13/2016):
Expand Down
41 changes: 30 additions & 11 deletions lib/paperclip/io_adapters/uri_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,49 @@

module Paperclip
class UriAdapter < AbstractAdapter
attr_writer :content_type

def initialize(target)
@target = target
@content = download_content
cache_current_values
@tempfile = copy_to_tempfile(@content)
end

attr_writer :content_type

private

def download_content
open(@target)
def cache_current_values
self.content_type = content_type_from_content || "text/html"

self.original_filename = filename_from_content_disposition ||
filename_from_path ||
default_filename
@size = @content.size
end

def cache_current_values
@original_filename = @target.path.split("/").last
@original_filename ||= "index.html"
self.original_filename = @original_filename.strip
def content_type_from_content
if @content.respond_to?(:content_type)
@content.content_type
end
end

@content_type = @content.content_type if @content.respond_to?(:content_type)
@content_type ||= "text/html"
def filename_from_content_disposition
if @content.meta.has_key?("content-disposition")
@content.meta["content-disposition"].
match(/filename="([^"]*)"/)[1]
end
end

@size = @content.size
def filename_from_path
@target.path.split("/").last
end

def default_filename
"index.html"
end

def download_content
open(@target)
end

def copy_to_tempfile(src)
Expand Down
13 changes: 8 additions & 5 deletions spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
require 'spec_helper'

describe Paperclip::HttpUrlProxyAdapter do
before do
@open_return = StringIO.new("xxx")
@open_return.stubs(:content_type).returns("image/png")
@open_return.stubs(:meta).returns({})
Paperclip::HttpUrlProxyAdapter.any_instance.
stubs(:download_content).returns(@open_return)
end

context "a new instance" do
before do
@open_return = StringIO.new("xxx")
@open_return.stubs(:content_type).returns("image/png")
Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(@open_return)
@url = "http://thoughtbot.com/images/thoughtbot-logo.png"
@subject = Paperclip.io_adapters.for(@url)
end
Expand Down Expand Up @@ -60,7 +65,6 @@

context "a url with query params" do
before do
Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
@url = "https://github.com/thoughtbot/paperclip?file=test"
@subject = Paperclip.io_adapters.for(@url)
end
Expand All @@ -76,7 +80,6 @@

context "a url with restricted characters in the filename" do
before do
Paperclip::HttpUrlProxyAdapter.any_instance.stubs(:download_content).returns(StringIO.new("x"))
@url = "https://github.com/thoughtbot/paper:clip.jpg"
@subject = Paperclip.io_adapters.for(@url)
end
Expand Down
37 changes: 31 additions & 6 deletions spec/paperclip/io_adapters/uri_adapter_spec.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
require 'spec_helper'

describe Paperclip::UriAdapter do
let(:content_type) { "image/png" }
let(:meta) { {} }

before do
@open_return = StringIO.new("xxx")
@open_return.stubs(:content_type).returns(content_type)
@open_return.stubs(:meta).returns(meta)
Paperclip::UriAdapter.any_instance.
stubs(:download_content).returns(@open_return)
end

context "a new instance" do
before do
@open_return = StringIO.new("xxx")
@open_return.stubs(:content_type).returns("image/png")
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(@open_return)
@uri = URI.parse("http://thoughtbot.com/images/thoughtbot-logo.png")
@subject = Paperclip.io_adapters.for(@uri)
end
Expand Down Expand Up @@ -56,8 +64,9 @@
end

context "a directory index url" do
let(:content_type) { "text/html" }

before do
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
@uri = URI.parse("http://thoughtbot.com")
@subject = Paperclip.io_adapters.for(@uri)
end
Expand All @@ -73,7 +82,6 @@

context "a url with query params" do
before do
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
@uri = URI.parse("https://github.com/thoughtbot/paperclip?file=test")
@subject = Paperclip.io_adapters.for(@uri)
end
Expand All @@ -83,9 +91,26 @@
end
end

context "a url with content disposition headers" do
let(:file_name) { "test_document.pdf" }
let(:meta) do
{
"content-disposition" => "attachment; filename=\"#{file_name}\";",
}
end

before do
@uri = URI.parse("https://github.com/thoughtbot/paperclip?file=test")
@subject = Paperclip.io_adapters.for(@uri)
end

it "returns a file name" do
assert_equal file_name, @subject.original_filename
end
end

context "a url with restricted characters in the filename" do
before do
Paperclip::UriAdapter.any_instance.stubs(:download_content).returns(StringIO.new("xxx"))
@uri = URI.parse("https://github.com/thoughtbot/paper:clip.jpg")
@subject = Paperclip.io_adapters.for(@uri)
end
Expand Down

0 comments on commit 98e0c34

Please sign in to comment.