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
|
# frozen_string_literal: true
# Released under the MIT License.
# Copyright, 2025, by Samuel Williams.
require_relative "split"
require_relative "../quoted_string"
require_relative "../error"
module Protocol
module HTTP
module Header
# The `accept-encoding` header represents a list of encodings that the client can accept.
class AcceptEncoding < Split
ParseError = Class.new(Error)
# https://tools.ietf.org/html/rfc7231#section-5.3.1
QVALUE = /0(\.[0-9]{0,3})?|1(\.[0]{0,3})?/
# https://tools.ietf.org/html/rfc7231#section-5.3.4
ENCODING = /\A(?<name>#{TOKEN})(;q=(?<q>#{QVALUE}))?\z/
Encoding = Struct.new(:name, :q) do
def quality_factor
(q || 1.0).to_f
end
def <=> other
other.quality_factor <=> self.quality_factor
end
end
# Parse the `accept-encoding` header value into a list of encodings.
#
# @returns [Array(Charset)] the list of character sets and their associated quality factors.
def encodings
self.map do |value|
if match = value.match(ENCODING)
Encoding.new(match[:name], match[:q])
else
raise ParseError.new("Could not parse encoding: #{value.inspect}")
end
end
end
end
end
end
end
|