diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-14 18:31:21 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-14 18:31:21 +0900 |
commit | a80d386e915315e1d789c9171ccd725efc36503b (patch) | |
tree | 0bee298c1d8013171429a2894b4221db1703d9bf | |
parent | 771d444bb5ddd3d49dfec874fd6ac1288bd9b9b3 (diff) | |
download | plum-a80d386e915315e1d789c9171ccd725efc36503b.tar.gz |
hpack: update test cases
-rw-r--r-- | lib/plum/hpack/encoder.rb | 25 | ||||
-rw-r--r-- | test/plum/hpack/test_encoder.rb | 31 |
2 files changed, 42 insertions, 14 deletions
diff --git a/lib/plum/hpack/encoder.rb b/lib/plum/hpack/encoder.rb index a1a09e8..2dc2482 100644 --- a/lib/plum/hpack/encoder.rb +++ b/lib/plum/hpack/encoder.rb @@ -5,9 +5,10 @@ module Plum class Encoder include HPACK::Context - def initialize(dynamic_table_limit, indexing: true) + def initialize(dynamic_table_limit, indexing: true, huffman: true) super(dynamic_table_limit) @indexing = indexing + @huffman = huffman end def encode(headers) @@ -94,15 +95,25 @@ module Plum end def encode_string(str) - huffman_str = Huffman.encode(str) - if huffman_str.bytesize < str.bytesize - lenstr = encode_integer(huffman_str.bytesize, 7) - lenstr.setbyte(0, lenstr.uint8(0) | 0b10000000) - lenstr.force_encoding(Encoding::BINARY) << huffman_str + if @huffman + hs = encode_string_huffman(str) + ps = encode_string_plain(str) + hs.bytesize < ps.bytesize ? hs : ps else - encode_integer(str.bytesize, 7) << str.force_encoding(Encoding::BINARY) + encode_string_plain(str) end end + + def encode_string_plain(str) + encode_integer(str.bytesize, 7) << str.force_encoding(Encoding::BINARY) + end + + def encode_string_huffman(str) + huffman_str = Huffman.encode(str) + lenstr = encode_integer(huffman_str.bytesize, 7) + lenstr.setbyte(0, lenstr.uint8(0) | 0b10000000) + lenstr.force_encoding(Encoding::BINARY) << huffman_str + end end end end diff --git a/test/plum/hpack/test_encoder.rb b/test/plum/hpack/test_encoder.rb index 9c64942..3c56dfc 100644 --- a/test/plum/hpack/test_encoder.rb +++ b/test/plum/hpack/test_encoder.rb @@ -3,25 +3,25 @@ require "test_helper" class HPACKEncoderTest < Minitest::Test # C.1.1 def test_hpack_encode_integer_small - result = new_encoder.__send__(:encode_integer, 10, 5) + result = new_encoder(1 << 31).__send__(:encode_integer, 10, 5) assert_equal([0b00001010].pack("C*"), result) end # C.1.2 def test_hpack_encode_integer_big - result = new_encoder.__send__(:encode_integer, 1337, 5) + result = new_encoder(1 << 31).__send__(:encode_integer, 1337, 5) assert_equal([0b00011111, 0b10011010, 0b00001010].pack("C*"), result) end # C.1.3 def test_hpack_encode_integer_8prefix - result = new_encoder.__send__(:encode_integer, 42, 8) + result = new_encoder(1 << 31).__send__(:encode_integer, 42, 8) assert_equal([0b00101010].pack("C*"), result) end def test_hpack_encode_single headers = [["custom-key", "custom-header"]] - encoded = new_encoder.encode(headers) + encoded = new_encoder(1 << 31).encode(headers) decoded = new_decoder.decode(encoded) assert_equal(headers, decoded) end @@ -33,17 +33,34 @@ class HPACKEncoderTest < Minitest::Test [":path", "/"], [":authority", "www.example.com"] ] - encoded = new_encoder.encode(headers) + encoded = new_encoder(1 << 31).encode(headers) decoded = new_decoder.decode(encoded) assert_equal(headers, decoded) end + def test_hpack_encode_without_indexing + encoder = new_encoder(1 << 31, indexing: false) + headers1 = [["custom-key", "custom-header"]] + ret1 = encoder.encode(headers1) + assert_equal([], encoder.dynamic_table) + headers2 = [[":method", "custom-header"]] + ret2 = encoder.encode(headers2) + assert_equal([], encoder.dynamic_table) + end + + def test_hpack_encode_without_huffman + encoder = new_encoder(1 << 31, huffman: false) + headers = [["custom-key", "custom-header"]] + ret = encoder.encode(headers) + assert_equal("\x40\x0acustom-key\x0dcustom-header", ret) + end + private def new_decoder(settings_header_table_size = 1 << 31) Plum::HPACK::Decoder.new(settings_header_table_size) end - def new_encoder(settings_header_table_size = 1 << 31) - Plum::HPACK::Encoder.new(settings_header_table_size) + def new_encoder(*args) + Plum::HPACK::Encoder.new(*args) end end |