Module: Plum::FrameFactory

Included in:
Frame
Defined in:
lib/plum/frame_factory.rb

Instance Method Summary collapse

Instance Method Details

#continuation(stream_id, payload, end_headers: false) ⇒ Object

Creates a CONTINUATION frame.

Parameters:

  • stream_id (Integer)

    The stream ID.

  • payload (String)

    Payload.

  • end_headers (Boolean) (defaults to: false)

    add END_HEADERS flag



91
92
93
# File 'lib/plum/frame_factory.rb', line 91

def continuation(stream_id, payload, end_headers: false)
  Frame.new(type: :continuation, stream_id: stream_id, flags_value: (end_headers ? 4 : 0), payload: payload)
end

#data(stream_id, payload = "", end_stream: false) ⇒ Object

Creates a DATA frame.

Parameters:

  • stream_id (Integer)

    The stream ID.

  • payload (String) (defaults to: "")

    Payload.

  • end_stream (Boolean) (defaults to: false)

    add END_STREAM flag



58
59
60
61
62
# File 'lib/plum/frame_factory.rb', line 58

def data(stream_id, payload = "", end_stream: false)
  payload = payload.b if payload&.encoding != Encoding::BINARY
  fval = end_stream ? 1 : 0
  Frame.new(type_value: 0, stream_id: stream_id, flags_value: fval, payload: payload)
end

#goaway(last_id, error_type, message = "") ⇒ Object

Creates a GOAWAY frame.

Parameters:

  • last_id (Integer)

    The biggest processed stream ID.

  • error_type (Symbol)

    The error type defined in RFC 7540 Section 7.

  • message (String) (defaults to: "")

    Additional debug data.

See Also:

  • 7540 Section 6.8


19
20
21
22
23
24
# File 'lib/plum/frame_factory.rb', line 19

def goaway(last_id, error_type, message = "")
  payload = String.new.push_uint32(last_id)
                      .push_uint32(HTTPError::ERROR_CODES[error_type])
                      .push(message)
  Frame.new(type: :goaway, stream_id: 0, payload: payload)
end

#headers(stream_id, encoded, end_stream: false, end_headers: false) ⇒ Object

Creates a HEADERS frame.

Parameters:

  • stream_id (Integer)

    The stream ID.

  • encoded (String)

    Headers.

  • end_stream (Boolean) (defaults to: false)

    add END_STREAM flag

  • end_headers (Boolean) (defaults to: false)

    add END_HEADERS flag



69
70
71
72
73
# File 'lib/plum/frame_factory.rb', line 69

def headers(stream_id, encoded, end_stream: false, end_headers: false)
  fval = end_stream ? 1 : 0
  fval += 4 if end_headers
  Frame.new(type_value: 1, stream_id: stream_id, flags_value: fval, payload: encoded)
end

#ping(ack, payload) ⇒ Object #ping(payload = "plum\x00\x00\x00\x00") ⇒ Object

Creates a PING frame.

Overloads:

  • #ping(ack, payload) ⇒ Object

    Parameters:

    • ack (Symbol)

      Pass :ack to create an ACK frame.

    • payload (String)

      8 bytes length data to send.

  • #ping(payload = "plum\x00\x00\x00\x00") ⇒ Object

    Parameters:

    • payload (String) (defaults to: "plum\x00\x00\x00\x00")

      8 bytes length data to send.



44
45
46
47
48
49
50
51
52
# File 'lib/plum/frame_factory.rb', line 44

def ping(arg1 = "plum\x00\x00\x00\x00".b, arg2 = nil)
  if !arg2
    raise ArgumentError.new("data must be 8 octets") if arg1.bytesize != 8
    arg1 = arg1.b if arg1.encoding != Encoding::BINARY
    Frame.new(type: :ping, stream_id: 0, payload: arg1)
  else
    Frame.new(type: :ping, stream_id: 0, flags: [:ack], payload: arg2)
  end
end

#push_promise(stream_id, new_id, encoded, end_headers: false) ⇒ Object

Creates a PUSH_PROMISE frame.

Parameters:

  • stream_id (Integer)

    The stream ID.

  • new_id (Integer)

    The stream ID to create.

  • encoded (String)

    Request headers.

  • end_headers (Boolean) (defaults to: false)

    add END_HEADERS flag



80
81
82
83
84
85
# File 'lib/plum/frame_factory.rb', line 80

def push_promise(stream_id, new_id, encoded, end_headers: false)
  payload = String.new.push_uint32(new_id)
                      .push(encoded)
  fval = end_headers ? 4 : 0
  Frame.new(type: :push_promise, stream_id: stream_id, flags_value: fval, payload: payload)
end

#rst_stream(stream_id, error_type) ⇒ Object

Creates a RST_STREAM frame.

Parameters:

  • stream_id (Integer)

    The stream ID.

  • error_type (Symbol)

    The error type defined in RFC 7540 Section 7.



9
10
11
12
# File 'lib/plum/frame_factory.rb', line 9

def rst_stream(stream_id, error_type)
  payload = String.new.push_uint32(HTTPError::ERROR_CODES[error_type])
  Frame.new(type: :rst_stream, stream_id: stream_id, payload: payload)
end

#settings(ack = nil, **args) ⇒ Object

Creates a SETTINGS frame.

Parameters:

  • ack (Symbol) (defaults to: nil)

    Pass :ack to create an ACK frame.

  • args (Hash<Symbol, Integer>)

    The settings values to send.



29
30
31
32
33
34
35
36
# File 'lib/plum/frame_factory.rb', line 29

def settings(ack = nil, **args)
  payload = args.inject(String.new) {|payload, (key, value)|
    id = Frame::SETTINGS_TYPE[key] or raise ArgumentError.new("invalid settings type")
    payload.push_uint16(id)
    payload.push_uint32(value)
  }
  Frame.new(type: :settings, stream_id: 0, flags: [ack], payload: payload)
end