class AcceptHeaders::MediaType::Negotiator

Constants

HEADER_PREFIX
MEDIA_TYPE_PATTERN
PARAMS_PATTERN

Public Instance Methods

negotiate(supported) click to toggle source
Calls superclass method AcceptHeaders::Negotiatable#negotiate
# File lib/accept_headers/media_type/negotiator.rb, line 13
def negotiate(supported)
  support, match = super(supported)
  return nil if support.nil? && match.nil?
  begin
    media_type = parse(support).first
    media_type.extensions = match.extensions
    return media_type
  rescue MediaType::Error
    return nil
  end
end

Private Instance Methods

no_header() click to toggle source
# File lib/accept_headers/media_type/negotiator.rb, line 26
def no_header
  [MediaType.new]
end
parse_extensions(extensions_string) click to toggle source
# File lib/accept_headers/media_type/negotiator.rb, line 45
def parse_extensions(extensions_string)
  return {} if !extensions_string || extensions_string.empty?
  if extensions_string.match(/['"]/)
    extensions = extensions_string.scan(PARAMS_PATTERN).map(&:compact).to_h
  else
    extensions = {}
    extensions_string.split(';').each do |part|
      param = PARAMS_PATTERN.match(part)
      extensions[param[:attribute]] = param[:value] if param
    end
  end
  extensions.delete('q')
  extensions
end
parse_item(header) click to toggle source
# File lib/accept_headers/media_type/negotiator.rb, line 30
def parse_item(header)
  return nil if header.nil?
  header.strip!
  accept_media_range, accept_extensions = header.split(';', 2)
  raise Error if accept_media_range.nil?
  media_range = MEDIA_TYPE_PATTERN.match(accept_media_range)
  raise Error if media_range.nil?
  MediaType.new(
    media_range[:type],
    media_range[:subtype],
    q: parse_q(accept_extensions),
    extensions: parse_extensions(accept_extensions)
  )
end