Class: Protocol::HTTP2::Framer

Inherits:
Object
  • Object
show all
Defined in:
lib/protocol/http2/framer.rb

Instance Method Summary collapse

Constructor Details

#initialize(stream, frames = FRAMES) ⇒ Framer

Returns a new instance of Framer.



39
40
41
42
# File 'lib/protocol/http2/framer.rb', line 39

def initialize(stream, frames = FRAMES)
  @stream = stream
  @frames = frames
end

Instance Method Details

#closeObject



48
49
50
# File 'lib/protocol/http2/framer.rb', line 48

def close
  @stream.close
end

#closed?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/protocol/http2/framer.rb', line 52

def closed?
  @stream.closed?
end

#flushObject



44
45
46
# File 'lib/protocol/http2/framer.rb', line 44

def flush
  @stream.flush
end

#read_connection_prefaceObject



60
61
62
63
64
65
66
67
68
# File 'lib/protocol/http2/framer.rb', line 60

def read_connection_preface
  string = @stream.read(CONNECTION_PREFACE.bytesize)
  
  unless string == CONNECTION_PREFACE
    raise HandshakeError, "Invalid connection preface: #{string.inspect}"
  end
  
  return string
end

#read_frame(maximum_frame_size = MAXIMUM_ALLOWED_FRAME_SIZE) ⇒ Frame

Returns the frame that has been read from the underlying IO.

Returns:

  • (Frame)

    the frame that has been read from the underlying IO.

Raises:

  • if the underlying IO fails for some reason.



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/protocol/http2/framer.rb', line 72

def read_frame(maximum_frame_size = MAXIMUM_ALLOWED_FRAME_SIZE)
  # Read the header:
  length, type, flags, stream_id = read_header
  
  # Console.debug(self) {"read_frame: length=#{length} type=#{type} flags=#{flags} stream_id=#{stream_id} -> klass=#{@frames[type].inspect}"}
  
  # Allocate the frame:
  klass = @frames[type] || Frame
  frame = klass.new(stream_id, flags, type, length)
  
  # Read the payload:
  frame.read(@stream, maximum_frame_size)
  
  # Console.debug(self, name: "read") {frame.inspect}
  
  return frame
end

#read_headerObject

Raises:

  • (EOFError)


101
102
103
104
105
106
107
108
109
# File 'lib/protocol/http2/framer.rb', line 101

def read_header
  if buffer = @stream.read(9)
    if buffer.bytesize == 9
      return Frame.parse_header(buffer)
    end
  end
  
  raise EOFError, "Could not read frame header!"
end

#write_connection_prefaceObject



56
57
58
# File 'lib/protocol/http2/framer.rb', line 56

def write_connection_preface
  @stream.write(CONNECTION_PREFACE)
end

#write_frame(frame) ⇒ Object

Write a frame to the underlying IO. After writing one or more frames, you should call flush to ensure the frames are sent to the remote peer.



93
94
95
96
97
98
99
# File 'lib/protocol/http2/framer.rb', line 93

def write_frame(frame)
  # Console.debug(self, name: "write") {frame.inspect}
  
  frame.write(@stream)
  
  return frame
end