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
|
# frozen_string_literal: true
# Released under the MIT License.
# Copyright, 2019-2025, by Samuel Williams.
require_relative "frame"
require_relative "padded"
require_relative "continuation_frame"
module Protocol
module HTTP2
# The PUSH_PROMISE frame is used to notify the peer endpoint in advance of streams the sender intends to initiate. The PUSH_PROMISE frame includes the unsigned 31-bit identifier of the stream the endpoint plans to create along with a set of headers that provide additional context for the stream.
#
# +---------------+
# |Pad Length? (8)|
# +-+-------------+-----------------------------------------------+
# |R| Promised Stream ID (31) |
# +-+-----------------------------+-------------------------------+
# | Header Block Fragment (*) ...
# +---------------------------------------------------------------+
# | Padding (*) ...
# +---------------------------------------------------------------+
#
class PushPromiseFrame < Frame
include Continued, Padded
TYPE = 0x5
FORMAT = "N".freeze
# Unpack the promised stream ID and header block fragment.
# @returns [Array] An array containing the promised stream ID and header block data.
def unpack
data = super
stream_id = data.unpack1(FORMAT)
return stream_id, data.byteslice(4, data.bytesize - 4)
end
# Pack the promised stream ID and header block data into the frame.
# @parameter stream_id [Integer] The promised stream ID.
# @parameter data [String] The header block data.
# @parameter arguments [Array] Additional arguments.
# @parameter options [Hash] Options for packing.
def pack(stream_id, data, *arguments, **options)
super([stream_id].pack(FORMAT) + data, *arguments, **options)
end
# Apply this PUSH_PROMISE frame to a connection for processing.
# @parameter connection [Connection] The connection to apply the frame to.
def apply(connection)
connection.receive_push_promise(self)
end
end
end
end
|