Module: Requests::HPACK::Integer

Defined in:
lib/requests/hpack.rb

Class Method Summary collapse

Class Method Details

.decode(bytes, pos, prefix_bits) ⇒ Object



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/requests/hpack.rb', line 135

def decode(bytes, pos, prefix_bits)
  max = (1 << prefix_bits) - 1
  value = bytes.getbyte(pos) & max
  pos += 1
  if value == max
    m = 0
    loop do
      b = bytes.getbyte(pos)
      raise Requests::ContentDecodingError, 'truncated hpack integer' if b.nil?
      pos += 1
      value += (b & 127) * (2**m)
      m += 7
      break if b & 128 == 0
    end
  end
  [value, pos]
end

.encode(value, prefix_bits, first_byte = 0) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/requests/hpack.rb', line 121

def encode(value, prefix_bits, first_byte = 0)
  max = (1 << prefix_bits) - 1
  if value < max
    [first_byte | value].pack('C')
  else
    out = [first_byte | max].pack('C')
    value -= max
    while value >= 128
      out << [(value % 128) | 128].pack('C')
      value /= 128
    end
    out << [value].pack('C')
  end
end