lib/http/2/framer.rb in http-2-0.8.2 vs lib/http/2/framer.rb in http-2-0.8.3
- old
+ new
@@ -1,8 +1,9 @@
module HTTP2
# Performs encoding, decoding, and validation of binary HTTP/2 frames.
#
+ # rubocop:disable ClassLength
class Framer
include Error
# Default value of max frame size (16384 bytes)
DEFAULT_MAX_FRAME_SIZE = 2**14
@@ -213,11 +214,11 @@
when :rst_stream
bytes << pack_error(frame[:error])
length += 4
when :settings
- if frame[:stream] != 0
+ if (frame[:stream]).nonzero?
fail CompressionError, "Invalid stream ID (#{frame[:stream]})"
end
frame[:payload].each do |(k, v)|
if k.is_a? Integer
@@ -266,19 +267,21 @@
when :altsvc
bytes << [frame[:max_age], frame[:port]].pack(UINT32 + UINT16)
length += 6
if frame[:proto]
fail CompressionError, 'Proto too long' if frame[:proto].bytesize > 255
- bytes << [frame[:proto].bytesize].pack(UINT8) << frame[:proto].force_encoding(Encoding::BINARY)
+ bytes << [frame[:proto].bytesize].pack(UINT8)
+ bytes << frame[:proto].force_encoding(Encoding::BINARY)
length += 1 + frame[:proto].bytesize
else
bytes << [0].pack(UINT8)
length += 1
end
if frame[:host]
fail CompressionError, 'Host too long' if frame[:host].bytesize > 255
- bytes << [frame[:host].bytesize].pack(UINT8) << frame[:host].force_encoding(Encoding::BINARY)
+ bytes << [frame[:host].bytesize].pack(UINT8)
+ bytes << frame[:host].force_encoding(Encoding::BINARY)
length += 1 + frame[:host].bytesize
else
bytes << [0].pack(UINT8)
length += 1
end
@@ -323,10 +326,12 @@
def parse(buf)
return nil if buf.size < 9
frame = read_common_header(buf)
return nil if buf.size < 9 + frame[:length]
+ fail ProtocolError, 'payload too large' if frame[:length] > DEFAULT_MAX_FRAME_SIZE
+
buf.read(9)
payload = buf.read(frame[:length])
# Implementations MUST discard frames
# that have unknown or unsupported types.
@@ -352,30 +357,30 @@
frame[:payload] = payload.read(frame[:length])
when :headers
if frame[:flags].include? :priority
e_sd = payload.read_uint32
frame[:stream_dependency] = e_sd & RBIT
- frame[:exclusive] = (e_sd & EBIT) != 0
+ frame[:exclusive] = (e_sd & EBIT) != 0 # rubocop:disable Style/NumericPredicate
frame[:weight] = payload.getbyte + 1
end
frame[:payload] = payload.read(frame[:length])
when :priority
e_sd = payload.read_uint32
frame[:stream_dependency] = e_sd & RBIT
- frame[:exclusive] = (e_sd & EBIT) != 0
+ frame[:exclusive] = (e_sd & EBIT) != 0 # rubocop:disable Style/NumericPredicate
frame[:weight] = payload.getbyte + 1
when :rst_stream
frame[:error] = unpack_error payload.read_uint32
when :settings
# NOTE: frame[:length] might not match the number of frame[:payload]
# because unknown extensions are ignored.
frame[:payload] = []
- unless frame[:length] % 6 == 0
+ unless (frame[:length] % 6).zero?
fail ProtocolError, 'Invalid settings payload length'
end
- if frame[:stream] != 0
+ if (frame[:stream]).nonzero?
fail ProtocolError, "Invalid stream ID (#{frame[:stream]})"
end
(frame[:length] / 6).times do
id = payload.read(2).unpack(UINT16).first