module Plum::HPACK::Context

Attributes

dynamic_table[R]
limit[R]
size[R]

Public Class Methods

new(dynamic_table_limit) click to toggle source
# File lib/plum/hpack/context.rb, line 12
def initialize(dynamic_table_limit)
  @limit = dynamic_table_limit
  @dynamic_table = []
  @size = 0
end

Public Instance Methods

limit=(value) click to toggle source
# File lib/plum/hpack/context.rb, line 6
def limit=(value)
  @limit = value
  evict
end

Private Instance Methods

evict() click to toggle source
# File lib/plum/hpack/context.rb, line 51
def evict
  while @size > @limit
    name, value = @dynamic_table.pop
    @size -= name.bytesize + value.bytesize + 32
  end
end
fetch(index) click to toggle source
# File lib/plum/hpack/context.rb, line 25
def fetch(index)
  if index == 0
    raise HPACKError.new("index can't be 0")
  elsif index <= STATIC_TABLE_SIZE
      STATIC_TABLE[index - 1]
  elsif index <= STATIC_TABLE.size + @dynamic_table.size
    @dynamic_table[index - STATIC_TABLE_SIZE - 1]
  else
    raise HPACKError.new("invalid index: #{index}")
  end
end
search_half(name) click to toggle source
# File lib/plum/hpack/context.rb, line 44
def search_half(name)
  si = STATIC_TABLE.index { |n, v| n == name }
  return si + 1 if si
  di = @dynamic_table.index { |n, v| n == name }
  return di + STATIC_TABLE_SIZE + 1 if di
end
store(name, value) click to toggle source
# File lib/plum/hpack/context.rb, line 18
def store(name, value)
  value = value.to_s
  @dynamic_table.unshift([name.freeze, value.freeze])
  @size += name.bytesize + value.bytesize + 32
  evict
end