Mercurial > hg > nginx-tests
annotate lib/Test/Nginx/HTTP3.pm @ 1905:f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
The parse_stream() routine has had a missing explicit return if there were no
streams received. In Perl < 5.24 this used to return no value, or an empty
array in the list context. In modern Perl this returns an empty value, or an
array of 1 element, which made the check for last index of the returned array
work rather by accident.
The fix is to return explicitly and to check the array size in callers instead.
author | Sergey Kandaurov <pluknet@nginx.com> |
---|---|
date | Tue, 06 Jun 2023 18:50:07 +0400 |
parents | 8303f3633f65 |
children | 1baf5fe1d86c |
rev | line source |
---|---|
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1 package Test::Nginx::HTTP3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
3 # (C) Sergey Kandaurov |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
4 # (C) Nginx, Inc. |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
5 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
6 # Module for nginx QUIC tests. |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
7 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
8 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
9 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
10 use warnings; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
11 use strict; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
12 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
13 use IO::Socket::INET; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
14 use IO::Select; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
15 use Data::Dumper; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
16 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
17 use Test::Nginx; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
18 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
19 sub new { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
20 my $self = {}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
21 bless $self, shift @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
22 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
23 my ($port, %extra) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
24 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
25 require Crypt::KeyDerivation; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
26 require Crypt::PK::X25519; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
27 require Crypt::PRNG; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
28 require Crypt::AuthEnc::GCM; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
29 require Crypt::Mode::CTR; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
30 require Crypt::Digest; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
31 require Crypt::Mac::HMAC; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
32 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
33 $self->{socket} = IO::Socket::INET->new( |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
34 Proto => "udp", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
35 PeerAddr => '127.0.0.1:' . port($port || 8980), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
36 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
37 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
38 $self->{repeat} = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
39 $self->{token} = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
40 $self->{psk_list} = $extra{psk_list} || []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
41 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
42 $self->{sni} = exists $extra{sni} ? $extra{sni} : 'localhost'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
43 $self->{opts} = $extra{opts}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
44 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
45 $self->{zero} = pack("x5"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
46 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
47 $self->{static_encode} = [ static_table() ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
48 $self->{static_decode} = [ static_table() ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
49 $self->{dynamic_encode} = []; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
50 $self->{last_stream} = -4; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
51 $self->{buf} = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
52 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
53 $self->init(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
54 $self->init_key_schedule(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
55 $self->initial(); |
1887
1023354f3a41
Tests: ssl_reject_handshake tests with HTTP/3.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1886
diff
changeset
|
56 return $self if $extra{probe}; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
57 $self->handshake() or return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
58 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
59 # RFC 9204, 4.3.1. Set Dynamic Table Capacity |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
60 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
61 my $buf = pack("B*", '001' . ipack(5, $extra{capacity} || 400)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
62 $self->{encoder_offset} = length($buf) + 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
63 $buf = "\x08\x02\x02" . $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
64 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
65 # RFC 9114, 6.2.1. Control Streams |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
66 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
67 $buf = "\x0a\x06\x03\x00\x04\x00" . $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
68 $self->{control_offset} = 3; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
69 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
70 $self->raw_write($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
71 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
72 return $self; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
73 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
74 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
75 sub init { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
76 my ($self, $early_data) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
77 $self->{keys} = []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
78 $self->{pn} = [[-1, -1, -1, -1], [-1, -1, -1, -1]]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
79 $self->{crypto_in} = [[],[],[],[]]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
80 $self->{stream_in} = []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
81 $self->{frames_in} = []; |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
82 $self->{frames_incomplete} = []; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
83 $self->{tlsm} = (); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
84 $self->{tlsm}{$_} = '' |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
85 for 'ch', 'sh', 'ee', 'cert', 'cv', 'sf', 'cf', 'nst'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
86 $self->{requests} = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
87 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
88 # Initial |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
89 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
90 $self->{odcid} = undef; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
91 $self->{scid} = Crypt::PRNG::random_bytes(17); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
92 $self->{dcid} = Crypt::PRNG::random_bytes(18); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
93 $self->{salt} = "\x38\x76\x2c\xf7\xf5\x59\x34\xb3\x4d\x17" |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
94 . "\x9a\xe6\xa4\xc8\x0c\xad\xcc\xbb\x7f\x0a"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
95 $self->{ncid} = []; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
96 $self->{early_data} = $early_data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
97 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
98 $self->retry(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
99 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
100 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
101 sub retry { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
102 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
103 my $prk = Crypt::KeyDerivation::hkdf_extract($self->{dcid}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
104 $self->{salt}, 'SHA256'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
105 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
106 Test::Nginx::log_core('||', "scid = " . unpack("H*", $self->{scid})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
107 Test::Nginx::log_core('||', "dcid = " . unpack("H*", $self->{dcid})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
108 Test::Nginx::log_core('||', "prk = " . unpack("H*", $prk)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
109 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
110 $self->set_traffic_keys('tls13 client in', 0, 'w', $prk); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
111 $self->set_traffic_keys('tls13 server in', 0, 'r', $prk); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
112 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
113 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
114 sub init_key_schedule { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
115 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
116 $self->{psk} = $self->{psk_list}[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
117 $self->{es_prk} = Crypt::KeyDerivation::hkdf_extract( |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
118 $self->{psk}->{secret} || pack("x32"), pack("x32"), 'SHA256'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
119 $self->{sk} = Crypt::PK::X25519->new->generate_key; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
120 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
121 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
122 sub initial { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
123 my ($self, $ed) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
124 $self->{tlsm}{ch} = $self->build_tls_client_hello(); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
125 my $ch = $self->{tlsm}{ch}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
126 my $crypto = build_crypto($ch); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
127 my $padding = 1200 - length($crypto); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
128 $padding = 0 if $padding < 0 || $self->{psk}->{ed}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
129 my $payload = $crypto . pack("x$padding"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
130 my $initial = $self->encrypt_aead($payload, 0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
131 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
132 if ($ed && $self->{psk}->{ed}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
133 $self->set_traffic_keys('tls13 c e traffic', 1, 'w', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
134 $self->{es_prk}, Crypt::Digest::digest_data('SHA256', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
135 $self->{tlsm}{ch})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
136 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
137 # my $ed = "\x0a\x02\x08\x00\x04\x02\x06\x1f\x0d\x00\x0a" |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
138 # . $self->build_stream("\x01\x06\x00\x00\xc0"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
139 $payload = $ed; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
140 # $payload = $self->build_stream("GET /\n"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
141 $padding = 1200 - length($crypto) - length($payload); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
142 $payload .= pack("x$padding") if $padding > 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
143 $initial .= $self->encrypt_aead($payload, 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
144 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
145 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
146 $self->{socket}->syswrite($initial); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
147 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
148 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
149 sub handshake { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
150 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
151 my $buf = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
152 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
153 $self->read_tls_message(\$buf, \&parse_tls_server_hello) or return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
154 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
155 my $sh = $self->{tlsm}{sh}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
156 my $extens_len = unpack("C*", substr($sh, 6 + 32 + 4, 2)) * 8 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
157 + unpack("C*", substr($sh, 6 + 32 + 5, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
158 my $extens = substr($sh, 6 + 32 + 4 + 2, $extens_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
159 my $pub = key_share($extens); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
160 Test::Nginx::log_core('||', "pub = " . unpack("H*", $pub)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
161 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
162 my $pk = Crypt::PK::X25519->new; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
163 $pk->import_key_raw($pub, "public"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
164 my $shared_secret = $self->{sk}->shared_secret($pk); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
165 Test::Nginx::log_core('||', "shared = " . unpack("H*", $shared_secret)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
166 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
167 # tls13_advance_key_schedule |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
168 |
1884
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
169 my $psk = pre_shared_key($extens); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
170 $self->{psk} = (defined $psk && $self->{psk_list}[$psk]) || undef; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
171 $self->{es_prk} = Crypt::KeyDerivation::hkdf_extract( |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
172 $self->{psk}->{secret} || pack("x32"), pack("x32"), 'SHA256'); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
173 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
174 $self->{hs_prk} = hkdf_advance($shared_secret, $self->{es_prk}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
175 Test::Nginx::log_core('||', "hs = " . unpack("H*", $self->{hs_prk})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
176 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
177 # derive_secret_with_transcript |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
178 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
179 my $digest = Crypt::Digest::digest_data('SHA256', $self->{tlsm}{ch} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
180 . $self->{tlsm}{sh}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
181 $self->set_traffic_keys('tls13 c hs traffic', 2, 'w', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
182 $self->{hs_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
183 $self->set_traffic_keys('tls13 s hs traffic', 2, 'r', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
184 $self->{hs_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
185 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
186 $self->read_tls_message(\$buf, \&parse_tls_encrypted_extensions); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
187 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
188 unless (keys %{$self->{psk}}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
189 $self->read_tls_message(\$buf, \&parse_tls_certificate); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
190 $self->read_tls_message(\$buf, \&parse_tls_certificate_verify); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
191 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
192 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
193 $self->read_tls_message(\$buf, \&parse_tls_finished); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
194 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
195 # tls13_advance_key_schedule(application) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
196 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
197 $self->{ms_prk} = hkdf_advance(pack("x32"), $self->{hs_prk}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
198 Test::Nginx::log_core('||', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
199 "master = " . unpack("H*", $self->{ms_prk})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
200 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
201 # derive_secret_with_transcript(application) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
202 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
203 $digest = Crypt::Digest::digest_data('SHA256', $self->{tlsm}{ch} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
204 . $self->{tlsm}{sh} . $self->{tlsm}{ee} . $self->{tlsm}{cert} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
205 . $self->{tlsm}{cv} . $self->{tlsm}{sf}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
206 $self->set_traffic_keys('tls13 c ap traffic', 3, 'w', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
207 $self->{ms_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
208 $self->set_traffic_keys('tls13 s ap traffic', 3, 'r', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
209 $self->{ms_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
210 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
211 # client finished |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
212 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
213 my $finished = tls13_finished($self->{keys}[2]{w}{prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
214 Test::Nginx::log_core('||', "finished = " . unpack("H*", $finished)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
215 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
216 $self->{tlsm}{cf} = $finished; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
217 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
218 $digest = Crypt::Digest::digest_data('SHA256', $self->{tlsm}{ch} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
219 . $self->{tlsm}{sh} . $self->{tlsm}{ee} . $self->{tlsm}{cert} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
220 . $self->{tlsm}{cv} . $self->{tlsm}{sf} . $self->{tlsm}{cf}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
221 $self->{rms_prk} = hkdf_expand_label("tls13 res master", 32, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
222 $self->{ms_prk}, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
223 Test::Nginx::log_core('||', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
224 "resumption = " . unpack("H*", $self->{rms_prk})); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
225 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
226 my $crypto = build_crypto($finished); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
227 $self->{socket}->syswrite($self->encrypt_aead($crypto, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
228 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
229 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
230 #if (!$psk->{ed}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
231 # my $r = "\x0a\x02\x08\x00\x04\x02\x06\x1f\x0d\x00\x0a"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
232 # $s->syswrite(encrypt_aead($r, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
233 # $r = "\x01\x06\x00\x00\xc0"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
234 # $s->syswrite(encrypt_aead($self->build_stream($r), 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
235 #} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
236 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
237 sub DESTROY { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
238 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
239 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
240 return unless $self->{socket}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
241 return unless $self->{keys}[3]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
242 my $frame = build_cc(0, "graceful shutdown"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
243 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
244 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
245 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
246 sub ping { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
247 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
248 my $frame = "\x01\x00\x00\x00"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
249 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
250 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
251 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
252 sub reset_stream { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
253 my ($self, $sid, $code) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
254 my $final_size = $self->{streams}{$sid}{sent}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
255 my $frame = "\x04" . build_int($sid) . build_int($code) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
256 . build_int($final_size); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
257 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
258 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
259 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
260 sub stop_sending { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
261 my ($self, $sid, $code) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
262 my $frame = "\x05" . build_int($sid) . build_int($code); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
263 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
264 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
265 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
266 sub new_connection_id { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
267 my ($self, $seqno, $ret, $id, $token) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
268 my $frame = "\x18" . build_int($seqno) . build_int($ret) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
269 . pack("C", length($id)) . $id . $token; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
270 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
271 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
272 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
273 sub path_challenge { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
274 my ($self, $data) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
275 my $frame = "\x1a" . $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
276 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
277 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
278 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
279 sub path_response { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
280 my ($self, $data) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
281 my $frame = "\x1b" . $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
282 $self->{socket}->syswrite($self->encrypt_aead($frame, 3)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
283 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
284 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
285 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
286 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
287 # HTTP/3 routines |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
288 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
289 # 4.3.2. Insert with Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
290 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
291 sub insert_reference { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
292 my ($self, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
293 my $table = $extra{dyn} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
294 ? $self->{dynamic_encode} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
295 : $self->{static_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
296 my $huff = $extra{huff}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
297 my $hbit = $huff ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
298 my $dbit = $extra{dyn} ? '0' : '1'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
299 my ($index, $buf) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
300 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
301 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
302 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
303 $table = $self->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
304 splice @$table, 0, 0, [ $name, $value ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
305 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
306 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
307 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
308 $buf = pack('B*', '1' . $dbit . ipack(6, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
309 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
310 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
311 my $offset = $self->{encoder_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
312 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
313 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
314 $self->{encoder_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
315 $self->raw_write("\x0e\x02" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
316 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
317 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
318 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
319 # 4.3.3. Insert with Literal Name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
320 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
321 sub insert_literal { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
322 my ($self, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
323 my $table = $self->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
324 my $huff = $extra{huff}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
325 my $hbit = $huff ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
326 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
327 splice @$table, 0, 0, [ $name, $value ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
328 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
329 $name = $huff ? huff($name) : $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
330 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
331 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
332 my $buf = pack('B*', '01' . $hbit . ipack(5, length($name))) . $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
333 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
334 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
335 my $offset = $self->{encoder_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
336 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
337 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
338 $self->{encoder_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
339 $self->raw_write("\x0e\x02" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
340 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
341 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
342 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
343 # 4.3.4. Duplicate |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
344 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
345 sub duplicate { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
346 my ($self, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
347 my $table = $self->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
348 my $index = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
349 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
350 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
351 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
352 splice @$table, 0, 0, [ $table->[$index][0], $table->[$index][1] ]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
353 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
354 my $buf = pack('B*', '000' . ipack(5, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
355 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
356 my $offset = $self->{encoder_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
357 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
358 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
359 $self->{encoder_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
360 $self->raw_write("\x0e\x02" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
361 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
362 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
363 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
364 sub max_push_id { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
365 my ($self, $val) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
366 $val = build_int($val); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
367 my $buf = "\x0d" . build_int(length($val)) . $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
368 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
369 my $offset = $self->{control_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
370 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
371 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
372 $self->{control_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
373 $self->raw_write("\x0e\x06" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
374 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
375 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
376 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
377 sub cancel_push { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
378 my ($self, $val) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
379 $val = build_int($val); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
380 my $buf = "\x03" . build_int(length($val)) . $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
381 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
382 my $offset = $self->{control_offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
383 my $length = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
384 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
385 $self->{control_offset} += $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
386 $self->raw_write("\x0e\x06" |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
387 . build_int($offset) . build_int($length) . $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
388 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
389 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
390 sub new_stream { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
391 my ($self, $uri, $stream) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
392 my ($input, $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
393 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
394 $self->{headers} = ''; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
395 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
396 my $host = $uri->{host} || 'localhost'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
397 my $method = $uri->{method} || 'GET'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
398 my $scheme = $uri->{scheme} || 'http'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
399 my $path = $uri->{path} || '/'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
400 my $headers = $uri->{headers}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
401 my $body = $uri->{body}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
402 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
403 if ($stream) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
404 $self->{last_stream} = $stream; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
405 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
406 $self->{last_stream} += 4; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
407 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
408 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
409 unless ($headers) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
410 $input = qpack($self, ":method", $method); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
411 $input .= qpack($self, ":scheme", $scheme); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
412 $input .= qpack($self, ":path", $path); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
413 $input .= qpack($self, ":authority", $host); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
414 $input .= qpack($self, "content-length", length($body)) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
415 if $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
416 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
417 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
418 $input = join '', map { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
419 qpack($self, $_->{name}, $_->{value}, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
420 mode => $_->{mode}, huff => $_->{huff}, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
421 idx => $_->{idx}, dyn => $_->{dyn}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
422 } @$headers if $headers; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
423 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
424 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
425 # encoded field section prefix |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
426 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
427 my $table = $self->{dynamic_encode}; |
1883
ff50c265a5ac
Tests: HTTP/3 tests with streams blocked on insert count.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1875
diff
changeset
|
428 my $ric = $uri->{ric} ? $uri->{ric} : @$table ? @$table + 1 : 0; |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
429 my $base = $uri->{base} || 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
430 $base = $base < 0 ? 0x80 + abs($base) - 1 : $base; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
431 $input = pack("CC", $ric, $base) . $input; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
432 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
433 # set length, attach headers, body |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
434 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
435 $buf = pack("C", 1); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
436 $buf .= build_int(length($input)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
437 $buf .= $input; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
438 $buf .= pack_body($self, $body) if defined $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
439 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
440 $self->{streams}{$self->{last_stream}}{sent} = length($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
441 $self->raw_write($self->build_stream($buf, start => $uri->{body_more})); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
442 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
443 return $self->{last_stream}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
444 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
445 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
446 sub h3_body { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
447 my ($self, $body, $sid, $extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
448 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
449 my $buf = pack_body($self, $body) if defined $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
450 my $offset = $self->{streams}{$sid}{sent}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
451 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
452 $self->{streams}{$sid}{sent} += length($body); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
453 $self->raw_write($self->build_stream($buf, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
454 start => $extra->{body_more}, sid => $sid, offset => $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
455 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
456 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
457 sub pack_body { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
458 my ($self, $body) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
459 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
460 my $buf .= pack("C", 0); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
461 $buf .= build_int(length($body)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
462 $buf .= $body; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
463 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
464 |
1889
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
465 sub h3_max_data { |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
466 my ($self, $val, $stream) = @_; |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
467 |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
468 my $buf = defined $stream |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
469 ? "\x11" . build_int($stream) . build_int($val) |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
470 : "\x10" . build_int($val); |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
471 return $self->raw_write($buf); |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
472 } |
8303f3633f65
Tests: added HTTP/3 proxy_max_temp_file_size tests.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1887
diff
changeset
|
473 |
1875
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
474 my %cframe = ( |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
475 0 => { name => 'DATA', value => \&data }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
476 1 => { name => 'HEADERS', value => \&headers }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
477 # 3 => { name => 'CANCEL_PUSH', value => \&cancel_push }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
478 4 => { name => 'SETTINGS', value => \&settings }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
479 5 => { name => 'PUSH_PROMISE', value => \&push_promise }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
480 7 => { name => 'GOAWAY', value => \&goaway }, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
481 ); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
482 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
483 sub read { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
484 my ($self, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
485 my (@got); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
486 my $s = $self->{socket}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
487 my $wait = $extra{wait}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
488 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
489 local $Data::Dumper::Terse = 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
490 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
491 while (1) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
492 my ($frame, $length, $uni); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
493 my ($stream, $buf, $eof) = $self->read_stream_message($wait); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
494 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
495 unless (defined $stream) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
496 return \@got unless scalar @{$self->{frames_in}}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
497 goto frames; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
498 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
499 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
500 if (length($self->{frames_incomplete}[$stream]{buf})) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
501 $buf = $self->{frames_incomplete}[$stream]{buf} . $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
502 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
503 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
504 again: |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
505 if (($stream % 4) == 3) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
506 unless (defined $self->{stream_uni}{$stream}{stream}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
507 (my $len, $uni) = parse_int(substr($buf, 0)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
508 $self->{stream_uni}{$stream}{stream} = $uni; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
509 $buf = substr($buf, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
510 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
511 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
512 $uni = $self->{stream_uni}{$stream}{stream}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
513 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
514 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
515 # push stream |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
516 if ($uni == 1 && !$self->{stream_uni}{$stream}{push}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
517 $self->{stream_uni}{$stream}{push} = 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
518 ($frame, $length) = push_stream($buf, $stream); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
519 goto push_me; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
520 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
521 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
522 # decoder |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
523 if ($uni == 3) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
524 ($frame, $length) = push_decoder($buf, $stream); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
525 goto push_me; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
526 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
527 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
528 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
529 my $offset = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
530 my ($len, $type); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
531 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
532 if (!length($self->{frames_incomplete}[$stream]{buf})) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
533 ($len, $type) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
534 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
535 ($len, $length) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
536 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
537 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
538 $self->{frames_incomplete}[$stream]{type} = $type; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
539 $self->{frames_incomplete}[$stream]{length} = $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
540 $self->{frames_incomplete}[$stream]{offset} = $offset; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
541 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
542 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
543 if (length($buf) < $self->{frames_incomplete}[$stream]{length} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
544 + $self->{frames_incomplete}[$stream]{offset}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
545 { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
546 $self->{frames_incomplete}[$stream]{buf} = $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
547 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
548 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
549 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
550 $type = $self->{frames_incomplete}[$stream]{type}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
551 $length = $self->{frames_incomplete}[$stream]{length}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
552 $offset = $self->{frames_incomplete}[$stream]{offset}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
553 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
554 $buf = substr($buf, $offset); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
555 $self->{frames_incomplete}[$stream]{buf} = ""; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
556 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
557 $frame = $cframe{$type}{value}($self, $buf, $length); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
558 $frame->{length} = $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
559 $frame->{type} = $cframe{$type}{name}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
560 $frame->{flags} = $eof && length($buf) == $length; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
561 $frame->{sid} = $stream; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
562 $frame->{uni} = $uni if defined $uni; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
563 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
564 push_me: |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
565 push @got, $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
566 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
567 Test::Nginx::log_core('||', $_) for split "\n", Dumper $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
568 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
569 $buf = substr($buf, $length); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
570 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
571 last unless $extra{all} && test_fin($frame, $extra{all}); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
572 goto again if length($buf) > 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
573 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
574 frames: |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
575 while ($frame = shift @{$self->{frames_in}}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
576 push @got, $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
577 Test::Nginx::log_core('||', $_) for split "\n", |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
578 Dumper $frame; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
579 return \@got unless test_fin($frame, $extra{all}); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
580 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
581 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
582 return \@got; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
583 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
584 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
585 sub push_stream { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
586 my ($buf, $stream) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
587 my $frame = { sid => $stream, uni => 1, type => 'PUSH header' }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
588 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
589 my ($len, $id) = parse_int($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
590 $frame->{push_id} = $id; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
591 $frame->{length} = $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
592 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
593 return ($frame, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
594 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
595 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
596 sub push_decoder { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
597 my ($buf, $stream) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
598 my ($skip, $val) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
599 my $frame = { sid => $stream, uni => 3 }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
600 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
601 if ($skip < length($buf)) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
602 my $bits = unpack("\@$skip B8", $buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
603 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
604 if (substr($bits, 0, 1) eq '1') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
605 ($val, $skip) = iunpack(7, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
606 $frame->{type} = 'DECODER_SA'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
607 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
608 } elsif (substr($bits, 0, 2) eq '01') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
609 ($val, $skip) = iunpack(6, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
610 $frame->{type} = 'DECODER_C'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
611 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
612 } elsif (substr($bits, 0, 2) eq '00') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
613 ($val, $skip) = iunpack(6, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
614 $frame->{type} = 'DECODER_ICI'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
615 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
616 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
617 $frame->{val} = $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
618 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
619 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
620 return ($frame, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
621 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
622 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
623 sub test_fin { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
624 my ($frame, $all) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
625 my @test = @{$all}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
626 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
627 # wait for the specified DATA length |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
628 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
629 for (@test) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
630 if ($_->{length} && $frame->{type} eq 'DATA') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
631 # check also for StreamID if needed |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
632 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
633 if (!$_->{sid} || $_->{sid} == $frame->{sid}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
634 $_->{length} -= $frame->{length}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
635 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
636 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
637 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
638 @test = grep { !(defined $_->{length} && $_->{length} == 0) } @test; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
639 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
640 # wait for the fin flag |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
641 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
642 @test = grep { !(defined $_->{fin} |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
643 && (!defined $_->{sid} || $_->{sid} == $frame->{sid}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
644 && $_->{fin} & $frame->{flags}) |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
645 } @test if defined $frame->{flags}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
646 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
647 # wait for the specified frame |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
648 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
649 @test = grep { !($_->{type} && $_->{type} eq $frame->{type}) } @test; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
650 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
651 @{$all} = @test; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
652 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
653 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
654 sub data { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
655 my ($self, $buf, $len) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
656 return { data => substr($buf, 0, $len) }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
657 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
658 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
659 sub headers { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
660 my ($self, $buf, $len) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
661 my ($ric, $base); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
662 $self->{headers} = substr($buf, 0, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
663 my $skip = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
664 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
665 ($ric, $skip) = iunpack(8, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
666 ($base, $skip) = iunpack(7, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
667 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
668 $buf = substr($buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
669 $len -= $skip; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
670 { headers => qunpack($self, $buf, $len) }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
671 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
672 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
673 sub settings { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
674 my ($self, $buf, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
675 my %payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
676 my ($offset, $len) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
677 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
678 while ($offset < $length) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
679 my ($id, $val); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
680 ($len, $id) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
681 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
682 ($len, $val) = parse_int(substr($buf, $offset)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
683 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
684 $payload{$id} = $val; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
685 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
686 return \%payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
687 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
688 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
689 sub push_promise { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
690 my ($self, $buf, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
691 my %payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
692 my ($offset, $len, $id) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
693 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
694 ($len, $id) = parse_int($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
695 $offset += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
696 $payload{push_id} = $id; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
697 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
698 my ($ric, $base); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
699 my $skip = $offset; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
700 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
701 ($ric, $skip) = iunpack(8, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
702 ($base, $skip) = iunpack(7, $buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
703 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
704 $buf = substr($buf, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
705 $length -= $skip; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
706 $payload{headers} = qunpack($self, $buf, $length); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
707 return \%payload; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
708 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
709 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
710 sub goaway { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
711 my ($self, $buf, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
712 my ($len, $stream) = parse_int($buf); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
713 { last_sid => $stream } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
714 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
715 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
716 # RFC 7541, 5.1. Integer Representation |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
717 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
718 sub ipack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
719 my ($base, $d) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
720 return sprintf("%.*b", $base, $d) if $d < 2**$base - 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
721 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
722 my $o = sprintf("%${base}b", 2**$base - 1); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
723 $d -= 2**$base - 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
724 while ($d >= 128) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
725 $o .= sprintf("%8b", $d % 128 + 128); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
726 $d /= 128; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
727 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
728 $o .= sprintf("%08b", $d); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
729 return $o; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
730 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
731 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
732 sub iunpack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
733 my ($base, $b, $s) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
734 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
735 my $len = unpack("\@$s B8", $b); $s++; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
736 my $huff = substr($len, 8 - $base - 1, 1); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
737 $len = '0' x (8 - $base) . substr($len, 8 - $base); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
738 $len = unpack("C", pack("B8", $len)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
739 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
740 return ($len, $s, $huff) if $len < 2**$base - 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
741 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
742 my $m = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
743 my $d; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
744 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
745 do { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
746 $d = unpack("\@$s C", $b); $s++; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
747 $len += ($d & 127) * 2**$m; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
748 $m += $base; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
749 } while (($d & 128) == 128); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
750 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
751 return ($len, $s, $huff); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
752 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
753 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
754 sub qpack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
755 my ($ctx, $name, $value, %extra) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
756 my $mode = defined $extra{mode} ? $extra{mode} : 4; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
757 my $huff = $extra{huff}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
758 my $hbit = $huff ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
759 my $ibit = $extra{ni} ? '1' : '0'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
760 my $dbit = $extra{dyn} ? '0' : '1'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
761 my $table = $extra{dyn} ? $ctx->{dynamic_encode} : $ctx->{static_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
762 my ($index, $buf) = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
763 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
764 # 4.5.2. Indexed Field Line |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
765 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
766 if ($mode == 0) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
767 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
768 or $table->[$index][0] eq $name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
769 and $table->[$index][1] eq $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
770 $buf = pack('B*', '1' . $dbit . ipack(6, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
771 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
772 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
773 # 4.5.3. Indexed Field Line with Post-Base Index |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
774 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
775 if ($mode == 1) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
776 $table = $ctx->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
777 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
778 or $table->[$index][0] eq $name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
779 and $table->[$index][1] eq $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
780 $buf = pack('B*', '0001' . ipack(4, 0)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
781 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
782 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
783 # 4.5.4. Literal Field Line with Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
784 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
785 if ($mode == 2) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
786 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
787 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
788 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
789 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
790 $buf = pack('B*', '01' . $ibit . $dbit . ipack(4, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
791 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
792 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
793 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
794 # 4.5.5. Literal Field Line with Post-Base Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
795 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
796 if ($mode == 3) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
797 $table = $ctx->{dynamic_encode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
798 ++$index until $index > $#$table |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
799 or $table->[$index][0] eq $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
800 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
801 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
802 $buf = pack('B*', '0000' . $ibit . ipack(3, $index)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
803 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
804 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
805 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
806 # 4.5.6. Literal Field Line with Literal Name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
807 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
808 if ($mode == 4) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
809 $name = $huff ? huff($name) : $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
810 $value = $huff ? huff($value) : $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
811 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
812 $buf = pack('B*', '001' . $ibit . |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
813 $hbit . ipack(3, length($name))) . $name; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
814 $buf .= pack('B*', $hbit . ipack(7, length($value))) . $value; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
815 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
816 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
817 return $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
818 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
819 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
820 sub qunpack { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
821 my ($ctx, $data, $length) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
822 my $table = $ctx->{static_decode}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
823 my %headers; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
824 my $skip = 0; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
825 my ($index, $name, $value, $size); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
826 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
827 my $field = sub { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
828 my ($base, $b) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
829 my ($len, $s, $huff) = iunpack(@_); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
830 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
831 my $field = substr($b, $s, $len); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
832 $field = $huff ? dehuff($field) : $field; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
833 $s += $len; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
834 return ($field, $s); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
835 }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
836 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
837 my $add = sub { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
838 my ($h, $n, $v) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
839 return $h->{$n} = $v unless exists $h->{$n}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
840 $h->{$n} = [ $h->{$n} ] unless ref $h->{$n}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
841 push @{$h->{$n}}, $v; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
842 }; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
843 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
844 while ($skip < $length) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
845 my $ib = unpack("\@$skip B8", $data); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
846 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
847 # 4.5.2. Indexed Field Line |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
848 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
849 if (substr($ib, 0, 2) eq '11') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
850 ($index, $skip) = iunpack(6, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
851 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
852 $add->(\%headers, |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
853 $table->[$index][0], $table->[$index][1]); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
854 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
855 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
856 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
857 # 4.5.4. Literal Field Line with Name Reference |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
858 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
859 if (substr($ib, 0, 4) eq '0101') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
860 ($index, $skip) = iunpack(4, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
861 $name = $table->[$index][0]; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
862 ($value, $skip) = $field->(7, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
863 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
864 $add->(\%headers, $name, $value); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
865 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
866 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
867 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
868 # 4.5.6. Literal Field Line with Literal Name |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
869 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
870 if (substr($ib, 0, 4) eq '0010') { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
871 ($name, $skip) = $field->(3, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
872 ($value, $skip) = $field->(7, $data, $skip); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
873 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
874 $add->(\%headers, $name, $value); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
875 next; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
876 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
877 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
878 last; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
879 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
880 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
881 return \%headers; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
882 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
883 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
884 sub static_table { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
885 [ ':authority', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
886 [ ':path', '/' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
887 [ 'age', '0' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
888 [ 'content-disposition', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
889 [ 'content-length', '0' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
890 [ 'cookie', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
891 [ 'date', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
892 [ 'etag', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
893 [ 'if-modified-since', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
894 [ 'if-none-match', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
895 [ 'last-modified', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
896 [ 'link', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
897 [ 'location', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
898 [ 'referer', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
899 [ 'set-cookie', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
900 [ ':method', 'CONNECT' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
901 [ ':method', 'DELETE' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
902 [ ':method', 'GET' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
903 [ ':method', 'HEAD' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
904 [ ':method', 'OPTIONS' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
905 [ ':method', 'POST' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
906 [ ':method', 'PUT' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
907 [ ':scheme', 'http' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
908 [ ':scheme', 'https' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
909 [ ':status', '103' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
910 [ ':status', '200' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
911 [ ':status', '304' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
912 [ ':status', '404' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
913 [ ':status', '503' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
914 [ 'accept', '*/*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
915 [ 'accept', 'application/dns-message' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
916 [ 'accept-encoding', 'gzip, deflate, br' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
917 [ 'accept-ranges', 'bytes' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
918 [ 'access-control-allow-headers', 'cache-control' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
919 [ 'access-control-allow-headers', 'content-type' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
920 [ 'access-control-allow-origin', '*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
921 [ 'cache-control', 'max-age=0' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
922 [ 'cache-control', 'max-age=2592000' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
923 [ 'cache-control', 'max-age=604800' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
924 [ 'cache-control', 'no-cache' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
925 [ 'cache-control', 'no-store' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
926 [ 'cache-control', 'public, max-age=31536000' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
927 [ 'content-encoding', 'br' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
928 [ 'content-encoding', 'gzip' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
929 [ 'content-type', 'application/dns-message' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
930 [ 'content-type', 'application/javascript' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
931 [ 'content-type', 'application/json' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
932 [ 'content-type', 'application/x-www-form-urlencoded' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
933 [ 'content-type', 'image/gif' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
934 [ 'content-type', 'image/jpeg' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
935 [ 'content-type', 'image/png' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
936 [ 'content-type', 'text/css' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
937 [ 'content-type', 'text/html; charset=utf-8' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
938 [ 'content-type', 'text/plain' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
939 [ 'content-type', 'text/plain;charset=utf-8' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
940 [ 'range', 'bytes=0-' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
941 [ 'strict-transport-security', 'max-age=31536000' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
942 [ 'strict-transport-security', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
943 'max-age=31536000; includesubdomains' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
944 [ 'strict-transport-security', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
945 'max-age=31536000; includesubdomains; preload' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
946 [ 'vary', 'accept-encoding' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
947 [ 'vary', 'origin' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
948 [ 'x-content-type-options', 'nosniff' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
949 [ 'x-xss-protection', '1; mode=block' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
950 [ ':status', '100' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
951 [ ':status', '204' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
952 [ ':status', '206' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
953 [ ':status', '302' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
954 [ ':status', '400' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
955 [ ':status', '403' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
956 [ ':status', '421' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
957 [ ':status', '425' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
958 [ ':status', '500' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
959 [ 'accept-language', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
960 [ 'access-control-allow-credentials', 'FALSE' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
961 [ 'access-control-allow-credentials', 'TRUE' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
962 [ 'access-control-allow-headers', '*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
963 [ 'access-control-allow-methods', 'get' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
964 [ 'access-control-allow-methods', 'get, post, options' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
965 [ 'access-control-allow-methods', 'options' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
966 [ 'access-control-expose-headers', 'content-length' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
967 [ 'access-control-request-headers', 'content-type' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
968 [ 'access-control-request-method', 'get' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
969 [ 'access-control-request-method', 'post' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
970 [ 'alt-svc', 'clear' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
971 [ 'authorization', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
972 [ 'content-security-policy', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
973 "script-src 'none'; object-src 'none'; base-uri 'none'" ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
974 [ 'early-data', '1' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
975 [ 'expect-ct', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
976 [ 'forwarded', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
977 [ 'if-range', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
978 [ 'origin', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
979 [ 'purpose', 'prefetch' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
980 [ 'server', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
981 [ 'timing-allow-origin', '*' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
982 [ 'upgrade-insecure-requests', '1' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
983 [ 'user-agent', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
984 [ 'x-forwarded-for', '' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
985 [ 'x-frame-options', 'deny' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
986 [ 'x-frame-options', 'sameorigin' ], |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
987 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
988 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
989 sub huff_code { scalar { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
990 pack('C', 0) => '1111111111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
991 pack('C', 1) => '11111111111111111011000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
992 pack('C', 2) => '1111111111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
993 pack('C', 3) => '1111111111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
994 pack('C', 4) => '1111111111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
995 pack('C', 5) => '1111111111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
996 pack('C', 6) => '1111111111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
997 pack('C', 7) => '1111111111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
998 pack('C', 8) => '1111111111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
999 pack('C', 9) => '111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1000 pack('C', 10) => '111111111111111111111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1001 pack('C', 11) => '1111111111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1002 pack('C', 12) => '1111111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1003 pack('C', 13) => '111111111111111111111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1004 pack('C', 14) => '1111111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1005 pack('C', 15) => '1111111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1006 pack('C', 16) => '1111111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1007 pack('C', 17) => '1111111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1008 pack('C', 18) => '1111111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1009 pack('C', 19) => '1111111111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1010 pack('C', 20) => '1111111111111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1011 pack('C', 21) => '1111111111111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1012 pack('C', 22) => '111111111111111111111111111110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1013 pack('C', 23) => '1111111111111111111111110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1014 pack('C', 24) => '1111111111111111111111110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1015 pack('C', 25) => '1111111111111111111111110101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1016 pack('C', 26) => '1111111111111111111111110110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1017 pack('C', 27) => '1111111111111111111111110111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1018 pack('C', 28) => '1111111111111111111111111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1019 pack('C', 29) => '1111111111111111111111111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1020 pack('C', 30) => '1111111111111111111111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1021 pack('C', 31) => '1111111111111111111111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1022 pack('C', 32) => '010100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1023 pack('C', 33) => '1111111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1024 pack('C', 34) => '1111111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1025 pack('C', 35) => '111111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1026 pack('C', 36) => '1111111111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1027 pack('C', 37) => '010101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1028 pack('C', 38) => '11111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1029 pack('C', 39) => '11111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1030 pack('C', 40) => '1111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1031 pack('C', 41) => '1111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1032 pack('C', 42) => '11111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1033 pack('C', 43) => '11111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1034 pack('C', 44) => '11111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1035 pack('C', 45) => '010110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1036 pack('C', 46) => '010111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1037 pack('C', 47) => '011000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1038 pack('C', 48) => '00000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1039 pack('C', 49) => '00001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1040 pack('C', 50) => '00010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1041 pack('C', 51) => '011001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1042 pack('C', 52) => '011010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1043 pack('C', 53) => '011011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1044 pack('C', 54) => '011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1045 pack('C', 55) => '011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1046 pack('C', 56) => '011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1047 pack('C', 57) => '011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1048 pack('C', 58) => '1011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1049 pack('C', 59) => '11111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1050 pack('C', 60) => '111111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1051 pack('C', 61) => '100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1052 pack('C', 62) => '111111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1053 pack('C', 63) => '1111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1054 pack('C', 64) => '1111111111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1055 pack('C', 65) => '100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1056 pack('C', 66) => '1011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1057 pack('C', 67) => '1011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1058 pack('C', 68) => '1011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1059 pack('C', 69) => '1100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1060 pack('C', 70) => '1100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1061 pack('C', 71) => '1100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1062 pack('C', 72) => '1100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1063 pack('C', 73) => '1100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1064 pack('C', 74) => '1100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1065 pack('C', 75) => '1100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1066 pack('C', 76) => '1100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1067 pack('C', 77) => '1101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1068 pack('C', 78) => '1101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1069 pack('C', 79) => '1101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1070 pack('C', 80) => '1101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1071 pack('C', 81) => '1101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1072 pack('C', 82) => '1101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1073 pack('C', 83) => '1101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1074 pack('C', 84) => '1101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1075 pack('C', 85) => '1110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1076 pack('C', 86) => '1110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1077 pack('C', 87) => '1110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1078 pack('C', 88) => '11111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1079 pack('C', 89) => '1110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1080 pack('C', 90) => '11111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1081 pack('C', 91) => '1111111111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1082 pack('C', 92) => '1111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1083 pack('C', 93) => '1111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1084 pack('C', 94) => '11111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1085 pack('C', 95) => '100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1086 pack('C', 96) => '111111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1087 pack('C', 97) => '00011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1088 pack('C', 98) => '100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1089 pack('C', 99) => '00100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1090 pack('C', 100) => '100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1091 pack('C', 101) => '00101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1092 pack('C', 102) => '100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1093 pack('C', 103) => '100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1094 pack('C', 104) => '100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1095 pack('C', 105) => '00110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1096 pack('C', 106) => '1110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1097 pack('C', 107) => '1110101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1098 pack('C', 108) => '101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1099 pack('C', 109) => '101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1100 pack('C', 110) => '101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1101 pack('C', 111) => '00111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1102 pack('C', 112) => '101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1103 pack('C', 113) => '1110110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1104 pack('C', 114) => '101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1105 pack('C', 115) => '01000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1106 pack('C', 116) => '01001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1107 pack('C', 117) => '101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1108 pack('C', 118) => '1110111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1109 pack('C', 119) => '1111000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1110 pack('C', 120) => '1111001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1111 pack('C', 121) => '1111010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1112 pack('C', 122) => '1111011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1113 pack('C', 123) => '111111111111110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1114 pack('C', 124) => '11111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1115 pack('C', 125) => '11111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1116 pack('C', 126) => '1111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1117 pack('C', 127) => '1111111111111111111111111100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1118 pack('C', 128) => '11111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1119 pack('C', 129) => '1111111111111111010010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1120 pack('C', 130) => '11111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1121 pack('C', 131) => '11111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1122 pack('C', 132) => '1111111111111111010011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1123 pack('C', 133) => '1111111111111111010100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1124 pack('C', 134) => '1111111111111111010101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1125 pack('C', 135) => '11111111111111111011001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1126 pack('C', 136) => '1111111111111111010110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1127 pack('C', 137) => '11111111111111111011010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1128 pack('C', 138) => '11111111111111111011011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1129 pack('C', 139) => '11111111111111111011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1130 pack('C', 140) => '11111111111111111011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1131 pack('C', 141) => '11111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1132 pack('C', 142) => '111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1133 pack('C', 143) => '11111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1134 pack('C', 144) => '111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1135 pack('C', 145) => '111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1136 pack('C', 146) => '1111111111111111010111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1137 pack('C', 147) => '11111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1138 pack('C', 148) => '111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1139 pack('C', 149) => '11111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1140 pack('C', 150) => '11111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1141 pack('C', 151) => '11111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1142 pack('C', 152) => '11111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1143 pack('C', 153) => '111111111111111011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1144 pack('C', 154) => '1111111111111111011000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1145 pack('C', 155) => '11111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1146 pack('C', 156) => '1111111111111111011001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1147 pack('C', 157) => '11111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1148 pack('C', 158) => '11111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1149 pack('C', 159) => '111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1150 pack('C', 160) => '1111111111111111011010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1151 pack('C', 161) => '111111111111111011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1152 pack('C', 162) => '11111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1153 pack('C', 163) => '1111111111111111011011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1154 pack('C', 164) => '1111111111111111011100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1155 pack('C', 165) => '11111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1156 pack('C', 166) => '11111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1157 pack('C', 167) => '111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1158 pack('C', 168) => '11111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1159 pack('C', 169) => '1111111111111111011101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1160 pack('C', 170) => '1111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1161 pack('C', 171) => '111111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1162 pack('C', 172) => '111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1163 pack('C', 173) => '1111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1164 pack('C', 174) => '11111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1165 pack('C', 175) => '11111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1166 pack('C', 176) => '111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1167 pack('C', 177) => '111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1168 pack('C', 178) => '1111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1169 pack('C', 179) => '111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1170 pack('C', 180) => '11111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1171 pack('C', 181) => '1111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1172 pack('C', 182) => '11111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1173 pack('C', 183) => '11111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1174 pack('C', 184) => '11111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1175 pack('C', 185) => '1111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1176 pack('C', 186) => '1111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1177 pack('C', 187) => '1111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1178 pack('C', 188) => '11111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1179 pack('C', 189) => '1111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1180 pack('C', 190) => '1111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1181 pack('C', 191) => '11111111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1182 pack('C', 192) => '11111111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1183 pack('C', 193) => '11111111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1184 pack('C', 194) => '11111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1185 pack('C', 195) => '1111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1186 pack('C', 196) => '1111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1187 pack('C', 197) => '11111111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1188 pack('C', 198) => '1111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1189 pack('C', 199) => '1111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1190 pack('C', 200) => '11111111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1191 pack('C', 201) => '11111111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1192 pack('C', 202) => '11111111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1193 pack('C', 203) => '111111111111111111111011110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1194 pack('C', 204) => '111111111111111111111011111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1195 pack('C', 205) => '11111111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1196 pack('C', 206) => '111111111111111111110001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1197 pack('C', 207) => '1111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1198 pack('C', 208) => '1111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1199 pack('C', 209) => '111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1200 pack('C', 210) => '11111111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1201 pack('C', 211) => '111111111111111111111100000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1202 pack('C', 212) => '111111111111111111111100001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1203 pack('C', 213) => '11111111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1204 pack('C', 214) => '111111111111111111111100010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1205 pack('C', 215) => '111111111111111111110010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1206 pack('C', 216) => '111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1207 pack('C', 217) => '111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1208 pack('C', 218) => '11111111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1209 pack('C', 219) => '11111111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1210 pack('C', 220) => '1111111111111111111111111101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1211 pack('C', 221) => '111111111111111111111100011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1212 pack('C', 222) => '111111111111111111111100100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1213 pack('C', 223) => '111111111111111111111100101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1214 pack('C', 224) => '11111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1215 pack('C', 225) => '111111111111111111110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1216 pack('C', 226) => '11111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1217 pack('C', 227) => '111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1218 pack('C', 228) => '1111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1219 pack('C', 229) => '111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1220 pack('C', 230) => '111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1221 pack('C', 231) => '11111111111111111110011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1222 pack('C', 232) => '1111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1223 pack('C', 233) => '1111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1224 pack('C', 234) => '1111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1225 pack('C', 235) => '1111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1226 pack('C', 236) => '111111111111111111110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1227 pack('C', 237) => '111111111111111111110101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1228 pack('C', 238) => '11111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1229 pack('C', 239) => '11111111111111111110100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1230 pack('C', 240) => '11111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1231 pack('C', 241) => '111111111111111111111100110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1232 pack('C', 242) => '11111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1233 pack('C', 243) => '11111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1234 pack('C', 244) => '111111111111111111111100111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1235 pack('C', 245) => '111111111111111111111101000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1236 pack('C', 246) => '111111111111111111111101001', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1237 pack('C', 247) => '111111111111111111111101010', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1238 pack('C', 248) => '111111111111111111111101011', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1239 pack('C', 249) => '1111111111111111111111111110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1240 pack('C', 250) => '111111111111111111111101100', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1241 pack('C', 251) => '111111111111111111111101101', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1242 pack('C', 252) => '111111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1243 pack('C', 253) => '111111111111111111111101111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1244 pack('C', 254) => '111111111111111111111110000', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1245 pack('C', 255) => '11111111111111111111101110', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1246 '_eos' => '111111111111111111111111111111', |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1247 }}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1248 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1249 sub huff { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1250 my ($string) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1251 my $code = &huff_code; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1252 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1253 my $ret = join '', map { $code->{$_} } (split //, $string); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1254 my $len = length($ret) + (8 - length($ret) % 8); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1255 $ret .= $code->{_eos}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1256 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1257 return pack("B$len", $ret); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1258 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1259 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1260 sub dehuff { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1261 my ($string) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1262 my $code = &huff_code; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1263 my %decode = reverse %$code; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1264 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1265 my $ret = ''; my $c = ''; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1266 for (split //, unpack('B*', $string)) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1267 $c .= $_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1268 next unless exists $decode{$c}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1269 last if $decode{$c} eq '_eos'; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1270 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1271 $ret .= $decode{$c}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1272 $c = ''; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1273 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1274 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1275 return $ret; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1276 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1277 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1278 sub raw_write { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1279 my ($self, $message) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1280 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1281 if ($self->{chaining}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1282 return add_chain($self, $message); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1283 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1284 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1285 $self->{socket}->syswrite($self->encrypt_aead($message, 3)); |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1286 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1287 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1288 sub start_chain { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1289 my ($self) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1290 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1291 $self->{chaining} = 1; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1292 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1293 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1294 sub add_chain { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1295 my ($self, $buf) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1296 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1297 if ($self->{chained_buf}) { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1298 $self->{chained_buf} .= $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1299 } else { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1300 $self->{chained_buf} = $buf; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1301 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1302 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1303 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1304 sub send_chain { |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1305 my ($self) = @_; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1306 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1307 undef $self->{chaining}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1308 $self->raw_write($self->{chained_buf}) if $self->{chained_buf}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1309 undef $self->{chained_buf}; |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1310 } |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1311 |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1312 ############################################################################### |
f50c2a65ccc0
Tests: basic HTTP/3 support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1874
diff
changeset
|
1313 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1314 sub parse_frames { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1315 my ($buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1316 my @frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1317 my $offset = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1318 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1319 while ($offset < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1320 my ($tlen, $type) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1321 $offset += $tlen; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1322 next if $type == 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1323 my $frame = { type => $type }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1324 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1325 if ($type == 1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1326 $frame->{type} = 'PING'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1327 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1328 if ($type == 2) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1329 $frame->{type} = 'ACK'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1330 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1331 $frame->{largest} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1332 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1333 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1334 $frame->{delay} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1335 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1336 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1337 $frame->{count} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1338 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1339 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1340 $frame->{first} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1341 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1342 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1343 if ($type == 4) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1344 $frame->{type} = 'RESET_STREAM'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1345 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1346 $frame->{sid} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1347 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1348 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1349 $frame->{code} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1350 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1351 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1352 $frame->{final_size} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1353 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1354 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1355 if ($type == 5) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1356 $frame->{type} = 'STOP_SENDING'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1357 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1358 $frame->{sid} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1359 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1360 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1361 $frame->{code} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1362 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1363 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1364 if ($type == 6) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1365 my ($olen, $off) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1366 $offset += $olen; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1367 my ($llen, $len) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1368 $offset += $llen; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1369 $frame->{type} = 'CRYPTO'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1370 $frame->{length} = $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1371 $frame->{offset} = $off; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1372 $frame->{payload} = substr($buf, $offset, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1373 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1374 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1375 if ($type == 7) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1376 $frame->{type} = 'NEW_TOKEN'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1377 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1378 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1379 $frame->{token} = substr($buf, $offset, $val); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1380 $offset += $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1381 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1382 if (($type & 0xf8) == 0x08) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1383 $frame->{type} = 'STREAM'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1384 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1385 $frame->{id} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1386 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1387 if ($type & 0x4) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1388 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1389 $frame->{offset} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1390 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1391 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1392 $frame->{offset} = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1393 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1394 if ($type & 0x2) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1395 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1396 $frame->{length} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1397 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1398 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1399 $frame->{length} = length($buf) - $offset; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1400 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1401 if ($type & 0x1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1402 $frame->{fin} = 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1403 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1404 $frame->{payload} = |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1405 substr($buf, $offset, $frame->{length}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1406 $offset += $frame->{length}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1407 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1408 if ($type == 18 || $type == 19) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1409 $frame->{type} = 'MAX_STREAMS'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1410 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1411 $frame->{val} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1412 $frame->{uni} = 1 if $type == 19; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1413 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1414 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1415 if ($type == 24) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1416 $frame->{type} = 'NCID'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1417 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1418 $frame->{seqno} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1419 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1420 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1421 $frame->{rpt} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1422 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1423 $len = unpack("C", substr($buf, $offset, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1424 $frame->{length} = $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1425 $offset += 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1426 $frame->{cid} = substr($buf, $offset, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1427 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1428 $frame->{token} = substr($buf, $offset, 16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1429 $offset += 16; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1430 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1431 if ($type == 26) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1432 $frame->{type} = 'PATH_CHALLENGE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1433 $frame->{data} = substr($buf, $offset, 8); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1434 $offset += 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1435 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1436 if ($type == 27) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1437 $frame->{type} = 'PATH_RESPONSE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1438 $frame->{data} = substr($buf, $offset, 8); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1439 $offset += 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1440 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1441 if ($type == 28 || $type == 29) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1442 $frame->{type} = 'CONNECTION_CLOSE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1443 my ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1444 $frame->{error} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1445 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1446 if ($type == 28) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1447 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1448 $frame->{frame_type} = $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1449 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1450 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1451 ($len, $val) = parse_int(substr($buf, $offset)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1452 $offset += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1453 $frame->{phrase} = substr($buf, $offset, $val); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1454 $offset += $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1455 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1456 if ($type == 30) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1457 $frame->{type} = 'HANDSHAKE_DONE'; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1458 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1459 push @frames, $frame; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1460 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1461 return \@frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1462 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1463 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1464 sub handle_frames { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1465 my ($self, $frames, $level) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1466 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1467 my @frames = grep { $_->{type} eq 'CRYPTO' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1468 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1469 insert_crypto($self->{crypto_in}[$level], [ |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1470 $frame->{offset}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1471 $frame->{length}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1472 $frame->{payload}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1473 ]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1474 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1475 $self->parse_tls_nst() if $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1476 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1477 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1478 @frames = grep { $_->{type} eq 'STREAM' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1479 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1480 $self->{stream_in}[$frame->{id}] ||= { buf => [], pos => 0 }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1481 insert_crypto($self->{stream_in}[$frame->{id}]->{buf}, [ |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1482 $frame->{offset}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1483 $frame->{length}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1484 $frame->{payload}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1485 $frame->{fin}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1486 ]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1487 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1488 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1489 @frames = grep { $_->{type} eq 'NCID' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1490 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1491 push @{$self->{ncid}}, $frame; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1492 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1493 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1494 my $ack = $self->{ack}[$level]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1495 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1496 # stop tracking acknowledged ACK ranges |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1497 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1498 @frames = grep { $_->{type} eq 'ACK' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1499 while (my $frame = shift @frames) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1500 my $max = $frame->{largest}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1501 my $min = $max - $frame->{first}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1502 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1503 for my $num ($min .. $max) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1504 for my $pn (keys %$ack) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1505 delete $ack->{$pn} if $ack->{$pn} == $num; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1506 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1507 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1508 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1509 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1510 $self->{socket}->syswrite($self->encrypt_aead(build_ack($ack), $level)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1511 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1512 for my $pn (keys %$ack) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1513 $ack->{$pn} = $self->{pn}[0][$level] if $ack->{$pn} == -1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1514 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1515 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1516 my ($frame) = grep { $_->{type} eq 'NEW_TOKEN' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1517 $self->{token} = $frame->{token} || ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1518 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1519 push @{$self->{frames_in}}, grep { $_->{type} ne 'CRYPTO' |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1520 && $_->{type} ne 'STREAM' } @$frames; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1521 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1522 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1523 sub insert_crypto { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1524 my ($crypto, $frame) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1525 my $i; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1526 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1527 for ($i = 0; $i < scalar @$crypto; $i++) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1528 # frame][crypto][frame |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1529 my $this = @$crypto[$i]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1530 if (@$frame[0] <= @$this[0] && |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1531 @$frame[0] + @$frame[1] >= @$this[0] + @$this[1]) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1532 { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1533 my $old = substr(@$frame[2], @$this[0] - @$frame[0], |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1534 @$this[1]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1535 die "bad inner" if $old ne @$this[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1536 splice @$crypto, $i, 1; $i--; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1537 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1538 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1539 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1540 return push @$crypto, $frame if !@$crypto; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1541 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1542 for ($i = 0; $i < @$crypto; $i++) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1543 if (@$frame[0] <= @{@$crypto[$i]}[0] + @{@$crypto[$i]}[1]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1544 last; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1545 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1546 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1547 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1548 return push @$crypto, $frame if $i == @$crypto; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1549 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1550 my $this = @$crypto[$i]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1551 my $next = @$crypto[$i + 1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1552 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1553 if (@$frame[0] + @$frame[1] == @$this[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1554 # frame][crypto |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1555 @$this[0] = @$frame[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1556 @$this[1] += @$frame[1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1557 @$this[2] = @$frame[2] . @$this[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1558 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1559 } elsif (@$this[0] + @$this[1] == @$frame[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1560 # crypto][frame |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1561 @$this[1] += @$frame[1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1562 @$this[2] .= @$frame[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1563 @$this[3] = @$frame[3]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1564 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1565 } elsif (@$frame[0] + @$frame[1] < @$this[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1566 # frame..crypto |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1567 return splice @$crypto, $i, 0, $frame; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1568 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1569 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1570 # overlay |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1571 my ($b1, $b2) = @$this[0] < @$frame[0] |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1572 ? ($this, $frame) : ($frame, $this); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1573 my ($o1, $o2) = @$this[0] + @$this[1] < @$frame[0] + @$frame[1] |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1574 ? ($this, $frame) : ($frame, $this); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1575 my $offset = @$b2[0] - @$b1[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1576 my $length = @$o1[0] + @$o1[1] - @$b2[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1577 my $old = substr @$b1[2], $offset, $length, @$b2[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1578 die "bad repl" if substr(@$b1[2], $offset, $length) ne $old; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1579 @$this = (@$b1[0], @$o2[0] + @$o2[1] - @$b1[0], @$b1[2]); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1580 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1581 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1582 return if !defined $next; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1583 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1584 # combine with next overlay if any |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1585 if (@$this[0] + @$this[1] >= @$next[0]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1586 my $offset = @$next[0] - @$this[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1587 my $length = @$this[0] + @$this[1] - @$next[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1588 my $old = substr @$this[2], $offset, $length, @$next[2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1589 die "bad repl2" if substr(@$this[2], $offset, $length) ne $old; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1590 @$this[1] = @$next[0] + @$next[1] - @$this[0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1591 splice @$crypto, $i + 1, 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1592 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1593 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1594 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1595 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1596 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1597 sub save_session_tickets { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1598 my ($self, $content) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1599 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1600 my $nst_len = unpack("n", substr($content, 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1601 my $nst = substr($content, 4, $nst_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1602 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1603 my $psk = {}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1604 my $lifetime = substr($nst, 0, 4); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1605 $psk->{age_add} = substr($nst, 4, 4); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1606 my $nonce_len = unpack("C", substr($nst, 8, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1607 my $nonce = substr($nst, 9, $nonce_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1608 my $len = unpack("n", substr($nst, 8 + 1 + $nonce_len, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1609 $psk->{ticket} = substr($nst, 11 + $nonce_len, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1610 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1611 my $extens_len = unpack("n", substr($nst, 11 + $nonce_len + $len, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1612 my $extens = substr($nst, 11 + $nonce_len + $len + 2, $extens_len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1613 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1614 $psk->{ed} = early_data($extens); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1615 $psk->{secret} = hkdf_expand_label("tls13 resumption", 32, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1616 $self->{rms_prk}, $nonce); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1617 push @{$self->{psk_list}}, $psk; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1618 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1619 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1620 sub decode_pn { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1621 my ($self, $pn, $pnl, $level) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1622 my $expected = $self->{pn}[1][$level] + 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1623 my $pn_win = 1 << $pnl * 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1624 my $pn_hwin = $pn_win / 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1625 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1626 $pn |= $expected & ~($pn_win - 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1627 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1628 if ($pn <= $expected - $pn_hwin && $pn < (1 << 62) - $pn_win) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1629 $pn += $pn_win; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1630 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1631 } elsif ($pn > $expected + $pn_hwin && $pn >= $pn_win) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1632 $pn -= $pn_win; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1633 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1634 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1635 return $pn; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1636 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1637 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1638 sub decrypt_aead { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1639 my ($self, $buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1640 my $flags = unpack("C", substr($buf, 0, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1641 return 0, $self->decrypt_retry($buf) if ($flags & 0xf0) == 0xf0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1642 my $level = $flags & 0x80 ? $flags - 0xc0 >> 4 : 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1643 my $offpn = 1 + length($self->{scid}) if $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1644 $offpn = ( |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1645 $offpn = unpack("C", substr($buf, 5, 1)), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1646 $self->{scid} = substr($buf, 6, $offpn), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1647 $offpn = unpack("C", substr($buf, 6 + length($self->{scid}), 1)), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1648 $self->{dcid} = |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1649 substr($buf, 6 + length($self->{scid}) + 1, $offpn), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1650 7 + ($level == 0) + length($self->{scid}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1651 + length($self->{dcid})) if $level != 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1652 my ($len, $val) = $level != 3 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1653 ? parse_int(substr($buf, $offpn)) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1654 : (0, length($buf) - $offpn); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1655 $offpn += $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1656 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1657 my $sample = substr($buf, $offpn + 4, 16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1658 my ($ad, $pnl, $pn) = $self->decrypt_ad($buf, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1659 $self->{keys}[$level]{r}{hp}, $sample, $offpn, $level == 3); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1660 Test::Nginx::log_core('||', "ad = " . unpack("H*", $ad)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1661 $pn = $self->decode_pn($pn, $pnl, $level); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1662 my $nonce = substr(pack("x12") . pack("N", $pn), -12) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1663 ^ $self->{keys}[$level]{r}{iv}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1664 my $ciphertext = substr($buf, $offpn + $pnl, $val - 16 - $pnl); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1665 my $tag = substr($buf, $offpn + $val - 16, 16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1666 my $plaintext = Crypt::AuthEnc::GCM::gcm_decrypt_verify('AES', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1667 $self->{keys}[$level]{r}{key}, $nonce, $ad, $ciphertext, $tag); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1668 return if !defined $plaintext; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1669 Test::Nginx::log_core('||', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1670 "pn = $pn, level = $level, length = " . length($plaintext)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1671 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1672 $self->{pn}[1][$level] = $pn; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1673 $self->{ack}[$level]{$pn} = -1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1674 $self->{ack}[$_] = undef for (0 .. $level - 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1675 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1676 return ($level, $plaintext, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1677 substr($buf, length($ad . $ciphertext . $tag)), ''); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1678 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1679 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1680 sub decrypt_ad { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1681 my ($self, $buf, $hp, $sample, $offset, $short) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1682 my $m = Crypt::Mode::CTR->new('AES'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1683 my $mask = $m->encrypt($self->{zero}, $hp, $sample); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1684 substr($buf, 0, 1) ^= substr($mask, 0, 1) & ($short ? "\x1f" : "\x0f"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1685 my $pnl = unpack("C", substr($buf, 0, 1) & "\x03") + 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1686 for (my $i = 0; $i < $pnl; $i++) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1687 substr($buf, $offset + $i, 1) ^= substr($mask, $i + 1, 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1688 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1689 my $pn = unpack("C", substr($buf, $offset, $pnl)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1690 my $ad = substr($buf, 0, $offset + $pnl); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1691 return ($ad, $pnl, $pn); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1692 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1693 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1694 sub encrypt_aead { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1695 my ($self, $payload, $level) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1696 my $pn = ++$self->{pn}[0][$level]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1697 my $ad = pack("C", $level == 3 ? 0x40 : 0xc + $level << 4) | "\x03"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1698 $ad .= "\x00\x00\x00\x01" unless $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1699 $ad .= $level == 3 ? $self->{dcid} : |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1700 pack("C", length($self->{dcid})) . $self->{dcid} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1701 . pack("C", length($self->{scid})) . $self->{scid}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1702 $ad .= build_int(length($self->{token})) . $self->{token} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1703 if $level == 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1704 $ad .= build_int(length($payload) + 16 + 4) unless $level == 3; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1705 $ad .= pack("N", $pn); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1706 my $nonce = substr(pack("x12") . pack("N", $pn), -12) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1707 ^ $self->{keys}[$level]{w}{iv}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1708 my ($ciphertext, $tag) = Crypt::AuthEnc::GCM::gcm_encrypt_authenticate( |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1709 'AES', $self->{keys}[$level]{w}{key}, $nonce, $ad, $payload); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1710 my $sample = substr($ciphertext . $tag, 0, 16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1711 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1712 $ad = $self->encrypt_ad($ad, $self->{keys}[$level]{w}{hp}, |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1713 $sample, $level == 3); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1714 return $ad . $ciphertext . $tag; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1715 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1716 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1717 sub encrypt_ad { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1718 my ($self, $ad, $hp, $sample, $short) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1719 my $m = Crypt::Mode::CTR->new('AES'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1720 my $mask = $m->encrypt($self->{zero}, $hp, $sample); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1721 substr($ad, 0, 1) ^= substr($mask, 0, 1) & ($short ? "\x1f" : "\x0f"); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1722 substr($ad, -4) ^= substr($mask, 1); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1723 return $ad; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1724 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1725 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1726 sub decrypt_retry { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1727 my ($self, $buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1728 my $off = unpack("C", substr($buf, 5, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1729 $self->{scid} = substr($buf, 6, $off); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1730 $self->{odcid} = $self->{dcid}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1731 $self->{dcid} = unpack("C", substr($buf, 6 + $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1732 $self->{dcid} = substr($buf, 6 + $off + 1, $self->{dcid}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1733 my $token = substr($buf, 6 + $off + 1 + length($self->{dcid}), -16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1734 my $tag = substr($buf, -16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1735 my $pseudo = pack("C", length($self->{odcid})) . $self->{odcid} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1736 . substr($buf, 0, -16); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1737 return ($tag, retry_verify_tag($pseudo), $token); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1738 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1739 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1740 sub retry_verify_tag { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1741 my $key = "\xbe\x0c\x69\x0b\x9f\x66\x57\x5a" |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1742 . "\x1d\x76\x6b\x54\xe3\x68\xc8\x4e"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1743 my $nonce = "\x46\x15\x99\xd3\x5d\x63\x2b\xf2\x23\x98\x25\xbb"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1744 my (undef, $tag) = Crypt::AuthEnc::GCM::gcm_encrypt_authenticate('AES', |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1745 $key, $nonce, shift, ''); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1746 return $tag; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1747 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1748 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1749 sub set_traffic_keys { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1750 my ($self, $label, $level, $direction, $secret, $digest) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1751 my $prk = hkdf_expand_label($label, 32, $secret, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1752 my $key = hkdf_expand_label("tls13 quic key", 16, $prk); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1753 my $iv = hkdf_expand_label("tls13 quic iv", 12, $prk); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1754 my $hp = hkdf_expand_label("tls13 quic hp", 16, $prk); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1755 $self->{keys}[$level]{$direction}{prk} = $prk; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1756 $self->{keys}[$level]{$direction}{key} = $key; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1757 $self->{keys}[$level]{$direction}{iv} = $iv; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1758 $self->{keys}[$level]{$direction}{hp} = $hp; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1759 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1760 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1761 sub hmac_finished { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1762 my ($key, $digest) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1763 my $finished_key = hkdf_expand_label("tls13 finished", 32, $key); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1764 Crypt::Mac::HMAC::hmac('SHA256', $finished_key, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1765 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1766 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1767 sub tls13_finished { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1768 my ($key, $digest) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1769 my $hmac = hmac_finished($key, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1770 "\x14\x00" . pack('n', length($hmac)) . $hmac; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1771 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1772 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1773 sub binders { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1774 my ($key, $digest) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1775 my $hmac = hmac_finished($key, $digest); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1776 pack('n', length($hmac) + 1) . pack('C', length($hmac)) . $hmac; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1777 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1778 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1779 sub hkdf_advance { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1780 my ($secret, $prk) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1781 my $digest0 = Crypt::Digest::digest_data('SHA256', ''); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1782 my $expand = hkdf_expand_label("tls13 derived", 32, $prk, $digest0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1783 Crypt::KeyDerivation::hkdf_extract($secret, $expand, 'SHA256'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1784 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1785 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1786 sub hkdf_expand_label { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1787 my ($label, $len, $prk, $context) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1788 $context = '' if !defined $context; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1789 my $info = pack("C3", 0, $len, length($label)) . $label |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1790 . pack("C", length($context)) . $context; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1791 return Crypt::KeyDerivation::hkdf_expand($prk, 'SHA256', $len, $info); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1792 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1793 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1794 sub key_share { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1795 my ($extens) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1796 my $offset = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1797 while ($offset < length($extens)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1798 my $ext = substr($extens, $offset, 2); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1799 my $len = unpack("C", substr($extens, $offset + 2, 1)) * 8 + |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1800 unpack("C", substr($extens, $offset + 3, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1801 if ($ext eq "\x00\x33") { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1802 return substr($extens, $offset + 4 + 4, $len - 4); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1803 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1804 $offset += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1805 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1806 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1807 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1808 sub early_data { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1809 my ($extens) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1810 my $offset = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1811 while ($offset < length($extens)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1812 my $ext = substr($extens, $offset, 2); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1813 my $len = unpack("C", substr($extens, $offset + 2, 1)) * 8 + |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1814 unpack("C", substr($extens, $offset + 3, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1815 if ($ext eq "\x00\x2a") { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1816 return substr($extens, $offset + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1817 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1818 $offset += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1819 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1820 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1821 |
1884
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1822 sub pre_shared_key { |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1823 my ($extens) = @_; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1824 my $offset = 0; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1825 while ($offset < length($extens)) { |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1826 my $ext = substr($extens, $offset, 2); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1827 my $len = unpack("C", substr($extens, $offset + 2, 1)) * 8 + |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1828 unpack("C", substr($extens, $offset + 3, 1)); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1829 if ($ext eq "\x00\x29") { |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1830 return unpack("n", substr($extens, $offset + 4, $len)); |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1831 } |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1832 $offset += 4 + $len; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1833 } |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1834 return; |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1835 } |
6f1508d53a26
Tests: fixed extracting QUIC early secret if PSK is not in use.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1883
diff
changeset
|
1836 |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1837 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1838 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1839 sub build_cc { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1840 my ($code, $reason) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1841 "\x1d" . build_int($code) . build_int(length($reason)) . $reason; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1842 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1843 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1844 sub build_ack { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1845 my ($ack) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1846 my @keys = sort { $b <=> $a } keys %$ack; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1847 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1848 return "\x02" . build_int($keys[0]) . "\x00\x00\x00" if @keys == 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1849 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1850 my $min = my $max = shift @keys; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1851 my @acks = (); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1852 for my $next (@keys) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1853 if ($next == $min - 1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1854 $min = $next; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1855 next if $next != $keys[-1]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1856 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1857 push @acks, $max, $min; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1858 $min = $max = $next; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1859 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1860 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1861 ($max, $min) = splice @acks, 0, 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1862 my $ranges = @acks / 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1863 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1864 $ack = "\x02" . build_int($max) . "\x00" . build_int($ranges) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1865 . build_int($max - $min); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1866 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1867 for (my $smallest = $min; $ranges--; ) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1868 my ($max, $min) = splice @acks, 0, 2; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1869 $ack .= build_int($smallest - $max - 2); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1870 $ack .= build_int($max - $min); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1871 $smallest = $min; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1872 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1873 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1874 return $ack; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1875 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1876 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1877 sub build_crypto { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1878 my ($tlsm) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1879 "\x06\x00" . build_int(length($tlsm)) . $tlsm; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1880 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1881 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1882 sub build_stream { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1883 my ($self, $r, %extra) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1884 my $stream = $extra{start} ? 0xe : 0xf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1885 my $length = $extra{length} ? $extra{length} : build_int(length($r)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1886 my $offset = build_int($extra{offset} ? $extra{offset} : 0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1887 my $sid = defined $extra{sid} ? $extra{sid} : $self->{requests}++; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1888 pack("CC", $stream, 4 * $sid) . $offset . $length . $r; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1889 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1890 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1891 sub parse_int { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1892 my ($buf) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1893 my $val = unpack("C", substr($buf, 0, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1894 my $len = my $plen = 1 << ($val >> 6); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1895 $val = $val & 0x3f; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1896 while (--$len) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1897 $val = ($val << 8) + unpack("C", substr($buf, $plen - $len, 1)) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1898 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1899 return ($plen, $val); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1900 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1901 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1902 sub build_int { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1903 my ($value) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1904 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1905 my $build_int_set = sub { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1906 my ($value, $len, $bits) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1907 (($value >> ($len * 8)) & 0xff) | ($bits << 6); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1908 }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1909 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1910 if ($value < 1 << 6) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1911 pack("C", $build_int_set->($value, 0, 0)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1912 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1913 } elsif ($value < 1 << 14) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1914 pack("C*", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1915 $build_int_set->($value, 1, 1), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1916 $build_int_set->($value, 0, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1917 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1918 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1919 } elsif ($value < 1 << 30) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1920 pack("C*", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1921 $build_int_set->($value, 3, 2), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1922 $build_int_set->($value, 2, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1923 $build_int_set->($value, 1, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1924 $build_int_set->($value, 0, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1925 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1926 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1927 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1928 pack("C*", |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1929 build_int_set->($value, 7, 3), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1930 build_int_set->($value, 6, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1931 build_int_set->($value, 5, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1932 build_int_set->($value, 4, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1933 build_int_set->($value, 3, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1934 build_int_set->($value, 2, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1935 build_int_set->($value, 1, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1936 build_int_set->($value, 0, 0), |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1937 ); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1938 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1939 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1940 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1941 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1942 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1943 sub read_stream_message { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1944 my ($self, $timo) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1945 my ($level, $plaintext, @data); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1946 my $s = $self->{socket}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1947 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1948 while (1) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1949 @data = $self->parse_stream(); |
1905
f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1889
diff
changeset
|
1950 return @data if @data; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1951 return if scalar @{$self->{frames_in}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1952 |
1886
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
1953 again: |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1954 my $txt; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1955 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1956 if (!length($self->{buf})) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1957 return unless IO::Select->new($s)->can_read($timo || 3); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1958 $s->sysread($self->{buf}, 65527); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1959 $txt = "recv"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1960 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1961 $txt = "remaining"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1962 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1963 my $len = length $self->{buf}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1964 Test::Nginx::log_core('||', sprintf("$txt = [%d]", $len)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1965 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1966 while ($self->{buf}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1967 ($level, $plaintext, $self->{buf}, $self->{token}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1968 = $self->decrypt_aead($self->{buf}); |
1886
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
1969 if (!defined $plaintext) { |
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
1970 $self->{buf} = ''; |
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
1971 goto again; |
90a310f3cee6
Tests: workaround for QUIC routing while reloading nginx.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1884
diff
changeset
|
1972 } |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1973 goto retry if $self->{token}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1974 $self->handle_frames(parse_frames($plaintext), $level); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1975 @data = $self->parse_stream(); |
1905
f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1889
diff
changeset
|
1976 return @data if @data; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1977 return if scalar @{$self->{frames_in}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1978 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1979 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1980 return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1981 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1982 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1983 sub parse_stream { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1984 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1985 my $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1986 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1987 for my $i (0 .. $#{$self->{stream_in}}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1988 my $stream = $self->{stream_in}[$i]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1989 next if !defined $stream; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1990 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1991 my $buf = $stream->{buf}[0][2]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1992 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1993 if ($stream->{buf}[0][3]) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1994 $stream->{buf}[0][3] = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1995 $stream->{eof} = 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1996 $data = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1997 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1998 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
1999 if (length($buf) > $stream->{pos}) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2000 $data = substr($buf, $stream->{pos}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2001 $stream->{pos} = length($buf); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2002 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2003 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2004 next if !defined $data; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2005 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2006 return ($i, $data, $stream->{eof} ? 1 : 0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2007 } |
1905
f35824e75b66
Tests: fixed reading QUIC streams on Perl < 5.24.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1889
diff
changeset
|
2008 return; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2009 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2010 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2011 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2012 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2013 sub read_tls_message { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2014 my ($self, $buf, $type) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2015 my $s = $self->{socket}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2016 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2017 while (!$type->($self)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2018 my $txt; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2019 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2020 if (!length($$buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2021 return unless IO::Select->new($s)->can_read(3); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2022 $s->sysread($$buf, 65527); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2023 $txt = "recv"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2024 } else { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2025 $txt = "remaining"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2026 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2027 my $len = length $$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2028 Test::Nginx::log_core('||', sprintf("$txt = [%d]", $len)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2029 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2030 while ($$buf) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2031 (my $level, my $plaintext, $$buf, $self->{token}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2032 = $self->decrypt_aead($$buf); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2033 return if !defined $plaintext; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2034 goto retry if $self->{token}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2035 $self->handle_frames(parse_frames($plaintext), $level); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2036 return 1 if $type->($self); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2037 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2038 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2039 return; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2040 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2041 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2042 sub parse_tls_server_hello { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2043 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2044 my $buf = $self->{crypto_in}[0][0][2] if $self->{crypto_in}[0][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2045 return 0 if !$buf || length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2046 my $type = unpack("C", substr($buf, 0, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2047 my $len = unpack("n", substr($buf, 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2048 my $content = substr($buf, 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2049 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2050 $self->{tlsm}{sh} = substr($buf, 0, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2051 return $self->{tlsm}{sh}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2052 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2053 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2054 sub parse_tls_encrypted_extensions { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2055 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2056 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2057 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2058 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2059 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2060 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2061 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2062 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2063 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2064 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2065 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2066 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2067 last if $type == 8; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2068 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2069 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2070 $self->{tlsm}{ee} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2071 return $self->{tlsm}{ee}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2072 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2073 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2074 sub parse_tls_certificate { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2075 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2076 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2077 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2078 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2079 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2080 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2081 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2082 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2083 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2084 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2085 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2086 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2087 last if $type == 11; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2088 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2089 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2090 $self->{tlsm}{cert} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2091 return $self->{tlsm}{cert}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2092 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2093 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2094 sub parse_tls_certificate_verify { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2095 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2096 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2097 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2098 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2099 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2100 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2101 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2102 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2103 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2104 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2105 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2106 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2107 last if $type == 15; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2108 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2109 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2110 $self->{tlsm}{cv} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2111 return $self->{tlsm}{cv}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2112 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2113 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2114 sub parse_tls_finished { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2115 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2116 my $buf = $self->{crypto_in}[2][0][2] if $self->{crypto_in}[2][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2117 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2118 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2119 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2120 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2121 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2122 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2123 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2124 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2125 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2126 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2127 last if $type == 20; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2128 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2129 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2130 $self->{tlsm}{sf} = substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2131 return $self->{tlsm}{sf}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2132 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2133 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2134 sub parse_tls_nst { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2135 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2136 my $buf = $self->{crypto_in}[3][0][2] if $self->{crypto_in}[3][0]; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2137 return 0 if !$buf; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2138 my $off = 0; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2139 my $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2140 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2141 while ($off < length($buf)) { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2142 return 0 if length($buf) < 4; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2143 my $type = unpack("C", substr($buf, $off, 1)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2144 my $len = unpack("n", substr($buf, $off + 2, 2)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2145 $content = substr($buf, $off + 4, $len); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2146 return 0 if length($content) < $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2147 $self->{tlsm}{nst} .= substr($buf, $off, 4) . $content; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2148 $self->save_session_tickets(substr($buf, $off, 4) . $content); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2149 $off += 4 + $len; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2150 substr($self->{crypto_in}[3][0][2], 0, $off) = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2151 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2152 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2153 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2154 sub build_tls_client_hello { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2155 my ($self) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2156 my $key_share = $self->{sk}->export_key_raw('public'); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2157 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2158 my $version = "\x03\x03"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2159 my $random = Crypt::PRNG::random_bytes(32); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2160 my $session = "\x00"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2161 my $cipher = "\x00\x02\x13\x01"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2162 my $compr = "\x01\x00"; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2163 my $ext = build_tlsext_server_name($self->{sni}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2164 . build_tlsext_supported_groups(29) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2165 . build_tlsext_alpn("h3", "hq-interop") |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2166 . build_tlsext_sigalgs(0x0804, 0x0805, 0x0806) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2167 . build_tlsext_supported_versions(0x0304) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2168 . build_tlsext_ke_modes(1) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2169 . build_tlsext_key_share(29, $key_share) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2170 . build_tlsext_quic_tp($self->{scid}, $self->{opts}); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2171 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2172 $ext .= build_tlsext_early_data($self->{psk}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2173 . build_tlsext_psk($self->{psk}) if keys %{$self->{psk}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2174 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2175 my $len = pack('n', length($ext)); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2176 my $ch = $version . $random . $session . $cipher . $compr . $len . $ext; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2177 $ch = "\x01\x00" . pack('n', length($ch)) . $ch; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2178 $ch = build_tls_ch_with_binder($ch, $self->{es_prk}) |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2179 if keys %{$self->{psk}}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2180 return $ch; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2181 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2182 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2183 sub build_tlsext_server_name { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2184 my ($name) = @_; |
1887
1023354f3a41
Tests: ssl_reject_handshake tests with HTTP/3.
Sergey Kandaurov <pluknet@nginx.com>
parents:
1886
diff
changeset
|
2185 return '' if !defined $name; |
1874
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2186 my $sname = pack('xn', length($name)) . $name; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2187 my $snamelist = pack('n', length($sname)) . $sname; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2188 pack('n2', 0, length($snamelist)) . $snamelist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2189 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2190 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2191 sub build_tlsext_supported_groups { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2192 my $ngrouplist = pack('n*', @_ * 2, @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2193 pack('n2', 10, length($ngrouplist)) . $ngrouplist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2194 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2195 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2196 sub build_tlsext_alpn { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2197 my $protoname = pack('(C/a*)*', @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2198 my $protonamelist = pack('n', length($protoname)) . $protoname; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2199 pack('n2', 16, length($protonamelist)) . $protonamelist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2200 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2201 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2202 sub build_tlsext_sigalgs { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2203 my $sschemelist = pack('n*', @_ * 2, @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2204 pack('n2', 13, length($sschemelist)) . $sschemelist; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2205 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2206 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2207 sub build_tlsext_supported_versions { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2208 my $versions = pack('Cn*', @_ * 2, @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2209 pack('n2', 43, length($versions)) . $versions; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2210 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2211 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2212 sub build_tlsext_ke_modes { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2213 my $versions = pack('C*', scalar(@_), @_); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2214 pack('n2', 45, length($versions)) . $versions; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2215 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2216 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2217 sub build_tlsext_key_share { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2218 my ($group, $share) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2219 my $kse = pack("n2", $group, length($share)) . $share; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2220 my $ksch = pack("n", length($kse)) . $kse; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2221 pack('n2', 51, length($ksch)) . $ksch; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2222 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2223 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2224 sub build_tlsext_quic_tp { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2225 my ($scid, $opts) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2226 my $tp = ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2227 my $quic_tp_tlv = sub { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2228 my ($id, $val) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2229 $val = $opts->{$id} // $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2230 $val = build_int($val) unless $id == 15; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2231 $tp .= build_int($id) . pack("C*", length($val)) . $val; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2232 }; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2233 $quic_tp_tlv->(1, 30000); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2234 $quic_tp_tlv->(4, 1048576); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2235 $quic_tp_tlv->(5, 262144); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2236 $quic_tp_tlv->(7, 262144); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2237 $quic_tp_tlv->(9, 100); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2238 $quic_tp_tlv->(15, $scid); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2239 pack('n2', 57, length($tp)) . $tp; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2240 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2241 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2242 sub build_tlsext_early_data { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2243 my ($psk) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2244 $psk->{ed} ? pack('n2', 42, 0) : ''; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2245 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2246 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2247 sub build_tlsext_psk { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2248 my ($psk) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2249 my $identity = pack('n', length($psk->{ticket})) . $psk->{ticket} |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2250 . $psk->{age_add}; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2251 my $identities = pack('n', length($identity)) . $identity; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2252 my $hash = pack('x32'); # SHA256 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2253 my $binder = pack('C', length($hash)) . $hash; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2254 my $binders = pack('n', length($binder)) . $binder; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2255 pack('n2', 41, length($identities . $binders)) . $identities . $binders; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2256 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2257 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2258 sub build_tls_ch_with_binder { |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2259 my ($ch, $prk) = @_; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2260 my $digest0 = Crypt::Digest::digest_data('SHA256', ''); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2261 my $key = hkdf_expand_label("tls13 res binder", 32, $prk, $digest0); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2262 my $truncated = substr($ch, 0, -35); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2263 my $context = Crypt::Digest::digest_data('SHA256', $truncated); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2264 $truncated . binders($key, $context); |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2265 } |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2266 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2267 ############################################################################### |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2268 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2269 1; |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2270 |
d57a0fd293a3
Tests: basic QUIC support.
Sergey Kandaurov <pluknet@nginx.com>
parents:
diff
changeset
|
2271 ############################################################################### |