Module: Praxis::ContentTypeParser

Defined in:
lib/praxis/content_type_parser.rb

Constant Summary collapse

REGEXP =
/^
  \s*
  (?<type>[^+;\s]+)
  (\+(?<sub_type>[^;\s]+))?
  (\s*;\s*)?
  (?<params>.*?)?
  (\s*;\s*)?
$/x

Class Method Summary collapse

Class Method Details

.parse(content_type) ⇒ Hash

Parses Content type

Examples:

parse(nil)      #=> Exception: Content type does not have any type defined (ArgumentError)
parse('+json')  #=> Exception: Content type does not have any type defined (ArgumentError)
parse(';p1=11') #=> Exception: Content type does not have any type defined (ArgumentError)
parse('text/xml') #=>
  {:type     => "text/xml",
   :sub_type => nil,
   :params   => {}}
parse('application/vnd.something+json') #=>
  {:type     => "application/vnd.something",
   :sub_type => "json",
   :params   => {}}
parse('application/vnd.something+json;p1=1.0;param_with_noval;p2=a13') #=>
  {:type     => "application/vnd.something",
   :sub_type => "json",
   :params   => {"p1"=>"1.0", "param_with_noval"=>nil, "p2"=>"a13"}}

Parameters:

  • Content (String)

    type to parse

Returns:

  • (Hash)

    A hash with keys: :type, :sub_type(optional) and :params(optional)

Raises:

  • (ArgumentError)

    It fails when blank or weird content type is provided



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

def self.parse(content_type)
  parsed = REGEXP.match(content_type.to_s)
  raise(ArgumentError, 'Content type does not have any type defined') unless parsed

  result = {
    type: parsed[:type]
  }
  result[:sub_type] = parsed[:sub_type] if parsed[:sub_type]
  if parsed[:params]
    params = {}
    parsed[:params].split(';').each do |param|
      key, value = param.split('=')
      key        = key.to_s.strip
      next if key.empty?
      params[key.strip] = value && value.strip
    end
    result[:params] = params unless params.empty?
  end
  result
end