module CarrierWave::Cloudflare::URL

Constants

ALLOWED_OPTIONS

Public Instance Methods

append_options!(uri, options) click to toggle source
# File lib/carrierwave/cloudflare/url.rb, line 53
def append_options!(uri, options)
  if should_modify_path?
    query = options.map { |k, v| "#{k}=#{v}" }.join(",")

    segment = "/cdn-cgi/image/#{query}"
    uri.path = segment + uri.path
  else
    uri.query = QueryString.new(uri.query).tap do |params|
      # the format is "width-500.height.200", only safe symbols are used
      param_with_options = options.map { |k, v| "#{k}-#{v}" }.join(".")

      params["cdn-cgi"] = param_with_options
    end.to_query
  end
end
extract(url) click to toggle source
# File lib/carrierwave/cloudflare/url.rb, line 16
def extract(url)
  uri = URI.parse(url)
  options = {}

  if should_modify_path?
    if %r{/cdn-cgi/image/([^/]+)(/.*)} =~ uri.path
      formatted = $LAST_MATCH_INFO[1]
      original_path = $LAST_MATCH_INFO[2]

      options = parse_options(formatted)
      uri.path = original_path
    end
  else
    query = QueryString.new(uri.query)

    if query.key?("cdn-cgi")
      options = parse_options(query["cdn-cgi"], separator: ".", assigner: "-")
    end
  end

  [uri, options]
end
parse_options(str, separator: ",", assigner: "=") click to toggle source

converts strings “w=foo,h=bar” into hashes

# File lib/carrierwave/cloudflare/url.rb, line 84
def parse_options(str, separator: ",", assigner: "=")
  kv = str.split(separator).map { |s| s.strip.split(assigner) }
  Hash[kv]
end
sanitized_options(options) click to toggle source
# File lib/carrierwave/cloudflare/url.rb, line 69
def sanitized_options(options)
  ordered = options.map do |k, v|
    idx = ALLOWED_OPTIONS.index(k)
    [idx, [k, v]]
  end

  filtered = ordered.select { |i,| i }.sort

  filtered.map do |_, (k, v)|
    v = v.join("x") if v.is_a?(Array)
    [k, v]
  end
end
should_modify_path?() click to toggle source
# File lib/carrierwave/cloudflare/url.rb, line 12
def should_modify_path?
  ::CarrierWave::Cloudflare.cloudflare_transform
end
transform(url, **options) click to toggle source
# File lib/carrierwave/cloudflare/url.rb, line 39
def transform(url, **options)
  uri, existing_opts = extract(url)
  options = existing_opts.merge(options.transform_keys(&:to_s))

  pairs = sanitized_options(options)

  if pairs.empty?
    url
  else
    append_options!(uri, pairs)
    uri.to_s
  end
end