Module: CloudfrontAssetHost

Defined in:
lib/cloudfront_asset_host.rb,
lib/cloudfront_asset_host/uploader.rb,
lib/cloudfront_asset_host/css_rewriter.rb

Defined Under Namespace

Modules: CssRewriter, Uploader

Class Method Summary collapse

Class Method Details

.asset_host(source = nil, request = nil) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/cloudfront_asset_host.rb', line 64

def asset_host(source = nil, request = nil)
  return '' if source && disable_cdn_for_source?(source)

  cname_for_source = (self.cname =~ /%d/) ? self.cname % (source.hash % 4) : self.cname
  host = cname_for_source.present? ? "http://#{ cname_for_source }" : "http://#{self.bucket_host}"

  if source && request && CloudfrontAssetHost.gzip
    gzip_allowed  = CloudfrontAssetHost.gzip_allowed_for_source?(source)

    # Only Netscape 4 does not support gzip
    # IE masquerades as Netscape 4, so we check that as well
    user_agent = request.headers['User-Agent'].to_s
    gzip_accepted = !(user_agent =~ /^Mozilla\/4/) || user_agent =~ /\bMSIE/
    gzip_accepted &&= request.headers['Accept-Encoding'].to_s.include?('gzip')

    if gzip_accepted && gzip_allowed
      host << "/#{CloudfrontAssetHost.gzip_prefix}"
    end
  end

  host
end

.bucket_hostObject



87
88
89
# File 'lib/cloudfront_asset_host.rb', line 87

def bucket_host
  "#{self.bucket}.s3.amazonaws.com"
end

.configure {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/cloudfront_asset_host.rb', line 42

def configure
  # default configuration
  self.bucket     = nil
  self.cname      = nil
  self.key_prefix = ""
  self.s3_config  = "#{RAILS_ROOT}/config/s3.yml"
  self.enabled    = false

  self.asset_dirs = "images,javascripts,stylesheets"
  self.exclude_pattern = nil

  self.gzip            = true
  self.gzip_extensions = %w(js css)
  self.gzip_prefix     = "gz"

  yield(self)

  if properly_configured?
    enable!
  end
end

.disable_cdn_for_source?(source) ⇒ Boolean

Returns:

  • (Boolean)


108
109
110
# File 'lib/cloudfront_asset_host.rb', line 108

def disable_cdn_for_source?(source)
  source.match(exclude_pattern) if exclude_pattern.present?
end

.enable!Object



91
92
93
94
95
96
97
# File 'lib/cloudfront_asset_host.rb', line 91

def enable!
  if enabled
    ActionController::Base.asset_host = Proc.new { |source, request| CloudfrontAssetHost.asset_host(source, request) }
    ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :rewrite_asset_path, :cloudfront)
    ActionView::Helpers::AssetTagHelper.send(:alias_method_chain, :rails_asset_id, :cloudfront)
  end
end

.gzip_allowed_for_source?(source) ⇒ Boolean

Returns:

  • (Boolean)


103
104
105
106
# File 'lib/cloudfront_asset_host.rb', line 103

def gzip_allowed_for_source?(source)
  extension = source.split('.').last
  CloudfrontAssetHost.gzip_extensions.include?(extension)
end

.key_for_path(path) ⇒ Object



99
100
101
# File 'lib/cloudfront_asset_host.rb', line 99

def key_for_path(path)
  key_prefix + md5sum(path)[0..8]
end