class Parameterized
A parameterized MIME header value.
Definitions
def self.parse(string)
Parse a parameterized header value.
Signature
-
parameter
stringString 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
valueObject 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
typeString The primary header value.
-
parameter
parametersHash 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
nameString 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