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