Mercurial > hg > nginx-tests
comparison h2.t @ 671:0c70eb166a3a
Tests: in HTTP/2 tests, always access a dynamic table by reference.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Wed, 02 Sep 2015 13:57:46 +0300 |
parents | 944b87756cab |
children | 66f94d6c5047 |
comparison
equal
deleted
inserted
replaced
670:944b87756cab | 671:0c70eb166a3a |
---|---|
1928 [ 'www-authenticate', '' ], | 1928 [ 'www-authenticate', '' ], |
1929 } | 1929 } |
1930 | 1930 |
1931 sub hpack { | 1931 sub hpack { |
1932 my ($ctx, $name, $value, %extra) = @_; | 1932 my ($ctx, $name, $value, %extra) = @_; |
1933 my @table = @{$ctx->{dynamic_encode}}; | 1933 my $table = $ctx->{dynamic_encode}; |
1934 my $mode = defined $extra{mode} ? $extra{mode} : 1; | 1934 my $mode = defined $extra{mode} ? $extra{mode} : 1; |
1935 my $huff = $extra{huff}; | 1935 my $huff = $extra{huff}; |
1936 | 1936 |
1937 my ($index, $buf) = 0; | 1937 my ($index, $buf) = 0; |
1938 | 1938 |
1939 # 6.1. Indexed Header Field Representation | 1939 # 6.1. Indexed Header Field Representation |
1940 | 1940 |
1941 if ($mode == 0) { | 1941 if ($mode == 0) { |
1942 ++$index until $index > $#table | 1942 ++$index until $index > $#$table |
1943 or $table[$index][0] eq $name | 1943 or $table->[$index][0] eq $name |
1944 and $table[$index][1] eq $value; | 1944 and $table->[$index][1] eq $value; |
1945 $buf = pack('B*', '1' . sprintf("%7b", $index)); | 1945 $buf = pack('B*', '1' . sprintf("%7b", $index)); |
1946 } | 1946 } |
1947 | 1947 |
1948 # 6.2.1. Literal Header Field with Incremental Indexing | 1948 # 6.2.1. Literal Header Field with Incremental Indexing |
1949 | 1949 |
1950 if ($mode == 1) { | 1950 if ($mode == 1) { |
1951 splice @{$ctx->{dynamic_encode}}, $ctx->{static_table_size}, 0, | 1951 splice @$table, $ctx->{static_table_size}, 0, [ $name, $value ]; |
1952 [ $name, $value ]; | 1952 |
1953 | 1953 ++$index until $index > $#$table |
1954 ++$index until $index > $#table or $table[$index][0] eq $name; | 1954 or $table->[$index][0] eq $name; |
1955 my $value = $huff ? huff($value) : $value; | 1955 my $value = $huff ? huff($value) : $value; |
1956 | 1956 |
1957 $buf = pack('B*', '01' . sprintf("%6b", $index) | 1957 $buf = pack('B*', '01' . sprintf("%6b", $index) |
1958 . ($huff ? '1' : '0') . sprintf("%7b", length($value))); | 1958 . ($huff ? '1' : '0') . sprintf("%7b", length($value))); |
1959 $buf .= $value; | 1959 $buf .= $value; |
1960 } | 1960 } |
1961 | 1961 |
1962 # 6.2.1. Literal Header Field with Incremental Indexing -- New Name | 1962 # 6.2.1. Literal Header Field with Incremental Indexing -- New Name |
1963 | 1963 |
1964 if ($mode == 2) { | 1964 if ($mode == 2) { |
1965 splice @{$ctx->{dynamic_encode}}, $ctx->{static_table_size}, 0, | 1965 splice @$table, $ctx->{static_table_size}, 0, [ $name, $value ]; |
1966 [ $name, $value ]; | |
1967 | 1966 |
1968 my $name = $huff ? huff($name) : $name; | 1967 my $name = $huff ? huff($name) : $name; |
1969 my $value = $huff ? huff($value) : $value; | 1968 my $value = $huff ? huff($value) : $value; |
1970 my $hbit = ($huff ? '1' : '0'); | 1969 my $hbit = ($huff ? '1' : '0'); |
1971 | 1970 |
1977 } | 1976 } |
1978 | 1977 |
1979 # 6.2.2. Literal Header Field without Indexing | 1978 # 6.2.2. Literal Header Field without Indexing |
1980 | 1979 |
1981 if ($mode == 3) { | 1980 if ($mode == 3) { |
1982 ++$index until $index > $#table or $table[$index][0] eq $name; | 1981 ++$index until $index > $#$table |
1982 or $table->[$index][0] eq $name; | |
1983 my $value = $huff ? huff($value) : $value; | 1983 my $value = $huff ? huff($value) : $value; |
1984 | 1984 |
1985 $buf = pack('B*', '0000' . sprintf("%4b", $index) | 1985 $buf = pack('B*', '0000' . sprintf("%4b", $index) |
1986 . ($huff ? '1' : '0') . sprintf("%7b", length($value))); | 1986 . ($huff ? '1' : '0') . sprintf("%7b", length($value))); |
1987 $buf .= $value; | 1987 $buf .= $value; |
2002 } | 2002 } |
2003 | 2003 |
2004 # 6.2.3. Literal Header Field Never Indexed | 2004 # 6.2.3. Literal Header Field Never Indexed |
2005 | 2005 |
2006 if ($mode == 5) { | 2006 if ($mode == 5) { |
2007 ++$index until $index > $#table or $table[$index][0] eq $name; | 2007 ++$index until $index > $#$table |
2008 or $table->[$index][0] eq $name; | |
2008 my $value = $huff ? huff($value) : $value; | 2009 my $value = $huff ? huff($value) : $value; |
2009 | 2010 |
2010 $buf = pack('B*', '0001' . sprintf("%4b", $index) | 2011 $buf = pack('B*', '0001' . sprintf("%4b", $index) |
2011 . ($huff ? '1' : '0') . sprintf("%7b", length($value))); | 2012 . ($huff ? '1' : '0') . sprintf("%7b", length($value))); |
2012 $buf .= $value; | 2013 $buf .= $value; |
2029 return $buf; | 2030 return $buf; |
2030 } | 2031 } |
2031 | 2032 |
2032 sub hunpack { | 2033 sub hunpack { |
2033 my ($ctx, $data, $length) = @_; | 2034 my ($ctx, $data, $length) = @_; |
2034 my @table = @{$ctx->{dynamic_decode}}; | 2035 my $table = $ctx->{dynamic_decode}; |
2035 my %headers; | 2036 my %headers; |
2036 my $skip = 0; | 2037 my $skip = 0; |
2037 my ($name, $value); | 2038 my ($name, $value); |
2038 | 2039 |
2039 sub index { | 2040 sub index { |
2064 while ($skip < $length) { | 2065 while ($skip < $length) { |
2065 my $ib = unpack("\@$skip B8", $data); | 2066 my $ib = unpack("\@$skip B8", $data); |
2066 | 2067 |
2067 if (substr($ib, 0, 1) eq '1') { | 2068 if (substr($ib, 0, 1) eq '1') { |
2068 my $index = &index($ib, 1); | 2069 my $index = &index($ib, 1); |
2069 add(\%headers, $table[$index][0], $table[$index][1]); | 2070 add(\%headers, |
2071 $table->[$index][0], $table->[$index][1]); | |
2070 $skip += 1; | 2072 $skip += 1; |
2071 next; | 2073 next; |
2072 } | 2074 } |
2073 | 2075 |
2074 if (substr($ib, 0, 2) eq '01') { | 2076 if (substr($ib, 0, 2) eq '01') { |
2075 $name = $table[&index($ib, 2)][0]; | 2077 $name = $table->[&index($ib, 2)][0]; |
2076 $skip++; | 2078 $skip++; |
2077 | 2079 |
2078 ($name, $skip) = field($data, $skip) unless $name; | 2080 ($name, $skip) = field($data, $skip) unless $name; |
2079 ($value, $skip) = field($data, $skip); | 2081 ($value, $skip) = field($data, $skip); |
2080 | 2082 |
2081 splice @{$ctx->{dynamic_decode}}, | 2083 splice @$table, |
2082 $ctx->{static_table_size}, 0, [ $name, $value ]; | 2084 $ctx->{static_table_size}, 0, [ $name, $value ]; |
2083 add(\%headers, $name, $value); | 2085 add(\%headers, $name, $value); |
2084 next; | 2086 next; |
2085 } | 2087 } |
2086 | 2088 |
2087 if (substr($ib, 0, 4) eq '0000') { | 2089 if (substr($ib, 0, 4) eq '0000') { |
2088 $name = $table[&index($ib, 4)][0]; | 2090 $name = $table->[&index($ib, 4)][0]; |
2089 $skip++; | 2091 $skip++; |
2090 | 2092 |
2091 ($name, $skip) = field($data, $skip) unless $name; | 2093 ($name, $skip) = field($data, $skip) unless $name; |
2092 ($value, $skip) = field($data, $skip); | 2094 ($value, $skip) = field($data, $skip); |
2093 | 2095 |