1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
# frozen_string_literal: true
# Released under the MIT License.
# Copyright, 2019-2025, by Samuel Williams.
module Protocol
module HTTP
module Header
# Represents headers that can contain multiple distinct values separated by commas.
#
# This isn't a specific header class is a utility for handling headers with comma-separated values, such as `accept`, `cache-control`, and other similar headers. The values are split and stored as an array internally, and serialized back to a comma-separated string when needed.
class Split < Array
# Regular expression used to split values on commas, with optional surrounding whitespace.
COMMA = /\s*,\s*/
# Initializes a `Split` header with the given value. If the value is provided, it is split into distinct entries and stored as an array.
#
# @parameter value [String | Nil] the raw header value containing multiple entries separated by commas, or `nil` for an empty header.
def initialize(value = nil)
if value
super(value.split(COMMA))
else
super()
end
end
# Adds one or more comma-separated values to the header.
#
# The input string is split into distinct entries and appended to the array.
#
# @parameter value [String] the value or values to add, separated by commas.
def << value
self.concat(value.split(COMMA))
end
# Serializes the stored values into a comma-separated string.
#
# @returns [String] the serialized representation of the header values.
def to_s
join(",")
end
# Whether this header is acceptable in HTTP trailers.
# This is a base class for comma-separated headers, default is to disallow in trailers.
# @returns [Boolean] `false`, as most comma-separated headers should not appear in trailers by default.
def self.trailer?
false
end
protected
def reverse_find(&block)
reverse_each do |value|
return value if block.call(value)
end
return nil
end
end
end
end
end
|