class Protocol::HPACK::Huffman

Implementation of huffman encoding for HPACK.

def self.decode(buffer)

Raises:
  • (CompressionError) - when Huffman coded string is malformed

Returns:
  • (String) - binary string

Parameters:
  • buf (Buffer) --
def self.decode(buffer)
	emit = String.new.b
	state = 0 # start state
	mask = (1 << BITS_AT_ONCE) - 1
	buffer.each_byte do |c|
		shift = BITS_AT_ONCE
		while shift >= 0
			branch = (c >> shift) & mask
			
			# MACHINE[state] = [final, [transitions]]
			#  [final] unfinished bits so far are prefix of the EOS code.
			# Each transition is [emit, next]
			#  [emit] character to be emitted on this transition, empty string, or EOS.
			#  [next] next state number.
			value, state = MACHINE[state][branch]
			
			raise CompressionError, "Huffman decode error (EOS found)" if value == EOS
			
			emit << value.chr if value
			shift -= BITS_AT_ONCE
		end
	end
	# Check whether partial input is correctly filled
	unless state <= MAX_FINAL_STATE
		raise CompressionError, "Huffman decode error (EOS invalid)"
	end
	emit.force_encoding(Encoding::BINARY)
end

def self.encode(str)

Returns:
  • (String) - binary string

Parameters:
  • str (String) --
def self.encode(str)
	bitstring = str.each_byte.map {|chr| ENCODE_TABLE[chr]}.join
	bitstring << "1" * ((8 - bitstring.size) % 8)
	[bitstring].pack("B*")
end