class Parameterized

A parameterized MIME header value.

Definitions

def self.parse(string)

Parse a parameterized header value.

Signature

parameter string String

The header value.

returns Parameterized

The parsed header.

raises ArgumentError

If the header value is malformed or contains duplicate parameters.

Implementation

def self.parse(string)
	unless match = self::VALUE_PATTERN.match(string)
		raise ArgumentError, "Invalid header value: #{string.inspect}!"
	end
	
	type = match[1].downcase
	parameters = {}
	offset = match.end(0)
	
	while offset < string.length
		unless match = PARAMETER_PATTERN.match(string, offset)
			raise ArgumentError, "Invalid header parameter at offset #{offset}: #{string.inspect}!"
		end
		
		name = match[1].downcase
		
		if parameters.key?(name)
			raise ArgumentError, "Duplicate header parameter: #{name.inspect}!"
		end
		
		if quoted = match[2]
			parameters[name] = quoted.gsub(/\\(.)/, "\\1")
		else
			parameters[name] = match[3]
		end
		
		offset = match.end(0)
	end
	
	return new(type, parameters)
end

def self.coerce(value)

Coerce an object to a parameterized header value.

Signature

parameter value Object

The header value.

returns Parameterized

The parsed header.

Implementation

def self.coerce(value)
	if value.is_a?(self)
		return value
	end
	
	return parse(value.to_s)
end

def initialize(type, parameters = {})

Initialize a parameterized header value.

Signature

parameter type String

The primary header value.

parameter parameters Hash

The named parameters.

Implementation

def initialize(type, parameters = {})
	@type = type
	@parameters = parameters
end

attr :type

The primary header value.

attr :parameters

The named parameters.

def [](name)

Fetch a named parameter.

Signature

parameter name String

The case-insensitive parameter name.

returns String | Nil

The parameter value, if present.

Implementation

def [](name)
	@parameters[name.downcase]
end

def <<(value)

Reject a second value for this singular MIME field.

Implementation

def <<(value)
	raise Protocol::HTTP::DuplicateHeaderError.new(self.class::NAME, self, value)
end

def to_s

Convert the header to its wire representation.

Signature

returns String

The serialized header value.

Implementation

def to_s
	value = String.new(@type)
	
	@parameters.each do |name, parameter|
		escaped = parameter.gsub(/["\\]/, "\\\\\\0")
		value << "; #{name}=\"#{escaped}\""
	end
	
	return value
end