lib/carrierwave/storage/fog.rb in carrierwave-1.2.3 vs lib/carrierwave/storage/fog.rb in carrierwave-1.3.0
- old
+ new
@@ -190,12 +190,18 @@
# avoid a get by using local references
local_directory = connection.directories.new(:key => @uploader.fog_directory)
local_file = local_directory.files.new(:key => path)
expire_at = ::Fog::Time.now + @uploader.fog_authenticated_url_expiration
case @uploader.fog_credentials[:provider]
- when 'AWS'
- local_file.url(expire_at, options)
+ when 'AWS', 'Google'
+ # Older versions of fog-google do not support options as a parameter
+ if url_options_supported?(local_file)
+ local_file.url(expire_at, options)
+ else
+ warn "Options hash not supported in #{local_file.class}. You may need to upgrade your Fog provider."
+ local_file.url(expire_at)
+ end
when 'Rackspace'
connection.get_object_https_url(@uploader.fog_directory, path, expire_at, options)
when 'OpenStack'
connection.get_object_https_url(@uploader.fog_directory, path, expire_at)
else
@@ -350,19 +356,23 @@
else
"#{host}/#{encoded_path}"
end
else
# AWS/Google optimized for speed over correctness
- case @uploader.fog_credentials[:provider].to_s
+ case fog_provider
when 'AWS'
# check if some endpoint is set in fog_credentials
if @uploader.fog_credentials.has_key?(:endpoint)
"#{@uploader.fog_credentials[:endpoint]}/#{@uploader.fog_directory}/#{encoded_path}"
else
protocol = @uploader.fog_use_ssl_for_aws ? "https" : "http"
+
+ subdomain_regex = /^(?:[a-z]|\d(?!\d{0,2}(?:\d{1,3}){3}$))(?:[a-z0-9\.]|(?![\-])|\-(?![\.])){1,61}[a-z0-9]$/
+ valid_subdomain = @uploader.fog_directory.to_s =~ subdomain_regex && !(protocol == 'https' && @uploader.fog_directory =~ /\./)
+
# if directory is a valid subdomain, use that style for access
- if @uploader.fog_directory.to_s =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\d{1,3}){3}$))(?:[a-z0-9\.]|(?![\-])|\-(?![\.])){1,61}[a-z0-9]$/
+ if valid_subdomain
s3_subdomain = @uploader.fog_aws_accelerate ? "s3-accelerate" : "s3"
"#{protocol}://#{@uploader.fog_directory}.#{s3_subdomain}.amazonaws.com/#{encoded_path}"
else
# directory is not a valid subdomain, so use path style for access
"#{protocol}://s3.amazonaws.com/#{@uploader.fog_directory}/#{encoded_path}"
@@ -464,21 +474,34 @@
def file
@file ||= directory.files.head(path)
end
def acl_header
- {'x-amz-acl' => @uploader.fog_public ? 'public-read' : 'private'}
+ if fog_provider == 'AWS'
+ { 'x-amz-acl' => @uploader.fog_public ? 'public-read' : 'private' }
+ else
+ {}
+ end
end
+ def fog_provider
+ @uploader.fog_credentials[:provider].to_s
+ end
+
def read_source_file(file_body)
return unless ::File.exist?(file_body.path)
begin
file_body = ::File.open(file_body.path) if file_body.closed? # Reopen if it's already closed
file_body.read
ensure
file_body.close
end
+ end
+
+ def url_options_supported?(local_file)
+ parameters = file.method(:url).parameters
+ parameters.count == 2 && parameters[1].include?(:options)
end
end
end # Fog