aboutsummaryrefslogtreecommitdiffstats
path: root/lib/plum/hpack/huffman.rb
blob: c4d8c53fe84e8b8b1b243f9cf0d60cf1b216d901 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using Plum::BinaryString

module Plum
  module HPACK
    module Huffman
      extend self

      # TODO: performance
      def encode(bytestr)
        out = ""
        bytestr.bytes.each do |b|
          out << HUFFMAN_TABLE[b]
        end
        out << "1" * (8 - (out.size % 8))
        [out].pack("B*")
      end

      # TODO: performance
      def decode(encoded)
        bits = encoded.unpack("B*")[0]
        buf = ""
        outl = []
        while (n = bits.shift(1)).size > 0
          if c = HUFFMAN_DECODE_TABLE[buf << n]
            buf = ""
            outl << c
          end
        end

        if buf.size > 7
          raise HPACKError.new("huffman: padding is too large (> 7 bits)")
        elsif buf != "1" * buf.size
          raise HPACKError.new("huffman: unknown suffix: #{buf}")
        else
          outl.pack("C*")
        end
      end
    end
  end
end