1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
ULib/tests/ulib/http2/rfc7541_4_2
stefanocasazza 329b3fbd64 sync
2016-12-22 15:54:12 +01:00

374 lines
8.5 KiB
Bash
Executable File

#!/bin/sh
#
# Written by Dridi Boukelmoune <dridi.boukelmoune@gmail.com>
#
# This file is in the public domain.
#
# 4.2. Maximum Table Size
#
# Protocols that use HPACK determine the maximum size that the encoder
# is permitted to use for the dynamic table. In HTTP/2, this value is
# determined by the SETTINGS_HEADER_TABLE_SIZE setting (see
# Section 6.5.2 of [HTTP2]).
#
# An encoder can choose to use less capacity than this maximum size
# (see Section 6.3), but the chosen size MUST stay lower than or equal
# to the maximum set by the protocol.
#
# A change in the maximum size of the dynamic table is signaled via a
# dynamic table size update (see Section 6.3). This dynamic table size
# update MUST occur at the beginning of the first header block
# following the change to the dynamic table size. In HTTP/2, this
# follows a settings acknowledgment (see Section 6.5.3 of [HTTP2]).
#
# Multiple updates to the maximum table size can occur between the
# transmission of two header blocks. In the case that this size is
# changed more than once in this interval, the smallest maximum table
# size that occurs in that interval MUST be signaled in a dynamic table
# size update. The final maximum size is always signaled, resulting in
# at most two dynamic table size updates. This ensures that the
# decoder is able to perform eviction based on reductions in dynamic
# table size (see Section 4.3).
#
# This mechanism can be used to completely clear entries from the
# dynamic table by setting a maximum size of 0, which can subsequently
# be restored.
. "$(dirname "$0")"/common.sh
_ ---------------------------------------
_ Encoder can choose to use less capacity
_ ---------------------------------------
mk_hex <<EOF
# update table size to 0
20
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
EOF
mk_msg <<EOF
name: value
EOF
mk_tbl </dev/null
mk_enc <<EOF
update 0
dynamic str name str value
EOF
tst_decode
tst_encode
_ ----------------------------
_ Resize followed by an update
_ ----------------------------
mk_hex <<EOF
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
# table update to 20
34 | 4
# literal field "name: value"
0004 6e61 6d65 0576 616c 7565 | ..name.value
EOF
mk_msg <<EOF
name: value
name: value
EOF
mk_tbl </dev/null
mk_enc <<EOF
dynamic str name str value
send
resize 20
# cashpack automatically sends the update
literal str name str value
EOF
tst_decode --decoding-spec d12,r20,
tst_encode
_ -----------------------------------------------------
_ Table resized multiple times between two HPACK blocks
_ -----------------------------------------------------
mk_hex <<EOF
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
# table update to 0
20 |
# table update back to 4096
3fe1 1f | ?..
# literal field "name: value"
0004 6e61 6d65 0576 616c 7565 | ..name.value
EOF
mk_enc <<EOF
dynamic str name str value
send
resize 0
resize 4096
# cashpack automatically sends both updates
literal str name str value
EOF
tst_decode --decoding-spec d12,r0,r4096,
tst_encode
_ ----------------------------------------------------------
_ Table resized more than two times between two HPACK blocks
_ ----------------------------------------------------------
mk_enc <<EOF
dynamic str name str value
send
# the first resize will be ignored leading to the same
# HPACK blocks as the previous test case
resize 20
resize 0
resize 4096
# cashpack automatically sends the two relevant updates
literal str name str value
EOF
tst_decode --decoding-spec d12,r20,r0,r4096,
tst_encode
_ ---------------------------------------------------------
_ Use less capacity for the last update of multiple resizes
_ ---------------------------------------------------------
mk_hex <<EOF
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
# table update to 0
20 |
# table update to only 2048
3fe1 08 | ?..
# literal field "name: value"
0004 6e61 6d65 0576 616c 7565 | ..name.value
EOF
tst_decode --decoding-spec d12,r0,r4096,
# XXX: not testable yet for encoding
_ ---------------------------
_ Missing update after resize
_ ---------------------------
mk_hex <<EOF
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
# literal field "name: value"
0004 6e61 6d65 0576 616c 7565 | ..name.value
EOF
tst_decode --decoding-spec d12,r0, --expect-error RSZ
_ ------------------------------------
_ Omit the minimum of multiple resizes
_ ------------------------------------
mk_hex <<EOF
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
# table update to 4096
3fe1 1f | ?..
EOF
tst_decode --decoding-spec d12,r0,r4096, --expect-error UPD
_ -------------------------------------
_ Update too big after multiple resizes
_ -------------------------------------
mk_hex <<EOF
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
# table update to 0
20 |
# table update over 9000
3f8a 46 | ?.F
EOF
tst_decode --decoding-spec d12,r0,r4096, --expect-error UPD
_ -------------------------------------------------------
_ Table size update not at the begining of an HPACK block
_ -------------------------------------------------------
mk_msg </dev/null
mk_tbl </dev/null
mk_bin <<EOF
10000100 | pick ":path: /" from the 4th static entry
00111111 | 001 (table update) and 31 (5-bit prefix)
01110111 | 0 (end of int) and 119 (total: 150)
EOF
tst_decode --expect-error UPD
_ ---------------------------------------------
_ No more than two updates can occur in a block
_ ---------------------------------------------
mk_hex <<EOF
# dynamic field "name: value"
4004 6e61 6d65 0576 616c 7565 | @.name.value
# table update to 0
20 |
# table update back to 4096
3fe1 1f | ?..
# table update to 20
34 | 4
EOF
HDECODE=hdecode # XXX: nghttp2 1.7.1 fails this test
tst_decode --decoding-spec d12,r0,r4096, --expect-error UPD
_ ----------------------------------
_ Set a limit above the maximum size
_ ----------------------------------
mk_hex <<EOF
# no update received
4004 6e61 6d65 0576 616c 7565 4005 6f74 | @.name.value@.ot
6865 7205 6669 656c 64 | her.field
EOF
mk_tbl <<EOF
[ 1] (s = 42) other: field
Table size: 42
EOF
mk_enc <<EOF
update 4096
dynamic str name str value
dynamic str other str field
EOF
tst_encode --table-size 42
# the same test with the limit set during allocation
mk_enc <<EOF
dynamic str name str value
dynamic str other str field
EOF
tst_encode --table-limit 4096 --table-size 42
_ ---------------------------------------
_ Resize above the limit after it was set
_ ---------------------------------------
mk_hex <<EOF
# no update, yet
4004 6e61 6d65 0576 616c 7565 4005 6f74 | @.name.value@.ot
6865 7205 6669 656c 64 | her.field
# table update to 0
20
# table update to 4096
3fe1 1f
4004 6e61 6d65 0576 616c 7565 4005 6f74 | @.name.value@.ot
6865 7205 6669 656c 64 | her.field
EOF
mk_tbl <<EOF
[ 1] (s = 42) other: field
[ 2] (s = 41) name: value
Table size: 83
EOF
mk_enc <<EOF
update 4096
dynamic str name str value
dynamic str other str field
send
resize 0
resize 8192
dynamic str name str value
dynamic str other str field
EOF
tst_encode
# the same test with the limit set during allocation
mk_enc <<EOF
dynamic str name str value
dynamic str other str field
send
resize 0
resize 8192
dynamic str name str value
dynamic str other str field
EOF
tst_encode --table-limit 4096
_ ----------------------
_ Resize below the limit
_ ----------------------
mk_hex <<EOF
# table update to 4096
3fe1 1f
4004 6e61 6d65 0576 616c 7565 4005 6f74 | @.name.value@.ot
6865 7205 6669 656c 64 | her.field
EOF
mk_tbl <<EOF
[ 1] (s = 42) other: field
[ 2] (s = 41) name: value
Table size: 83
EOF
mk_enc <<EOF
update 8192
resize 4096
dynamic str name str value
dynamic str other str field
EOF
tst_encode --table-size 42
# the same test with the limit set during allocation
mk_enc <<EOF
resize 4096
dynamic str name str value
dynamic str other str field
EOF
tst_encode --table-limit 8192 --table-size 42