lib/protocol/http/header/connection.rb



# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2019-2025, by Samuel Williams.
# Copyright, 2024, by Thomas Morgan.

require_relative "split"

module Protocol
	module HTTP
		module Header
			# Represents the `connection` HTTP header, which controls options for the current connection.
			#
			# The `connection` header is used to specify control options such as whether the connection should be kept alive, closed, or upgraded to a different protocol.
			class Connection < Split
				# The `keep-alive` directive indicates that the connection should remain open for future requests or responses, avoiding the overhead of opening a new connection.
				KEEP_ALIVE = "keep-alive"
				
				# The `close` directive indicates that the connection should be closed after the current request and response are complete.
				CLOSE = "close"
				
				# The `upgrade` directive indicates that the connection should be upgraded to a different protocol, as specified in the `Upgrade` header.
				UPGRADE = "upgrade"
				
				# Initializes the connection header with the given value. The value is expected to be a comma-separated string of directives.
				#
				# @parameter value [String | Nil] the raw `connection` header value.
				def initialize(value = nil)
					super(value&.downcase)
				end
				
				# Adds a directive to the `connection` header. The value will be normalized to lowercase before being added.
				#
				# @parameter value [String] the directive to add.
				def << value
					super(value.downcase)
				end
				
				# @returns [Boolean] whether the `keep-alive` directive is present and the connection is not marked for closure with the `close` directive.
				def keep_alive?
					self.include?(KEEP_ALIVE) && !close?
				end
				
				# @returns [Boolean] whether the `close` directive is present, indicating that the connection should be closed after the current request and response.
				def close?
					self.include?(CLOSE)
				end
				
				# @returns [Boolean] whether the `upgrade` directive is present, indicating that the connection should be upgraded to a different protocol.
				def upgrade?
					self.include?(UPGRADE)
				end
			end
		end
	end
end