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