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