aboutsummaryrefslogtreecommitdiffstats
path: root/lib/plum/frame_factory.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/plum/frame_factory.rb')
-rw-r--r--lib/plum/frame_factory.rb34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/plum/frame_factory.rb b/lib/plum/frame_factory.rb
index 3a9fa97..686f88e 100644
--- a/lib/plum/frame_factory.rb
+++ b/lib/plum/frame_factory.rb
@@ -2,11 +2,19 @@ using Plum::BinaryString
module Plum
module FrameFactory
+ # Creates a RST_STREAM frame.
+ # @param stream_id [Integer] The stream ID.
+ # @param error_type [Symbol] The error type defined in RFC 7540 Section 7.
def rst_stream(stream_id, error_type)
payload = "".push_uint32(HTTPError::ERROR_CODES[error_type])
Frame.new(type: :rst_stream, stream_id: stream_id, payload: payload)
end
+ # Creates a GOAWAY frame.
+ # @param last_id [Integer] The biggest processed stream ID.
+ # @param error_type [Symbol] The error type defined in RFC 7540 Section 7.
+ # @param message [String] Additional debug data.
+ # @see RFC 7540 Section 6.8
def goaway(last_id, error_type, message = "")
payload = "".push_uint32((last_id || 0) | (0 << 31))
.push_uint32(HTTPError::ERROR_CODES[error_type])
@@ -14,6 +22,9 @@ module Plum
Frame.new(type: :goaway, stream_id: 0, payload: payload)
end
+ # Creates a SETTINGS frame.
+ # @param ack [Symbol] Pass :ack to create an ACK frame.
+ # @param args [Hash<Symbol, Integer>] The settings values to send.
def settings(ack = nil, **args)
payload = args.inject("") {|payload, (key, value)|
id = Frame::SETTINGS_TYPE[key] or raise ArgumentError.new("invalid settings type")
@@ -23,6 +34,12 @@ module Plum
Frame.new(type: :settings, stream_id: 0, flags: [ack], payload: payload)
end
+ # Creates a PING frame.
+ # @overload ping(ack, payload)
+ # @param ack [Symbol] Pass :ack to create an ACK frame.
+ # @param payload [String] 8 bytes length data to send.
+ # @overload ping(payload = "plum\x00\x00\x00\x00")
+ # @param payload [String] 8 bytes length data to send.
def ping(arg1 = "plum\x00\x00\x00\x00", arg2 = nil)
if !arg2
raise ArgumentError.new("data must be 8 octets") if arg1.bytesize != 8
@@ -32,20 +49,37 @@ module Plum
end
end
+ # Creates a DATA frame.
+ # @param stream_id [Integer] The stream ID.
+ # @param payload [String] Payload.
+ # @param flags [Array<Symbol>] Flags.
def data(stream_id, payload, *flags)
Frame.new(type: :data, stream_id: stream_id, flags: flags, payload: payload)
end
+ # Creates a DATA frame.
+ # @param stream_id [Integer] The stream ID.
+ # @param encoded [String] Headers.
+ # @param flags [Array<Symbol>] Flags.
def headers(stream_id, encoded, *flags)
Frame.new(type: :headers, stream_id: stream_id, flags: flags, payload: encoded)
end
+ # Creates a PUSH_PROMISE frame.
+ # @param stream_id [Integer] The stream ID.
+ # @param new_id [Integer] The stream ID to create.
+ # @param encoded [String] Request headers.
+ # @param flags [Array<Symbol>] Flags.
def push_promise(stream_id, new_id, encoded, *flags)
payload = "".push_uint32(0 << 31 | new_id)
.push(encoded)
Frame.new(type: :push_promise, stream_id: stream_id, flags: flags, payload: payload)
end
+ # Creates a CONTINUATION frame.
+ # @param stream_id [Integer] The stream ID.
+ # @param payload [String] Payload.
+ # @param flags [Array<Symbol>] Flags.
def continuation(stream_id, payload, *flags)
Frame.new(type: :continuation, stream_id: stream_id, flags: flags, payload: payload)
end