Permalink
Browse files

Adds support for S3 scheme-less URL generation

  • Loading branch information...
1 parent c0e9b35 commit 5ce04edb0ea5e1cf77b8a9533a6c8ead4c803fd0 @grzuy grzuy committed with jyurek Apr 28, 2012
Showing with 42 additions and 5 deletions.
  1. +10 −5 lib/paperclip/storage/s3.rb
  2. +32 −0 test/storage/s3_test.rb
@@ -39,8 +39,9 @@ module Storage
# :s3_permissions => :private
#
# * +s3_protocol+: The protocol for the URLs generated to your S3 assets. Can be either
- # 'http' or 'https'. Defaults to 'http' when your :s3_permissions are :public_read (the
- # default), and 'https' when your :s3_permissions are anything else.
+ # 'http', 'https', or an empty string to generate scheme-less URLs. Defaults to 'http'
+ # when your :s3_permissions are :public_read (the default), and 'https' when your
+ # :s3_permissions are anything else.
# * +s3_headers+: A hash of headers or a Proc. You may specify a hash such as
# {'Expires' => 1.year.from_now.httpdate}. If you use a Proc, headers are determined at
# runtime. Paperclip will call that Proc with attachment as the only argument.
@@ -147,14 +148,18 @@ def sanitize_hash(hash)
@http_proxy = @options[:http_proxy] || nil
end
+
Paperclip.interpolates(:s3_alias_url) do |attachment, style|
- "#{attachment.s3_protocol(style)}://#{attachment.s3_host_alias}/#{attachment.path(style).gsub(%r{^/}, "")}"
+ url_prefix = (s3_protocol = attachment.s3_protocol(style)).present? ? "#{s3_protocol}:" : ""
+ "#{url_prefix}//#{attachment.s3_host_alias}/#{attachment.path(style).gsub(%r{^/}, "")}"
end unless Paperclip::Interpolations.respond_to? :s3_alias_url
Paperclip.interpolates(:s3_path_url) do |attachment, style|
- "#{attachment.s3_protocol(style)}://#{attachment.s3_host_name}/#{attachment.bucket_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
+ url_prefix = (s3_protocol = attachment.s3_protocol(style)).present? ? "#{s3_protocol}:" : ""
+ "#{url_prefix}//#{attachment.s3_host_name}/#{attachment.bucket_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
end unless Paperclip::Interpolations.respond_to? :s3_path_url
Paperclip.interpolates(:s3_domain_url) do |attachment, style|
- "#{attachment.s3_protocol(style)}://#{attachment.bucket_name}.#{attachment.s3_host_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
+ url_prefix = (s3_protocol = attachment.s3_protocol(style)).present? ? "#{s3_protocol}:" : ""
+ "#{url_prefix}//#{attachment.bucket_name}.#{attachment.s3_host_name}/#{attachment.path(style).gsub(%r{^/}, "")}"
end unless Paperclip::Interpolations.respond_to? :s3_domain_url
Paperclip.interpolates(:asset_host) do |attachment, style|
"#{attachment.path(style).gsub(%r{^/}, "")}"
@@ -128,6 +128,38 @@ def teardown
end
+ context ":s3_protocol => 'https'" do
+ setup do
+ rebuild_model :storage => :s3,
+ :s3_credentials => {},
+ :s3_protocol => 'https',
+ :bucket => "bucket",
+ :path => ":attachment/:basename.:extension"
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ end
+
+ should "return a url based on an S3 path" do
+ assert_match %r{^https://s3.amazonaws.com/bucket/avatars/stringio.txt}, @dummy.avatar.url
+ end
+ end
+
+ context ":s3_protocol => ''" do
+ setup do
+ rebuild_model :storage => :s3,
+ :s3_credentials => {},
+ :s3_protocol => '',
+ :bucket => "bucket",
+ :path => ":attachment/:basename.:extension"
+ @dummy = Dummy.new
+ @dummy.avatar = StringIO.new(".")
+ end
+
+ should "return a url based on an S3 path" do
+ assert_match %r{^//s3.amazonaws.com/bucket/avatars/stringio.txt}, @dummy.avatar.url
+ end
+ end
+
context "An attachment that uses S3 for storage and has the style in the path" do
setup do
rebuild_model :storage => :s3,

0 comments on commit 5ce04ed

Please sign in to comment.