aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-08-14 18:31:21 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-08-14 18:31:21 +0900
commita80d386e915315e1d789c9171ccd725efc36503b (patch)
tree0bee298c1d8013171429a2894b4221db1703d9bf
parent771d444bb5ddd3d49dfec874fd6ac1288bd9b9b3 (diff)
downloadplum-a80d386e915315e1d789c9171ccd725efc36503b.tar.gz
hpack: update test cases
-rw-r--r--lib/plum/hpack/encoder.rb25
-rw-r--r--test/plum/hpack/test_encoder.rb31
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