1 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4 // option. This file may not be copied, modified, or distributed
5 // except according to those terms.
6 
7 use crate::client_events::{Http3ClientEvent, Http3ClientEvents};
8 use crate::connection::{Http3Connection, Http3State};
9 use crate::hframe::HFrame;
10 use crate::push_controller::PushController;
11 use crate::push_stream::PushStream;
12 use crate::recv_message::{MessageType, RecvMessage};
13 use crate::send_message::{SendMessage, SendMessageEvents};
14 use crate::settings::HSettings;
15 use crate::{Header, ReceiveOutput, RecvMessageEvents, ResetType};
16 use neqo_common::{
17     event::Provider as EventProvider, hex, hex_with_len, qdebug, qinfo, qlog::NeqoQlog, qtrace,
18     Datagram, Decoder, Encoder, Role,
19 };
20 use neqo_crypto::{agent::CertificateInfo, AuthenticationStatus, ResumptionToken, SecretAgentInfo};
21 use neqo_qpack::{QpackSettings, Stats as QpackStats};
22 use neqo_transport::{
23     AppError, Connection, ConnectionEvent, ConnectionId, ConnectionIdGenerator,
24     ConnectionParameters, Output, QuicVersion, Stats as TransportStats, StreamId, StreamType,
25     ZeroRttState,
26 };
27 use std::cell::RefCell;
28 use std::fmt::Display;
29 use std::mem;
30 use std::net::SocketAddr;
31 use std::rc::Rc;
32 use std::time::Instant;
33 
34 use crate::{Error, Res};
35 
36 // This is used for filtering send_streams and recv_Streams with a stream_ids greater than or equal a given id.
37 // Only the same type (bidirectional or unidirectionsl) streams are filtered.
id_gte<U>(base: StreamId) -> impl FnMut((&u64, &U)) -> Option<u64> + 'static where U: ?Sized,38 fn id_gte<U>(base: StreamId) -> impl FnMut((&u64, &U)) -> Option<u64> + 'static
39 where
40     U: ?Sized,
41 {
42     move |(id, _)| {
43         if *id >= base.as_u64() && !(StreamId::from(*id).is_bidi() ^ base.is_bidi()) {
44             Some(*id)
45         } else {
46             None
47         }
48     }
49 }
50 
51 // This is used for filtering send_streams and recv_Streams with a stream_ids less than a given id.
52 // Only the same type (bidirectional or unidirectional) streams are filtered.
id_lt<U>(base: StreamId) -> impl FnMut(&u64, &mut U) -> bool where U: ?Sized,53 fn id_lt<U>(base: StreamId) -> impl FnMut(&u64, &mut U) -> bool
54 where
55     U: ?Sized,
56 {
57     let mut f = id_gte(base);
58     move |id, v| f((id, v)).is_none()
59 }
60 
alpn_from_quic_version(version: QuicVersion) -> &'static str61 fn alpn_from_quic_version(version: QuicVersion) -> &'static str {
62     match version {
63         QuicVersion::Version1 => "h3",
64         QuicVersion::Draft29 => "h3-29",
65         QuicVersion::Draft30 => "h3-30",
66         QuicVersion::Draft31 => "h3-31",
67         QuicVersion::Draft32 => "h3-32",
68     }
69 }
70 
71 pub struct Http3Parameters {
72     pub qpack_settings: QpackSettings,
73     pub max_concurrent_push_streams: u64,
74 }
75 
76 pub struct Http3Client {
77     conn: Connection,
78     base_handler: Http3Connection,
79     events: Http3ClientEvents,
80     push_handler: Rc<RefCell<PushController>>,
81 }
82 
83 impl Display for Http3Client {
fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result84     fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
85         write!(f, "Http3 client")
86     }
87 }
88 
89 impl Http3Client {
90     /// # Errors
91     /// Making a `neqo-transport::connection` may produce an error. This can only be a crypto error if
92     /// the socket can't be created or configured.
new( server_name: &str, cid_manager: Rc<RefCell<dyn ConnectionIdGenerator>>, local_addr: SocketAddr, remote_addr: SocketAddr, conn_params: ConnectionParameters, http3_parameters: &Http3Parameters, now: Instant, ) -> Res<Self>93     pub fn new(
94         server_name: &str,
95         cid_manager: Rc<RefCell<dyn ConnectionIdGenerator>>,
96         local_addr: SocketAddr,
97         remote_addr: SocketAddr,
98         conn_params: ConnectionParameters,
99         http3_parameters: &Http3Parameters,
100         now: Instant,
101     ) -> Res<Self> {
102         Ok(Self::new_with_conn(
103             Connection::new_client(
104                 server_name,
105                 &[alpn_from_quic_version(conn_params.get_quic_version())],
106                 cid_manager,
107                 local_addr,
108                 remote_addr,
109                 conn_params,
110                 now,
111             )?,
112             http3_parameters,
113         ))
114     }
115 
116     #[must_use]
new_with_conn(c: Connection, http3_parameters: &Http3Parameters) -> Self117     pub fn new_with_conn(c: Connection, http3_parameters: &Http3Parameters) -> Self {
118         let events = Http3ClientEvents::default();
119         Self {
120             conn: c,
121             base_handler: Http3Connection::new(http3_parameters.qpack_settings),
122             events: events.clone(),
123             push_handler: Rc::new(RefCell::new(PushController::new(
124                 http3_parameters.max_concurrent_push_streams,
125                 events,
126             ))),
127         }
128     }
129 
130     #[must_use]
role(&self) -> Role131     pub fn role(&self) -> Role {
132         self.conn.role()
133     }
134 
135     #[must_use]
state(&self) -> Http3State136     pub fn state(&self) -> Http3State {
137         self.base_handler.state()
138     }
139 
140     #[must_use]
tls_info(&self) -> Option<&SecretAgentInfo>141     pub fn tls_info(&self) -> Option<&SecretAgentInfo> {
142         self.conn.tls_info()
143     }
144 
145     /// Get the peer's certificate.
146     #[must_use]
peer_certificate(&self) -> Option<CertificateInfo>147     pub fn peer_certificate(&self) -> Option<CertificateInfo> {
148         self.conn.peer_certificate()
149     }
150 
151     /// This called when peer certificates have been verified.
authenticated(&mut self, status: AuthenticationStatus, now: Instant)152     pub fn authenticated(&mut self, status: AuthenticationStatus, now: Instant) {
153         self.conn.authenticated(status, now);
154     }
155 
set_qlog(&mut self, qlog: NeqoQlog)156     pub fn set_qlog(&mut self, qlog: NeqoQlog) {
157         self.conn.set_qlog(qlog);
158     }
159 
160     /// Enable encrypted client hello (ECH).
161     ///
162     /// # Errors
163     /// Fails when the configuration provided is bad.
enable_ech(&mut self, ech_config_list: impl AsRef<[u8]>) -> Res<()>164     pub fn enable_ech(&mut self, ech_config_list: impl AsRef<[u8]>) -> Res<()> {
165         self.conn.client_enable_ech(ech_config_list)?;
166         Ok(())
167     }
168 
169     /// Get the connection id, which is useful for disambiguating connections to
170     /// the same origin.
171     #[must_use]
connection_id(&self) -> &ConnectionId172     pub fn connection_id(&self) -> &ConnectionId {
173         &self.conn.odcid().expect("Client always has odcid")
174     }
175 
176     /// A resumption token encodes transport and settings parameter as well.
create_resumption_token(&mut self, token: &ResumptionToken)177     fn create_resumption_token(&mut self, token: &ResumptionToken) {
178         if let Some(settings) = self.base_handler.get_settings() {
179             let mut enc = Encoder::default();
180             settings.encode_frame_contents(&mut enc);
181             enc.encode(token.as_ref());
182             self.events
183                 .resumption_token(ResumptionToken::new(enc.into(), token.expiration_time()));
184         }
185     }
186 
187     /// This may be call if an application has a resumption token. This must be called before connection starts.
188     /// # Errors
189     /// An error is return if token cannot be decoded or a connection is is a wrong state.
190     /// # Panics
191     /// On closing if the base handler can't handle it (debug only).
enable_resumption(&mut self, now: Instant, token: impl AsRef<[u8]>) -> Res<()>192     pub fn enable_resumption(&mut self, now: Instant, token: impl AsRef<[u8]>) -> Res<()> {
193         if self.base_handler.state != Http3State::Initializing {
194             return Err(Error::InvalidState);
195         }
196         let mut dec = Decoder::from(token.as_ref());
197         let settings_slice = match dec.decode_vvec() {
198             Some(v) => v,
199             None => return Err(Error::InvalidResumptionToken),
200         };
201         qtrace!([self], "  settings {}", hex_with_len(&settings_slice));
202         let mut dec_settings = Decoder::from(settings_slice);
203         let mut settings = HSettings::default();
204         Error::map_error(
205             settings.decode_frame_contents(&mut dec_settings),
206             Error::InvalidResumptionToken,
207         )?;
208         let tok = dec.decode_remainder();
209         qtrace!([self], "  Transport token {}", hex(&tok));
210         self.conn.enable_resumption(now, tok)?;
211         if self.conn.state().closed() {
212             let state = self.conn.state().clone();
213             let res = self
214                 .base_handler
215                 .handle_state_change(&mut self.conn, &state);
216             debug_assert_eq!(Ok(true), res);
217             return Err(Error::FatalError);
218         }
219         if *self.conn.zero_rtt_state() == ZeroRttState::Sending {
220             self.base_handler
221                 .set_0rtt_settings(&mut self.conn, settings)?;
222             self.events
223                 .connection_state_change(self.base_handler.state());
224             self.push_handler
225                 .borrow_mut()
226                 .maybe_send_max_push_id_frame(&mut self.base_handler);
227         }
228         Ok(())
229     }
230 
231     /// This is call to close a connection.
close<S>(&mut self, now: Instant, error: AppError, msg: S) where S: AsRef<str> + Display,232     pub fn close<S>(&mut self, now: Instant, error: AppError, msg: S)
233     where
234         S: AsRef<str> + Display,
235     {
236         qinfo!([self], "Close the connection error={} msg={}.", error, msg);
237         if !matches!(
238             self.base_handler.state,
239             Http3State::Closing(_) | Http3State::Closed(_)
240         ) {
241             self.push_handler.borrow_mut().clear();
242             self.conn.close(now, error, msg);
243             self.base_handler.close(error);
244             self.events
245                 .connection_state_change(self.base_handler.state());
246         }
247     }
248 
249     /// Attempt to force a key update.
250     /// # Errors
251     /// If the connection isn't confirmed, or there is an outstanding key update, this
252     /// returns `Err(Error::TransportError(neqo_transport::Error::KeyUpdateBlocked))`.
initiate_key_update(&mut self) -> Res<()>253     pub fn initiate_key_update(&mut self) -> Res<()> {
254         self.conn.initiate_key_update()?;
255         Ok(())
256     }
257 
258     // API: Request/response
259 
260     /// This is call to make a new http request. Each request can have headers and they are added when request
261     /// is created. A response body may be added by calling `send_request_body`.
262     /// # Errors
263     /// If a new stream cannot be created an error will be return.
fetch( &mut self, now: Instant, method: &str, scheme: &str, host: &str, path: &str, headers: &[Header], ) -> Res<u64>264     pub fn fetch(
265         &mut self,
266         now: Instant,
267         method: &str,
268         scheme: &str,
269         host: &str,
270         path: &str,
271         headers: &[Header],
272     ) -> Res<u64> {
273         qinfo!(
274             [self],
275             "Fetch method={}, scheme={}, host={}, path={}",
276             method,
277             scheme,
278             host,
279             path
280         );
281         // Requests cannot be created when a connection is in states: Initializing, GoingAway, Closing and Closed.
282         match self.base_handler.state() {
283             Http3State::GoingAway(..) | Http3State::Closing(..) | Http3State::Closed(..) => {
284                 return Err(Error::AlreadyClosed)
285             }
286             Http3State::Initializing => return Err(Error::Unavailable),
287             _ => {}
288         }
289 
290         let id = self
291             .conn
292             .stream_create(StreamType::BiDi)
293             .map_err(|e| Error::map_stream_create_errors(&e))?;
294 
295         // Transform pseudo-header fields
296         let mut final_headers = vec![
297             Header::new(":method", method),
298             Header::new(":scheme", scheme),
299             Header::new(":authority", host),
300             Header::new(":path", path),
301         ];
302         final_headers.extend_from_slice(headers);
303 
304         self.base_handler.add_streams(
305             id,
306             SendMessage::new_with_headers(id, final_headers, Box::new(self.events.clone())),
307             Box::new(RecvMessage::new(
308                 MessageType::Response,
309                 id,
310                 Rc::clone(&self.base_handler.qpack_decoder),
311                 Box::new(self.events.clone()),
312                 Some(Rc::clone(&self.push_handler)),
313             )),
314         );
315 
316         // Call immediately send so that at least headers get sent. This will make Firefox faster, since
317         // it can send request body immediatly in most cases and does not need to do a complete process loop.
318         let output = self
319             .base_handler
320             .send_streams
321             .get_mut(&id)
322             .ok_or(Error::InvalidStreamId)?
323             .send(
324                 &mut self.conn,
325                 &mut self.base_handler.qpack_encoder.borrow_mut(),
326             );
327         if let Err(e) = output {
328             if e.connection_error() {
329                 self.close(now, e.code(), "");
330             }
331             return Err(e);
332         }
333 
334         Ok(id)
335     }
336 
337     /// An application may reset a stream(request).
338     /// Both sides, sending and receiving side, will be closed.
339     /// # Errors
340     /// An error will be return if a stream does not exist.
stream_reset(&mut self, stream_id: u64, error: AppError) -> Res<()>341     pub fn stream_reset(&mut self, stream_id: u64, error: AppError) -> Res<()> {
342         qinfo!([self], "reset_stream {} error={}.", stream_id, error);
343         self.base_handler
344             .stream_reset(&mut self.conn, stream_id, error)?;
345         self.events.remove_events_for_stream_id(stream_id);
346         Ok(())
347     }
348 
349     /// This is call when application is done sending a request.
350     /// # Errors
351     /// An error will be return if stream does not exist.
stream_close_send(&mut self, stream_id: u64) -> Res<()>352     pub fn stream_close_send(&mut self, stream_id: u64) -> Res<()> {
353         qinfo!([self], "Close sending side stream={}.", stream_id);
354         self.base_handler
355             .stream_close_send(&mut self.conn, stream_id)
356     }
357 
358     /// To supply a request body this function is called (headers are supplied through the `fetch` function.)
359     /// # Errors
360     /// `InvalidStreamId` if thee stream does not exist,
361     /// `AlreadyClosed` if the stream has already been closed.
362     /// `TransportStreamDoesNotExist` if the transport stream does not exist (this may happen if `process_output`
363     /// has not been called when needed, and HTTP3 layer has not picked up the info that the stream has been closed.)
364     /// `InvalidInput` if an empty buffer has been supplied.
send_request_body(&mut self, stream_id: u64, buf: &[u8]) -> Res<usize>365     pub fn send_request_body(&mut self, stream_id: u64, buf: &[u8]) -> Res<usize> {
366         qinfo!(
367             [self],
368             "send_request_body from stream {} sending {} bytes.",
369             stream_id,
370             buf.len()
371         );
372         self.base_handler
373             .send_streams
374             .get_mut(&stream_id)
375             .ok_or(Error::InvalidStreamId)?
376             .send_body(&mut self.conn, buf)
377     }
378 
379     /// Response data are read directly into a buffer supplied as a parameter of this function to avoid copying
380     /// data.
381     /// # Errors
382     /// It returns an error if a stream does not exist or an error happen while reading a stream, e.g.
383     /// early close, protocol error, etc.
read_response_data( &mut self, now: Instant, stream_id: u64, buf: &mut [u8], ) -> Res<(usize, bool)>384     pub fn read_response_data(
385         &mut self,
386         now: Instant,
387         stream_id: u64,
388         buf: &mut [u8],
389     ) -> Res<(usize, bool)> {
390         qinfo!([self], "read_data from stream {}.", stream_id);
391         let recv_stream = self
392             .base_handler
393             .recv_streams
394             .get_mut(&stream_id)
395             .ok_or(Error::InvalidStreamId)?
396             .http_stream()
397             .ok_or(Error::InvalidStreamId)?;
398 
399         match recv_stream.read_data(&mut self.conn, buf) {
400             Ok((amount, fin)) => {
401                 if recv_stream.done() {
402                     self.base_handler.recv_streams.remove(&stream_id);
403                 }
404                 Ok((amount, fin))
405             }
406             Err(e) => {
407                 if e.stream_reset_error() {
408                     self.reset_stream_on_error(stream_id, e.code());
409                     Ok((0, false))
410                 } else if e.connection_error() {
411                     self.close(now, e.code(), "");
412                     Err(e)
413                 } else {
414                     Err(e)
415                 }
416             }
417         }
418     }
419 
420     // API: Push streams
421 
422     /// Cancel a push
423     /// # Errors
424     /// `InvalidStreamId` if the stream does not exist.
cancel_push(&mut self, push_id: u64) -> Res<()>425     pub fn cancel_push(&mut self, push_id: u64) -> Res<()> {
426         self.push_handler
427             .borrow_mut()
428             .cancel(push_id, &mut self.conn, &mut self.base_handler)
429     }
430 
431     /// Push response data are read directly into a buffer supplied as a parameter of this function
432     /// to avoid copying data.
433     /// # Errors
434     /// It returns an error if a stream does not exist(`InvalidStreamId`) or an error has happened while
435     /// reading a stream, e.g. early close, protocol error, etc.
push_read_data( &mut self, now: Instant, push_id: u64, buf: &mut [u8], ) -> Res<(usize, bool)>436     pub fn push_read_data(
437         &mut self,
438         now: Instant,
439         push_id: u64,
440         buf: &mut [u8],
441     ) -> Res<(usize, bool)> {
442         let stream_id = self.push_handler.borrow_mut().get_active_stream_id(push_id);
443         stream_id.map_or(Err(Error::InvalidStreamId), |id| {
444             self.read_response_data(now, id, buf)
445         })
446     }
447 
process(&mut self, dgram: Option<Datagram>, now: Instant) -> Output448     pub fn process(&mut self, dgram: Option<Datagram>, now: Instant) -> Output {
449         qtrace!([self], "Process.");
450         if let Some(d) = dgram {
451             self.process_input(d, now);
452         }
453         self.process_output(now)
454     }
455 
456     /// Supply an incoming QUIC packet.
process_input(&mut self, dgram: Datagram, now: Instant)457     pub fn process_input(&mut self, dgram: Datagram, now: Instant) {
458         qtrace!([self], "Process input.");
459         self.conn.process_input(dgram, now);
460         self.process_http3(now);
461     }
462 
463     // Only used by neqo-interop
conn(&mut self) -> &mut Connection464     pub fn conn(&mut self) -> &mut Connection {
465         &mut self.conn
466     }
467 
468     /// Process HTTP3 layer.
process_http3(&mut self, now: Instant)469     fn process_http3(&mut self, now: Instant) {
470         qtrace!([self], "Process http3 internal.");
471         match self.base_handler.state() {
472             Http3State::ZeroRtt | Http3State::Connected | Http3State::GoingAway(..) => {
473                 let res = self.check_connection_events();
474                 if self.check_result(now, &res) {
475                     return;
476                 }
477                 self.push_handler
478                     .borrow_mut()
479                     .maybe_send_max_push_id_frame(&mut self.base_handler);
480                 let res = self.base_handler.process_sending(&mut self.conn);
481                 self.check_result(now, &res);
482             }
483             Http3State::Closed { .. } => {}
484             _ => {
485                 let res = self.check_connection_events();
486                 let _ = self.check_result(now, &res);
487             }
488         }
489     }
490 
491     /// Get packet that need to be written into a UDP socket or a timer value if there is no data to send.
492     /// This function should be called repeatedly until timer value is returned.
process_output(&mut self, now: Instant) -> Output493     pub fn process_output(&mut self, now: Instant) -> Output {
494         qtrace!([self], "Process output.");
495 
496         // Maybe send() stuff on http3-managed streams
497         self.process_http3(now);
498 
499         let out = self.conn.process_output(now);
500 
501         // Update H3 for any transport state changes and events
502         self.process_http3(now);
503 
504         out
505     }
506 
507     // This function takes the provided result and check for an error.
508     // An error results in closing the connection.
check_result<ERR>(&mut self, now: Instant, res: &Res<ERR>) -> bool509     fn check_result<ERR>(&mut self, now: Instant, res: &Res<ERR>) -> bool {
510         match &res {
511             Err(Error::HttpGoaway) => {
512                 qinfo!([self], "Connection error: goaway stream_id increased.");
513                 self.close(
514                     now,
515                     Error::HttpGeneralProtocol.code(),
516                     "Connection error: goaway stream_id increased",
517                 );
518                 true
519             }
520             Err(e) => {
521                 qinfo!([self], "Connection error: {}.", e);
522                 self.close(now, e.code(), &format!("{}", e));
523                 true
524             }
525             _ => false,
526         }
527     }
528 
529     // If this return an error the connection must be closed.
check_connection_events(&mut self) -> Res<()>530     fn check_connection_events(&mut self) -> Res<()> {
531         qtrace!([self], "Check connection events.");
532         while let Some(e) = self.conn.next_event() {
533             qdebug!([self], "check_connection_events - event {:?}.", e);
534             match e {
535                 ConnectionEvent::NewStream { stream_id } => match stream_id.stream_type() {
536                     StreamType::BiDi => return Err(Error::HttpStreamCreation),
537                     StreamType::UniDi => self
538                         .base_handler
539                         .handle_new_unidi_stream(stream_id.as_u64()),
540                 },
541                 ConnectionEvent::SendStreamWritable { stream_id } => {
542                     if let Some(s) = self.base_handler.send_streams.get_mut(&stream_id.as_u64()) {
543                         s.stream_writable();
544                     }
545                 }
546                 ConnectionEvent::RecvStreamReadable { stream_id } => {
547                     if let Err(e) = self.handle_stream_readable(stream_id) {
548                         if e.stream_reset_error() {
549                             self.reset_stream_on_error(stream_id, e.code());
550                         } else {
551                             return Err(e);
552                         }
553                     }
554                 }
555                 ConnectionEvent::RecvStreamReset {
556                     stream_id,
557                     app_error,
558                 } => self
559                     .base_handler
560                     .handle_stream_reset(stream_id, app_error)?,
561                 ConnectionEvent::SendStreamStopSending {
562                     stream_id,
563                     app_error,
564                 } => self
565                     .base_handler
566                     .handle_stream_stop_sending(stream_id, app_error)?,
567                 ConnectionEvent::SendStreamComplete { .. } => {}
568                 ConnectionEvent::SendStreamCreatable { stream_type } => {
569                     self.events.new_requests_creatable(stream_type)
570                 }
571                 ConnectionEvent::AuthenticationNeeded => self.events.authentication_needed(),
572                 ConnectionEvent::EchFallbackAuthenticationNeeded { public_name } => {
573                     self.events.ech_fallback_authentication_needed(public_name)
574                 }
575                 ConnectionEvent::StateChange(state) => {
576                     if self
577                         .base_handler
578                         .handle_state_change(&mut self.conn, &state)?
579                     {
580                         self.events
581                             .connection_state_change(self.base_handler.state());
582                     }
583                 }
584                 ConnectionEvent::ZeroRttRejected => {
585                     self.base_handler.handle_zero_rtt_rejected()?;
586                     self.events.zero_rtt_rejected();
587                     self.push_handler.borrow_mut().handle_zero_rtt_rejected();
588                 }
589                 ConnectionEvent::ResumptionToken(token) => {
590                     self.create_resumption_token(&token);
591                 }
592             }
593         }
594         Ok(())
595     }
596 
handle_stream_readable(&mut self, stream_id: u64) -> Res<()>597     fn handle_stream_readable(&mut self, stream_id: u64) -> Res<()> {
598         match self
599             .base_handler
600             .handle_stream_readable(&mut self.conn, stream_id)?
601         {
602             ReceiveOutput::PushStream => self.handle_new_push_stream(stream_id),
603             ReceiveOutput::ControlFrames(control_frames) => {
604                 for f in control_frames {
605                     match f {
606                         HFrame::CancelPush { push_id } => self
607                             .push_handler
608                             .borrow_mut()
609                             .handle_cancel_push(push_id, &mut self.conn, &mut self.base_handler),
610                         HFrame::MaxPushId { .. } => Err(Error::HttpFrameUnexpected),
611                         HFrame::Goaway { stream_id } => self.handle_goaway(stream_id),
612                         _ => {
613                             unreachable!(
614                                 "we should only put MaxPushId and Goaway into control_frames."
615                             );
616                         }
617                     }?;
618                 }
619                 Ok(())
620             }
621             _ => Ok(()),
622         }
623     }
624 
handle_new_push_stream(&mut self, stream_id: u64) -> Res<()>625     fn handle_new_push_stream(&mut self, stream_id: u64) -> Res<()> {
626         if self.push_handler.borrow().can_receive_push() {
627             self.base_handler.add_recv_stream(
628                 stream_id,
629                 Box::new(PushStream::new(
630                     stream_id,
631                     Rc::clone(&self.push_handler),
632                     Rc::clone(&self.base_handler.qpack_decoder),
633                     self.events.clone(),
634                 )),
635             );
636             let res = self
637                 .base_handler
638                 .handle_stream_readable(&mut self.conn, stream_id)?;
639             debug_assert!(matches!(res, ReceiveOutput::NoOutput));
640             Ok(())
641         } else {
642             Err(Error::HttpId)
643         }
644     }
645 
handle_goaway(&mut self, goaway_stream_id: u64) -> Res<()>646     fn handle_goaway(&mut self, goaway_stream_id: u64) -> Res<()> {
647         qinfo!([self], "handle_goaway {}", goaway_stream_id);
648 
649         let id = StreamId::from(goaway_stream_id);
650         if id.is_uni() || id.is_server_initiated() {
651             return Err(Error::HttpId);
652         }
653 
654         match self.base_handler.state {
655             Http3State::Connected => {
656                 self.base_handler.state = Http3State::GoingAway(goaway_stream_id);
657             }
658             Http3State::GoingAway(ref mut stream_id) => {
659                 if goaway_stream_id > *stream_id {
660                     return Err(Error::HttpGoaway);
661                 }
662                 *stream_id = goaway_stream_id;
663             }
664             Http3State::Closing(..) | Http3State::Closed(..) => {}
665             _ => unreachable!("Should not receive Goaway frame in this state."),
666         }
667 
668         let goaway_stream_id = StreamId::from(goaway_stream_id);
669         // Issue reset events for streams >= goaway stream id
670         for id in self
671             .base_handler
672             .send_streams
673             .iter()
674             .filter_map(id_gte(goaway_stream_id))
675         {
676             self.events
677                 .reset(id, Error::HttpRequestRejected.code(), false);
678         }
679 
680         for id in self
681             .base_handler
682             .recv_streams
683             .iter()
684             .filter_map(id_gte(goaway_stream_id))
685         {
686             self.events
687                 .stop_sending(id, Error::HttpRequestRejected.code());
688         }
689 
690         self.events.goaway_received();
691 
692         // Actually remove (i.e. don't retain) these streams
693         self.base_handler
694             .send_streams
695             .retain(id_lt(goaway_stream_id));
696 
697         self.base_handler
698             .recv_streams
699             .retain(id_lt(goaway_stream_id));
700 
701         Ok(())
702     }
703 
704     /// Increases `max_stream_data` for a `stream_id`.
705     /// # Errors
706     /// Returns `InvalidStreamId` if a stream does not exist or the receiving
707     /// side is closed.
set_stream_max_data(&mut self, stream_id: u64, max_data: u64) -> Res<()>708     pub fn set_stream_max_data(&mut self, stream_id: u64, max_data: u64) -> Res<()> {
709         self.conn.set_stream_max_data(stream_id, max_data)?;
710         Ok(())
711     }
712 
713     #[must_use]
qpack_decoder_stats(&self) -> QpackStats714     pub fn qpack_decoder_stats(&self) -> QpackStats {
715         self.base_handler.qpack_decoder.borrow().stats()
716     }
717 
718     #[must_use]
qpack_encoder_stats(&self) -> QpackStats719     pub fn qpack_encoder_stats(&self) -> QpackStats {
720         self.base_handler.qpack_encoder.borrow().stats()
721     }
722 
723     #[must_use]
transport_stats(&self) -> TransportStats724     pub fn transport_stats(&self) -> TransportStats {
725         self.conn.stats()
726     }
727 
reset_stream_on_error(&mut self, stream_id: u64, app_error: AppError)728     fn reset_stream_on_error(&mut self, stream_id: u64, app_error: AppError) {
729         mem::drop(self.conn.stream_stop_sending(stream_id, app_error));
730         if let Some(mut rs) = self.base_handler.recv_streams.remove(&stream_id) {
731             rs.stream_reset(app_error, ResetType::Local).unwrap();
732         }
733     }
734 }
735 
736 impl EventProvider for Http3Client {
737     type Event = Http3ClientEvent;
738 
739     /// Return true if there are outstanding events.
has_events(&self) -> bool740     fn has_events(&self) -> bool {
741         self.events.has_events()
742     }
743 
744     /// Get events that indicate state changes on the connection. This method
745     /// correctly handles cases where handling one event can obsolete
746     /// previously-queued events, or cause new events to be generated.
next_event(&mut self) -> Option<Self::Event>747     fn next_event(&mut self) -> Option<Self::Event> {
748         self.events.next_event()
749     }
750 }
751 
752 #[cfg(test)]
753 mod tests {
754     use super::{
755         AuthenticationStatus, Connection, Error, HSettings, Header, Http3Client, Http3ClientEvent,
756         Http3Parameters, Http3State, QpackSettings, Rc, RefCell, StreamType,
757     };
758     use crate::hframe::{HFrame, H3_FRAME_TYPE_SETTINGS, H3_RESERVED_FRAME_TYPES};
759     use crate::qpack_encoder_receiver::EncoderRecvStream;
760     use crate::settings::{HSetting, HSettingType, H3_RESERVED_SETTINGS};
761     use crate::{Http3Server, RecvStream};
762     use neqo_common::{event::Provider, Datagram, Decoder, Encoder};
763     use neqo_crypto::{AllowZeroRtt, AntiReplay, ResumptionToken};
764     use neqo_qpack::encoder::QPackEncoder;
765     use neqo_transport::tparams::{self, TransportParameter};
766     use neqo_transport::{
767         ConnectionError, ConnectionEvent, ConnectionParameters, Output, State, RECV_BUFFER_SIZE,
768         SEND_BUFFER_SIZE,
769     };
770     use std::convert::TryFrom;
771     use std::mem;
772     use std::time::Duration;
773     use test_fixture::{
774         addr, anti_replay, default_server_h3, fixture_init, now, CountingConnectionIdGenerator,
775         DEFAULT_ALPN_H3, DEFAULT_KEYS, DEFAULT_SERVER_NAME,
776     };
777 
assert_closed(client: &Http3Client, expected: &Error)778     fn assert_closed(client: &Http3Client, expected: &Error) {
779         match client.state() {
780             Http3State::Closing(err) | Http3State::Closed(err) => {
781                 assert_eq!(err, ConnectionError::Application(expected.code()))
782             }
783             _ => panic!("Wrong state {:?}", client.state()),
784         };
785     }
786 
787     /// Create a http3 client with default configuration.
default_http3_client() -> Http3Client788     pub fn default_http3_client() -> Http3Client {
789         default_http3_client_param(100)
790     }
791 
default_http3_client_param(max_table_size: u64) -> Http3Client792     pub fn default_http3_client_param(max_table_size: u64) -> Http3Client {
793         fixture_init();
794         Http3Client::new(
795             DEFAULT_SERVER_NAME,
796             Rc::new(RefCell::new(CountingConnectionIdGenerator::default())),
797             addr(),
798             addr(),
799             ConnectionParameters::default(),
800             &Http3Parameters {
801                 qpack_settings: QpackSettings {
802                     max_table_size_encoder: max_table_size,
803                     max_table_size_decoder: max_table_size,
804                     max_blocked_streams: 100,
805                 },
806                 max_concurrent_push_streams: 5,
807             },
808             now(),
809         )
810         .expect("create a default client")
811     }
812 
813     const CONTROL_STREAM_TYPE: &[u8] = &[0x0];
814 
815     // Encoder stream data
816     const ENCODER_STREAM_DATA: &[u8] = &[0x2];
817 
818     // Encoder stream data with a change capacity instruction(0x3f, 0x45 = change capacity to 100)
819     // This data will be send when 0-RTT is used and we already have a max_table_capacity from
820     // resumed settings.
821     const ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION: &[u8] = &[0x2, 0x3f, 0x45];
822 
823     const ENCODER_STREAM_DATA_WITH_CAP_INST_AND_ENCODING_INST: &[u8] = &[
824         0x2, 0x3f, 0x45, 0x67, 0xa7, 0xd4, 0xe5, 0x1c, 0x85, 0xb1, 0x1f, 0x86, 0xa7, 0xd7, 0x71,
825         0xd1, 0x69, 0x7f,
826     ];
827 
828     // Decoder stream data
829     const DECODER_STREAM_DATA: &[u8] = &[0x3];
830 
831     const PUSH_STREAM_TYPE: &[u8] = &[0x1];
832 
833     const CLIENT_SIDE_CONTROL_STREAM_ID: u64 = 2;
834     const CLIENT_SIDE_ENCODER_STREAM_ID: u64 = 6;
835     const CLIENT_SIDE_DECODER_STREAM_ID: u64 = 10;
836 
837     struct TestServer {
838         settings: HFrame,
839         conn: Connection,
840         control_stream_id: Option<u64>,
841         encoder: Rc<RefCell<QPackEncoder>>,
842         encoder_receiver: EncoderRecvStream,
843         encoder_stream_id: Option<u64>,
844         decoder_stream_id: Option<u64>,
845     }
846 
847     impl TestServer {
new() -> Self848         pub fn new() -> Self {
849             Self::new_with_settings(&[
850                 HSetting::new(HSettingType::MaxTableCapacity, 100),
851                 HSetting::new(HSettingType::BlockedStreams, 100),
852                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
853             ])
854         }
855 
new_with_settings(server_settings: &[HSetting]) -> Self856         pub fn new_with_settings(server_settings: &[HSetting]) -> Self {
857             fixture_init();
858             let max_table_size = server_settings
859                 .iter()
860                 .find(|s| s.setting_type == HSettingType::MaxTableCapacity)
861                 .map_or(100, |s| s.value);
862             let max_blocked_streams = u16::try_from(
863                 server_settings
864                     .iter()
865                     .find(|s| s.setting_type == HSettingType::BlockedStreams)
866                     .map_or(100, |s| s.value),
867             )
868             .unwrap();
869             let qpack = Rc::new(RefCell::new(QPackEncoder::new(
870                 QpackSettings {
871                     max_table_size_encoder: max_table_size,
872                     max_table_size_decoder: max_table_size,
873                     max_blocked_streams,
874                 },
875                 true,
876             )));
877             Self {
878                 settings: HFrame::Settings {
879                     settings: HSettings::new(server_settings),
880                 },
881                 conn: default_server_h3(),
882                 control_stream_id: None,
883                 encoder: Rc::clone(&qpack),
884                 encoder_receiver: EncoderRecvStream::new(CLIENT_SIDE_DECODER_STREAM_ID, qpack),
885                 encoder_stream_id: None,
886                 decoder_stream_id: None,
887             }
888         }
889 
new_with_conn(conn: Connection) -> Self890         pub fn new_with_conn(conn: Connection) -> Self {
891             let qpack = Rc::new(RefCell::new(QPackEncoder::new(
892                 QpackSettings {
893                     max_table_size_encoder: 128,
894                     max_table_size_decoder: 128,
895                     max_blocked_streams: 0,
896                 },
897                 true,
898             )));
899             Self {
900                 settings: HFrame::Settings {
901                     settings: HSettings::new(&[]),
902                 },
903                 conn,
904                 control_stream_id: None,
905                 encoder: Rc::clone(&qpack),
906                 encoder_receiver: EncoderRecvStream::new(CLIENT_SIDE_DECODER_STREAM_ID, qpack),
907                 encoder_stream_id: None,
908                 decoder_stream_id: None,
909             }
910         }
911 
create_qpack_streams(&mut self)912         pub fn create_qpack_streams(&mut self) {
913             // Create a QPACK encoder stream
914             self.encoder_stream_id = Some(self.conn.stream_create(StreamType::UniDi).unwrap());
915             self.encoder
916                 .borrow_mut()
917                 .add_send_stream(self.encoder_stream_id.unwrap());
918             self.encoder.borrow_mut().send(&mut self.conn).unwrap();
919 
920             // Create decoder stream
921             self.decoder_stream_id = Some(self.conn.stream_create(StreamType::UniDi).unwrap());
922             assert_eq!(
923                 self.conn
924                     .stream_send(self.decoder_stream_id.unwrap(), DECODER_STREAM_DATA)
925                     .unwrap(),
926                 1
927             );
928         }
929 
create_control_stream(&mut self)930         pub fn create_control_stream(&mut self) {
931             // Create control stream
932             self.control_stream_id = Some(self.conn.stream_create(StreamType::UniDi).unwrap());
933             // Send stream type on the control stream.
934             assert_eq!(
935                 self.conn
936                     .stream_send(self.control_stream_id.unwrap(), CONTROL_STREAM_TYPE)
937                     .unwrap(),
938                 1
939             );
940 
941             // Encode a settings frame and send it.
942             let mut enc = Encoder::default();
943             self.settings.encode(&mut enc);
944             assert_eq!(
945                 self.conn
946                     .stream_send(self.control_stream_id.unwrap(), &enc[..])
947                     .unwrap(),
948                 enc[..].len()
949             );
950         }
951 
check_client_control_qpack_streams_no_resumption(&mut self)952         pub fn check_client_control_qpack_streams_no_resumption(&mut self) {
953             self.check_client_control_qpack_streams(
954                 ENCODER_STREAM_DATA,
955                 EXPECTED_REQUEST_HEADER_FRAME,
956                 false,
957                 true,
958             );
959         }
960 
check_control_qpack_request_streams_resumption( &mut self, expect_encoder_stream_data: &[u8], expect_request_header: &[u8], expect_request: bool, )961         pub fn check_control_qpack_request_streams_resumption(
962             &mut self,
963             expect_encoder_stream_data: &[u8],
964             expect_request_header: &[u8],
965             expect_request: bool,
966         ) {
967             self.check_client_control_qpack_streams(
968                 expect_encoder_stream_data,
969                 expect_request_header,
970                 expect_request,
971                 false,
972             );
973         }
974 
975         // Check that server has received correct settings and qpack streams.
check_client_control_qpack_streams( &mut self, expect_encoder_stream_data: &[u8], expect_request_header: &[u8], expect_request: bool, expect_connected: bool, )976         pub fn check_client_control_qpack_streams(
977             &mut self,
978             expect_encoder_stream_data: &[u8],
979             expect_request_header: &[u8],
980             expect_request: bool,
981             expect_connected: bool,
982         ) {
983             let mut connected = false;
984             let mut control_stream = false;
985             let mut qpack_decoder_stream = false;
986             let mut qpack_encoder_stream = false;
987             let mut request = false;
988             while let Some(e) = self.conn.next_event() {
989                 match e {
990                     ConnectionEvent::NewStream { stream_id }
991                     | ConnectionEvent::SendStreamWritable { stream_id } => {
992                         if expect_request {
993                             assert!(matches!(stream_id.as_u64(), 2 | 6 | 10 | 0));
994                         } else {
995                             assert!(matches!(stream_id.as_u64(), 2 | 6 | 10));
996                         }
997                     }
998                     ConnectionEvent::RecvStreamReadable { stream_id } => {
999                         if stream_id == CLIENT_SIDE_CONTROL_STREAM_ID {
1000                             self.check_control_stream();
1001                             control_stream = true;
1002                         } else if stream_id == CLIENT_SIDE_ENCODER_STREAM_ID {
1003                             // the qpack encoder stream
1004                             self.read_and_check_stream_data(
1005                                 stream_id,
1006                                 expect_encoder_stream_data,
1007                                 false,
1008                             );
1009                             qpack_encoder_stream = true;
1010                         } else if stream_id == CLIENT_SIDE_DECODER_STREAM_ID {
1011                             // the qpack decoder stream
1012                             self.read_and_check_stream_data(stream_id, DECODER_STREAM_DATA, false);
1013                             qpack_decoder_stream = true;
1014                         } else if stream_id == 0 {
1015                             assert!(expect_request);
1016                             self.read_and_check_stream_data(stream_id, expect_request_header, true);
1017                             request = true;
1018                         } else {
1019                             panic!("unexpected event");
1020                         }
1021                     }
1022                     ConnectionEvent::StateChange(State::Connected) => connected = true,
1023                     ConnectionEvent::StateChange(_) => {}
1024                     _ => panic!("unexpected event"),
1025                 }
1026             }
1027             assert_eq!(connected, expect_connected);
1028             assert!(control_stream);
1029             assert!(qpack_encoder_stream);
1030             assert!(qpack_decoder_stream);
1031             assert_eq!(request, expect_request);
1032         }
1033 
1034         // Check that the control stream contains default values.
1035         // Expect a SETTINGS frame, some grease, and a MAX_PUSH_ID frame.
1036         // The default test configuration uses:
1037         //  - max_table_capacity = 100
1038         //  - max_blocked_streams = 100
1039         // and a maximum of 5 push streams.
check_control_stream(&mut self)1040         fn check_control_stream(&mut self) {
1041             let mut buf = [0_u8; 100];
1042             let (amount, fin) = self
1043                 .conn
1044                 .stream_recv(CLIENT_SIDE_CONTROL_STREAM_ID, &mut buf)
1045                 .unwrap();
1046             let mut dec = Decoder::from(&buf[..amount]);
1047             assert_eq!(dec.decode_varint().unwrap(), 0); // control stream type
1048             assert_eq!(dec.decode_varint().unwrap(), 4); // SETTINGS
1049             assert_eq!(dec.decode_vvec().unwrap(), &[1, 0x40, 0x64, 7, 0x40, 0x64]);
1050 
1051             assert_eq!((dec.decode_varint().unwrap() - 0x21) % 0x1f, 0); // Grease
1052             assert!(dec.decode_vvec().unwrap().len() < 8);
1053 
1054             assert_eq!(dec.decode_varint().unwrap(), 0xd); // MAX_PUSH_ID
1055             assert_eq!(dec.decode_vvec().unwrap(), &[5]);
1056 
1057             assert_eq!(dec.remaining(), 0);
1058             assert!(!fin);
1059         }
1060 
read_and_check_stream_data( &mut self, stream_id: u64, expected_data: &[u8], expected_fin: bool, )1061         pub fn read_and_check_stream_data(
1062             &mut self,
1063             stream_id: u64,
1064             expected_data: &[u8],
1065             expected_fin: bool,
1066         ) {
1067             let mut buf = [0_u8; 100];
1068             let (amount, fin) = self.conn.stream_recv(stream_id, &mut buf).unwrap();
1069             assert_eq!(fin, expected_fin);
1070             assert_eq!(amount, expected_data.len());
1071             assert_eq!(&buf[..amount], expected_data);
1072         }
1073 
encode_headers( &mut self, stream_id: u64, headers: &[Header], encoder: &mut Encoder, )1074         pub fn encode_headers(
1075             &mut self,
1076             stream_id: u64,
1077             headers: &[Header],
1078             encoder: &mut Encoder,
1079         ) {
1080             let header_block = self
1081                 .encoder
1082                 .borrow_mut()
1083                 .encode_header_block(&mut self.conn, &headers, stream_id)
1084                 .unwrap();
1085             let hframe = HFrame::Headers {
1086                 header_block: header_block.to_vec(),
1087             };
1088             hframe.encode(encoder);
1089         }
1090 
set_max_uni_stream(&mut self, max_stream: u64)1091         pub fn set_max_uni_stream(&mut self, max_stream: u64) {
1092             self.conn
1093                 .set_local_tparam(
1094                     tparams::INITIAL_MAX_STREAMS_UNI,
1095                     TransportParameter::Integer(max_stream),
1096                 )
1097                 .unwrap();
1098         }
1099     }
1100 
handshake_only(client: &mut Http3Client, server: &mut TestServer) -> Output1101     fn handshake_only(client: &mut Http3Client, server: &mut TestServer) -> Output {
1102         assert_eq!(client.state(), Http3State::Initializing);
1103         let out = client.process(None, now());
1104         assert_eq!(client.state(), Http3State::Initializing);
1105 
1106         assert_eq!(*server.conn.state(), State::Init);
1107         let out = server.conn.process(out.dgram(), now());
1108         assert_eq!(*server.conn.state(), State::Handshaking);
1109 
1110         let out = client.process(out.dgram(), now());
1111         let out = server.conn.process(out.dgram(), now());
1112         assert!(out.as_dgram_ref().is_none());
1113 
1114         let authentication_needed = |e| matches!(e, Http3ClientEvent::AuthenticationNeeded);
1115         assert!(client.events().any(authentication_needed));
1116         client.authenticated(AuthenticationStatus::Ok, now());
1117         out
1118     }
1119 
1120     // Perform only Quic transport handshake.
connect_only_transport_with(client: &mut Http3Client, server: &mut TestServer)1121     fn connect_only_transport_with(client: &mut Http3Client, server: &mut TestServer) {
1122         let out = handshake_only(client, server);
1123 
1124         let out = client.process(out.dgram(), now());
1125         let connected = |e| matches!(e, Http3ClientEvent::StateChange(Http3State::Connected));
1126         assert!(client.events().any(connected));
1127 
1128         assert_eq!(client.state(), Http3State::Connected);
1129         mem::drop(server.conn.process(out.dgram(), now()));
1130         assert!(server.conn.state().connected());
1131     }
1132 
1133     // Perform only Quic transport handshake.
connect_only_transport() -> (Http3Client, TestServer)1134     fn connect_only_transport() -> (Http3Client, TestServer) {
1135         let mut client = default_http3_client();
1136         let mut server = TestServer::new();
1137         connect_only_transport_with(&mut client, &mut server);
1138         (client, server)
1139     }
1140 
send_and_receive_client_settings(client: &mut Http3Client, server: &mut TestServer)1141     fn send_and_receive_client_settings(client: &mut Http3Client, server: &mut TestServer) {
1142         // send and receive client settings
1143         let out = client.process(None, now());
1144         mem::drop(server.conn.process(out.dgram(), now()));
1145         server.check_client_control_qpack_streams_no_resumption();
1146     }
1147 
1148     // Perform Quic transport handshake and exchange Http3 settings.
connect_with(client: &mut Http3Client, server: &mut TestServer)1149     fn connect_with(client: &mut Http3Client, server: &mut TestServer) {
1150         connect_only_transport_with(client, server);
1151 
1152         send_and_receive_client_settings(client, server);
1153 
1154         server.create_control_stream();
1155 
1156         server.create_qpack_streams();
1157         // Send the server's control and qpack streams data.
1158         let out = server.conn.process(None, now());
1159         client.process(out.dgram(), now());
1160 
1161         // assert no error occured.
1162         assert_eq!(client.state(), Http3State::Connected);
1163     }
1164 
1165     // Perform Quic transport handshake and exchange Http3 settings.
connect() -> (Http3Client, TestServer)1166     fn connect() -> (Http3Client, TestServer) {
1167         let mut client = default_http3_client();
1168         let mut server = TestServer::new();
1169         connect_with(&mut client, &mut server);
1170         (client, server)
1171     }
1172 
1173     // Fetch request fetch("GET", "https", "something.com", "/", headers).
make_request(client: &mut Http3Client, close_sending_side: bool, headers: &[Header]) -> u641174     fn make_request(client: &mut Http3Client, close_sending_side: bool, headers: &[Header]) -> u64 {
1175         let request_stream_id = client
1176             .fetch(now(), "GET", "https", "something.com", "/", headers)
1177             .unwrap();
1178         if close_sending_side {
1179             client.stream_close_send(request_stream_id).unwrap();
1180         }
1181         request_stream_id
1182     }
1183 
1184     // For fetch request fetch("GET", "https", "something.com", "/", &[])
1185     // the following request header frame will be sent:
1186     const EXPECTED_REQUEST_HEADER_FRAME: &[u8] = &[
1187         0x01, 0x10, 0x00, 0x00, 0xd1, 0xd7, 0x50, 0x89, 0x41, 0xe9, 0x2a, 0x67, 0x35, 0x53, 0x2e,
1188         0x43, 0xd3, 0xc1,
1189     ];
1190 
1191     // For fetch request fetch("GET", "https", "something.com", "/", &[(String::from("myheaders", "myvalue"))])
1192     // the following request header frame will be sent:
1193     const EXPECTED_REQUEST_HEADER_FRAME_VERSION2: &[u8] = &[
1194         0x01, 0x11, 0x02, 0x80, 0xd1, 0xd7, 0x50, 0x89, 0x41, 0xe9, 0x2a, 0x67, 0x35, 0x53, 0x2e,
1195         0x43, 0xd3, 0xc1, 0x10,
1196     ];
1197 
1198     const HTTP_HEADER_FRAME_0: &[u8] = &[0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x30];
1199 
1200     // The response header from HTTP_HEADER_FRAME (0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x30) are
1201     // decoded into:
check_response_header_0(header: &[Header])1202     fn check_response_header_0(header: &[Header]) {
1203         let expected_response_header_0 = &[
1204             Header::new(":status", "200"),
1205             Header::new("content-length", "0"),
1206         ];
1207         assert_eq!(header, expected_response_header_0);
1208     }
1209 
1210     const HTTP_RESPONSE_1: &[u8] = &[
1211         // headers
1212         0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x37, // the first data frame
1213         0x0, 0x3, 0x61, 0x62, 0x63, // the second data frame
1214         0x0, 0x4, 0x64, 0x65, 0x66, 0x67,
1215     ];
1216 
1217     const HTTP_RESPONSE_HEADER_ONLY_1: &[u8] = &[
1218         // headers
1219         0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x37,
1220     ];
1221     const HTTP_RESPONSE_DATA_FRAME_1_ONLY_1: &[u8] = &[0x0, 0x3, 0x61, 0x62, 0x63];
1222 
1223     const HTTP_RESPONSE_DATA_FRAME_2_ONLY_1: &[u8] = &[0x0, 0x4, 0x64, 0x65, 0x66, 0x67];
1224 
1225     // The response header from HTTP_RESPONSE_1 (0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x36) are
1226     // decoded into:
check_response_header_1(header: &[Header])1227     fn check_response_header_1(header: &[Header]) {
1228         let expected_response_header_1 = &[
1229             Header::new(":status", "200"),
1230             Header::new("content-length", "7"),
1231         ];
1232         assert_eq!(header, expected_response_header_1);
1233     }
1234 
1235     const EXPECTED_RESPONSE_DATA_1: &[u8] = &[0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67];
1236 
1237     const HTTP_RESPONSE_2: &[u8] = &[
1238         // headers
1239         0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x33, // the data frame
1240         0x0, 0x3, 0x61, 0x62, 0x63,
1241     ];
1242 
1243     const HTTP_RESPONSE_HEADER_ONLY_2: &[u8] = &[
1244         // headers
1245         0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x33,
1246     ];
1247 
1248     const HTTP_RESPONSE_DATA_FRAME_ONLY_2: &[u8] = &[
1249         // the data frame
1250         0x0, 0x3, 0x61, 0x62, 0x63,
1251     ];
1252 
1253     // The response header from HTTP_RESPONSE_2 (0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x36) are
1254     // decoded into:
check_response_header_2(header: &[Header])1255     fn check_response_header_2(header: &[Header]) {
1256         let expected_response_header_2 = &[
1257             Header::new(":status", "200"),
1258             Header::new("content-length", "3"),
1259         ];
1260         assert_eq!(header, expected_response_header_2);
1261     }
1262 
1263     // The data frame payload from HTTP_RESPONSE_2 is:
1264     const EXPECTED_RESPONSE_DATA_2_FRAME_1: &[u8] = &[0x61, 0x62, 0x63];
1265 
make_request_and_exchange_pkts( client: &mut Http3Client, server: &mut TestServer, close_sending_side: bool, ) -> u641266     fn make_request_and_exchange_pkts(
1267         client: &mut Http3Client,
1268         server: &mut TestServer,
1269         close_sending_side: bool,
1270     ) -> u64 {
1271         let request_stream_id = make_request(client, close_sending_side, &[]);
1272 
1273         let out = client.process(None, now());
1274         mem::drop(server.conn.process(out.dgram(), now()));
1275 
1276         // find the new request/response stream and send frame v on it.
1277         while let Some(e) = server.conn.next_event() {
1278             match e {
1279                 ConnectionEvent::NewStream { stream_id } => {
1280                     assert_eq!(stream_id.as_u64(), request_stream_id);
1281                     assert_eq!(stream_id.stream_type(), StreamType::BiDi);
1282                 }
1283                 ConnectionEvent::RecvStreamReadable { stream_id } => {
1284                     assert_eq!(stream_id, request_stream_id);
1285                     server.read_and_check_stream_data(
1286                         stream_id,
1287                         EXPECTED_REQUEST_HEADER_FRAME,
1288                         close_sending_side,
1289                     );
1290                 }
1291                 _ => {}
1292             }
1293         }
1294         let out = server.conn.process(None, now());
1295         client.process(out.dgram(), now());
1296         request_stream_id
1297     }
1298 
connect_and_send_request(close_sending_side: bool) -> (Http3Client, TestServer, u64)1299     fn connect_and_send_request(close_sending_side: bool) -> (Http3Client, TestServer, u64) {
1300         let (mut client, mut server) = connect();
1301         let request_stream_id =
1302             make_request_and_exchange_pkts(&mut client, &mut server, close_sending_side);
1303         assert_eq!(request_stream_id, 0);
1304 
1305         (client, server, request_stream_id)
1306     }
1307 
server_send_response_and_exchange_packet( client: &mut Http3Client, server: &mut TestServer, stream_id: u64, response: &[u8], close_stream: bool, )1308     fn server_send_response_and_exchange_packet(
1309         client: &mut Http3Client,
1310         server: &mut TestServer,
1311         stream_id: u64,
1312         response: &[u8],
1313         close_stream: bool,
1314     ) {
1315         let _ = server.conn.stream_send(stream_id, response).unwrap();
1316         if close_stream {
1317             server.conn.stream_close_send(stream_id).unwrap();
1318         }
1319         let out = server.conn.process(None, now());
1320         let out = client.process(out.dgram(), now());
1321         mem::drop(server.conn.process(out.dgram(), now()));
1322     }
1323 
1324     const PUSH_PROMISE_DATA: &[u8] = &[
1325         0x00, 0x00, 0xd1, 0xd7, 0x50, 0x89, 0x41, 0xe9, 0x2a, 0x67, 0x35, 0x53, 0x2e, 0x43, 0xd3,
1326         0xc1,
1327     ];
1328 
check_pushpromise_header(header: &[Header])1329     fn check_pushpromise_header(header: &[Header]) {
1330         let expected_response_header_1 = &[
1331             Header::new(":method", "GET"),
1332             Header::new(":scheme", "https"),
1333             Header::new(":authority", "something.com"),
1334             Header::new(":path", "/"),
1335         ];
1336         assert_eq!(header, expected_response_header_1);
1337     }
1338 
1339     // Send a push promise with push_id and request_stream_id.
send_push_promise(conn: &mut Connection, stream_id: u64, push_id: u64)1340     fn send_push_promise(conn: &mut Connection, stream_id: u64, push_id: u64) {
1341         let frame = HFrame::PushPromise {
1342             push_id,
1343             header_block: PUSH_PROMISE_DATA.to_vec(),
1344         };
1345         let mut d = Encoder::default();
1346         frame.encode(&mut d);
1347         let _ = conn.stream_send(stream_id, &d).unwrap();
1348     }
1349 
send_push_data_and_exchange_packets( client: &mut Http3Client, server: &mut TestServer, push_id: u8, close_push_stream: bool, ) -> u641350     fn send_push_data_and_exchange_packets(
1351         client: &mut Http3Client,
1352         server: &mut TestServer,
1353         push_id: u8,
1354         close_push_stream: bool,
1355     ) -> u64 {
1356         let push_stream_id = send_push_data(&mut server.conn, push_id, close_push_stream);
1357 
1358         let out = server.conn.process(None, now());
1359         let out = client.process(out.dgram(), now());
1360         mem::drop(server.conn.process(out.dgram(), now()));
1361 
1362         push_stream_id
1363     }
1364 
send_push_promise_and_exchange_packets( client: &mut Http3Client, server: &mut TestServer, stream_id: u64, push_id: u64, )1365     fn send_push_promise_and_exchange_packets(
1366         client: &mut Http3Client,
1367         server: &mut TestServer,
1368         stream_id: u64,
1369         push_id: u64,
1370     ) {
1371         send_push_promise(&mut server.conn, stream_id, push_id);
1372 
1373         let out = server.conn.process(None, now());
1374         let out = client.process(out.dgram(), now());
1375         mem::drop(server.conn.process(out.dgram(), now()));
1376     }
1377 
send_cancel_push_and_exchange_packets( client: &mut Http3Client, server: &mut TestServer, push_id: u64, )1378     fn send_cancel_push_and_exchange_packets(
1379         client: &mut Http3Client,
1380         server: &mut TestServer,
1381         push_id: u64,
1382     ) {
1383         let frame = HFrame::CancelPush { push_id };
1384         let mut d = Encoder::default();
1385         frame.encode(&mut d);
1386         server
1387             .conn
1388             .stream_send(server.control_stream_id.unwrap(), &d)
1389             .unwrap();
1390 
1391         let out = server.conn.process(None, now());
1392         let out = client.process(out.dgram(), now());
1393         mem::drop(server.conn.process(out.dgram(), now()));
1394     }
1395 
1396     const PUSH_DATA: &[u8] = &[
1397         // headers
1398         0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x34, // the data frame.
1399         0x0, 0x4, 0x61, 0x62, 0x63, 0x64,
1400     ];
1401 
1402     // The response header from PUSH_DATA (0x01, 0x06, 0x00, 0x00, 0xd9, 0x54, 0x01, 0x34) are
1403     // decoded into:
check_push_response_header(header: &[Header])1404     fn check_push_response_header(header: &[Header]) {
1405         let expected_push_response_header = vec![
1406             Header::new(":status", "200"),
1407             Header::new("content-length", "4"),
1408         ];
1409         assert_eq!(header, &expected_push_response_header[..]);
1410     }
1411 
1412     // The data frame payload from PUSH_DATA is:
1413     const EXPECTED_PUSH_RESPONSE_DATA_FRAME: &[u8] = &[0x61, 0x62, 0x63, 0x64];
1414 
1415     // Send push data on a push stream:
1416     //  1) push_stream_type PUSH_STREAM_TYPE
1417     //  2) push_id
1418     //  3) PUSH_DATA that contains encoded headers and a data frame.
1419     // This function can only handle small push_id numbers that fit in a varint of length 1 byte.
send_data_on_push( conn: &mut Connection, push_stream_id: u64, push_id: u8, data: &[u8], close_push_stream: bool, )1420     fn send_data_on_push(
1421         conn: &mut Connection,
1422         push_stream_id: u64,
1423         push_id: u8,
1424         data: &[u8],
1425         close_push_stream: bool,
1426     ) {
1427         // send data
1428         let _ = conn.stream_send(push_stream_id, PUSH_STREAM_TYPE).unwrap();
1429         let _ = conn.stream_send(push_stream_id, &[push_id]).unwrap();
1430         let _ = conn.stream_send(push_stream_id, data).unwrap();
1431         if close_push_stream {
1432             conn.stream_close_send(push_stream_id).unwrap();
1433         }
1434     }
1435 
1436     // Send push data on a push stream:
1437     //  1) push_stream_type PUSH_STREAM_TYPE
1438     //  2) push_id
1439     //  3) PUSH_DATA that contains encoded headers and a data frame.
1440     // This function can only handle small push_id numbers that fit in a varint of length 1 byte.
send_push_data(conn: &mut Connection, push_id: u8, close_push_stream: bool) -> u641441     fn send_push_data(conn: &mut Connection, push_id: u8, close_push_stream: bool) -> u64 {
1442         send_push_with_data(conn, push_id, PUSH_DATA, close_push_stream)
1443     }
1444 
1445     // Send push data on a push stream:
1446     //  1) push_stream_type PUSH_STREAM_TYPE
1447     //  2) push_id
1448     //  3) and supplied push data.
1449     // This function can only handle small push_id numbers that fit in a varint of length 1 byte.
send_push_with_data( conn: &mut Connection, push_id: u8, data: &[u8], close_push_stream: bool, ) -> u641450     fn send_push_with_data(
1451         conn: &mut Connection,
1452         push_id: u8,
1453         data: &[u8],
1454         close_push_stream: bool,
1455     ) -> u64 {
1456         // create a push stream
1457         let push_stream_id = conn.stream_create(StreamType::UniDi).unwrap();
1458         // send data
1459         send_data_on_push(conn, push_stream_id, push_id, data, close_push_stream);
1460         push_stream_id
1461     }
1462 
1463     struct PushPromiseInfo {
1464         pub push_id: u64,
1465         pub ref_stream_id: u64,
1466     }
1467 
1468     // Helper function: read response when a server sends:
1469     // - HTTP_RESPONSE_2 on the request_stream_id stream,
1470     // - a number of push promises described by a list of PushPromiseInfo.
1471     // - and a push streams with push_id in the push_streams list.
1472     // All push stream contain PUSH_DATA that decodes to headers (that can be checked by calling
1473     // check_push_response_header) and EXPECTED_PUSH_RESPONSE_DATA_FRAME
read_response_and_push_events( client: &mut Http3Client, push_promises: &[PushPromiseInfo], push_streams: &[u64], response_stream_id: u64, )1474     fn read_response_and_push_events(
1475         client: &mut Http3Client,
1476         push_promises: &[PushPromiseInfo],
1477         push_streams: &[u64],
1478         response_stream_id: u64,
1479     ) {
1480         let mut num_push_promises = 0;
1481         let mut num_push_stream_headers = 0;
1482         let mut num_push_stream_data = 0;
1483         while let Some(e) = client.next_event() {
1484             match e {
1485                 Http3ClientEvent::PushPromise {
1486                     push_id,
1487                     request_stream_id,
1488                     headers,
1489                 } => {
1490                     assert!(push_promises
1491                         .iter()
1492                         .any(|p| p.push_id == push_id && p.ref_stream_id == request_stream_id));
1493                     check_pushpromise_header(&headers[..]);
1494                     num_push_promises += 1;
1495                 }
1496                 Http3ClientEvent::PushHeaderReady {
1497                     push_id,
1498                     headers,
1499                     interim,
1500                     fin,
1501                 } => {
1502                     assert!(push_streams.contains(&push_id));
1503                     check_push_response_header(&headers);
1504                     num_push_stream_headers += 1;
1505                     assert!(!fin);
1506                     assert!(!interim);
1507                 }
1508                 Http3ClientEvent::PushDataReadable { push_id } => {
1509                     assert!(push_streams.contains(&push_id));
1510                     let mut buf = [0_u8; 100];
1511                     let (amount, fin) = client.push_read_data(now(), push_id, &mut buf).unwrap();
1512                     assert!(fin);
1513                     assert_eq!(amount, EXPECTED_PUSH_RESPONSE_DATA_FRAME.len());
1514                     assert_eq!(&buf[..amount], EXPECTED_PUSH_RESPONSE_DATA_FRAME);
1515                     num_push_stream_data += 1;
1516                 }
1517                 Http3ClientEvent::HeaderReady {
1518                     stream_id,
1519                     headers,
1520                     interim,
1521                     fin,
1522                 } => {
1523                     assert_eq!(stream_id, response_stream_id);
1524                     check_response_header_2(&headers);
1525                     assert!(!fin);
1526                     assert!(!interim);
1527                 }
1528                 Http3ClientEvent::DataReadable { stream_id } => {
1529                     assert_eq!(stream_id, response_stream_id);
1530                     let mut buf = [0_u8; 100];
1531                     let (amount, _) = client
1532                         .read_response_data(now(), stream_id, &mut buf)
1533                         .unwrap();
1534                     assert_eq!(amount, EXPECTED_RESPONSE_DATA_2_FRAME_1.len());
1535                     assert_eq!(&buf[..amount], EXPECTED_RESPONSE_DATA_2_FRAME_1);
1536                 }
1537                 _ => {}
1538             }
1539         }
1540 
1541         assert_eq!(num_push_promises, push_promises.len());
1542         assert_eq!(num_push_stream_headers, push_streams.len());
1543         assert_eq!(num_push_stream_data, push_streams.len());
1544     }
1545 
1546     // Client: Test receiving a new control stream and a SETTINGS frame.
1547     #[test]
test_client_connect_and_exchange_qpack_and_control_streams()1548     fn test_client_connect_and_exchange_qpack_and_control_streams() {
1549         mem::drop(connect());
1550     }
1551 
1552     // Client: Test that the connection will be closed if control stream
1553     // has been closed.
1554     #[test]
test_client_close_control_stream()1555     fn test_client_close_control_stream() {
1556         let (mut client, mut server) = connect();
1557         server
1558             .conn
1559             .stream_close_send(server.control_stream_id.unwrap())
1560             .unwrap();
1561         let out = server.conn.process(None, now());
1562         client.process(out.dgram(), now());
1563         assert_closed(&client, &Error::HttpClosedCriticalStream);
1564     }
1565 
1566     // Client: Test that the connection will be closed if the local control stream
1567     // has been reset.
1568     #[test]
test_client_reset_control_stream()1569     fn test_client_reset_control_stream() {
1570         let (mut client, mut server) = connect();
1571         server
1572             .conn
1573             .stream_reset_send(server.control_stream_id.unwrap(), Error::HttpNoError.code())
1574             .unwrap();
1575         let out = server.conn.process(None, now());
1576         client.process(out.dgram(), now());
1577         assert_closed(&client, &Error::HttpClosedCriticalStream);
1578     }
1579 
1580     // Client: Test that the connection will be closed if the server side encoder stream
1581     // has been reset.
1582     #[test]
test_client_reset_server_side_encoder_stream()1583     fn test_client_reset_server_side_encoder_stream() {
1584         let (mut client, mut server) = connect();
1585         server
1586             .conn
1587             .stream_reset_send(server.encoder_stream_id.unwrap(), Error::HttpNoError.code())
1588             .unwrap();
1589         let out = server.conn.process(None, now());
1590         client.process(out.dgram(), now());
1591         assert_closed(&client, &Error::HttpClosedCriticalStream);
1592     }
1593 
1594     // Client: Test that the connection will be closed if the server side decoder stream
1595     // has been reset.
1596     #[test]
test_client_reset_server_side_decoder_stream()1597     fn test_client_reset_server_side_decoder_stream() {
1598         let (mut client, mut server) = connect();
1599         server
1600             .conn
1601             .stream_reset_send(server.decoder_stream_id.unwrap(), Error::HttpNoError.code())
1602             .unwrap();
1603         let out = server.conn.process(None, now());
1604         client.process(out.dgram(), now());
1605         assert_closed(&client, &Error::HttpClosedCriticalStream);
1606     }
1607 
1608     // Client: Test that the connection will be closed if the local control stream
1609     // has received a stop_sending.
1610     #[test]
test_client_stop_sending_control_stream()1611     fn test_client_stop_sending_control_stream() {
1612         let (mut client, mut server) = connect();
1613         server
1614             .conn
1615             .stream_stop_sending(CLIENT_SIDE_CONTROL_STREAM_ID, Error::HttpNoError.code())
1616             .unwrap();
1617         let out = server.conn.process(None, now());
1618         client.process(out.dgram(), now());
1619         assert_closed(&client, &Error::HttpClosedCriticalStream);
1620     }
1621 
1622     // Client: Test that the connection will be closed if the client side encoder stream
1623     // has received a stop_sending.
1624     #[test]
test_client_stop_sending_encoder_stream()1625     fn test_client_stop_sending_encoder_stream() {
1626         let (mut client, mut server) = connect();
1627         server
1628             .conn
1629             .stream_stop_sending(CLIENT_SIDE_ENCODER_STREAM_ID, Error::HttpNoError.code())
1630             .unwrap();
1631         let out = server.conn.process(None, now());
1632         client.process(out.dgram(), now());
1633         assert_closed(&client, &Error::HttpClosedCriticalStream);
1634     }
1635 
1636     // Client: Test that the connection will be closed if the client side decoder stream
1637     // has received a stop_sending.
1638     #[test]
test_client_stop_sending_decoder_stream()1639     fn test_client_stop_sending_decoder_stream() {
1640         let (mut client, mut server) = connect();
1641         server
1642             .conn
1643             .stream_stop_sending(CLIENT_SIDE_DECODER_STREAM_ID, Error::HttpNoError.code())
1644             .unwrap();
1645         let out = server.conn.process(None, now());
1646         client.process(out.dgram(), now());
1647         assert_closed(&client, &Error::HttpClosedCriticalStream);
1648     }
1649 
1650     // Client: test missing SETTINGS frame
1651     // (the first frame sent is a garbage frame).
1652     #[test]
test_client_missing_settings()1653     fn test_client_missing_settings() {
1654         let (mut client, mut server) = connect_only_transport();
1655         // Create server control stream.
1656         let control_stream = server.conn.stream_create(StreamType::UniDi).unwrap();
1657         // Send a HEADERS frame instead (which contains garbage).
1658         let sent = server
1659             .conn
1660             .stream_send(control_stream, &[0x0, 0x1, 0x3, 0x0, 0x1, 0x2]);
1661         assert_eq!(sent, Ok(6));
1662         let out = server.conn.process(None, now());
1663         client.process(out.dgram(), now());
1664         assert_closed(&client, &Error::HttpMissingSettings);
1665     }
1666 
1667     // Client: receiving SETTINGS frame twice causes connection close
1668     // with error HTTP_UNEXPECTED_FRAME.
1669     #[test]
test_client_receive_settings_twice()1670     fn test_client_receive_settings_twice() {
1671         let (mut client, mut server) = connect();
1672         // send the second SETTINGS frame.
1673         let sent = server.conn.stream_send(
1674             server.control_stream_id.unwrap(),
1675             &[0x4, 0x6, 0x1, 0x40, 0x64, 0x7, 0x40, 0x64],
1676         );
1677         assert_eq!(sent, Ok(8));
1678         let out = server.conn.process(None, now());
1679         client.process(out.dgram(), now());
1680         assert_closed(&client, &Error::HttpFrameUnexpected);
1681     }
1682 
test_wrong_frame_on_control_stream(v: &[u8])1683     fn test_wrong_frame_on_control_stream(v: &[u8]) {
1684         let (mut client, mut server) = connect();
1685 
1686         // send a frame that is not allowed on the control stream.
1687         let _ = server
1688             .conn
1689             .stream_send(server.control_stream_id.unwrap(), v)
1690             .unwrap();
1691 
1692         let out = server.conn.process(None, now());
1693         client.process(out.dgram(), now());
1694 
1695         assert_closed(&client, &Error::HttpFrameUnexpected);
1696     }
1697 
1698     // send DATA frame on a cortrol stream
1699     #[test]
test_data_frame_on_control_stream()1700     fn test_data_frame_on_control_stream() {
1701         test_wrong_frame_on_control_stream(&[0x0, 0x2, 0x1, 0x2]);
1702     }
1703 
1704     // send HEADERS frame on a cortrol stream
1705     #[test]
test_headers_frame_on_control_stream()1706     fn test_headers_frame_on_control_stream() {
1707         test_wrong_frame_on_control_stream(&[0x1, 0x2, 0x1, 0x2]);
1708     }
1709 
1710     // send PUSH_PROMISE frame on a cortrol stream
1711     #[test]
test_push_promise_frame_on_control_stream()1712     fn test_push_promise_frame_on_control_stream() {
1713         test_wrong_frame_on_control_stream(&[0x5, 0x2, 0x1, 0x2]);
1714     }
1715 
test_wrong_frame_on_push_stream(v: &[u8])1716     fn test_wrong_frame_on_push_stream(v: &[u8]) {
1717         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
1718 
1719         send_push_promise(&mut server.conn, request_stream_id, 0);
1720         // Create a push stream
1721         let push_stream_id = server.conn.stream_create(StreamType::UniDi).unwrap();
1722 
1723         // Send the push stream type byte, push_id and frame v.
1724         let _ = server
1725             .conn
1726             .stream_send(push_stream_id, &[0x01, 0x0])
1727             .unwrap();
1728         let _ = server.conn.stream_send(push_stream_id, v).unwrap();
1729 
1730         let out = server.conn.process(None, now());
1731         let out = client.process(out.dgram(), now());
1732         mem::drop(server.conn.process(out.dgram(), now()));
1733 
1734         assert_closed(&client, &Error::HttpFrameUnexpected);
1735     }
1736 
1737     #[test]
test_cancel_push_frame_on_push_stream()1738     fn test_cancel_push_frame_on_push_stream() {
1739         test_wrong_frame_on_push_stream(&[0x3, 0x1, 0x5]);
1740     }
1741 
1742     #[test]
test_settings_frame_on_push_stream()1743     fn test_settings_frame_on_push_stream() {
1744         test_wrong_frame_on_push_stream(&[0x4, 0x4, 0x6, 0x4, 0x8, 0x4]);
1745     }
1746 
1747     #[test]
test_push_promise_frame_on_push_stream()1748     fn test_push_promise_frame_on_push_stream() {
1749         test_wrong_frame_on_push_stream(&[0x5, 0x2, 0x1, 0x2]);
1750     }
1751 
1752     #[test]
test_goaway_frame_on_push_stream()1753     fn test_goaway_frame_on_push_stream() {
1754         test_wrong_frame_on_push_stream(&[0x7, 0x1, 0x5]);
1755     }
1756 
1757     #[test]
test_max_push_id_frame_on_push_stream()1758     fn test_max_push_id_frame_on_push_stream() {
1759         test_wrong_frame_on_push_stream(&[0xd, 0x1, 0x5]);
1760     }
1761 
1762     // send DATA frame before a header frame
1763     #[test]
test_data_frame_on_push_stream()1764     fn test_data_frame_on_push_stream() {
1765         test_wrong_frame_on_push_stream(&[0x0, 0x2, 0x1, 0x2]);
1766     }
1767 
1768     // Client: receive unknown stream type
1769     // This function also tests getting stream id that does not fit into a single byte.
1770     #[test]
test_client_received_unknown_stream()1771     fn test_client_received_unknown_stream() {
1772         let (mut client, mut server) = connect();
1773 
1774         // create a stream with unknown type.
1775         let new_stream_id = server.conn.stream_create(StreamType::UniDi).unwrap();
1776         let _ = server
1777             .conn
1778             .stream_send(new_stream_id, &[0x41, 0x19, 0x4, 0x4, 0x6, 0x0, 0x8, 0x0])
1779             .unwrap();
1780         let out = server.conn.process(None, now());
1781         let out = client.process(out.dgram(), now());
1782         mem::drop(server.conn.process(out.dgram(), now()));
1783 
1784         // check for stop-sending with Error::HttpStreamCreation.
1785         let mut stop_sending_event_found = false;
1786         while let Some(e) = server.conn.next_event() {
1787             if let ConnectionEvent::SendStreamStopSending {
1788                 stream_id,
1789                 app_error,
1790             } = e
1791             {
1792                 stop_sending_event_found = true;
1793                 assert_eq!(stream_id, new_stream_id);
1794                 assert_eq!(app_error, Error::HttpStreamCreation.code());
1795             }
1796         }
1797         assert!(stop_sending_event_found);
1798         assert_eq!(client.state(), Http3State::Connected);
1799     }
1800 
1801     // Test wrong frame on req/rec stream
test_wrong_frame_on_request_stream(v: &[u8])1802     fn test_wrong_frame_on_request_stream(v: &[u8]) {
1803         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
1804 
1805         let _ = server.conn.stream_send(request_stream_id, v).unwrap();
1806 
1807         // Generate packet with the above bad h3 input
1808         let out = server.conn.process(None, now());
1809         // Process bad input and close the connection.
1810         mem::drop(client.process(out.dgram(), now()));
1811 
1812         assert_closed(&client, &Error::HttpFrameUnexpected);
1813     }
1814 
1815     #[test]
test_cancel_push_frame_on_request_stream()1816     fn test_cancel_push_frame_on_request_stream() {
1817         test_wrong_frame_on_request_stream(&[0x3, 0x1, 0x5]);
1818     }
1819 
1820     #[test]
test_settings_frame_on_request_stream()1821     fn test_settings_frame_on_request_stream() {
1822         test_wrong_frame_on_request_stream(&[0x4, 0x4, 0x6, 0x4, 0x8, 0x4]);
1823     }
1824 
1825     #[test]
test_goaway_frame_on_request_stream()1826     fn test_goaway_frame_on_request_stream() {
1827         test_wrong_frame_on_request_stream(&[0x7, 0x1, 0x5]);
1828     }
1829 
1830     #[test]
test_max_push_id_frame_on_request_stream()1831     fn test_max_push_id_frame_on_request_stream() {
1832         test_wrong_frame_on_request_stream(&[0xd, 0x1, 0x5]);
1833     }
1834 
1835     // Test reading of a slowly streamed frame. bytes are received one by one
1836     #[test]
test_frame_reading()1837     fn test_frame_reading() {
1838         let (mut client, mut server) = connect_only_transport();
1839 
1840         // create a control stream.
1841         let control_stream = server.conn.stream_create(StreamType::UniDi).unwrap();
1842 
1843         // send the stream type
1844         let mut sent = server.conn.stream_send(control_stream, &[0x0]);
1845         assert_eq!(sent, Ok(1));
1846         let out = server.conn.process(None, now());
1847         client.process(out.dgram(), now());
1848 
1849         // start sending SETTINGS frame
1850         sent = server.conn.stream_send(control_stream, &[0x4]);
1851         assert_eq!(sent, Ok(1));
1852         let out = server.conn.process(None, now());
1853         client.process(out.dgram(), now());
1854 
1855         sent = server.conn.stream_send(control_stream, &[0x4]);
1856         assert_eq!(sent, Ok(1));
1857         let out = server.conn.process(None, now());
1858         client.process(out.dgram(), now());
1859 
1860         sent = server.conn.stream_send(control_stream, &[0x6]);
1861         assert_eq!(sent, Ok(1));
1862         let out = server.conn.process(None, now());
1863         client.process(out.dgram(), now());
1864 
1865         sent = server.conn.stream_send(control_stream, &[0x0]);
1866         assert_eq!(sent, Ok(1));
1867         let out = server.conn.process(None, now());
1868         client.process(out.dgram(), now());
1869 
1870         sent = server.conn.stream_send(control_stream, &[0x8]);
1871         assert_eq!(sent, Ok(1));
1872         let out = server.conn.process(None, now());
1873         client.process(out.dgram(), now());
1874 
1875         sent = server.conn.stream_send(control_stream, &[0x0]);
1876         assert_eq!(sent, Ok(1));
1877         let out = server.conn.process(None, now());
1878         client.process(out.dgram(), now());
1879 
1880         assert_eq!(client.state(), Http3State::Connected);
1881 
1882         // Now test PushPromise
1883         sent = server.conn.stream_send(control_stream, &[0x5]);
1884         assert_eq!(sent, Ok(1));
1885         let out = server.conn.process(None, now());
1886         client.process(out.dgram(), now());
1887 
1888         sent = server.conn.stream_send(control_stream, &[0x5]);
1889         assert_eq!(sent, Ok(1));
1890         let out = server.conn.process(None, now());
1891         client.process(out.dgram(), now());
1892 
1893         sent = server.conn.stream_send(control_stream, &[0x4]);
1894         assert_eq!(sent, Ok(1));
1895         let out = server.conn.process(None, now());
1896         client.process(out.dgram(), now());
1897 
1898         sent = server.conn.stream_send(control_stream, &[0x61]);
1899         assert_eq!(sent, Ok(1));
1900         let out = server.conn.process(None, now());
1901         client.process(out.dgram(), now());
1902 
1903         sent = server.conn.stream_send(control_stream, &[0x62]);
1904         assert_eq!(sent, Ok(1));
1905         let out = server.conn.process(None, now());
1906         client.process(out.dgram(), now());
1907 
1908         sent = server.conn.stream_send(control_stream, &[0x63]);
1909         assert_eq!(sent, Ok(1));
1910         let out = server.conn.process(None, now());
1911         client.process(out.dgram(), now());
1912 
1913         sent = server.conn.stream_send(control_stream, &[0x64]);
1914         assert_eq!(sent, Ok(1));
1915         let out = server.conn.process(None, now());
1916         client.process(out.dgram(), now());
1917 
1918         // PUSH_PROMISE on a control stream will cause an error
1919         assert_closed(&client, &Error::HttpFrameUnexpected);
1920     }
1921 
1922     #[test]
fetch_basic()1923     fn fetch_basic() {
1924         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
1925         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
1926 
1927         // send response - 200  Content-Length: 7
1928         // with content: 'abcdefg'.
1929         // The content will be send in 2 DATA frames.
1930         server_send_response_and_exchange_packet(
1931             &mut client,
1932             &mut server,
1933             request_stream_id,
1934             HTTP_RESPONSE_1,
1935             true,
1936         );
1937 
1938         let http_events = client.events().collect::<Vec<_>>();
1939         assert_eq!(http_events.len(), 2);
1940         for e in http_events {
1941             match e {
1942                 Http3ClientEvent::HeaderReady {
1943                     stream_id,
1944                     headers,
1945                     interim,
1946                     fin,
1947                 } => {
1948                     assert_eq!(stream_id, request_stream_id);
1949                     check_response_header_1(&headers);
1950                     assert!(!fin);
1951                     assert!(!interim);
1952                 }
1953                 Http3ClientEvent::DataReadable { stream_id } => {
1954                     assert_eq!(stream_id, request_stream_id);
1955                     let mut buf = [0_u8; 100];
1956                     let (amount, fin) = client
1957                         .read_response_data(now(), stream_id, &mut buf)
1958                         .unwrap();
1959                     assert!(fin);
1960                     assert_eq!(amount, EXPECTED_RESPONSE_DATA_1.len());
1961                     assert_eq!(&buf[..amount], EXPECTED_RESPONSE_DATA_1);
1962                 }
1963                 _ => {}
1964             }
1965         }
1966 
1967         // after this stream will be removed from hcoon. We will check this by trying to read
1968         // from the stream and that should fail.
1969         let mut buf = [0_u8; 100];
1970         let res = client.read_response_data(now(), request_stream_id, &mut buf);
1971         assert_eq!(res.unwrap_err(), Error::InvalidStreamId);
1972 
1973         client.close(now(), 0, "");
1974     }
1975 
1976     // Helper function: read response when a server sends HTTP_RESPONSE_2.
read_response(client: &mut Http3Client, server: &mut Connection, request_stream_id: u64)1977     fn read_response(client: &mut Http3Client, server: &mut Connection, request_stream_id: u64) {
1978         let out = server.process(None, now());
1979         client.process(out.dgram(), now());
1980 
1981         while let Some(e) = client.next_event() {
1982             match e {
1983                 Http3ClientEvent::HeaderReady {
1984                     stream_id,
1985                     headers,
1986                     interim,
1987                     fin,
1988                 } => {
1989                     assert_eq!(stream_id, request_stream_id);
1990                     check_response_header_2(&headers);
1991                     assert!(!fin);
1992                     assert!(!interim);
1993                 }
1994                 Http3ClientEvent::DataReadable { stream_id } => {
1995                     assert_eq!(stream_id, request_stream_id);
1996                     let mut buf = [0_u8; 100];
1997                     let (amount, fin) = client
1998                         .read_response_data(now(), stream_id, &mut buf)
1999                         .unwrap();
2000                     assert!(fin);
2001                     assert_eq!(amount, EXPECTED_RESPONSE_DATA_2_FRAME_1.len());
2002                     assert_eq!(&buf[..amount], EXPECTED_RESPONSE_DATA_2_FRAME_1);
2003                 }
2004                 _ => {}
2005             }
2006         }
2007 
2008         // after this stream will be removed from client. We will check this by trying to read
2009         // from the stream and that should fail.
2010         let mut buf = [0_u8; 100];
2011         let res = client.read_response_data(now(), request_stream_id, &mut buf);
2012         assert!(res.is_err());
2013         assert_eq!(res.unwrap_err(), Error::InvalidStreamId);
2014 
2015         client.close(now(), 0, "");
2016     }
2017 
2018     // Data sent with a request:
2019     const REQUEST_BODY: &[u8] = &[0x64, 0x65, 0x66];
2020     // Corresponding data frame that server will receive.
2021     const EXPECTED_REQUEST_BODY_FRAME: &[u8] = &[0x0, 0x3, 0x64, 0x65, 0x66];
2022 
2023     // Send a request with the request body.
2024     #[test]
fetch_with_data()2025     fn fetch_with_data() {
2026         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2027         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2028 
2029         // Get DataWritable for the request stream so that we can write the request body.
2030         let data_writable = |e| matches!(e, Http3ClientEvent::DataWritable { .. });
2031         assert!(client.events().any(data_writable));
2032         let sent = client
2033             .send_request_body(request_stream_id, REQUEST_BODY)
2034             .unwrap();
2035         assert_eq!(sent, REQUEST_BODY.len());
2036         client.stream_close_send(request_stream_id).unwrap();
2037 
2038         let out = client.process(None, now());
2039         mem::drop(server.conn.process(out.dgram(), now()));
2040 
2041         // find the new request/response stream and send response on it.
2042         while let Some(e) = server.conn.next_event() {
2043             match e {
2044                 ConnectionEvent::NewStream { stream_id } => {
2045                     assert_eq!(stream_id.as_u64(), request_stream_id);
2046                     assert_eq!(stream_id.stream_type(), StreamType::BiDi);
2047                 }
2048                 ConnectionEvent::RecvStreamReadable { stream_id } => {
2049                     assert_eq!(stream_id, request_stream_id);
2050 
2051                     // Read request body.
2052                     let mut buf = [0_u8; 100];
2053                     let (amount, fin) = server.conn.stream_recv(stream_id, &mut buf).unwrap();
2054                     assert!(fin);
2055                     assert_eq!(amount, EXPECTED_REQUEST_BODY_FRAME.len());
2056                     assert_eq!(&buf[..amount], EXPECTED_REQUEST_BODY_FRAME);
2057 
2058                     // send response - 200  Content-Length: 3
2059                     // with content: 'abc'.
2060                     let _ = server.conn.stream_send(stream_id, HTTP_RESPONSE_2).unwrap();
2061                     server.conn.stream_close_send(stream_id).unwrap();
2062                 }
2063                 _ => {}
2064             }
2065         }
2066 
2067         read_response(&mut client, &mut server.conn, request_stream_id);
2068     }
2069 
2070     // send a request with request body containing request_body. We expect to receive expected_data_frame_header.
fetch_with_data_length_xbytes(request_body: &[u8], expected_data_frame_header: &[u8])2071     fn fetch_with_data_length_xbytes(request_body: &[u8], expected_data_frame_header: &[u8]) {
2072         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2073         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2074 
2075         // Get DataWritable for the request stream so that we can write the request body.
2076         let data_writable = |e| matches!(e, Http3ClientEvent::DataWritable { .. });
2077         assert!(client.events().any(data_writable));
2078         let sent = client.send_request_body(request_stream_id, request_body);
2079         assert_eq!(sent, Ok(request_body.len()));
2080 
2081         // Close stream.
2082         client.stream_close_send(request_stream_id).unwrap();
2083 
2084         // We need to loop a bit until all data has been sent.
2085         let mut out = client.process(None, now());
2086         for _i in 0..20 {
2087             out = server.conn.process(out.dgram(), now());
2088             out = client.process(out.dgram(), now());
2089         }
2090 
2091         // check request body is received.
2092         // Then send a response.
2093         while let Some(e) = server.conn.next_event() {
2094             if let ConnectionEvent::RecvStreamReadable { stream_id } = e {
2095                 if stream_id == request_stream_id {
2096                     // Read the DATA frame.
2097                     let mut buf = vec![1_u8; RECV_BUFFER_SIZE];
2098                     let (amount, fin) = server.conn.stream_recv(stream_id, &mut buf).unwrap();
2099                     assert!(fin);
2100                     assert_eq!(
2101                         amount,
2102                         request_body.len() + expected_data_frame_header.len()
2103                     );
2104 
2105                     // Check the DATA frame header
2106                     assert_eq!(
2107                         &buf[..expected_data_frame_header.len()],
2108                         expected_data_frame_header
2109                     );
2110 
2111                     // Check data.
2112                     assert_eq!(&buf[expected_data_frame_header.len()..amount], request_body);
2113 
2114                     // send response - 200  Content-Length: 3
2115                     // with content: 'abc'.
2116                     let _ = server.conn.stream_send(stream_id, HTTP_RESPONSE_2).unwrap();
2117                     server.conn.stream_close_send(stream_id).unwrap();
2118                 }
2119             }
2120         }
2121 
2122         read_response(&mut client, &mut server.conn, request_stream_id);
2123     }
2124 
2125     // send a request with 63 bytes. The DATA frame length field will still have 1 byte.
2126     #[test]
fetch_with_data_length_63bytes()2127     fn fetch_with_data_length_63bytes() {
2128         fetch_with_data_length_xbytes(&[0_u8; 63], &[0x0, 0x3f]);
2129     }
2130 
2131     // send a request with 64 bytes. The DATA frame length field will need 2 byte.
2132     #[test]
fetch_with_data_length_64bytes()2133     fn fetch_with_data_length_64bytes() {
2134         fetch_with_data_length_xbytes(&[0_u8; 64], &[0x0, 0x40, 0x40]);
2135     }
2136 
2137     // send a request with 16383 bytes. The DATA frame length field will still have 2 byte.
2138     #[test]
fetch_with_data_length_16383bytes()2139     fn fetch_with_data_length_16383bytes() {
2140         fetch_with_data_length_xbytes(&[0_u8; 16383], &[0x0, 0x7f, 0xff]);
2141     }
2142 
2143     // send a request with 16384 bytes. The DATA frame length field will need 4 byte.
2144     #[test]
fetch_with_data_length_16384bytes()2145     fn fetch_with_data_length_16384bytes() {
2146         fetch_with_data_length_xbytes(&[0_u8; 16384], &[0x0, 0x80, 0x0, 0x40, 0x0]);
2147     }
2148 
2149     // Send 2 data frames so that the second one cannot fit into the send_buf and it is only
2150     // partialy sent. We check that the sent data is correct.
2151     #[allow(clippy::useless_vec)]
fetch_with_two_data_frames( first_frame: &[u8], expected_first_data_frame_header: &[u8], expected_second_data_frame_header: &[u8], expected_second_data_frame: &[u8], )2152     fn fetch_with_two_data_frames(
2153         first_frame: &[u8],
2154         expected_first_data_frame_header: &[u8],
2155         expected_second_data_frame_header: &[u8],
2156         expected_second_data_frame: &[u8],
2157     ) {
2158         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2159         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2160 
2161         // Get DataWritable for the request stream so that we can write the request body.
2162         let data_writable = |e| matches!(e, Http3ClientEvent::DataWritable { .. });
2163         assert!(client.events().any(data_writable));
2164 
2165         // Send the first frame.
2166         let sent = client.send_request_body(request_stream_id, first_frame);
2167         assert_eq!(sent, Ok(first_frame.len()));
2168 
2169         // The second frame cannot fit.
2170         let sent = client.send_request_body(request_stream_id, &vec![0_u8; SEND_BUFFER_SIZE]);
2171         assert_eq!(sent, Ok(expected_second_data_frame.len()));
2172 
2173         // Close stream.
2174         client.stream_close_send(request_stream_id).unwrap();
2175 
2176         let mut out = client.process(None, now());
2177         // We need to loop a bit until all data has been sent. Once for every 1K
2178         // of data.
2179         for _i in 0..SEND_BUFFER_SIZE / 1000 {
2180             out = server.conn.process(out.dgram(), now());
2181             out = client.process(out.dgram(), now());
2182         }
2183 
2184         //  check received frames and send a response.
2185         while let Some(e) = server.conn.next_event() {
2186             if let ConnectionEvent::RecvStreamReadable { stream_id } = e {
2187                 if stream_id == request_stream_id {
2188                     // Read DATA frames.
2189                     let mut buf = vec![1_u8; RECV_BUFFER_SIZE];
2190                     let (amount, fin) = server.conn.stream_recv(stream_id, &mut buf).unwrap();
2191                     assert!(fin);
2192                     assert_eq!(
2193                         amount,
2194                         expected_first_data_frame_header.len()
2195                             + first_frame.len()
2196                             + expected_second_data_frame_header.len()
2197                             + expected_second_data_frame.len()
2198                     );
2199 
2200                     // Check the first DATA frame header
2201                     let end = expected_first_data_frame_header.len();
2202                     assert_eq!(&buf[..end], expected_first_data_frame_header);
2203 
2204                     // Check the first frame data.
2205                     let start = end;
2206                     let end = end + first_frame.len();
2207                     assert_eq!(&buf[start..end], first_frame);
2208 
2209                     // Check the second DATA frame header
2210                     let start2 = end;
2211                     let end2 = end + expected_second_data_frame_header.len();
2212                     assert_eq!(&buf[start2..end2], expected_second_data_frame_header);
2213 
2214                     // Check the second frame data.
2215                     let start3 = end2;
2216                     let end3 = end2 + expected_second_data_frame.len();
2217                     assert_eq!(&buf[start3..end3], expected_second_data_frame);
2218 
2219                     // send response - 200  Content-Length: 3
2220                     // with content: 'abc'.
2221                     let _ = server.conn.stream_send(stream_id, HTTP_RESPONSE_2).unwrap();
2222                     server.conn.stream_close_send(stream_id).unwrap();
2223                 }
2224             }
2225         }
2226 
2227         read_response(&mut client, &mut server.conn, request_stream_id);
2228     }
2229 
alloc_buffer(size: usize) -> (Vec<u8>, Vec<u8>)2230     fn alloc_buffer(size: usize) -> (Vec<u8>, Vec<u8>) {
2231         let data_frame = HFrame::Data { len: size as u64 };
2232         let mut enc = Encoder::default();
2233         data_frame.encode(&mut enc);
2234 
2235         (vec![0_u8; size], enc.to_vec())
2236     }
2237 
2238     // Send 2 frames. For the second one we can only send 63 bytes.
2239     // After the first frame there is exactly 63+2 bytes left in the send buffer.
2240     #[test]
fetch_two_data_frame_second_63bytes()2241     fn fetch_two_data_frame_second_63bytes() {
2242         let (buf, hdr) = alloc_buffer(SEND_BUFFER_SIZE - 88);
2243         fetch_with_two_data_frames(&buf, &hdr, &[0x0, 0x3f], &[0_u8; 63]);
2244     }
2245 
2246     // Send 2 frames. For the second one we can only send 63 bytes.
2247     // After the first frame there is exactly 63+3 bytes left in the send buffer,
2248     // but we can only send 63 bytes.
2249     #[test]
fetch_two_data_frame_second_63bytes_place_for_66()2250     fn fetch_two_data_frame_second_63bytes_place_for_66() {
2251         let (buf, hdr) = alloc_buffer(SEND_BUFFER_SIZE - 89);
2252         fetch_with_two_data_frames(&buf, &hdr, &[0x0, 0x3f], &[0_u8; 63]);
2253     }
2254 
2255     // Send 2 frames. For the second one we can only send 64 bytes.
2256     // After the first frame there is exactly 64+3 bytes left in the send buffer,
2257     // but we can only send 64 bytes.
2258     #[test]
fetch_two_data_frame_second_64bytes_place_for_67()2259     fn fetch_two_data_frame_second_64bytes_place_for_67() {
2260         let (buf, hdr) = alloc_buffer(SEND_BUFFER_SIZE - 90);
2261         fetch_with_two_data_frames(&buf, &hdr, &[0x0, 0x40, 0x40], &[0_u8; 64]);
2262     }
2263 
2264     // Send 2 frames. For the second one we can only send 16383 bytes.
2265     // After the first frame there is exactly 16383+3 bytes left in the send buffer.
2266     #[test]
fetch_two_data_frame_second_16383bytes()2267     fn fetch_two_data_frame_second_16383bytes() {
2268         let (buf, hdr) = alloc_buffer(SEND_BUFFER_SIZE - 16409);
2269         fetch_with_two_data_frames(&buf, &hdr, &[0x0, 0x7f, 0xff], &[0_u8; 16383]);
2270     }
2271 
2272     // Send 2 frames. For the second one we can only send 16383 bytes.
2273     // After the first frame there is exactly 16383+4 bytes left in the send buffer, but we can only send 16383 bytes.
2274     #[test]
fetch_two_data_frame_second_16383bytes_place_for_16387()2275     fn fetch_two_data_frame_second_16383bytes_place_for_16387() {
2276         let (buf, hdr) = alloc_buffer(SEND_BUFFER_SIZE - 16410);
2277         fetch_with_two_data_frames(&buf, &hdr, &[0x0, 0x7f, 0xff], &[0_u8; 16383]);
2278     }
2279 
2280     // Send 2 frames. For the second one we can only send 16383 bytes.
2281     // After the first frame there is exactly 16383+5 bytes left in the send buffer, but we can only send 16383 bytes.
2282     #[test]
fetch_two_data_frame_second_16383bytes_place_for_16388()2283     fn fetch_two_data_frame_second_16383bytes_place_for_16388() {
2284         let (buf, hdr) = alloc_buffer(SEND_BUFFER_SIZE - 16411);
2285         fetch_with_two_data_frames(&buf, &hdr, &[0x0, 0x7f, 0xff], &[0_u8; 16383]);
2286     }
2287 
2288     // Send 2 frames. For the second one we can send 16384 bytes.
2289     // After the first frame there is exactly 16384+5 bytes left in the send buffer, but we can send 16384 bytes.
2290     #[test]
fetch_two_data_frame_second_16384bytes_place_for_16389()2291     fn fetch_two_data_frame_second_16384bytes_place_for_16389() {
2292         let (buf, hdr) = alloc_buffer(SEND_BUFFER_SIZE - 16412);
2293         fetch_with_two_data_frames(&buf, &hdr, &[0x0, 0x80, 0x0, 0x40, 0x0], &[0_u8; 16384]);
2294     }
2295 
2296     // Test receiving STOP_SENDING with the HttpNoError error code.
2297     #[test]
test_stop_sending_early_response()2298     fn test_stop_sending_early_response() {
2299         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2300         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2301 
2302         // Stop sending with early_response.
2303         assert_eq!(
2304             Ok(()),
2305             server
2306                 .conn
2307                 .stream_stop_sending(request_stream_id, Error::HttpNoError.code())
2308         );
2309 
2310         // send response - 200  Content-Length: 3
2311         // with content: 'abc'.
2312         server_send_response_and_exchange_packet(
2313             &mut client,
2314             &mut server,
2315             request_stream_id,
2316             HTTP_RESPONSE_2,
2317             true,
2318         );
2319 
2320         let mut stop_sending = false;
2321         let mut response_headers = false;
2322         let mut response_body = false;
2323         while let Some(e) = client.next_event() {
2324             match e {
2325                 Http3ClientEvent::StopSending { stream_id, error } => {
2326                     assert_eq!(stream_id, request_stream_id);
2327                     assert_eq!(error, Error::HttpNoError.code());
2328                     // assert that we cannot send any more request data.
2329                     assert_eq!(
2330                         Err(Error::InvalidStreamId),
2331                         client.send_request_body(request_stream_id, &[0_u8; 10])
2332                     );
2333                     stop_sending = true;
2334                 }
2335                 Http3ClientEvent::HeaderReady {
2336                     stream_id,
2337                     headers,
2338                     interim,
2339                     fin,
2340                 } => {
2341                     assert_eq!(stream_id, request_stream_id);
2342                     check_response_header_2(&headers);
2343                     assert!(!fin);
2344                     assert!(!interim);
2345                     response_headers = true;
2346                 }
2347                 Http3ClientEvent::DataReadable { stream_id } => {
2348                     assert_eq!(stream_id, request_stream_id);
2349                     let mut buf = [0_u8; 100];
2350                     let (amount, fin) = client
2351                         .read_response_data(now(), stream_id, &mut buf)
2352                         .unwrap();
2353                     assert!(fin);
2354                     assert_eq!(amount, EXPECTED_RESPONSE_DATA_2_FRAME_1.len());
2355                     assert_eq!(&buf[..amount], EXPECTED_RESPONSE_DATA_2_FRAME_1);
2356                     response_body = true;
2357                 }
2358                 _ => {}
2359             }
2360         }
2361         assert!(response_headers);
2362         assert!(response_body);
2363         assert!(stop_sending);
2364 
2365         // after this stream will be removed from client. We will check this by trying to read
2366         // from the stream and that should fail.
2367         let mut buf = [0_u8; 100];
2368         let res = client.read_response_data(now(), request_stream_id, &mut buf);
2369         assert!(res.is_err());
2370         assert_eq!(res.unwrap_err(), Error::InvalidStreamId);
2371 
2372         client.close(now(), 0, "");
2373     }
2374 
2375     // Server sends stop sending and reset.
2376     #[test]
test_stop_sending_other_error_with_reset()2377     fn test_stop_sending_other_error_with_reset() {
2378         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2379         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2380 
2381         // Stop sending with RequestRejected.
2382         assert_eq!(
2383             Ok(()),
2384             server
2385                 .conn
2386                 .stream_stop_sending(request_stream_id, Error::HttpRequestRejected.code())
2387         );
2388         // also reset with RequestRejected.
2389         assert_eq!(
2390             Ok(()),
2391             server
2392                 .conn
2393                 .stream_reset_send(request_stream_id, Error::HttpRequestRejected.code())
2394         );
2395 
2396         let out = server.conn.process(None, now());
2397         client.process(out.dgram(), now());
2398 
2399         let mut reset = false;
2400         let mut stop_sending = false;
2401         while let Some(e) = client.next_event() {
2402             match e {
2403                 Http3ClientEvent::StopSending { stream_id, error } => {
2404                     assert_eq!(stream_id, request_stream_id);
2405                     assert_eq!(error, Error::HttpRequestRejected.code());
2406                     stop_sending = true;
2407                 }
2408                 Http3ClientEvent::Reset {
2409                     stream_id,
2410                     error,
2411                     local,
2412                 } => {
2413                     assert_eq!(stream_id, request_stream_id);
2414                     assert_eq!(error, Error::HttpRequestRejected.code());
2415                     assert!(!local);
2416                     reset = true;
2417                 }
2418                 Http3ClientEvent::HeaderReady { .. } | Http3ClientEvent::DataReadable { .. } => {
2419                     panic!("We should not get any headers or data");
2420                 }
2421                 _ => {}
2422             }
2423         }
2424 
2425         assert!(reset);
2426         assert!(stop_sending);
2427 
2428         // after this stream will be removed from client. We will check this by trying to read
2429         // from the stream and that should fail.
2430         let mut buf = [0_u8; 100];
2431         let res = client.read_response_data(now(), request_stream_id, &mut buf);
2432         assert!(res.is_err());
2433         assert_eq!(res.unwrap_err(), Error::InvalidStreamId);
2434 
2435         client.close(now(), 0, "");
2436     }
2437 
2438     // Server sends stop sending with RequestRejected, but it does not send reset.
2439     #[test]
test_stop_sending_other_error_wo_reset()2440     fn test_stop_sending_other_error_wo_reset() {
2441         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2442         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2443 
2444         // Stop sending with RequestRejected.
2445         assert_eq!(
2446             Ok(()),
2447             server
2448                 .conn
2449                 .stream_stop_sending(request_stream_id, Error::HttpRequestRejected.code())
2450         );
2451 
2452         let out = server.conn.process(None, now());
2453         client.process(out.dgram(), now());
2454 
2455         let mut stop_sending = false;
2456 
2457         while let Some(e) = client.next_event() {
2458             match e {
2459                 Http3ClientEvent::StopSending { stream_id, error } => {
2460                     assert_eq!(stream_id, request_stream_id);
2461                     assert_eq!(error, Error::HttpRequestRejected.code());
2462                     stop_sending = true;
2463                 }
2464                 Http3ClientEvent::Reset { .. } => {
2465                     panic!("We should not get StopSending.");
2466                 }
2467                 Http3ClientEvent::HeaderReady { .. } | Http3ClientEvent::DataReadable { .. } => {
2468                     panic!("We should not get any headers or data");
2469                 }
2470                 _ => {}
2471             }
2472         }
2473 
2474         assert!(stop_sending);
2475 
2476         // after this we can still read from a stream.
2477         let mut buf = [0_u8; 100];
2478         let res = client.read_response_data(now(), request_stream_id, &mut buf);
2479         assert!(res.is_ok());
2480 
2481         client.close(now(), 0, "");
2482     }
2483 
2484     // Server sends stop sending and reset. We have some events for that stream already
2485     // in client.events. The events will be removed.
2486     #[test]
test_stop_sending_and_reset_other_error_with_events()2487     fn test_stop_sending_and_reset_other_error_with_events() {
2488         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2489         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2490 
2491         // send response - 200  Content-Length: 3
2492         // with content: 'abc'.
2493         server_send_response_and_exchange_packet(
2494             &mut client,
2495             &mut server,
2496             request_stream_id,
2497             HTTP_RESPONSE_2,
2498             false,
2499         );
2500         // At this moment we have some new events, i.e. a HeadersReady event
2501 
2502         // Send a stop sending and reset.
2503         assert_eq!(
2504             Ok(()),
2505             server
2506                 .conn
2507                 .stream_stop_sending(request_stream_id, Error::HttpRequestCancelled.code())
2508         );
2509         assert_eq!(
2510             Ok(()),
2511             server
2512                 .conn
2513                 .stream_reset_send(request_stream_id, Error::HttpRequestCancelled.code())
2514         );
2515 
2516         let out = server.conn.process(None, now());
2517         client.process(out.dgram(), now());
2518 
2519         let mut reset = false;
2520 
2521         while let Some(e) = client.next_event() {
2522             match e {
2523                 Http3ClientEvent::StopSending { stream_id, error } => {
2524                     assert_eq!(stream_id, request_stream_id);
2525                     assert_eq!(error, Error::HttpRequestCancelled.code());
2526                 }
2527                 Http3ClientEvent::Reset {
2528                     stream_id,
2529                     error,
2530                     local,
2531                 } => {
2532                     assert_eq!(stream_id, request_stream_id);
2533                     assert_eq!(error, Error::HttpRequestCancelled.code());
2534                     assert!(!local);
2535                     reset = true;
2536                 }
2537                 Http3ClientEvent::HeaderReady { .. } | Http3ClientEvent::DataReadable { .. } => {
2538                     panic!("We should not get any headers or data");
2539                 }
2540                 _ => {}
2541             }
2542         }
2543 
2544         assert!(reset);
2545 
2546         // after this stream will be removed from client. We will check this by trying to read
2547         // from the stream and that should fail.
2548         let mut buf = [0_u8; 100];
2549         let res = client.read_response_data(now(), request_stream_id, &mut buf);
2550         assert!(res.is_err());
2551         assert_eq!(res.unwrap_err(), Error::InvalidStreamId);
2552 
2553         client.close(now(), 0, "");
2554     }
2555 
2556     // Server sends stop sending with code that is not HttpNoError.
2557     // We have some events for that stream already in the client.events.
2558     // The events will be removed.
2559     #[test]
test_stop_sending_other_error_with_events()2560     fn test_stop_sending_other_error_with_events() {
2561         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2562         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2563 
2564         // send response - 200  Content-Length: 3
2565         // with content: 'abc'.
2566         server_send_response_and_exchange_packet(
2567             &mut client,
2568             &mut server,
2569             request_stream_id,
2570             HTTP_RESPONSE_2,
2571             false,
2572         );
2573         // At this moment we have some new event, i.e. a HeadersReady event
2574 
2575         // Send a stop sending.
2576         assert_eq!(
2577             Ok(()),
2578             server
2579                 .conn
2580                 .stream_stop_sending(request_stream_id, Error::HttpRequestCancelled.code())
2581         );
2582 
2583         let out = server.conn.process(None, now());
2584         client.process(out.dgram(), now());
2585 
2586         let mut stop_sending = false;
2587         let mut header_ready = false;
2588 
2589         while let Some(e) = client.next_event() {
2590             match e {
2591                 Http3ClientEvent::StopSending { stream_id, error } => {
2592                     assert_eq!(stream_id, request_stream_id);
2593                     assert_eq!(error, Error::HttpRequestCancelled.code());
2594                     stop_sending = true;
2595                 }
2596                 Http3ClientEvent::Reset { .. } => {
2597                     panic!("We should not get StopSending.");
2598                 }
2599                 Http3ClientEvent::HeaderReady { .. } | Http3ClientEvent::DataReadable { .. } => {
2600                     header_ready = true;
2601                 }
2602                 _ => {}
2603             }
2604         }
2605 
2606         assert!(stop_sending);
2607         assert!(header_ready);
2608 
2609         // after this, we can sill read data from a sttream.
2610         let mut buf = [0_u8; 100];
2611         let (amount, fin) = client
2612             .read_response_data(now(), request_stream_id, &mut buf)
2613             .unwrap();
2614         assert!(!fin);
2615         assert_eq!(amount, EXPECTED_RESPONSE_DATA_2_FRAME_1.len());
2616         assert_eq!(&buf[..amount], EXPECTED_RESPONSE_DATA_2_FRAME_1);
2617 
2618         client.close(now(), 0, "");
2619     }
2620 
2621     // Server sends a reset. We will close sending side as well.
2622     #[test]
test_reset_wo_stop_sending()2623     fn test_reset_wo_stop_sending() {
2624         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
2625         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
2626 
2627         // Send a reset.
2628         assert_eq!(
2629             Ok(()),
2630             server
2631                 .conn
2632                 .stream_reset_send(request_stream_id, Error::HttpRequestCancelled.code())
2633         );
2634 
2635         let out = server.conn.process(None, now());
2636         client.process(out.dgram(), now());
2637 
2638         let mut reset = false;
2639 
2640         while let Some(e) = client.next_event() {
2641             match e {
2642                 Http3ClientEvent::StopSending { .. } => {
2643                     panic!("We should not get StopSending.");
2644                 }
2645                 Http3ClientEvent::Reset {
2646                     stream_id,
2647                     error,
2648                     local,
2649                 } => {
2650                     assert_eq!(stream_id, request_stream_id);
2651                     assert_eq!(error, Error::HttpRequestCancelled.code());
2652                     assert!(!local);
2653                     reset = true;
2654                 }
2655                 Http3ClientEvent::HeaderReady { .. } | Http3ClientEvent::DataReadable { .. } => {
2656                     panic!("We should not get any headers or data");
2657                 }
2658                 _ => {}
2659             }
2660         }
2661 
2662         assert!(reset);
2663 
2664         // after this stream will be removed from client. We will check this by trying to read
2665         // from the stream and that should fail.
2666         let mut buf = [0_u8; 100];
2667         let res = client.read_response_data(now(), request_stream_id, &mut buf);
2668         assert!(res.is_err());
2669         assert_eq!(res.unwrap_err(), Error::InvalidStreamId);
2670 
2671         client.close(now(), 0, "");
2672     }
2673 
test_incomplet_frame(buf: &[u8], error: &Error)2674     fn test_incomplet_frame(buf: &[u8], error: &Error) {
2675         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
2676 
2677         server_send_response_and_exchange_packet(
2678             &mut client,
2679             &mut server,
2680             request_stream_id,
2681             buf,
2682             true,
2683         );
2684 
2685         while let Some(e) = client.next_event() {
2686             if let Http3ClientEvent::DataReadable { stream_id } = e {
2687                 assert_eq!(stream_id, request_stream_id);
2688                 let mut buf_res = [0_u8; 100];
2689                 let res = client.read_response_data(now(), stream_id, &mut buf_res);
2690                 assert!(res.is_err());
2691                 assert_eq!(res.unwrap_err(), Error::HttpFrame);
2692             }
2693         }
2694         assert_closed(&client, &error);
2695     }
2696 
2697     // Incomplete DATA frame
2698     #[test]
test_incomplet_data_frame()2699     fn test_incomplet_data_frame() {
2700         test_incomplet_frame(&HTTP_RESPONSE_2[..12], &Error::HttpFrame);
2701     }
2702 
2703     // Incomplete HEADERS frame
2704     #[test]
test_incomplet_headers_frame()2705     fn test_incomplet_headers_frame() {
2706         test_incomplet_frame(&HTTP_RESPONSE_2[..7], &Error::HttpFrame);
2707     }
2708 
2709     #[test]
test_incomplet_unknown_frame()2710     fn test_incomplet_unknown_frame() {
2711         test_incomplet_frame(&[0x21], &Error::HttpFrame);
2712     }
2713 
2714     // test goaway
2715     #[test]
test_goaway()2716     fn test_goaway() {
2717         let (mut client, mut server) = connect();
2718         let request_stream_id_1 = make_request(&mut client, false, &[]);
2719         assert_eq!(request_stream_id_1, 0);
2720         let request_stream_id_2 = make_request(&mut client, false, &[]);
2721         assert_eq!(request_stream_id_2, 4);
2722         let request_stream_id_3 = make_request(&mut client, false, &[]);
2723         assert_eq!(request_stream_id_3, 8);
2724 
2725         let out = client.process(None, now());
2726         mem::drop(server.conn.process(out.dgram(), now()));
2727 
2728         let _ = server
2729             .conn
2730             .stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x8])
2731             .unwrap();
2732 
2733         // find the new request/response stream and send frame v on it.
2734         while let Some(e) = server.conn.next_event() {
2735             if let ConnectionEvent::RecvStreamReadable { stream_id } = e {
2736                 let mut buf = [0_u8; 100];
2737                 let _ = server.conn.stream_recv(stream_id, &mut buf).unwrap();
2738                 if (stream_id == request_stream_id_1) || (stream_id == request_stream_id_2) {
2739                     // send response - 200  Content-Length: 7
2740                     // with content: 'abcdefg'.
2741                     // The content will be send in 2 DATA frames.
2742                     let _ = server.conn.stream_send(stream_id, HTTP_RESPONSE_1).unwrap();
2743                     server.conn.stream_close_send(stream_id).unwrap();
2744                 }
2745             }
2746         }
2747         let out = server.conn.process(None, now());
2748         client.process(out.dgram(), now());
2749 
2750         let mut stream_reset = false;
2751         while let Some(e) = client.next_event() {
2752             match e {
2753                 Http3ClientEvent::HeaderReady { headers, fin, .. } => {
2754                     check_response_header_1(&headers);
2755                     assert!(!fin);
2756                 }
2757                 Http3ClientEvent::DataReadable { stream_id } => {
2758                     assert!(
2759                         (stream_id == request_stream_id_1) || (stream_id == request_stream_id_2)
2760                     );
2761                     let mut buf = [0_u8; 100];
2762                     assert_eq!(
2763                         (EXPECTED_RESPONSE_DATA_1.len(), true),
2764                         client
2765                             .read_response_data(now(), stream_id, &mut buf)
2766                             .unwrap()
2767                     );
2768                 }
2769                 Http3ClientEvent::Reset {
2770                     stream_id,
2771                     error,
2772                     local,
2773                 } => {
2774                     assert_eq!(stream_id, request_stream_id_3);
2775                     assert_eq!(error, Error::HttpRequestRejected.code());
2776                     assert!(!local);
2777                     stream_reset = true;
2778                 }
2779                 _ => {}
2780             }
2781         }
2782 
2783         assert!(stream_reset);
2784         assert_eq!(client.state(), Http3State::GoingAway(8));
2785 
2786         // Check that a new request cannot be made.
2787         assert_eq!(
2788             client.fetch(now(), "GET", "https", "something.com", "/", &[]),
2789             Err(Error::AlreadyClosed)
2790         );
2791 
2792         client.close(now(), 0, "");
2793     }
2794 
2795     #[test]
multiple_goaways()2796     fn multiple_goaways() {
2797         let (mut client, mut server) = connect();
2798         let request_stream_id_1 = make_request(&mut client, false, &[]);
2799         assert_eq!(request_stream_id_1, 0);
2800         let request_stream_id_2 = make_request(&mut client, false, &[]);
2801         assert_eq!(request_stream_id_2, 4);
2802         let request_stream_id_3 = make_request(&mut client, false, &[]);
2803         assert_eq!(request_stream_id_3, 8);
2804 
2805         let out = client.process(None, now());
2806         mem::drop(server.conn.process(out.dgram(), now()));
2807 
2808         // First send a Goaway frame with an higher number
2809         let _ = server
2810             .conn
2811             .stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x8])
2812             .unwrap();
2813 
2814         let out = server.conn.process(None, now());
2815         client.process(out.dgram(), now());
2816 
2817         // Check that there is one reset for stream_id 8
2818         let mut stream_reset_1 = 0;
2819         while let Some(e) = client.next_event() {
2820             if let Http3ClientEvent::Reset {
2821                 stream_id,
2822                 error,
2823                 local,
2824             } = e
2825             {
2826                 assert_eq!(stream_id, request_stream_id_3);
2827                 assert_eq!(error, Error::HttpRequestRejected.code());
2828                 assert!(!local);
2829                 stream_reset_1 += 1;
2830             }
2831         }
2832 
2833         assert_eq!(stream_reset_1, 1);
2834         assert_eq!(client.state(), Http3State::GoingAway(8));
2835 
2836         // Server sends another GOAWAY frame
2837         let _ = server
2838             .conn
2839             .stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x4])
2840             .unwrap();
2841 
2842         // Send response for stream 0
2843         server_send_response_and_exchange_packet(
2844             &mut client,
2845             &mut server,
2846             request_stream_id_1,
2847             HTTP_RESPONSE_1,
2848             true,
2849         );
2850 
2851         let mut stream_reset_2 = 0;
2852         while let Some(e) = client.next_event() {
2853             match e {
2854                 Http3ClientEvent::HeaderReady { headers, fin, .. } => {
2855                     check_response_header_1(&headers);
2856                     assert!(!fin);
2857                 }
2858                 Http3ClientEvent::DataReadable { stream_id } => {
2859                     assert!(stream_id == request_stream_id_1);
2860                     let mut buf = [0_u8; 100];
2861                     assert_eq!(
2862                         (EXPECTED_RESPONSE_DATA_1.len(), true),
2863                         client
2864                             .read_response_data(now(), stream_id, &mut buf)
2865                             .unwrap()
2866                     );
2867                 }
2868                 Http3ClientEvent::Reset {
2869                     stream_id,
2870                     error,
2871                     local,
2872                 } => {
2873                     assert_eq!(stream_id, request_stream_id_2);
2874                     assert_eq!(error, Error::HttpRequestRejected.code());
2875                     assert!(!local);
2876                     stream_reset_2 += 1;
2877                 }
2878                 _ => {}
2879             }
2880         }
2881 
2882         assert_eq!(stream_reset_2, 1);
2883         assert_eq!(client.state(), Http3State::GoingAway(4));
2884     }
2885 
2886     #[test]
multiple_goaways_stream_id_increased()2887     fn multiple_goaways_stream_id_increased() {
2888         let (mut client, mut server) = connect();
2889         let request_stream_id_1 = make_request(&mut client, false, &[]);
2890         assert_eq!(request_stream_id_1, 0);
2891         let request_stream_id_2 = make_request(&mut client, false, &[]);
2892         assert_eq!(request_stream_id_2, 4);
2893         let request_stream_id_3 = make_request(&mut client, false, &[]);
2894         assert_eq!(request_stream_id_3, 8);
2895 
2896         // First send a Goaway frame with a smaller number
2897         let _ = server
2898             .conn
2899             .stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x4])
2900             .unwrap();
2901 
2902         let out = server.conn.process(None, now());
2903         client.process(out.dgram(), now());
2904 
2905         assert_eq!(client.state(), Http3State::GoingAway(4));
2906 
2907         // Now send a Goaway frame with an higher number
2908         let _ = server
2909             .conn
2910             .stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x8])
2911             .unwrap();
2912 
2913         let out = server.conn.process(None, now());
2914         client.process(out.dgram(), now());
2915 
2916         assert_closed(&client, &Error::HttpGeneralProtocol);
2917     }
2918 
2919     #[test]
goaway_wrong_stream_id()2920     fn goaway_wrong_stream_id() {
2921         let (mut client, mut server) = connect();
2922 
2923         let _ = server
2924             .conn
2925             .stream_send(server.control_stream_id.unwrap(), &[0x7, 0x1, 0x9])
2926             .unwrap();
2927 
2928         let out = server.conn.process(None, now());
2929         client.process(out.dgram(), now());
2930 
2931         assert_closed(&client, &Error::HttpId);
2932     }
2933 
2934     // Close stream before headers.
2935     #[test]
test_stream_fin_wo_headers()2936     fn test_stream_fin_wo_headers() {
2937         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
2938         // send fin before sending any data.
2939         server.conn.stream_close_send(request_stream_id).unwrap();
2940 
2941         let out = server.conn.process(None, now());
2942         client.process(out.dgram(), now());
2943 
2944         // Recv HeaderReady wo headers with fin.
2945         let e = client.events().next().unwrap();
2946         assert_eq!(
2947             e,
2948             Http3ClientEvent::Reset {
2949                 stream_id: request_stream_id,
2950                 error: Error::HttpGeneralProtocolStream.code(),
2951                 local: true,
2952             }
2953         );
2954 
2955         // Stream should now be closed and gone
2956         let mut buf = [0_u8; 100];
2957         assert_eq!(
2958             client.read_response_data(now(), 0, &mut buf),
2959             Err(Error::InvalidStreamId)
2960         );
2961     }
2962 
2963     // Close stream imemediately after headers.
2964     #[test]
test_stream_fin_after_headers()2965     fn test_stream_fin_after_headers() {
2966         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
2967 
2968         server_send_response_and_exchange_packet(
2969             &mut client,
2970             &mut server,
2971             request_stream_id,
2972             HTTP_RESPONSE_HEADER_ONLY_2,
2973             true,
2974         );
2975 
2976         // Recv HeaderReady with headers and fin.
2977         let e = client.events().next().unwrap();
2978         if let Http3ClientEvent::HeaderReady {
2979             stream_id,
2980             headers,
2981             interim,
2982             fin,
2983         } = e
2984         {
2985             assert_eq!(stream_id, request_stream_id);
2986             check_response_header_2(&headers);
2987             assert!(fin);
2988             assert!(!interim);
2989         } else {
2990             panic!("wrong event type");
2991         }
2992 
2993         // Stream should now be closed and gone
2994         let mut buf = [0_u8; 100];
2995         assert_eq!(
2996             client.read_response_data(now(), 0, &mut buf),
2997             Err(Error::InvalidStreamId)
2998         );
2999     }
3000 
3001     // Send headers, read headers and than close stream.
3002     // We should get HeaderReady and a DataReadable
3003     #[test]
test_stream_fin_after_headers_are_read_wo_data_frame()3004     fn test_stream_fin_after_headers_are_read_wo_data_frame() {
3005         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3006         // Send some good data wo fin
3007         server_send_response_and_exchange_packet(
3008             &mut client,
3009             &mut server,
3010             request_stream_id,
3011             HTTP_RESPONSE_HEADER_ONLY_2,
3012             false,
3013         );
3014 
3015         // Recv headers wo fin
3016         while let Some(e) = client.next_event() {
3017             match e {
3018                 Http3ClientEvent::HeaderReady {
3019                     stream_id,
3020                     headers,
3021                     interim,
3022                     fin,
3023                 } => {
3024                     assert_eq!(stream_id, request_stream_id);
3025                     check_response_header_2(&headers);
3026                     assert!(!fin);
3027                     assert!(!interim);
3028                 }
3029                 Http3ClientEvent::DataReadable { .. } => {
3030                     panic!("We should not receive a DataGeadable event!");
3031                 }
3032                 _ => {}
3033             };
3034         }
3035 
3036         // ok NOW send fin
3037         server.conn.stream_close_send(request_stream_id).unwrap();
3038 
3039         let out = server.conn.process(None, now());
3040         client.process(out.dgram(), now());
3041 
3042         // Recv DataReadable wo data with fin
3043         while let Some(e) = client.next_event() {
3044             match e {
3045                 Http3ClientEvent::HeaderReady { .. } => {
3046                     panic!("We should not get another HeaderReady!");
3047                 }
3048                 Http3ClientEvent::DataReadable { stream_id } => {
3049                     assert_eq!(stream_id, request_stream_id);
3050                     let mut buf = [0_u8; 100];
3051                     let res = client.read_response_data(now(), stream_id, &mut buf);
3052                     let (len, fin) = res.expect("should read");
3053                     assert_eq!(0, len);
3054                     assert!(fin);
3055                 }
3056                 _ => {}
3057             };
3058         }
3059 
3060         // Stream should now be closed and gone
3061         let mut buf = [0_u8; 100];
3062         assert_eq!(
3063             client.read_response_data(now(), 0, &mut buf),
3064             Err(Error::InvalidStreamId)
3065         );
3066     }
3067 
3068     // Send headers and an empty data frame, then close the stream.
3069     #[test]
test_stream_fin_after_headers_and_a_empty_data_frame()3070     fn test_stream_fin_after_headers_and_a_empty_data_frame() {
3071         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3072 
3073         // Send headers.
3074         let _ = server
3075             .conn
3076             .stream_send(request_stream_id, HTTP_RESPONSE_HEADER_ONLY_2)
3077             .unwrap();
3078         // Send an empty data frame.
3079         let _ = server
3080             .conn
3081             .stream_send(request_stream_id, &[0x00, 0x00])
3082             .unwrap();
3083         // ok NOW send fin
3084         server.conn.stream_close_send(request_stream_id).unwrap();
3085 
3086         let out = server.conn.process(None, now());
3087         client.process(out.dgram(), now());
3088 
3089         // Recv HeaderReady with fin.
3090         while let Some(e) = client.next_event() {
3091             match e {
3092                 Http3ClientEvent::HeaderReady {
3093                     stream_id,
3094                     headers,
3095                     interim,
3096                     fin,
3097                 } => {
3098                     assert_eq!(stream_id, request_stream_id);
3099                     check_response_header_2(&headers);
3100                     assert!(!fin);
3101                     assert!(!interim);
3102                 }
3103                 Http3ClientEvent::DataReadable { stream_id } => {
3104                     assert_eq!(stream_id, request_stream_id);
3105                     let mut buf = [0_u8; 100];
3106                     assert_eq!(
3107                         Ok((0, true)),
3108                         client.read_response_data(now(), stream_id, &mut buf)
3109                     );
3110                 }
3111                 _ => {}
3112             };
3113         }
3114 
3115         // Stream should now be closed and gone
3116         let mut buf = [0_u8; 100];
3117         assert_eq!(
3118             client.read_response_data(now(), request_stream_id, &mut buf),
3119             Err(Error::InvalidStreamId)
3120         );
3121     }
3122 
3123     // Send headers and an empty data frame. Read headers and then close the stream.
3124     // We should get a HeaderReady without fin and a DataReadable wo data and with fin.
3125     #[test]
test_stream_fin_after_headers_an_empty_data_frame_are_read()3126     fn test_stream_fin_after_headers_an_empty_data_frame_are_read() {
3127         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3128         // Send some good data wo fin
3129         // Send headers.
3130         let _ = server
3131             .conn
3132             .stream_send(request_stream_id, HTTP_RESPONSE_HEADER_ONLY_2)
3133             .unwrap();
3134         // Send an empty data frame.
3135         let _ = server
3136             .conn
3137             .stream_send(request_stream_id, &[0x00, 0x00])
3138             .unwrap();
3139 
3140         let out = server.conn.process(None, now());
3141         client.process(out.dgram(), now());
3142 
3143         // Recv headers wo fin
3144         while let Some(e) = client.next_event() {
3145             match e {
3146                 Http3ClientEvent::HeaderReady {
3147                     stream_id,
3148                     headers,
3149                     interim,
3150                     fin,
3151                 } => {
3152                     assert_eq!(stream_id, request_stream_id);
3153                     check_response_header_2(&headers);
3154                     assert!(!fin);
3155                     assert!(!interim);
3156                 }
3157                 Http3ClientEvent::DataReadable { .. } => {
3158                     panic!("We should not receive a DataGeadable event!");
3159                 }
3160                 _ => {}
3161             };
3162         }
3163 
3164         // ok NOW send fin
3165         server.conn.stream_close_send(request_stream_id).unwrap();
3166 
3167         let out = server.conn.process(None, now());
3168         client.process(out.dgram(), now());
3169 
3170         // Recv no data, but do get fin
3171         while let Some(e) = client.next_event() {
3172             match e {
3173                 Http3ClientEvent::HeaderReady { .. } => {
3174                     panic!("We should not get another HeaderReady!");
3175                 }
3176                 Http3ClientEvent::DataReadable { stream_id } => {
3177                     assert_eq!(stream_id, request_stream_id);
3178                     let mut buf = [0_u8; 100];
3179                     let res = client.read_response_data(now(), stream_id, &mut buf);
3180                     let (len, fin) = res.expect("should read");
3181                     assert_eq!(0, len);
3182                     assert!(fin);
3183                 }
3184                 _ => {}
3185             };
3186         }
3187 
3188         // Stream should now be closed and gone
3189         let mut buf = [0_u8; 100];
3190         assert_eq!(
3191             client.read_response_data(now(), 0, &mut buf),
3192             Err(Error::InvalidStreamId)
3193         );
3194     }
3195 
3196     #[test]
test_stream_fin_after_a_data_frame()3197     fn test_stream_fin_after_a_data_frame() {
3198         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3199         // Send some good data wo fin
3200         server_send_response_and_exchange_packet(
3201             &mut client,
3202             &mut server,
3203             request_stream_id,
3204             HTTP_RESPONSE_2,
3205             false,
3206         );
3207 
3208         // Recv some good data wo fin
3209         while let Some(e) = client.next_event() {
3210             match e {
3211                 Http3ClientEvent::HeaderReady {
3212                     stream_id,
3213                     headers,
3214                     interim,
3215                     fin,
3216                 } => {
3217                     assert_eq!(stream_id, request_stream_id);
3218                     check_response_header_2(&headers);
3219                     assert!(!fin);
3220                     assert!(!interim);
3221                 }
3222                 Http3ClientEvent::DataReadable { stream_id } => {
3223                     assert_eq!(stream_id, request_stream_id);
3224                     let mut buf = [0_u8; 100];
3225                     let res = client.read_response_data(now(), stream_id, &mut buf);
3226                     let (len, fin) = res.expect("should have data");
3227                     assert_eq!(len, EXPECTED_RESPONSE_DATA_2_FRAME_1.len());
3228                     assert_eq!(&buf[..len], EXPECTED_RESPONSE_DATA_2_FRAME_1);
3229                     assert!(!fin);
3230                 }
3231                 _ => {}
3232             };
3233         }
3234 
3235         // ok NOW send fin
3236         server.conn.stream_close_send(request_stream_id).unwrap();
3237         let out = server.conn.process(None, now());
3238         client.process(out.dgram(), now());
3239 
3240         // fin wo data should generate DataReadable
3241         let e = client.events().next().unwrap();
3242         if let Http3ClientEvent::DataReadable { stream_id } = e {
3243             assert_eq!(stream_id, request_stream_id);
3244             let mut buf = [0; 100];
3245             let res = client.read_response_data(now(), stream_id, &mut buf);
3246             let (len, fin) = res.expect("should read");
3247             assert_eq!(0, len);
3248             assert!(fin);
3249         } else {
3250             panic!("wrong event type");
3251         }
3252 
3253         // Stream should now be closed and gone
3254         let mut buf = [0_u8; 100];
3255         assert_eq!(
3256             client.read_response_data(now(), 0, &mut buf),
3257             Err(Error::InvalidStreamId)
3258         );
3259     }
3260 
3261     #[test]
test_multiple_data_frames()3262     fn test_multiple_data_frames() {
3263         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3264 
3265         // Send two data frames with fin
3266         server_send_response_and_exchange_packet(
3267             &mut client,
3268             &mut server,
3269             request_stream_id,
3270             HTTP_RESPONSE_1,
3271             true,
3272         );
3273 
3274         // Read first frame
3275         match client.events().nth(1).unwrap() {
3276             Http3ClientEvent::DataReadable { stream_id } => {
3277                 assert_eq!(stream_id, request_stream_id);
3278                 let mut buf = [0_u8; 100];
3279                 assert_eq!(
3280                     (EXPECTED_RESPONSE_DATA_1.len(), true),
3281                     client
3282                         .read_response_data(now(), stream_id, &mut buf)
3283                         .unwrap()
3284                 );
3285             }
3286             x => {
3287                 eprintln!("event {:?}", x);
3288                 panic!()
3289             }
3290         }
3291 
3292         // Stream should now be closed and gone
3293         let mut buf = [0_u8; 100];
3294         assert_eq!(
3295             client.read_response_data(now(), 0, &mut buf),
3296             Err(Error::InvalidStreamId)
3297         );
3298     }
3299 
3300     #[test]
test_receive_grease_before_response()3301     fn test_receive_grease_before_response() {
3302         // Construct an unknown frame.
3303         const UNKNOWN_FRAME_LEN: usize = 832;
3304 
3305         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3306 
3307         let mut enc = Encoder::with_capacity(UNKNOWN_FRAME_LEN + 4);
3308         enc.encode_varint(1028_u64); // Arbitrary type.
3309         enc.encode_varint(UNKNOWN_FRAME_LEN as u64);
3310         let mut buf: Vec<_> = enc.into();
3311         buf.resize(UNKNOWN_FRAME_LEN + buf.len(), 0);
3312         let _ = server.conn.stream_send(request_stream_id, &buf).unwrap();
3313 
3314         // Send a headers and a data frame with fin
3315         server_send_response_and_exchange_packet(
3316             &mut client,
3317             &mut server,
3318             request_stream_id,
3319             HTTP_RESPONSE_2,
3320             true,
3321         );
3322 
3323         // Read first frame
3324         match client.events().nth(1).unwrap() {
3325             Http3ClientEvent::DataReadable { stream_id } => {
3326                 assert_eq!(stream_id, request_stream_id);
3327                 let mut buf = [0_u8; 100];
3328                 let (len, fin) = client
3329                     .read_response_data(now(), stream_id, &mut buf)
3330                     .unwrap();
3331                 assert_eq!(len, EXPECTED_RESPONSE_DATA_2_FRAME_1.len());
3332                 assert_eq!(&buf[..len], EXPECTED_RESPONSE_DATA_2_FRAME_1);
3333                 assert!(fin);
3334             }
3335             x => {
3336                 eprintln!("event {:?}", x);
3337                 panic!()
3338             }
3339         }
3340         // Stream should now be closed and gone
3341         let mut buf = [0_u8; 100];
3342         assert_eq!(
3343             client.read_response_data(now(), 0, &mut buf),
3344             Err(Error::InvalidStreamId)
3345         );
3346     }
3347 
3348     #[test]
test_read_frames_header_blocked()3349     fn test_read_frames_header_blocked() {
3350         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3351 
3352         setup_server_side_encoder(&mut client, &mut server);
3353 
3354         let headers = vec![
3355             Header::new(":status", "200"),
3356             Header::new("my-header", "my-header"),
3357             Header::new("content-length", "3"),
3358         ];
3359         let encoded_headers = server
3360             .encoder
3361             .borrow_mut()
3362             .encode_header_block(&mut server.conn, &headers, request_stream_id)
3363             .unwrap();
3364         let hframe = HFrame::Headers {
3365             header_block: encoded_headers.to_vec(),
3366         };
3367 
3368         // Send the encoder instructions, but delay them so that the stream is blocked on decoding headers.
3369         let encoder_inst_pkt = server.conn.process(None, now());
3370 
3371         // Send response
3372         let mut d = Encoder::default();
3373         hframe.encode(&mut d);
3374         let d_frame = HFrame::Data { len: 3 };
3375         d_frame.encode(&mut d);
3376         d.encode(&[0x61, 0x62, 0x63]);
3377         server_send_response_and_exchange_packet(
3378             &mut client,
3379             &mut server,
3380             request_stream_id,
3381             &d,
3382             true,
3383         );
3384 
3385         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
3386         assert!(!client.events().any(header_ready_event));
3387 
3388         // Let client receive the encoder instructions.
3389         mem::drop(client.process(encoder_inst_pkt.dgram(), now()));
3390 
3391         let out = server.conn.process(None, now());
3392         mem::drop(client.process(out.dgram(), now()));
3393         mem::drop(client.process(None, now()));
3394 
3395         let mut recv_header = false;
3396         let mut recv_data = false;
3397         // Now the stream is unblocked and both headers and data will be consumed.
3398         while let Some(e) = client.next_event() {
3399             match e {
3400                 Http3ClientEvent::HeaderReady { stream_id, .. } => {
3401                     assert_eq!(stream_id, request_stream_id);
3402                     recv_header = true;
3403                 }
3404                 Http3ClientEvent::DataReadable { stream_id } => {
3405                     recv_data = true;
3406                     assert_eq!(stream_id, request_stream_id);
3407                 }
3408                 x => {
3409                     eprintln!("event {:?}", x);
3410                     panic!()
3411                 }
3412             }
3413         }
3414         assert!(recv_header && recv_data);
3415     }
3416 
3417     #[test]
test_read_frames_header_blocked_with_fin_after_headers()3418     fn test_read_frames_header_blocked_with_fin_after_headers() {
3419         let (mut hconn, mut server, request_stream_id) = connect_and_send_request(true);
3420 
3421         setup_server_side_encoder(&mut hconn, &mut server);
3422 
3423         let sent_headers = vec![
3424             Header::new(":status", "200"),
3425             Header::new("my-header", "my-header"),
3426             Header::new("content-length", "0"),
3427         ];
3428         let encoded_headers = server
3429             .encoder
3430             .borrow_mut()
3431             .encode_header_block(&mut server.conn, &sent_headers, request_stream_id)
3432             .unwrap();
3433         let hframe = HFrame::Headers {
3434             header_block: encoded_headers.to_vec(),
3435         };
3436 
3437         // Send the encoder instructions, but delay them so that the stream is blocked on decoding headers.
3438         let encoder_inst_pkt = server.conn.process(None, now());
3439 
3440         let mut d = Encoder::default();
3441         hframe.encode(&mut d);
3442 
3443         server_send_response_and_exchange_packet(
3444             &mut hconn,
3445             &mut server,
3446             request_stream_id,
3447             &d,
3448             true,
3449         );
3450 
3451         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
3452         assert!(!hconn.events().any(header_ready_event));
3453 
3454         // Let client receive the encoder instructions.
3455         let _out = hconn.process(encoder_inst_pkt.dgram(), now());
3456 
3457         let mut recv_header = false;
3458         // Now the stream is unblocked. After headers we will receive a fin.
3459         while let Some(e) = hconn.next_event() {
3460             if let Http3ClientEvent::HeaderReady {
3461                 stream_id,
3462                 headers,
3463                 interim,
3464                 fin,
3465             } = e
3466             {
3467                 assert_eq!(stream_id, request_stream_id);
3468                 assert_eq!(headers, sent_headers);
3469                 assert!(fin);
3470                 assert!(!interim);
3471                 recv_header = true;
3472             } else {
3473                 panic!("event {:?}", e);
3474             }
3475         }
3476         assert!(recv_header);
3477     }
3478 
exchange_token(client: &mut Http3Client, server: &mut Connection) -> ResumptionToken3479     fn exchange_token(client: &mut Http3Client, server: &mut Connection) -> ResumptionToken {
3480         server.send_ticket(now(), &[]).expect("can send ticket");
3481         let out = server.process_output(now());
3482         assert!(out.as_dgram_ref().is_some());
3483         client.process_input(out.dgram().unwrap(), now());
3484         // We do not have a token so we need to wait for a resumption token timer to trigger.
3485         client.process_output(now() + Duration::from_millis(250));
3486         assert_eq!(client.state(), Http3State::Connected);
3487         client
3488             .events()
3489             .find_map(|e| {
3490                 if let Http3ClientEvent::ResumptionToken(token) = e {
3491                     Some(token)
3492                 } else {
3493                     None
3494                 }
3495             })
3496             .unwrap()
3497     }
3498 
start_with_0rtt() -> (Http3Client, TestServer)3499     fn start_with_0rtt() -> (Http3Client, TestServer) {
3500         let (mut client, mut server) = connect();
3501         let token = exchange_token(&mut client, &mut server.conn);
3502 
3503         let mut client = default_http3_client();
3504 
3505         let server = TestServer::new();
3506 
3507         assert_eq!(client.state(), Http3State::Initializing);
3508         client
3509             .enable_resumption(now(), &token)
3510             .expect("Set resumption token.");
3511 
3512         assert_eq!(client.state(), Http3State::ZeroRtt);
3513         let zerortt_event = |e| matches!(e, Http3ClientEvent::StateChange(Http3State::ZeroRtt));
3514         assert!(client.events().any(zerortt_event));
3515 
3516         (client, server)
3517     }
3518 
3519     #[test]
zero_rtt_negotiated()3520     fn zero_rtt_negotiated() {
3521         let (mut client, mut server) = start_with_0rtt();
3522 
3523         let out = client.process(None, now());
3524 
3525         assert_eq!(client.state(), Http3State::ZeroRtt);
3526         assert_eq!(*server.conn.state(), State::Init);
3527         let out = server.conn.process(out.dgram(), now());
3528 
3529         // Check that control and qpack streams are received and a
3530         // SETTINGS frame has been received.
3531         // Also qpack encoder stream will send "change capacity" instruction because it has
3532         // the peer settings already.
3533         server.check_control_qpack_request_streams_resumption(
3534             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3535             EXPECTED_REQUEST_HEADER_FRAME,
3536             false,
3537         );
3538 
3539         assert_eq!(*server.conn.state(), State::Handshaking);
3540         let out = client.process(out.dgram(), now());
3541         assert_eq!(client.state(), Http3State::Connected);
3542 
3543         mem::drop(server.conn.process(out.dgram(), now()));
3544         assert!(server.conn.state().connected());
3545 
3546         assert!(client.tls_info().unwrap().resumed());
3547         assert!(server.conn.tls_info().unwrap().resumed());
3548     }
3549 
3550     #[test]
zero_rtt_send_request()3551     fn zero_rtt_send_request() {
3552         let (mut client, mut server) = start_with_0rtt();
3553 
3554         let request_stream_id =
3555             make_request(&mut client, true, &[Header::new("myheaders", "myvalue")]);
3556         assert_eq!(request_stream_id, 0);
3557 
3558         let out = client.process(None, now());
3559 
3560         assert_eq!(client.state(), Http3State::ZeroRtt);
3561         assert_eq!(*server.conn.state(), State::Init);
3562         let out = server.conn.process(out.dgram(), now());
3563 
3564         // Check that control and qpack streams are received and a
3565         // SETTINGS frame has been received.
3566         // Also qpack encoder stream will send "change capacity" instruction because it has
3567         // the peer settings already.
3568         server.check_control_qpack_request_streams_resumption(
3569             ENCODER_STREAM_DATA_WITH_CAP_INST_AND_ENCODING_INST,
3570             EXPECTED_REQUEST_HEADER_FRAME_VERSION2,
3571             true,
3572         );
3573 
3574         assert_eq!(*server.conn.state(), State::Handshaking);
3575         let out = client.process(out.dgram(), now());
3576         assert_eq!(client.state(), Http3State::Connected);
3577         let out = server.conn.process(out.dgram(), now());
3578         assert!(server.conn.state().connected());
3579         let out = client.process(out.dgram(), now());
3580         assert!(out.as_dgram_ref().is_none());
3581 
3582         // After the server has been connected, send a response.
3583         let res = server.conn.stream_send(request_stream_id, HTTP_RESPONSE_2);
3584         assert_eq!(res, Ok(HTTP_RESPONSE_2.len()));
3585         server.conn.stream_close_send(request_stream_id).unwrap();
3586 
3587         read_response(&mut client, &mut server.conn, request_stream_id);
3588 
3589         assert!(client.tls_info().unwrap().resumed());
3590         assert!(server.conn.tls_info().unwrap().resumed());
3591     }
3592 
3593     #[test]
zero_rtt_before_resumption_token()3594     fn zero_rtt_before_resumption_token() {
3595         let mut client = default_http3_client();
3596         assert!(client
3597             .fetch(now(), "GET", "https", "something.com", "/", &[])
3598             .is_err());
3599     }
3600 
3601     #[test]
zero_rtt_send_reject()3602     fn zero_rtt_send_reject() {
3603         let (mut client, mut server) = connect();
3604         let token = exchange_token(&mut client, &mut server.conn);
3605 
3606         let mut client = default_http3_client();
3607         let mut server = Connection::new_server(
3608             test_fixture::DEFAULT_KEYS,
3609             test_fixture::DEFAULT_ALPN_H3,
3610             Rc::new(RefCell::new(CountingConnectionIdGenerator::default())),
3611             ConnectionParameters::default(),
3612         )
3613         .unwrap();
3614         // Using a freshly initialized anti-replay context
3615         // should result in the server rejecting 0-RTT.
3616         let ar = AntiReplay::new(now(), test_fixture::ANTI_REPLAY_WINDOW, 1, 3)
3617             .expect("setup anti-replay");
3618         server
3619             .server_enable_0rtt(&ar, AllowZeroRtt {})
3620             .expect("enable 0-RTT");
3621 
3622         assert_eq!(client.state(), Http3State::Initializing);
3623         client
3624             .enable_resumption(now(), &token)
3625             .expect("Set resumption token.");
3626         let zerortt_event = |e| matches!(e, Http3ClientEvent::StateChange(Http3State::ZeroRtt));
3627         assert!(client.events().any(zerortt_event));
3628 
3629         // Send ClientHello.
3630         let client_hs = client.process(None, now());
3631         assert!(client_hs.as_dgram_ref().is_some());
3632 
3633         // Create a request
3634         let request_stream_id = make_request(&mut client, false, &[]);
3635         assert_eq!(request_stream_id, 0);
3636 
3637         let client_0rtt = client.process(None, now());
3638         assert!(client_0rtt.as_dgram_ref().is_some());
3639 
3640         let server_hs = server.process(client_hs.dgram(), now());
3641         assert!(server_hs.as_dgram_ref().is_some()); // Should produce ServerHello etc...
3642         let server_ignored = server.process(client_0rtt.dgram(), now());
3643         assert!(server_ignored.as_dgram_ref().is_none());
3644 
3645         // The server shouldn't receive that 0-RTT data.
3646         let recvd_stream_evt = |e| matches!(e, ConnectionEvent::NewStream { .. });
3647         assert!(!server.events().any(recvd_stream_evt));
3648 
3649         // Client should get a rejection.
3650         let client_out = client.process(server_hs.dgram(), now());
3651         assert!(client_out.as_dgram_ref().is_some());
3652         let recvd_0rtt_reject = |e| e == Http3ClientEvent::ZeroRttRejected;
3653         assert!(client.events().any(recvd_0rtt_reject));
3654 
3655         // ...and the client stream should be gone.
3656         let res = client.stream_close_send(request_stream_id);
3657         assert!(res.is_err());
3658         assert_eq!(res.unwrap_err(), Error::InvalidStreamId);
3659 
3660         // Client will send Setting frame and open new qpack streams.
3661         mem::drop(server.process(client_out.dgram(), now()));
3662         TestServer::new_with_conn(server).check_client_control_qpack_streams_no_resumption();
3663 
3664         // Check that we can send a request and that the stream_id starts again from 0.
3665         assert_eq!(make_request(&mut client, false, &[]), 0);
3666     }
3667 
3668     // Connect to a server, get token and reconnect using 0-rtt. Seerver sends new Settings.
zero_rtt_change_settings( original_settings: &[HSetting], resumption_settings: &[HSetting], expected_client_state: &Http3State, expected_encoder_stream_data: &[u8], )3669     fn zero_rtt_change_settings(
3670         original_settings: &[HSetting],
3671         resumption_settings: &[HSetting],
3672         expected_client_state: &Http3State,
3673         expected_encoder_stream_data: &[u8],
3674     ) {
3675         let mut client = default_http3_client();
3676         let mut server = TestServer::new_with_settings(original_settings);
3677         // Connect and get a token
3678         connect_with(&mut client, &mut server);
3679         let token = exchange_token(&mut client, &mut server.conn);
3680 
3681         let mut client = default_http3_client();
3682         let mut server = TestServer::new_with_settings(resumption_settings);
3683         assert_eq!(client.state(), Http3State::Initializing);
3684         client
3685             .enable_resumption(now(), &token)
3686             .expect("Set resumption token.");
3687         assert_eq!(client.state(), Http3State::ZeroRtt);
3688         let out = client.process(None, now());
3689 
3690         assert_eq!(client.state(), Http3State::ZeroRtt);
3691         assert_eq!(*server.conn.state(), State::Init);
3692         let out = server.conn.process(out.dgram(), now());
3693 
3694         // Check that control and qpack streams anda SETTINGS frame are received.
3695         // Also qpack encoder stream will send "change capacity" instruction because it has
3696         // the peer settings already.
3697         server.check_control_qpack_request_streams_resumption(
3698             expected_encoder_stream_data,
3699             EXPECTED_REQUEST_HEADER_FRAME,
3700             false,
3701         );
3702 
3703         assert_eq!(*server.conn.state(), State::Handshaking);
3704         let out = client.process(out.dgram(), now());
3705         assert_eq!(client.state(), Http3State::Connected);
3706 
3707         mem::drop(server.conn.process(out.dgram(), now()));
3708         assert!(server.conn.state().connected());
3709 
3710         assert!(client.tls_info().unwrap().resumed());
3711         assert!(server.conn.tls_info().unwrap().resumed());
3712 
3713         // Send new settings.
3714         let control_stream = server.conn.stream_create(StreamType::UniDi).unwrap();
3715         let mut enc = Encoder::default();
3716         server.settings.encode(&mut enc);
3717         let mut sent = server.conn.stream_send(control_stream, CONTROL_STREAM_TYPE);
3718         assert_eq!(sent.unwrap(), CONTROL_STREAM_TYPE.len());
3719         sent = server.conn.stream_send(control_stream, &enc);
3720         assert_eq!(sent.unwrap(), enc.len());
3721 
3722         let out = server.conn.process(None, now());
3723         client.process(out.dgram(), now());
3724 
3725         assert_eq!(&client.state(), expected_client_state);
3726         assert!(server.conn.state().connected());
3727     }
3728 
3729     #[test]
zero_rtt_new_server_setting_are_the_same()3730     fn zero_rtt_new_server_setting_are_the_same() {
3731         // Send a new server settings that are the same as the old one.
3732         zero_rtt_change_settings(
3733             &[
3734                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3735                 HSetting::new(HSettingType::BlockedStreams, 100),
3736                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3737             ],
3738             &[
3739                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3740                 HSetting::new(HSettingType::BlockedStreams, 100),
3741                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3742             ],
3743             &Http3State::Connected,
3744             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3745         );
3746     }
3747 
3748     #[test]
zero_rtt_new_server_setting_omit_max_table()3749     fn zero_rtt_new_server_setting_omit_max_table() {
3750         // Send a new server settings without MaxTableCapacity
3751         zero_rtt_change_settings(
3752             &[
3753                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3754                 HSetting::new(HSettingType::BlockedStreams, 100),
3755                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3756             ],
3757             &[
3758                 HSetting::new(HSettingType::BlockedStreams, 100),
3759                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3760             ],
3761             &Http3State::Closing(ConnectionError::Application(265)),
3762             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3763         );
3764     }
3765 
3766     #[test]
zero_rtt_new_server_setting_omit_blocked_streams()3767     fn zero_rtt_new_server_setting_omit_blocked_streams() {
3768         // Send a new server settings without BlockedStreams
3769         zero_rtt_change_settings(
3770             &[
3771                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3772                 HSetting::new(HSettingType::BlockedStreams, 100),
3773                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3774             ],
3775             &[
3776                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3777                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3778             ],
3779             &Http3State::Closing(ConnectionError::Application(265)),
3780             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3781         );
3782     }
3783 
3784     #[test]
zero_rtt_new_server_setting_omit_header_list_size()3785     fn zero_rtt_new_server_setting_omit_header_list_size() {
3786         // Send a new server settings without MaxHeaderListSize
3787         zero_rtt_change_settings(
3788             &[
3789                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3790                 HSetting::new(HSettingType::BlockedStreams, 100),
3791                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3792             ],
3793             &[
3794                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3795                 HSetting::new(HSettingType::BlockedStreams, 100),
3796             ],
3797             &Http3State::Connected,
3798             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3799         );
3800     }
3801 
3802     #[test]
zero_rtt_new_server_setting_max_table_size_bigger()3803     fn zero_rtt_new_server_setting_max_table_size_bigger() {
3804         // Send a new server settings MaxTableCapacity=200
3805         zero_rtt_change_settings(
3806             &[
3807                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3808                 HSetting::new(HSettingType::BlockedStreams, 100),
3809                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3810             ],
3811             &[
3812                 HSetting::new(HSettingType::MaxTableCapacity, 200),
3813                 HSetting::new(HSettingType::BlockedStreams, 100),
3814                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3815             ],
3816             &Http3State::Closing(ConnectionError::Application(514)),
3817             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3818         );
3819     }
3820 
3821     #[test]
zero_rtt_new_server_setting_max_table_size_smaller()3822     fn zero_rtt_new_server_setting_max_table_size_smaller() {
3823         // Send a new server settings MaxTableCapacity=50
3824         zero_rtt_change_settings(
3825             &[
3826                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3827                 HSetting::new(HSettingType::BlockedStreams, 100),
3828                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3829             ],
3830             &[
3831                 HSetting::new(HSettingType::MaxTableCapacity, 50),
3832                 HSetting::new(HSettingType::BlockedStreams, 100),
3833                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3834             ],
3835             &Http3State::Closing(ConnectionError::Application(265)),
3836             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3837         );
3838     }
3839 
3840     #[test]
zero_rtt_new_server_setting_blocked_streams_bigger()3841     fn zero_rtt_new_server_setting_blocked_streams_bigger() {
3842         // Send a new server settings withBlockedStreams=200
3843         zero_rtt_change_settings(
3844             &[
3845                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3846                 HSetting::new(HSettingType::BlockedStreams, 100),
3847                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3848             ],
3849             &[
3850                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3851                 HSetting::new(HSettingType::BlockedStreams, 200),
3852                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3853             ],
3854             &Http3State::Connected,
3855             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3856         );
3857     }
3858 
3859     #[test]
zero_rtt_new_server_setting_blocked_streams_smaller()3860     fn zero_rtt_new_server_setting_blocked_streams_smaller() {
3861         // Send a new server settings withBlockedStreams=50
3862         zero_rtt_change_settings(
3863             &[
3864                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3865                 HSetting::new(HSettingType::BlockedStreams, 100),
3866                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3867             ],
3868             &[
3869                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3870                 HSetting::new(HSettingType::BlockedStreams, 50),
3871                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3872             ],
3873             &Http3State::Closing(ConnectionError::Application(265)),
3874             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3875         );
3876     }
3877 
3878     #[test]
zero_rtt_new_server_setting_max_header_size_bigger()3879     fn zero_rtt_new_server_setting_max_header_size_bigger() {
3880         // Send a new server settings with MaxHeaderListSize=20000
3881         zero_rtt_change_settings(
3882             &[
3883                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3884                 HSetting::new(HSettingType::BlockedStreams, 100),
3885                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3886             ],
3887             &[
3888                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3889                 HSetting::new(HSettingType::BlockedStreams, 100),
3890                 HSetting::new(HSettingType::MaxHeaderListSize, 20000),
3891             ],
3892             &Http3State::Connected,
3893             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3894         );
3895     }
3896 
3897     #[test]
zero_rtt_new_server_setting_max_headers_size_smaller()3898     fn zero_rtt_new_server_setting_max_headers_size_smaller() {
3899         // Send the new server settings with MaxHeaderListSize=5000
3900         zero_rtt_change_settings(
3901             &[
3902                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3903                 HSetting::new(HSettingType::BlockedStreams, 100),
3904                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3905             ],
3906             &[
3907                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3908                 HSetting::new(HSettingType::BlockedStreams, 100),
3909                 HSetting::new(HSettingType::MaxHeaderListSize, 5000),
3910             ],
3911             &Http3State::Closing(ConnectionError::Application(265)),
3912             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3913         );
3914     }
3915 
3916     #[test]
zero_rtt_max_table_size_first_omitted()3917     fn zero_rtt_max_table_size_first_omitted() {
3918         // send server original settings without MaxTableCapacity
3919         // send new server setting with MaxTableCapacity
3920         zero_rtt_change_settings(
3921             &[
3922                 HSetting::new(HSettingType::BlockedStreams, 100),
3923                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3924             ],
3925             &[
3926                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3927                 HSetting::new(HSettingType::BlockedStreams, 100),
3928                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3929             ],
3930             &Http3State::Connected,
3931             ENCODER_STREAM_DATA,
3932         );
3933     }
3934 
3935     #[test]
zero_rtt_blocked_streams_first_omitted()3936     fn zero_rtt_blocked_streams_first_omitted() {
3937         // Send server original settings without BlockedStreams
3938         // Send the new server settings with BlockedStreams
3939         zero_rtt_change_settings(
3940             &[
3941                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3942                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3943             ],
3944             &[
3945                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3946                 HSetting::new(HSettingType::BlockedStreams, 100),
3947                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3948             ],
3949             &Http3State::Connected,
3950             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3951         );
3952     }
3953 
3954     #[test]
zero_rtt_max_header_size_first_omitted()3955     fn zero_rtt_max_header_size_first_omitted() {
3956         // Send server settings without MaxHeaderListSize
3957         // Send new settings with MaxHeaderListSize.
3958         zero_rtt_change_settings(
3959             &[
3960                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3961                 HSetting::new(HSettingType::BlockedStreams, 10000),
3962             ],
3963             &[
3964                 HSetting::new(HSettingType::MaxTableCapacity, 100),
3965                 HSetting::new(HSettingType::BlockedStreams, 100),
3966                 HSetting::new(HSettingType::MaxHeaderListSize, 10000),
3967             ],
3968             &Http3State::Closing(ConnectionError::Application(265)),
3969             ENCODER_STREAM_DATA_WITH_CAP_INSTRUCTION,
3970         );
3971     }
3972 
3973     #[test]
test_trailers_with_fin_after_headers()3974     fn test_trailers_with_fin_after_headers() {
3975         // Make a new connection.
3976         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
3977 
3978         // Send HEADER frame.
3979         server_send_response_and_exchange_packet(
3980             &mut client,
3981             &mut server,
3982             request_stream_id,
3983             HTTP_HEADER_FRAME_0,
3984             false,
3985         );
3986 
3987         // Check response headers.
3988         let mut response_headers = false;
3989         while let Some(e) = client.next_event() {
3990             if let Http3ClientEvent::HeaderReady {
3991                 stream_id,
3992                 headers,
3993                 interim,
3994                 fin,
3995             } = e
3996             {
3997                 assert_eq!(stream_id, request_stream_id);
3998                 check_response_header_0(&headers);
3999                 assert!(!fin);
4000                 assert!(!interim);
4001                 response_headers = true;
4002             }
4003         }
4004         assert!(response_headers);
4005 
4006         // Send trailers
4007         server_send_response_and_exchange_packet(
4008             &mut client,
4009             &mut server,
4010             request_stream_id,
4011             HTTP_HEADER_FRAME_0,
4012             true,
4013         );
4014 
4015         let events: Vec<Http3ClientEvent> = client.events().collect();
4016 
4017         // We already had HeaderReady
4018         let header_ready: fn(&Http3ClientEvent) -> _ =
4019             |e| matches!(*e, Http3ClientEvent::HeaderReady { .. });
4020         assert!(!events.iter().any(header_ready));
4021 
4022         // Check that we have a DataReady event. Reading from the stream will return fin=true.
4023         let data_readable: fn(&Http3ClientEvent) -> _ =
4024             |e| matches!(*e, Http3ClientEvent::DataReadable { .. });
4025         assert!(events.iter().any(data_readable));
4026         let mut buf = [0_u8; 100];
4027         let (len, fin) = client
4028             .read_response_data(now(), request_stream_id, &mut buf)
4029             .unwrap();
4030         assert_eq!(0, len);
4031         assert!(fin);
4032     }
4033 
4034     #[test]
test_trailers_with_later_fin_after_headers()4035     fn test_trailers_with_later_fin_after_headers() {
4036         // Make a new connection.
4037         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4038 
4039         // Send HEADER frame.
4040         server_send_response_and_exchange_packet(
4041             &mut client,
4042             &mut server,
4043             request_stream_id,
4044             HTTP_HEADER_FRAME_0,
4045             false,
4046         );
4047 
4048         // Check response headers.
4049         let mut response_headers = false;
4050         while let Some(e) = client.next_event() {
4051             if let Http3ClientEvent::HeaderReady {
4052                 stream_id,
4053                 headers,
4054                 interim,
4055                 fin,
4056             } = e
4057             {
4058                 assert_eq!(stream_id, request_stream_id);
4059                 check_response_header_0(&headers);
4060                 assert!(!fin);
4061                 assert!(!interim);
4062                 response_headers = true;
4063             }
4064         }
4065         assert!(response_headers);
4066 
4067         // Send trailers
4068         server_send_response_and_exchange_packet(
4069             &mut client,
4070             &mut server,
4071             request_stream_id,
4072             HTTP_HEADER_FRAME_0,
4073             false,
4074         );
4075 
4076         // Check that we do not have a DataReady event.
4077         let data_readable = |e| matches!(e, Http3ClientEvent::DataReadable { .. });
4078         assert!(!client.events().any(data_readable));
4079 
4080         server.conn.stream_close_send(request_stream_id).unwrap();
4081 
4082         let out = server.conn.process(None, now());
4083         client.process(out.dgram(), now());
4084 
4085         let events: Vec<Http3ClientEvent> = client.events().collect();
4086 
4087         // We already had HeaderReady
4088         let header_ready: fn(&Http3ClientEvent) -> _ =
4089             |e| matches!(*e, Http3ClientEvent::HeaderReady { .. });
4090         assert!(!events.iter().any(header_ready));
4091 
4092         // Check that we have a DataReady event. Reading from the stream will return fin=true.
4093         let data_readable_fn: fn(&Http3ClientEvent) -> _ =
4094             |e| matches!(*e, Http3ClientEvent::DataReadable { .. });
4095         assert!(events.iter().any(data_readable_fn));
4096         let mut buf = [0_u8; 100];
4097         let (len, fin) = client
4098             .read_response_data(now(), request_stream_id, &mut buf)
4099             .unwrap();
4100         assert_eq!(0, len);
4101         assert!(fin);
4102     }
4103 
4104     #[test]
test_data_after_trailers_after_headers()4105     fn test_data_after_trailers_after_headers() {
4106         // Make a new connection.
4107         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4108 
4109         // Send HEADER frame.
4110         server_send_response_and_exchange_packet(
4111             &mut client,
4112             &mut server,
4113             request_stream_id,
4114             HTTP_HEADER_FRAME_0,
4115             false,
4116         );
4117 
4118         // Check response headers.
4119         let mut response_headers = false;
4120         while let Some(e) = client.next_event() {
4121             if let Http3ClientEvent::HeaderReady {
4122                 stream_id,
4123                 headers,
4124                 interim,
4125                 fin,
4126             } = e
4127             {
4128                 assert_eq!(stream_id, request_stream_id);
4129                 check_response_header_0(&headers);
4130                 assert!(!fin);
4131                 assert!(!interim);
4132                 response_headers = true;
4133             }
4134         }
4135         assert!(response_headers);
4136 
4137         // Send trailers
4138         server_send_response_and_exchange_packet(
4139             &mut client,
4140             &mut server,
4141             request_stream_id,
4142             HTTP_HEADER_FRAME_0,
4143             false,
4144         );
4145 
4146         // Check that we do not have a DataReady event.
4147         let data_readable = |e| matches!(e, Http3ClientEvent::DataReadable { .. });
4148         assert!(!client.events().any(data_readable));
4149 
4150         // Send Data frame.
4151         server_send_response_and_exchange_packet(
4152             &mut client,
4153             &mut server,
4154             request_stream_id,
4155             &[0x0, 0x3, 0x61, 0x62, 0x63], // a data frame
4156             false,
4157         );
4158 
4159         assert_closed(&client, &Error::HttpFrameUnexpected);
4160     }
4161 
4162     #[test]
transport_stream_readable_event_after_all_data()4163     fn transport_stream_readable_event_after_all_data() {
4164         let (mut client, mut server, request_stream_id) = connect_and_send_request(false);
4165 
4166         // Send headers.
4167         server_send_response_and_exchange_packet(
4168             &mut client,
4169             &mut server,
4170             request_stream_id,
4171             HTTP_RESPONSE_2,
4172             false,
4173         );
4174 
4175         // Send an empty data frame and a fin
4176         server_send_response_and_exchange_packet(
4177             &mut client,
4178             &mut server,
4179             request_stream_id,
4180             &[0x0, 0x0],
4181             true,
4182         );
4183 
4184         let mut buf = [0_u8; 100];
4185         assert_eq!(client.read_response_data(now(), 0, &mut buf), Ok((3, true)));
4186 
4187         client.process(None, now());
4188     }
4189 
4190     #[test]
no_data_ready_events_after_fin()4191     fn no_data_ready_events_after_fin() {
4192         // Connect exchange headers and send a request. Also check if the correct header frame has been sent.
4193         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4194 
4195         // send response - 200  Content-Length: 7
4196         // with content: 'abcdefg'.
4197         // The content will be send in 2 DATA frames.
4198         server_send_response_and_exchange_packet(
4199             &mut client,
4200             &mut server,
4201             request_stream_id,
4202             HTTP_RESPONSE_1,
4203             true,
4204         );
4205 
4206         let data_readable_event = |e| matches!(e, Http3ClientEvent::DataReadable { stream_id } if stream_id == request_stream_id);
4207         assert!(client.events().any(data_readable_event));
4208 
4209         let mut buf = [0_u8; 100];
4210         assert_eq!(
4211             (EXPECTED_RESPONSE_DATA_1.len(), true),
4212             client
4213                 .read_response_data(now(), request_stream_id, &mut buf)
4214                 .unwrap()
4215         );
4216 
4217         assert!(!client.events().any(data_readable_event));
4218     }
4219 
4220     #[test]
reading_small_chunks_of_data()4221     fn reading_small_chunks_of_data() {
4222         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4223 
4224         // send response - 200  Content-Length: 7
4225         // with content: 'abcdefg'.
4226         // The content will be send in 2 DATA frames.
4227         server_send_response_and_exchange_packet(
4228             &mut client,
4229             &mut server,
4230             request_stream_id,
4231             HTTP_RESPONSE_1,
4232             true,
4233         );
4234 
4235         let data_readable_event = |e| matches!(e, Http3ClientEvent::DataReadable { stream_id } if stream_id == request_stream_id);
4236         assert!(client.events().any(data_readable_event));
4237 
4238         let mut buf1 = [0_u8; 1];
4239         assert_eq!(
4240             (1, false),
4241             client
4242                 .read_response_data(now(), request_stream_id, &mut buf1)
4243                 .unwrap()
4244         );
4245         assert!(!client.events().any(data_readable_event));
4246 
4247         // Now read only until the end of the first frame. The firs framee has 3 bytes.
4248         let mut buf2 = [0_u8; 2];
4249         assert_eq!(
4250             (2, false),
4251             client
4252                 .read_response_data(now(), request_stream_id, &mut buf2)
4253                 .unwrap()
4254         );
4255         assert!(!client.events().any(data_readable_event));
4256 
4257         // Read a half of the second frame.
4258         assert_eq!(
4259             (2, false),
4260             client
4261                 .read_response_data(now(), request_stream_id, &mut buf2)
4262                 .unwrap()
4263         );
4264         assert!(!client.events().any(data_readable_event));
4265 
4266         // Read the rest.
4267         // Read a half of the second frame.
4268         assert_eq!(
4269             (2, true),
4270             client
4271                 .read_response_data(now(), request_stream_id, &mut buf2)
4272                 .unwrap()
4273         );
4274         assert!(!client.events().any(data_readable_event));
4275     }
4276 
4277     #[test]
zero_length_data_at_end()4278     fn zero_length_data_at_end() {
4279         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4280 
4281         // send response - 200  Content-Length: 7
4282         // with content: 'abcdefg'.
4283         // The content will be send in 2 DATA frames.
4284         server_send_response_and_exchange_packet(
4285             &mut client,
4286             &mut server,
4287             request_stream_id,
4288             HTTP_RESPONSE_1,
4289             false,
4290         );
4291         // Send a zero-length frame at the end of the stream.
4292         let _ = server.conn.stream_send(request_stream_id, &[0, 0]).unwrap();
4293         server.conn.stream_close_send(request_stream_id).unwrap();
4294         let dgram = server.conn.process_output(now()).dgram();
4295         let dgram = client.process(dgram, now()).dgram();
4296         server.conn.process_input(dgram.unwrap(), now());
4297 
4298         let data_readable_event = |e: &_| matches!(e, Http3ClientEvent::DataReadable { stream_id } if *stream_id == request_stream_id);
4299         assert_eq!(client.events().filter(data_readable_event).count(), 1);
4300 
4301         let mut buf = [0_u8; 10];
4302         assert_eq!(
4303             (7, true),
4304             client
4305                 .read_response_data(now(), request_stream_id, &mut buf)
4306                 .unwrap()
4307         );
4308         assert!(!client.events().any(|e| data_readable_event(&e)));
4309     }
4310 
4311     #[test]
stream_blocked_no_remote_encoder_stream()4312     fn stream_blocked_no_remote_encoder_stream() {
4313         let (mut client, mut server) = connect_only_transport();
4314 
4315         send_and_receive_client_settings(&mut client, &mut server);
4316 
4317         server.create_control_stream();
4318         // Send the server's control stream data.
4319         let out = server.conn.process(None, now());
4320         client.process(out.dgram(), now());
4321 
4322         server.create_qpack_streams();
4323         let qpack_pkt1 = server.conn.process(None, now());
4324         // delay delivery of this packet.
4325 
4326         let request_stream_id = make_request(&mut client, true, &[]);
4327         let out = client.process(None, now());
4328         mem::drop(server.conn.process(out.dgram(), now()));
4329 
4330         setup_server_side_encoder(&mut client, &mut server);
4331 
4332         let headers = vec![
4333             Header::new(":status", "200"),
4334             Header::new("my-header", "my-header"),
4335             Header::new("content-length", "3"),
4336         ];
4337         let encoded_headers = server
4338             .encoder
4339             .borrow_mut()
4340             .encode_header_block(&mut server.conn, &headers, request_stream_id)
4341             .unwrap();
4342         let hframe = HFrame::Headers {
4343             header_block: encoded_headers.to_vec(),
4344         };
4345 
4346         // Send the encoder instructions,
4347         let out = server.conn.process(None, now());
4348         client.process(out.dgram(), now());
4349 
4350         // Send response
4351         let mut d = Encoder::default();
4352         hframe.encode(&mut d);
4353         let d_frame = HFrame::Data { len: 3 };
4354         d_frame.encode(&mut d);
4355         d.encode(&[0x61, 0x62, 0x63]);
4356         let _ = server.conn.stream_send(request_stream_id, &d[..]).unwrap();
4357         server.conn.stream_close_send(request_stream_id).unwrap();
4358 
4359         let out = server.conn.process(None, now());
4360         mem::drop(client.process(out.dgram(), now()));
4361 
4362         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
4363         assert!(!client.events().any(header_ready_event));
4364 
4365         // Let client receive the encoder instructions.
4366         mem::drop(client.process(qpack_pkt1.dgram(), now()));
4367 
4368         assert!(client.events().any(header_ready_event));
4369     }
4370 
4371     // Client: receive a push stream
4372     #[test]
push_single()4373     fn push_single() {
4374         // Connect and send a request
4375         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4376 
4377         // Send a push promise.
4378         send_push_promise(&mut server.conn, request_stream_id, 0);
4379 
4380         // create a push stream.
4381         let _ = send_push_data(&mut server.conn, 0, true);
4382 
4383         server_send_response_and_exchange_packet(
4384             &mut client,
4385             &mut server,
4386             request_stream_id,
4387             HTTP_RESPONSE_2,
4388             true,
4389         );
4390 
4391         read_response_and_push_events(
4392             &mut client,
4393             &[PushPromiseInfo {
4394                 push_id: 0,
4395                 ref_stream_id: request_stream_id,
4396             }],
4397             &[0],
4398             request_stream_id,
4399         );
4400 
4401         assert_eq!(client.state(), Http3State::Connected);
4402 
4403         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
4404         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
4405     }
4406 
4407     #[test]
push_multiple()4408     fn push_multiple() {
4409         // Connect and send a request
4410         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4411 
4412         // Send a push promise.
4413         send_push_promise(&mut server.conn, request_stream_id, 0);
4414         send_push_promise(&mut server.conn, request_stream_id, 1);
4415 
4416         // create a push stream.
4417         let _ = send_push_data(&mut server.conn, 0, true);
4418 
4419         // create a second push stream.
4420         let _ = send_push_data(&mut server.conn, 1, true);
4421 
4422         server_send_response_and_exchange_packet(
4423             &mut client,
4424             &mut server,
4425             request_stream_id,
4426             HTTP_RESPONSE_2,
4427             true,
4428         );
4429 
4430         read_response_and_push_events(
4431             &mut client,
4432             &[
4433                 PushPromiseInfo {
4434                     push_id: 0,
4435                     ref_stream_id: request_stream_id,
4436                 },
4437                 PushPromiseInfo {
4438                     push_id: 1,
4439                     ref_stream_id: request_stream_id,
4440                 },
4441             ],
4442             &[0, 1],
4443             request_stream_id,
4444         );
4445 
4446         assert_eq!(client.state(), Http3State::Connected);
4447 
4448         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
4449         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
4450         assert_eq!(client.cancel_push(1), Err(Error::InvalidStreamId));
4451     }
4452 
4453     #[test]
push_after_headers()4454     fn push_after_headers() {
4455         // Connect and send a request
4456         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4457 
4458         // Send response headers
4459         let _ = server
4460             .conn
4461             .stream_send(request_stream_id, HTTP_RESPONSE_HEADER_ONLY_2)
4462             .unwrap();
4463 
4464         // Send a push promise.
4465         send_push_promise(&mut server.conn, request_stream_id, 0);
4466 
4467         // create a push stream.
4468         let _ = send_push_data(&mut server.conn, 0, true);
4469 
4470         // Send response data
4471         server_send_response_and_exchange_packet(
4472             &mut client,
4473             &mut server,
4474             request_stream_id,
4475             HTTP_RESPONSE_DATA_FRAME_ONLY_2,
4476             true,
4477         );
4478 
4479         read_response_and_push_events(
4480             &mut client,
4481             &[PushPromiseInfo {
4482                 push_id: 0,
4483                 ref_stream_id: request_stream_id,
4484             }],
4485             &[0],
4486             request_stream_id,
4487         );
4488 
4489         assert_eq!(client.state(), Http3State::Connected);
4490     }
4491 
4492     #[test]
push_after_response()4493     fn push_after_response() {
4494         // Connect and send a request
4495         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4496 
4497         // Send response headers and data frames
4498         let _ = server
4499             .conn
4500             .stream_send(request_stream_id, HTTP_RESPONSE_2)
4501             .unwrap();
4502 
4503         // Send a push promise.
4504         send_push_promise(&mut server.conn, request_stream_id, 0);
4505         // create a push stream.
4506         send_push_data_and_exchange_packets(&mut client, &mut server, 0, true);
4507 
4508         read_response_and_push_events(
4509             &mut client,
4510             &[PushPromiseInfo {
4511                 push_id: 0,
4512                 ref_stream_id: request_stream_id,
4513             }],
4514             &[0],
4515             request_stream_id,
4516         );
4517 
4518         assert_eq!(client.state(), Http3State::Connected);
4519     }
4520 
check_push_events(client: &mut Http3Client) -> bool4521     fn check_push_events(client: &mut Http3Client) -> bool {
4522         let any_push_event = |e| {
4523             matches!(
4524                 e,
4525                 Http3ClientEvent::PushPromise { .. }
4526                     | Http3ClientEvent::PushHeaderReady { .. }
4527                     | Http3ClientEvent::PushDataReadable { .. }
4528             )
4529         };
4530         client.events().any(any_push_event)
4531     }
4532 
check_data_readable(client: &mut Http3Client) -> bool4533     fn check_data_readable(client: &mut Http3Client) -> bool {
4534         let any_data_event = |e| matches!(e, Http3ClientEvent::DataReadable { .. });
4535         client.events().any(any_data_event)
4536     }
4537 
check_header_ready(client: &mut Http3Client) -> bool4538     fn check_header_ready(client: &mut Http3Client) -> bool {
4539         let any_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
4540         client.events().any(any_event)
4541     }
4542 
check_header_ready_and_push_promise(client: &mut Http3Client) -> bool4543     fn check_header_ready_and_push_promise(client: &mut Http3Client) -> bool {
4544         let any_event = |e| {
4545             matches!(
4546                 e,
4547                 Http3ClientEvent::HeaderReady { .. } | Http3ClientEvent::PushPromise { .. }
4548             )
4549         };
4550         client.events().any(any_event)
4551     }
4552 
4553     #[test]
push_stream_before_promise()4554     fn push_stream_before_promise() {
4555         // Connect and send a request
4556         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4557 
4558         // create a push stream.
4559         send_push_data_and_exchange_packets(&mut client, &mut server, 0, true);
4560 
4561         // Assert that we do not have any push event.
4562         assert!(!check_push_events(&mut client));
4563 
4564         // Now send push_promise
4565         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 0);
4566 
4567         server_send_response_and_exchange_packet(
4568             &mut client,
4569             &mut server,
4570             request_stream_id,
4571             HTTP_RESPONSE_2,
4572             true,
4573         );
4574 
4575         read_response_and_push_events(
4576             &mut client,
4577             &[PushPromiseInfo {
4578                 push_id: 0,
4579                 ref_stream_id: request_stream_id,
4580             }],
4581             &[0],
4582             request_stream_id,
4583         );
4584 
4585         assert_eq!(client.state(), Http3State::Connected);
4586     }
4587 
4588     // Test receiving pushes out of order.
4589     // Push_id 5 is received first, therefore Push_id 3 will be in the PushState:Init state.
4590     // Start push_id 3 by receiving a push_promise and then a push stream with the push_id 3.
4591     #[test]
push_out_of_order_1()4592     fn push_out_of_order_1() {
4593         // Connect and send a request
4594         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4595 
4596         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 5);
4597 
4598         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 3);
4599         // Start a push stream with push_id 3.
4600         send_push_data_and_exchange_packets(&mut client, &mut server, 3, true);
4601 
4602         assert_eq!(client.state(), Http3State::Connected);
4603 
4604         read_response_and_push_events(
4605             &mut client,
4606             &[
4607                 PushPromiseInfo {
4608                     push_id: 5,
4609                     ref_stream_id: request_stream_id,
4610                 },
4611                 PushPromiseInfo {
4612                     push_id: 3,
4613                     ref_stream_id: request_stream_id,
4614                 },
4615             ],
4616             &[3],
4617             request_stream_id,
4618         );
4619         assert_eq!(client.state(), Http3State::Connected);
4620     }
4621 
4622     // Test receiving pushes out of order.
4623     // Push_id 5 is received first, therefore Push_id 3 will be in the PushState:Init state.
4624     // Start push_id 3 by receiving a push stream with push_id 3 and then a push_promise.
4625     #[test]
push_out_of_order_2()4626     fn push_out_of_order_2() {
4627         // Connect and send a request
4628         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4629 
4630         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 5);
4631 
4632         send_push_data_and_exchange_packets(&mut client, &mut server, 3, true);
4633         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 3);
4634 
4635         read_response_and_push_events(
4636             &mut client,
4637             &[
4638                 PushPromiseInfo {
4639                     push_id: 5,
4640                     ref_stream_id: request_stream_id,
4641                 },
4642                 PushPromiseInfo {
4643                     push_id: 3,
4644                     ref_stream_id: request_stream_id,
4645                 },
4646             ],
4647             &[3],
4648             request_stream_id,
4649         );
4650         assert_eq!(client.state(), Http3State::Connected);
4651     }
4652 
4653     // Test receiving pushes out of order.
4654     // Push_id 5 is received first and read so that it is removed from the list,
4655     // therefore Push_id 3 will be in the PushState:Init state.
4656     // Start push_id 3 by receiving a push stream with the push_id 3 and then a push_promise.
4657     #[test]
push_out_of_order_3()4658     fn push_out_of_order_3() {
4659         // Connect and send a request
4660         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4661 
4662         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 5);
4663         send_push_data_and_exchange_packets(&mut client, &mut server, 5, true);
4664         assert_eq!(client.state(), Http3State::Connected);
4665 
4666         // Read push stream with push_id 5 to make it change to closed state.
4667         read_response_and_push_events(
4668             &mut client,
4669             &[PushPromiseInfo {
4670                 push_id: 5,
4671                 ref_stream_id: request_stream_id,
4672             }],
4673             &[5],
4674             request_stream_id,
4675         );
4676 
4677         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 3);
4678         send_push_data_and_exchange_packets(&mut client, &mut server, 3, true);
4679 
4680         read_response_and_push_events(
4681             &mut client,
4682             &[PushPromiseInfo {
4683                 push_id: 3,
4684                 ref_stream_id: request_stream_id,
4685             }],
4686             &[3],
4687             request_stream_id,
4688         );
4689         assert_eq!(client.state(), Http3State::Connected);
4690     }
4691 
4692     // The next test is for receiving a second PushPromise when Push is in the PushPromise state.
4693     #[test]
multiple_push_promise()4694     fn multiple_push_promise() {
4695         // Connect and send a request
4696         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4697 
4698         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 5);
4699 
4700         // make a second request.
4701         let request_stream_id_2 = make_request(&mut client, false, &[]);
4702         assert_eq!(request_stream_id_2, 4);
4703 
4704         let out = client.process(None, now());
4705         mem::drop(server.conn.process(out.dgram(), now()));
4706 
4707         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id_2, 5);
4708 
4709         read_response_and_push_events(
4710             &mut client,
4711             &[
4712                 PushPromiseInfo {
4713                     push_id: 5,
4714                     ref_stream_id: request_stream_id,
4715                 },
4716                 PushPromiseInfo {
4717                     push_id: 5,
4718                     ref_stream_id: request_stream_id_2,
4719                 },
4720             ],
4721             &[],
4722             request_stream_id,
4723         );
4724         assert_eq!(client.state(), Http3State::Connected);
4725     }
4726 
4727     // The next test is for receiving a second PushPromise when Push is in the Active state.
4728     #[test]
multiple_push_promise_active()4729     fn multiple_push_promise_active() {
4730         // Connect and send a request
4731         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4732 
4733         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 5);
4734         send_push_data_and_exchange_packets(&mut client, &mut server, 5, true);
4735 
4736         // make a second request.
4737         let request_stream_id_2 = make_request(&mut client, false, &[]);
4738         assert_eq!(request_stream_id_2, 4);
4739 
4740         let out = client.process(None, now());
4741         mem::drop(server.conn.process(out.dgram(), now()));
4742 
4743         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id_2, 5);
4744 
4745         read_response_and_push_events(
4746             &mut client,
4747             &[
4748                 PushPromiseInfo {
4749                     push_id: 5,
4750                     ref_stream_id: request_stream_id,
4751                 },
4752                 PushPromiseInfo {
4753                     push_id: 5,
4754                     ref_stream_id: request_stream_id_2,
4755                 },
4756             ],
4757             &[5],
4758             request_stream_id,
4759         );
4760         assert_eq!(client.state(), Http3State::Connected);
4761     }
4762 
4763     // The next test is for receiving a second PushPromise when the push is already closed.
4764     // PushPromise will be ignored for the push streams that are consumed.
4765     #[test]
multiple_push_promise_closed()4766     fn multiple_push_promise_closed() {
4767         // Connect and send a request
4768         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4769 
4770         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 5);
4771         // Start a push stream with push_id 5.
4772         send_push_data_and_exchange_packets(&mut client, &mut server, 5, true);
4773 
4774         read_response_and_push_events(
4775             &mut client,
4776             &[PushPromiseInfo {
4777                 push_id: 5,
4778                 ref_stream_id: request_stream_id,
4779             }],
4780             &[5],
4781             request_stream_id,
4782         );
4783 
4784         // make a second request.
4785         let request_stream_id_2 = make_request(&mut client, false, &[]);
4786         assert_eq!(request_stream_id_2, 4);
4787 
4788         let out = client.process(None, now());
4789         mem::drop(server.conn.process(out.dgram(), now()));
4790 
4791         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id_2, 5);
4792 
4793         // Check that we do not have a Http3ClientEvent::PushPromise.
4794         let push_event = |e| matches!(e, Http3ClientEvent::PushPromise { .. });
4795         assert!(!client.events().any(push_event));
4796     }
4797 
4798     //  Test that max_push_id is enforced when a push promise frame is received.
4799     #[test]
exceed_max_push_id_promise()4800     fn exceed_max_push_id_promise() {
4801         // Connect and send a request
4802         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4803 
4804         // Send a push promise. max_push_id is set to 5, to trigger an error we send push_id=6.
4805         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 6);
4806 
4807         assert_closed(&client, &Error::HttpId);
4808     }
4809 
4810     // Test that max_push_id is enforced when a push stream is received.
4811     #[test]
exceed_max_push_id_push_stream()4812     fn exceed_max_push_id_push_stream() {
4813         // Connect and send a request
4814         let (mut client, mut server) = connect();
4815 
4816         // Send a push stream. max_push_id is set to 5, to trigger an error we send push_id=6.
4817         send_push_data_and_exchange_packets(&mut client, &mut server, 6, true);
4818 
4819         assert_closed(&client, &Error::HttpId);
4820     }
4821 
4822     // Test that max_push_id is enforced when a cancel push frame is received.
4823     #[test]
exceed_max_push_id_cancel_push()4824     fn exceed_max_push_id_cancel_push() {
4825         // Connect and send a request
4826         let (mut client, mut server, _request_stream_id) = connect_and_send_request(true);
4827 
4828         // Send CANCEL_PUSH for push_id 6.
4829         send_cancel_push_and_exchange_packets(&mut client, &mut server, 6);
4830 
4831         assert_closed(&client, &Error::HttpId);
4832     }
4833 
4834     // Test that max_push_id is enforced when an app calls cancel_push.
4835     #[test]
exceed_max_push_id_cancel_api()4836     fn exceed_max_push_id_cancel_api() {
4837         // Connect and send a request
4838         let (mut client, _, _) = connect_and_send_request(true);
4839 
4840         assert_eq!(client.cancel_push(6), Err(Error::HttpId));
4841         assert_eq!(client.state(), Http3State::Connected);
4842     }
4843 
4844     #[test]
test_max_push_id_frame_update_is_sent()4845     fn test_max_push_id_frame_update_is_sent() {
4846         const MAX_PUSH_ID_FRAME: &[u8] = &[0xd, 0x1, 0x8];
4847 
4848         // Connect and send a request
4849         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4850 
4851         // Send 3 push promises.
4852         send_push_promise(&mut server.conn, request_stream_id, 0);
4853         send_push_promise(&mut server.conn, request_stream_id, 1);
4854         send_push_promise(&mut server.conn, request_stream_id, 2);
4855 
4856         // create 3 push streams.
4857         send_push_data(&mut server.conn, 0, true);
4858         send_push_data(&mut server.conn, 1, true);
4859         send_push_data_and_exchange_packets(&mut client, &mut server, 2, true);
4860 
4861         read_response_and_push_events(
4862             &mut client,
4863             &[
4864                 PushPromiseInfo {
4865                     push_id: 0,
4866                     ref_stream_id: request_stream_id,
4867                 },
4868                 PushPromiseInfo {
4869                     push_id: 1,
4870                     ref_stream_id: request_stream_id,
4871                 },
4872                 PushPromiseInfo {
4873                     push_id: 2,
4874                     ref_stream_id: request_stream_id,
4875                 },
4876             ],
4877             &[0, 1, 2],
4878             request_stream_id,
4879         );
4880 
4881         let out = client.process(None, now());
4882         mem::drop(server.conn.process(out.dgram(), now()));
4883 
4884         // Check max_push_id frame has been received
4885         let control_stream_readable =
4886             |e| matches!(e, ConnectionEvent::RecvStreamReadable{stream_id: x} if x == 2);
4887         assert!(server.conn.events().any(control_stream_readable));
4888         let mut buf = [0_u8; 100];
4889         let (amount, fin) = server.conn.stream_recv(2, &mut buf).unwrap();
4890         assert!(!fin);
4891 
4892         assert_eq!(amount, MAX_PUSH_ID_FRAME.len());
4893         assert_eq!(&buf[..3], MAX_PUSH_ID_FRAME);
4894 
4895         // Check that we can send push_id=8 now
4896         send_push_promise(&mut server.conn, request_stream_id, 8);
4897         send_push_data(&mut server.conn, 8, true);
4898 
4899         let out = server.conn.process(None, now());
4900         let out = client.process(out.dgram(), now());
4901         mem::drop(server.conn.process(out.dgram(), now()));
4902 
4903         assert_eq!(client.state(), Http3State::Connected);
4904 
4905         read_response_and_push_events(
4906             &mut client,
4907             &[PushPromiseInfo {
4908                 push_id: 8,
4909                 ref_stream_id: request_stream_id,
4910             }],
4911             &[8],
4912             request_stream_id,
4913         );
4914 
4915         assert_eq!(client.state(), Http3State::Connected);
4916     }
4917 
4918     // Test that 2 push streams with the same push_id are caught.
4919     #[test]
duplicate_push_stream()4920     fn duplicate_push_stream() {
4921         // Connect and send a request
4922         let (mut client, mut server, _request_stream_id) = connect_and_send_request(true);
4923 
4924         // Start a push stream with push_id 0.
4925         send_push_data_and_exchange_packets(&mut client, &mut server, 0, true);
4926 
4927         // Send it again
4928         send_push_data_and_exchange_packets(&mut client, &mut server, 0, true);
4929 
4930         assert_closed(&client, &Error::HttpId);
4931     }
4932 
4933     // Test that 2 push streams with the same push_id are caught.
4934     #[test]
duplicate_push_stream_active()4935     fn duplicate_push_stream_active() {
4936         // Connect and send a request
4937         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4938 
4939         send_push_promise(&mut server.conn, request_stream_id, 0);
4940         send_push_data_and_exchange_packets(&mut client, &mut server, 0, true);
4941         // Now the push_stream is in the PushState::Active state
4942 
4943         send_push_data_and_exchange_packets(&mut client, &mut server, 0, true);
4944 
4945         assert_closed(&client, &Error::HttpId);
4946     }
4947 
assert_stop_sending_event( server: &mut TestServer, push_stream_id: u64, expected_error: u64, )4948     fn assert_stop_sending_event(
4949         server: &mut TestServer,
4950         push_stream_id: u64,
4951         expected_error: u64,
4952     ) {
4953         assert!(server.conn.events().any(|e| matches!(
4954             e,
4955             ConnectionEvent::SendStreamStopSending {
4956                 stream_id,
4957                 app_error,
4958             } if stream_id == push_stream_id && app_error == expected_error
4959         )));
4960     }
4961 
4962     // Test CANCEL_PUSH frame: after cancel push any new PUSH_PROMISE or push stream will be ignored.
4963     #[test]
cancel_push_ignore_promise()4964     fn cancel_push_ignore_promise() {
4965         // Connect and send a request
4966         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4967 
4968         send_cancel_push_and_exchange_packets(&mut client, &mut server, 0);
4969 
4970         send_push_promise(&mut server.conn, request_stream_id, 0);
4971         // Start a push stream with push_id 0.
4972         let push_stream_id =
4973             send_push_data_and_exchange_packets(&mut client, &mut server, 0, false);
4974 
4975         // Assert that we do not have any push event.
4976         assert!(!check_push_events(&mut client));
4977 
4978         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
4979         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
4980 
4981         // Check that the push has been canceled by the client.
4982         assert_stop_sending_event(
4983             &mut server,
4984             push_stream_id,
4985             Error::HttpRequestCancelled.code(),
4986         );
4987 
4988         assert_eq!(client.state(), Http3State::Connected);
4989     }
4990 
4991     // Test CANCEL_PUSH frame: after cancel push any already received PUSH_PROMISE or push stream
4992     // events will be removed.
4993     #[test]
cancel_push_removes_push_events()4994     fn cancel_push_removes_push_events() {
4995         // Connect and send a request
4996         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
4997 
4998         send_push_promise(&mut server.conn, request_stream_id, 0);
4999         let push_stream_id =
5000             send_push_data_and_exchange_packets(&mut client, &mut server, 0, false);
5001 
5002         send_cancel_push_and_exchange_packets(&mut client, &mut server, 0);
5003 
5004         // Assert that we do not have any push event.
5005         assert!(!check_push_events(&mut client));
5006 
5007         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
5008         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
5009 
5010         // Check that the push has been canceled by the client.
5011         assert_stop_sending_event(
5012             &mut server,
5013             push_stream_id,
5014             Error::HttpRequestCancelled.code(),
5015         );
5016 
5017         assert_eq!(client.state(), Http3State::Connected);
5018     }
5019 
5020     // Test CANCEL_PUSH frame: after cancel push any already received push stream will be canceled.
5021     #[test]
cancel_push_frame_after_push_stream()5022     fn cancel_push_frame_after_push_stream() {
5023         // Connect and send a request
5024         let (mut client, mut server, _) = connect_and_send_request(true);
5025 
5026         // Start a push stream with push_id 0.
5027         let push_stream_id =
5028             send_push_data_and_exchange_packets(&mut client, &mut server, 0, false);
5029 
5030         send_cancel_push_and_exchange_packets(&mut client, &mut server, 0);
5031 
5032         // Assert that we do not have any push event.
5033         assert!(!check_push_events(&mut client));
5034 
5035         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
5036         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
5037 
5038         // Check that the push has been canceled by the client.
5039         assert_stop_sending_event(
5040             &mut server,
5041             push_stream_id,
5042             Error::HttpRequestCancelled.code(),
5043         );
5044 
5045         assert_eq!(client.state(), Http3State::Connected);
5046     }
5047 
5048     // Test a push stream reset after a new PUSH_PROMISE or/and push stream. The events will be ignored.
5049     #[test]
cancel_push_stream_after_push_promise_and_push_stream()5050     fn cancel_push_stream_after_push_promise_and_push_stream() {
5051         // Connect and send a request
5052         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5053 
5054         send_push_promise(&mut server.conn, request_stream_id, 0);
5055         // Start a push stream with push_id 0.
5056         let push_stream_id =
5057             send_push_data_and_exchange_packets(&mut client, &mut server, 0, false);
5058 
5059         server
5060             .conn
5061             .stream_reset_send(push_stream_id, Error::HttpRequestCancelled.code())
5062             .unwrap();
5063         let out = server.conn.process(None, now()).dgram();
5064         client.process(out, now());
5065 
5066         // Assert that we do not have any push event.
5067         assert!(!check_push_events(&mut client));
5068 
5069         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
5070         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
5071 
5072         assert_eq!(client.state(), Http3State::Connected);
5073     }
5074 
5075     // Test that a PUSH_PROMISE will be ignored after a push stream reset.
5076     #[test]
cancel_push_stream_before_push_promise()5077     fn cancel_push_stream_before_push_promise() {
5078         // Connect and send a request
5079         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5080 
5081         // Start a push stream with push_id 0.
5082         let push_stream_id =
5083             send_push_data_and_exchange_packets(&mut client, &mut server, 0, false);
5084 
5085         server
5086             .conn
5087             .stream_reset_send(push_stream_id, Error::HttpRequestCancelled.code())
5088             .unwrap();
5089         let out = server.conn.process(None, now()).dgram();
5090         client.process(out, now());
5091 
5092         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 0);
5093 
5094         // Assert that we do not have any push event.
5095         assert!(!check_push_events(&mut client));
5096 
5097         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
5098         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
5099 
5100         assert_eq!(client.state(), Http3State::Connected);
5101     }
5102 
5103     // Test that push_promise events will be removed after application calls cancel_push.
5104     #[test]
app_cancel_push_after_push_promise()5105     fn app_cancel_push_after_push_promise() {
5106         // Connect and send a request
5107         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5108 
5109         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 0);
5110 
5111         assert!(client.cancel_push(0).is_ok());
5112 
5113         // Assert that we do not have any push event.
5114         assert!(!check_push_events(&mut client));
5115 
5116         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
5117         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
5118 
5119         assert_eq!(client.state(), Http3State::Connected);
5120     }
5121 
5122     // Test that push_promise and push data events will be removed after application calls cancel_push.
5123     #[test]
app_cancel_push_after_push_promise_and_push_stream()5124     fn app_cancel_push_after_push_promise_and_push_stream() {
5125         // Connect and send a request
5126         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5127 
5128         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 0);
5129         let push_stream_id =
5130             send_push_data_and_exchange_packets(&mut client, &mut server, 0, false);
5131 
5132         assert!(client.cancel_push(0).is_ok());
5133         let out = client.process(None, now()).dgram();
5134         mem::drop(server.conn.process(out, now()));
5135 
5136         // Assert that we do not have any push event.
5137         assert!(!check_push_events(&mut client));
5138 
5139         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
5140         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
5141 
5142         // Check that the push has been canceled by the client.
5143         assert_stop_sending_event(
5144             &mut server,
5145             push_stream_id,
5146             Error::HttpRequestCancelled.code(),
5147         );
5148 
5149         assert_eq!(client.state(), Http3State::Connected);
5150     }
5151 
5152     // Test that push_promise events will be ignored after application calls cancel_push.
5153     #[test]
app_cancel_push_before_push_promise()5154     fn app_cancel_push_before_push_promise() {
5155         // Connect and send a request
5156         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5157 
5158         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 0);
5159         let push_stream_id =
5160             send_push_data_and_exchange_packets(&mut client, &mut server, 0, false);
5161 
5162         assert!(client.cancel_push(0).is_ok());
5163         let out = client.process(None, now()).dgram();
5164         mem::drop(server.conn.process(out, now()));
5165 
5166         send_push_promise_and_exchange_packets(&mut client, &mut server, request_stream_id, 0);
5167 
5168         // Assert that we do not have any push event.
5169         assert!(!check_push_events(&mut client));
5170 
5171         // Check that the push has been closed, e.g. calling cancel_push should return InvalidStreamId.
5172         assert_eq!(client.cancel_push(0), Err(Error::InvalidStreamId));
5173 
5174         // Check that the push has been canceled by the client.
5175         assert_stop_sending_event(
5176             &mut server,
5177             push_stream_id,
5178             Error::HttpRequestCancelled.code(),
5179         );
5180 
5181         assert_eq!(client.state(), Http3State::Connected);
5182     }
5183 
setup_server_side_encoder_param( client: &mut Http3Client, server: &mut TestServer, max_blocked_streams: u64, )5184     fn setup_server_side_encoder_param(
5185         client: &mut Http3Client,
5186         server: &mut TestServer,
5187         max_blocked_streams: u64,
5188     ) {
5189         server
5190             .encoder
5191             .borrow_mut()
5192             .set_max_capacity(max_blocked_streams)
5193             .unwrap();
5194         server
5195             .encoder
5196             .borrow_mut()
5197             .set_max_blocked_streams(100)
5198             .unwrap();
5199         server.encoder.borrow_mut().send(&mut server.conn).unwrap();
5200         let out = server.conn.process(None, now());
5201         mem::drop(client.process(out.dgram(), now()));
5202     }
5203 
setup_server_side_encoder(client: &mut Http3Client, server: &mut TestServer)5204     fn setup_server_side_encoder(client: &mut Http3Client, server: &mut TestServer) {
5205         setup_server_side_encoder_param(client, server, 100);
5206     }
5207 
send_push_promise_using_encoder( client: &mut Http3Client, server: &mut TestServer, stream_id: u64, push_id: u64, ) -> Option<Datagram>5208     fn send_push_promise_using_encoder(
5209         client: &mut Http3Client,
5210         server: &mut TestServer,
5211         stream_id: u64,
5212         push_id: u64,
5213     ) -> Option<Datagram> {
5214         send_push_promise_using_encoder_with_custom_headers(
5215             client,
5216             server,
5217             stream_id,
5218             push_id,
5219             Header::new("my-header", "my-value"),
5220         )
5221     }
5222 
send_push_promise_using_encoder_with_custom_headers( client: &mut Http3Client, server: &mut TestServer, stream_id: u64, push_id: u64, additional_header: Header, ) -> Option<Datagram>5223     fn send_push_promise_using_encoder_with_custom_headers(
5224         client: &mut Http3Client,
5225         server: &mut TestServer,
5226         stream_id: u64,
5227         push_id: u64,
5228         additional_header: Header,
5229     ) -> Option<Datagram> {
5230         let mut headers = vec![
5231             Header::new(":method", "GET"),
5232             Header::new(":scheme", "https"),
5233             Header::new(":authority", "something.com"),
5234             Header::new(":path", "/"),
5235             Header::new("content-length", "3"),
5236         ];
5237         headers.push(additional_header);
5238 
5239         let encoded_headers = server
5240             .encoder
5241             .borrow_mut()
5242             .encode_header_block(&mut server.conn, &headers, stream_id)
5243             .unwrap();
5244         let push_promise_frame = HFrame::PushPromise {
5245             push_id,
5246             header_block: encoded_headers.to_vec(),
5247         };
5248 
5249         // Send the encoder instructions, but delay them so that the stream is blocked on decoding headers.
5250         let encoder_inst_pkt = server.conn.process(None, now()).dgram();
5251         assert!(encoder_inst_pkt.is_some());
5252 
5253         let mut d = Encoder::default();
5254         push_promise_frame.encode(&mut d);
5255         server_send_response_and_exchange_packet(client, server, stream_id, &d, false);
5256 
5257         encoder_inst_pkt
5258     }
5259 
5260     #[test]
push_promise_header_decoder_block()5261     fn push_promise_header_decoder_block() {
5262         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5263 
5264         setup_server_side_encoder(&mut client, &mut server);
5265 
5266         let encoder_inst_pkt =
5267             send_push_promise_using_encoder(&mut client, &mut server, request_stream_id, 0);
5268 
5269         // PushPromise is blocked wathing for encoder instructions.
5270         assert!(!check_push_events(&mut client));
5271 
5272         // Let client receive the encoder instructions.
5273         let _out = client.process(encoder_inst_pkt, now());
5274 
5275         // PushPromise is blocked wathing for encoder instructions.
5276         assert!(check_push_events(&mut client));
5277     }
5278 
5279     // If PushPromise is blocked, stream data can still be received.
5280     #[test]
push_promise_blocked_but_stream_is_not_blocked()5281     fn push_promise_blocked_but_stream_is_not_blocked() {
5282         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5283 
5284         setup_server_side_encoder(&mut client, &mut server);
5285 
5286         // Send response headers
5287         server_send_response_and_exchange_packet(
5288             &mut client,
5289             &mut server,
5290             request_stream_id,
5291             HTTP_RESPONSE_HEADER_ONLY_1,
5292             false,
5293         );
5294 
5295         let encoder_inst_pkt =
5296             send_push_promise_using_encoder(&mut client, &mut server, request_stream_id, 0);
5297 
5298         // PushPromise is blocked wathing for encoder instructions.
5299         assert!(!check_push_events(&mut client));
5300 
5301         // Stream data can be still read
5302         server_send_response_and_exchange_packet(
5303             &mut client,
5304             &mut server,
5305             request_stream_id,
5306             HTTP_RESPONSE_DATA_FRAME_1_ONLY_1,
5307             false,
5308         );
5309 
5310         assert!(check_data_readable(&mut client));
5311 
5312         // Let client receive the encoder instructions.
5313         let _out = client.process(encoder_inst_pkt, now());
5314 
5315         // PushPromise is blocked wathing for encoder instructions.
5316         assert!(check_push_events(&mut client));
5317 
5318         // Stream data can be still read
5319         server_send_response_and_exchange_packet(
5320             &mut client,
5321             &mut server,
5322             request_stream_id,
5323             HTTP_RESPONSE_DATA_FRAME_2_ONLY_1,
5324             false,
5325         );
5326 
5327         assert!(check_data_readable(&mut client));
5328     }
5329 
5330     // The response Headers are not block if they do not refer the dynamic table.
5331     #[test]
push_promise_does_not_block_headers()5332     fn push_promise_does_not_block_headers() {
5333         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5334 
5335         setup_server_side_encoder(&mut client, &mut server);
5336 
5337         let encoder_inst_pkt =
5338             send_push_promise_using_encoder(&mut client, &mut server, request_stream_id, 0);
5339 
5340         // PushPromise is blocked wathing for encoder instructions.
5341         assert!(!check_push_events(&mut client));
5342 
5343         // Send response headers
5344         server_send_response_and_exchange_packet(
5345             &mut client,
5346             &mut server,
5347             request_stream_id,
5348             HTTP_RESPONSE_HEADER_ONLY_1,
5349             false,
5350         );
5351 
5352         assert!(check_header_ready(&mut client));
5353 
5354         // Let client receive the encoder instructions.
5355         let _out = client.process(encoder_inst_pkt, now());
5356 
5357         // PushPromise is blocked wathing for encoder instructions.
5358         assert!(check_push_events(&mut client));
5359     }
5360 
5361     // The response Headers are blocked if they refer a dynamic table entry.
5362     #[test]
push_promise_block_headers()5363     fn push_promise_block_headers() {
5364         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5365 
5366         setup_server_side_encoder(&mut client, &mut server);
5367 
5368         // Insert an elemet into a dynamic table.
5369         // insert "content-length: 1234
5370         server
5371             .encoder
5372             .borrow_mut()
5373             .send_and_insert(&mut server.conn, b"content-length", b"1234")
5374             .unwrap();
5375         let encoder_inst_pkt1 = server.conn.process(None, now()).dgram();
5376         let _out = client.process(encoder_inst_pkt1, now());
5377 
5378         // Send a PushPromise that is blocked until encoder_inst_pkt2 is process by the client.
5379         let encoder_inst_pkt2 =
5380             send_push_promise_using_encoder(&mut client, &mut server, request_stream_id, 0);
5381 
5382         // PushPromise is blocked wathing for encoder instructions.
5383         assert!(!check_push_events(&mut client));
5384 
5385         let response_headers = vec![
5386             Header::new(":status", "200"),
5387             Header::new("content-length", "1234"),
5388         ];
5389         let encoded_headers = server
5390             .encoder
5391             .borrow_mut()
5392             .encode_header_block(&mut server.conn, &response_headers, request_stream_id)
5393             .unwrap();
5394         let header_hframe = HFrame::Headers {
5395             header_block: encoded_headers.to_vec(),
5396         };
5397         let mut d = Encoder::default();
5398         header_hframe.encode(&mut d);
5399         server_send_response_and_exchange_packet(
5400             &mut client,
5401             &mut server,
5402             request_stream_id,
5403             &d,
5404             false,
5405         );
5406 
5407         // The response headers are blocked.
5408         assert!(!check_header_ready(&mut client));
5409 
5410         // Let client receive the encoder instructions.
5411         let _out = client.process(encoder_inst_pkt2, now());
5412 
5413         // The response headers are blocked.
5414         assert!(check_header_ready_and_push_promise(&mut client));
5415     }
5416 
5417     // In this test there are 2 push promises that are blocked and the response header is
5418     // blocked as well. After a packet is received only the first push promises is unblocked.
5419     #[test]
two_push_promises_and_header_block()5420     fn two_push_promises_and_header_block() {
5421         let mut client = default_http3_client_param(200);
5422         let mut server = TestServer::new_with_settings(&[
5423             HSetting::new(HSettingType::MaxTableCapacity, 200),
5424             HSetting::new(HSettingType::BlockedStreams, 100),
5425             HSetting::new(HSettingType::MaxHeaderListSize, 10000),
5426         ]);
5427         connect_only_transport_with(&mut client, &mut server);
5428         server.create_control_stream();
5429         server.create_qpack_streams();
5430         setup_server_side_encoder_param(&mut client, &mut server, 200);
5431 
5432         let request_stream_id = make_request_and_exchange_pkts(&mut client, &mut server, true);
5433 
5434         // Send a PushPromise that is blocked until encoder_inst_pkt2 is process by the client.
5435         let encoder_inst_pkt1 = send_push_promise_using_encoder_with_custom_headers(
5436             &mut client,
5437             &mut server,
5438             request_stream_id,
5439             0,
5440             Header::new("myn1", "myv1"),
5441         );
5442 
5443         // PushPromise is blocked wathing for encoder instructions.
5444         assert!(!check_push_events(&mut client));
5445 
5446         let encoder_inst_pkt2 = send_push_promise_using_encoder_with_custom_headers(
5447             &mut client,
5448             &mut server,
5449             request_stream_id,
5450             1,
5451             Header::new("myn2", "myv2"),
5452         );
5453 
5454         // PushPromise is blocked wathing for encoder instructions.
5455         assert!(!check_push_events(&mut client));
5456 
5457         let response_headers = vec![
5458             Header::new(":status", "200"),
5459             Header::new("content-length", "1234"),
5460             Header::new("myn3", "myv3"),
5461         ];
5462         let encoded_headers = server
5463             .encoder
5464             .borrow_mut()
5465             .encode_header_block(&mut server.conn, &response_headers, request_stream_id)
5466             .unwrap();
5467         let header_hframe = HFrame::Headers {
5468             header_block: encoded_headers.to_vec(),
5469         };
5470         let mut d = Encoder::default();
5471         header_hframe.encode(&mut d);
5472         server_send_response_and_exchange_packet(
5473             &mut client,
5474             &mut server,
5475             request_stream_id,
5476             &d,
5477             false,
5478         );
5479 
5480         // The response headers are blocked.
5481         assert!(!check_header_ready(&mut client));
5482 
5483         // Let client receive the encoder instructions.
5484         let _out = client.process(encoder_inst_pkt1, now());
5485 
5486         assert!(check_push_events(&mut client));
5487 
5488         // Let client receive the encoder instructions.
5489         let _out = client.process(encoder_inst_pkt2, now());
5490 
5491         assert!(check_header_ready_and_push_promise(&mut client));
5492     }
5493 
5494     // The PushPromise blocked on header decoding will be canceled if the stream is closed.
5495     #[test]
blocked_push_promises_canceled()5496     fn blocked_push_promises_canceled() {
5497         const STREAM_CANCELED_ID_0: &[u8] = &[0x40];
5498 
5499         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5500 
5501         setup_server_side_encoder(&mut client, &mut server);
5502 
5503         mem::drop(
5504             send_push_promise_using_encoder(&mut client, &mut server, request_stream_id, 0)
5505                 .unwrap(),
5506         );
5507 
5508         server_send_response_and_exchange_packet(
5509             &mut client,
5510             &mut server,
5511             request_stream_id,
5512             HTTP_RESPONSE_1,
5513             true,
5514         );
5515 
5516         // Read response that will make stream change to closed state.
5517         assert!(check_header_ready(&mut client));
5518         let mut buf = [0_u8; 100];
5519         let _ = client
5520             .read_response_data(now(), request_stream_id, &mut buf)
5521             .unwrap();
5522 
5523         let out = client.process(None, now());
5524         mem::drop(server.conn.process(out.dgram(), now()));
5525         // Check that encoder got stream_canceled instruction.
5526         let mut inst = [0_u8; 100];
5527         let (amount, fin) = server
5528             .conn
5529             .stream_recv(CLIENT_SIDE_DECODER_STREAM_ID, &mut inst)
5530             .unwrap();
5531         assert!(!fin);
5532         assert_eq!(amount, STREAM_CANCELED_ID_0.len());
5533         assert_eq!(&inst[..amount], STREAM_CANCELED_ID_0);
5534     }
5535 
5536     #[test]
data_readable_in_decoder_blocked_state()5537     fn data_readable_in_decoder_blocked_state() {
5538         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5539 
5540         setup_server_side_encoder(&mut client, &mut server);
5541 
5542         let headers = vec![
5543             Header::new(":status", "200"),
5544             Header::new("my-header", "my-header"),
5545             Header::new("content-length", "0"),
5546         ];
5547         let encoded_headers = server
5548             .encoder
5549             .borrow_mut()
5550             .encode_header_block(&mut server.conn, &headers, request_stream_id)
5551             .unwrap();
5552         let hframe = HFrame::Headers {
5553             header_block: encoded_headers.to_vec(),
5554         };
5555 
5556         // Delay encoder instruction so that the stream will be blocked.
5557         let encoder_insts = server.conn.process(None, now());
5558 
5559         // Send response headers.
5560         let mut d = Encoder::default();
5561         hframe.encode(&mut d);
5562         server_send_response_and_exchange_packet(
5563             &mut client,
5564             &mut server,
5565             request_stream_id,
5566             &d,
5567             false,
5568         );
5569 
5570         // Headers are blocked waiting fro the encoder instructions.
5571         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
5572         assert!(!client.events().any(header_ready_event));
5573 
5574         // Now send data frame. This will trigger DataRead event.
5575         let mut d = Encoder::default();
5576         hframe.encode(&mut d);
5577         let d_frame = HFrame::Data { len: 0 };
5578         d_frame.encode(&mut d);
5579         server_send_response_and_exchange_packet(
5580             &mut client,
5581             &mut server,
5582             request_stream_id,
5583             &d,
5584             true,
5585         );
5586 
5587         // Now read headers.
5588         mem::drop(client.process(encoder_insts.dgram(), now()));
5589     }
5590 
5591     #[test]
qpack_stream_reset()5592     fn qpack_stream_reset() {
5593         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5594         setup_server_side_encoder(&mut client, &mut server);
5595         // Cancel request.
5596         mem::drop(client.stream_reset(request_stream_id, Error::HttpRequestCancelled.code()));
5597         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 0);
5598         let out = client.process(None, now());
5599         mem::drop(server.conn.process(out.dgram(), now()));
5600         mem::drop(server.encoder_receiver.receive(&mut server.conn));
5601         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 1);
5602     }
5603 
send_headers_using_encoder( client: &mut Http3Client, server: &mut TestServer, request_stream_id: u64, headers: &[Header], data: &[u8], ) -> Option<Datagram>5604     fn send_headers_using_encoder(
5605         client: &mut Http3Client,
5606         server: &mut TestServer,
5607         request_stream_id: u64,
5608         headers: &[Header],
5609         data: &[u8],
5610     ) -> Option<Datagram> {
5611         let encoded_headers = server
5612             .encoder
5613             .borrow_mut()
5614             .encode_header_block(&mut server.conn, &headers, request_stream_id)
5615             .unwrap();
5616         let hframe = HFrame::Headers {
5617             header_block: encoded_headers.to_vec(),
5618         };
5619 
5620         let out = server.conn.process(None, now());
5621 
5622         // Send response
5623         let mut d = Encoder::default();
5624         hframe.encode(&mut d);
5625         let d_frame = HFrame::Data {
5626             len: u64::try_from(data.len()).unwrap(),
5627         };
5628         d_frame.encode(&mut d);
5629         d.encode(data);
5630         server_send_response_and_exchange_packet(client, server, request_stream_id, &d, true);
5631 
5632         out.dgram()
5633     }
5634 
5635     #[test]
qpack_stream_reset_recv()5636     fn qpack_stream_reset_recv() {
5637         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5638         setup_server_side_encoder(&mut client, &mut server);
5639 
5640         // Cancel request.
5641         server
5642             .conn
5643             .stream_reset_send(request_stream_id, Error::HttpRequestCancelled.code())
5644             .unwrap();
5645         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 0);
5646         let out = server.conn.process(None, now());
5647         let out = client.process(out.dgram(), now());
5648         mem::drop(server.conn.process(out.dgram(), now()));
5649         mem::drop(server.encoder_receiver.receive(&mut server.conn));
5650         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 1);
5651     }
5652 
5653     #[test]
qpack_stream_reset_during_header_qpack_blocked()5654     fn qpack_stream_reset_during_header_qpack_blocked() {
5655         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5656 
5657         setup_server_side_encoder(&mut client, &mut server);
5658 
5659         mem::drop(
5660             send_headers_using_encoder(
5661                 &mut client,
5662                 &mut server,
5663                 request_stream_id,
5664                 &[
5665                     Header::new(":status", "200"),
5666                     Header::new("my-header", "my-header"),
5667                     Header::new("content-length", "3"),
5668                 ],
5669                 &[0x61, 0x62, 0x63],
5670             )
5671             .unwrap(),
5672         );
5673 
5674         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
5675         assert!(!client.events().any(header_ready_event));
5676 
5677         // Cancel request.
5678         client
5679             .stream_reset(request_stream_id, Error::HttpRequestCancelled.code())
5680             .unwrap();
5681 
5682         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 0);
5683         let out = client.process(None, now());
5684         mem::drop(server.conn.process(out.dgram(), now()));
5685         let _ = server.encoder_receiver.receive(&mut server.conn).unwrap();
5686         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 1);
5687     }
5688 
5689     #[test]
qpack_no_stream_cancelled_after_fin()5690     fn qpack_no_stream_cancelled_after_fin() {
5691         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5692 
5693         setup_server_side_encoder(&mut client, &mut server);
5694 
5695         let encoder_instruct = send_headers_using_encoder(
5696             &mut client,
5697             &mut server,
5698             request_stream_id,
5699             &[
5700                 Header::new(":status", "200"),
5701                 Header::new("my-header", "my-header"),
5702                 Header::new("content-length", "3"),
5703             ],
5704             &[],
5705         );
5706 
5707         // Exchange encoder instructions
5708         mem::drop(client.process(encoder_instruct, now()));
5709 
5710         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
5711         assert!(client.events().any(header_ready_event));
5712         // After this the recv_stream is in ClosePending state
5713 
5714         // Cancel request.
5715         client
5716             .stream_reset(request_stream_id, Error::HttpRequestCancelled.code())
5717             .unwrap();
5718 
5719         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 0);
5720         let out = client.process(None, now());
5721         mem::drop(server.conn.process(out.dgram(), now()));
5722         let _ = server.encoder_receiver.receive(&mut server.conn).unwrap();
5723         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 0);
5724     }
5725 
5726     #[test]
qpack_stream_reset_push_promise_header_decoder_block()5727     fn qpack_stream_reset_push_promise_header_decoder_block() {
5728         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5729 
5730         setup_server_side_encoder(&mut client, &mut server);
5731 
5732         let headers = vec![
5733             Header::new(":status", "200"),
5734             Header::new("content-length", "3"),
5735         ];
5736         let encoded_headers = server
5737             .encoder
5738             .borrow_mut()
5739             .encode_header_block(&mut server.conn, &headers, request_stream_id)
5740             .unwrap();
5741         let hframe = HFrame::Headers {
5742             header_block: encoded_headers.to_vec(),
5743         };
5744 
5745         // Send the encoder instructions.
5746         let out = server.conn.process(None, now());
5747         mem::drop(client.process(out.dgram(), now()));
5748 
5749         // Send PushPromise that will be blocked waiting for decoder instructions.
5750         mem::drop(
5751             send_push_promise_using_encoder(&mut client, &mut server, request_stream_id, 0)
5752                 .unwrap(),
5753         );
5754 
5755         // Send response
5756         let mut d = Encoder::default();
5757         hframe.encode(&mut d);
5758         let d_frame = HFrame::Data { len: 0 };
5759         d_frame.encode(&mut d);
5760         server_send_response_and_exchange_packet(
5761             &mut client,
5762             &mut server,
5763             request_stream_id,
5764             &d,
5765             true,
5766         );
5767 
5768         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
5769         assert!(client.events().any(header_ready_event));
5770 
5771         // Cancel request.
5772         client
5773             .stream_reset(request_stream_id, Error::HttpRequestCancelled.code())
5774             .unwrap();
5775 
5776         let out = client.process(None, now());
5777         mem::drop(server.conn.process(out.dgram(), now()));
5778         let _ = server.encoder_receiver.receive(&mut server.conn).unwrap();
5779         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 1);
5780     }
5781 
5782     #[test]
qpack_stream_reset_dynamic_table_zero()5783     fn qpack_stream_reset_dynamic_table_zero() {
5784         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5785         // Cancel request.
5786         client
5787             .stream_reset(request_stream_id, Error::HttpRequestCancelled.code())
5788             .unwrap();
5789         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 0);
5790         let out = client.process(None, now());
5791         mem::drop(server.conn.process(out.dgram(), now()));
5792         let _ = server.encoder_receiver.receive(&mut server.conn).unwrap();
5793         assert_eq!(server.encoder.borrow_mut().stats().stream_cancelled_recv, 0);
5794     }
5795 
5796     #[test]
multiple_streams_in_decoder_blocked_state()5797     fn multiple_streams_in_decoder_blocked_state() {
5798         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5799 
5800         setup_server_side_encoder(&mut client, &mut server);
5801 
5802         let headers = vec![
5803             Header::new(":status", "200"),
5804             Header::new("my-header", "my-header"),
5805             Header::new("content-length", "0"),
5806         ];
5807         let encoded_headers = server
5808             .encoder
5809             .borrow_mut()
5810             .encode_header_block(&mut server.conn, &headers, request_stream_id)
5811             .unwrap();
5812         let hframe = HFrame::Headers {
5813             header_block: encoded_headers.to_vec(),
5814         };
5815 
5816         // Delay encoder instruction so that the stream will be blocked.
5817         let encoder_insts = server.conn.process(None, now());
5818 
5819         // Send response headers.
5820         let mut d = Encoder::default();
5821         hframe.encode(&mut d);
5822         server_send_response_and_exchange_packet(
5823             &mut client,
5824             &mut server,
5825             request_stream_id,
5826             &d,
5827             true,
5828         );
5829 
5830         // Headers are blocked waiting for the encoder instructions.
5831         let header_ready_event = |e| matches!(e, Http3ClientEvent::HeaderReady { .. });
5832         assert!(!client.events().any(header_ready_event));
5833 
5834         // Make another request.
5835         let request2 = make_request_and_exchange_pkts(&mut client, &mut server, true);
5836         // Send response headers.
5837         server_send_response_and_exchange_packet(&mut client, &mut server, request2, &d, true);
5838 
5839         // Headers on the second request are blocked as well are blocked
5840         // waiting for the encoder instructions.
5841         assert!(!client.events().any(header_ready_event));
5842 
5843         // Now make the encoder instructions available.
5844         mem::drop(client.process(encoder_insts.dgram(), now()));
5845 
5846         // Header blocks for both streams should be ready.
5847         let mut count_responses = 0;
5848         while let Some(e) = client.next_event() {
5849             if let Http3ClientEvent::HeaderReady { stream_id, .. } = e {
5850                 assert!((stream_id == request_stream_id) || (stream_id == request2));
5851                 count_responses += 1;
5852             }
5853         }
5854         assert_eq!(count_responses, 2);
5855     }
5856 
5857     #[test]
reserved_frames()5858     fn reserved_frames() {
5859         for f in H3_RESERVED_FRAME_TYPES {
5860             let mut enc = Encoder::default();
5861             enc.encode_varint(*f);
5862             test_wrong_frame_on_control_stream(&enc);
5863             test_wrong_frame_on_push_stream(&enc);
5864             test_wrong_frame_on_request_stream(&enc);
5865         }
5866     }
5867 
5868     #[test]
send_reserved_settings()5869     fn send_reserved_settings() {
5870         for s in H3_RESERVED_SETTINGS {
5871             let (mut client, mut server) = connect_only_transport();
5872             let control_stream = server.conn.stream_create(StreamType::UniDi).unwrap();
5873             // Send the control stream type(0x0).
5874             let _ = server
5875                 .conn
5876                 .stream_send(control_stream, CONTROL_STREAM_TYPE)
5877                 .unwrap();
5878             // Create a settings frame of length 2.
5879             let mut enc = Encoder::default();
5880             enc.encode_varint(H3_FRAME_TYPE_SETTINGS);
5881             enc.encode_varint(2_u64);
5882             // The settings frame contains a reserved settings type and some value (0x1).
5883             enc.encode_varint(*s);
5884             enc.encode_varint(1_u64);
5885             let sent = server.conn.stream_send(control_stream, &enc);
5886             assert_eq!(sent, Ok(4));
5887             let out = server.conn.process(None, now());
5888             client.process(out.dgram(), now());
5889             assert_closed(&client, &Error::HttpSettings);
5890         }
5891     }
5892 
5893     #[test]
response_w_1xx()5894     fn response_w_1xx() {
5895         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5896 
5897         setup_server_side_encoder(&mut client, &mut server);
5898 
5899         let mut d = Encoder::default();
5900         let headers1xx = vec![Header::new(":status", "103")];
5901         server.encode_headers(request_stream_id, &headers1xx, &mut d);
5902 
5903         let headers200 = vec![
5904             Header::new(":status", "200"),
5905             Header::new("my-header", "my-header"),
5906             Header::new("content-length", "3"),
5907         ];
5908         server.encode_headers(request_stream_id, &headers200, &mut d);
5909 
5910         // Send 1xx and 200 headers response.
5911         server_send_response_and_exchange_packet(
5912             &mut client,
5913             &mut server,
5914             request_stream_id,
5915             &d,
5916             false,
5917         );
5918 
5919         // Sending response data.
5920         server_send_response_and_exchange_packet(
5921             &mut client,
5922             &mut server,
5923             request_stream_id,
5924             HTTP_RESPONSE_DATA_FRAME_ONLY_2,
5925             true,
5926         );
5927 
5928         let mut events = client.events().filter_map(|e| {
5929             if let Http3ClientEvent::HeaderReady {
5930                 stream_id,
5931                 interim,
5932                 headers,
5933                 ..
5934             } = e
5935             {
5936                 Some((stream_id, interim, headers))
5937             } else {
5938                 None
5939             }
5940         });
5941         let (stream_id_1xx_rec, interim1xx_rec, headers1xx_rec) = events.next().unwrap();
5942         assert_eq!(
5943             (stream_id_1xx_rec, interim1xx_rec, headers1xx_rec),
5944             (request_stream_id, true, headers1xx)
5945         );
5946 
5947         let (stream_id_200_rec, interim200_rec, headers200_rec) = events.next().unwrap();
5948         assert_eq!(
5949             (stream_id_200_rec, interim200_rec, headers200_rec),
5950             (request_stream_id, false, headers200)
5951         );
5952         assert!(events.next().is_none());
5953     }
5954 
5955     #[test]
response_wo_status()5956     fn response_wo_status() {
5957         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
5958 
5959         setup_server_side_encoder(&mut client, &mut server);
5960 
5961         let mut d = Encoder::default();
5962         let headers = vec![
5963             Header::new("my-header", "my-header"),
5964             Header::new("content-length", "3"),
5965         ];
5966         server.encode_headers(request_stream_id, &headers, &mut d);
5967 
5968         // Send response
5969         server_send_response_and_exchange_packet(
5970             &mut client,
5971             &mut server,
5972             request_stream_id,
5973             &d,
5974             false,
5975         );
5976 
5977         // Stream has been reset because of the malformed headers.
5978         let e = client.events().next().unwrap();
5979         assert_eq!(
5980             e,
5981             Http3ClientEvent::Reset {
5982                 stream_id: request_stream_id,
5983                 error: Error::InvalidHeader.code(),
5984                 local: true,
5985             }
5986         );
5987 
5988         let out = client.process(None, now()).dgram();
5989         mem::drop(server.conn.process(out, now()));
5990 
5991         // Check that server has received a reset.
5992         let stop_sending_event = |e| {
5993             matches!(e, ConnectionEvent::SendStreamStopSending {
5994             stream_id,
5995             app_error
5996         } if stream_id == request_stream_id && app_error == Error::InvalidHeader.code())
5997         };
5998         assert!(server.conn.events().any(stop_sending_event));
5999 
6000         // Stream should now be closed and gone
6001         let mut buf = [0_u8; 100];
6002         assert_eq!(
6003             client.read_response_data(now(), 0, &mut buf),
6004             Err(Error::InvalidStreamId)
6005         );
6006     }
6007 
6008     // Client: receive a push stream
6009     #[test]
push_single_with_1xx()6010     fn push_single_with_1xx() {
6011         const FIRST_PUSH_ID: u64 = 0;
6012         // Connect and send a request
6013         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
6014 
6015         // Send a push promise.
6016         send_push_promise(&mut server.conn, request_stream_id, FIRST_PUSH_ID);
6017         // Create a push stream
6018         let push_stream_id = server.conn.stream_create(StreamType::UniDi).unwrap();
6019 
6020         let mut d = Encoder::default();
6021         let headers1xx = vec![Header::new(":status", "101")];
6022         server.encode_headers(push_stream_id, &headers1xx, &mut d);
6023 
6024         let headers200 = vec![
6025             Header::new(":status", "200"),
6026             Header::new("my-header", "my-header"),
6027             Header::new("content-length", "3"),
6028         ];
6029         server.encode_headers(push_stream_id, &headers200, &mut d);
6030 
6031         // create a push stream.
6032         send_data_on_push(
6033             &mut server.conn,
6034             push_stream_id,
6035             u8::try_from(FIRST_PUSH_ID).unwrap(),
6036             &d,
6037             true,
6038         );
6039 
6040         server_send_response_and_exchange_packet(
6041             &mut client,
6042             &mut server,
6043             request_stream_id,
6044             HTTP_RESPONSE_2,
6045             true,
6046         );
6047 
6048         let mut events = client.events().filter_map(|e| {
6049             if let Http3ClientEvent::PushHeaderReady {
6050                 push_id,
6051                 interim,
6052                 headers,
6053                 ..
6054             } = e
6055             {
6056                 Some((push_id, interim, headers))
6057             } else {
6058                 None
6059             }
6060         });
6061 
6062         let (push_id_1xx_rec, interim1xx_rec, headers1xx_rec) = events.next().unwrap();
6063         assert_eq!(
6064             (push_id_1xx_rec, interim1xx_rec, headers1xx_rec),
6065             (FIRST_PUSH_ID, true, headers1xx)
6066         );
6067 
6068         let (push_id_200_rec, interim200_rec, headers200_rec) = events.next().unwrap();
6069         assert_eq!(
6070             (push_id_200_rec, interim200_rec, headers200_rec),
6071             (FIRST_PUSH_ID, false, headers200)
6072         );
6073         assert!(events.next().is_none());
6074     }
6075 
6076     // Client: receive a push stream
6077     #[test]
push_single_wo_status()6078     fn push_single_wo_status() {
6079         const FIRST_PUSH_ID: u64 = 0;
6080         // Connect and send a request
6081         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
6082 
6083         // Send a push promise.
6084         send_push_promise(&mut server.conn, request_stream_id, FIRST_PUSH_ID);
6085         // Create a push stream
6086         let push_stream_id = server.conn.stream_create(StreamType::UniDi).unwrap();
6087 
6088         let mut d = Encoder::default();
6089         let headers = vec![
6090             Header::new("my-header", "my-header"),
6091             Header::new("content-length", "3"),
6092         ];
6093         server.encode_headers(request_stream_id, &headers, &mut d);
6094 
6095         send_data_on_push(
6096             &mut server.conn,
6097             push_stream_id,
6098             u8::try_from(FIRST_PUSH_ID).unwrap(),
6099             &d,
6100             false,
6101         );
6102 
6103         server_send_response_and_exchange_packet(
6104             &mut client,
6105             &mut server,
6106             request_stream_id,
6107             HTTP_RESPONSE_2,
6108             true,
6109         );
6110 
6111         // Stream has been reset because of thei malformed headers.
6112         let push_reset_event = |e| {
6113             matches!(e, Http3ClientEvent::PushReset {
6114             push_id,
6115             error,
6116         } if push_id == FIRST_PUSH_ID && error == Error::InvalidHeader.code())
6117         };
6118 
6119         assert!(client.events().any(push_reset_event));
6120 
6121         let out = client.process(None, now()).dgram();
6122         mem::drop(server.conn.process(out, now()));
6123 
6124         // Check that server has received a reset.
6125         let stop_sending_event = |e| {
6126             matches!(e, ConnectionEvent::SendStreamStopSending {
6127             stream_id,
6128             app_error
6129         } if stream_id == push_stream_id && app_error == Error::InvalidHeader.code())
6130         };
6131         assert!(server.conn.events().any(stop_sending_event));
6132     }
6133 
handshake_client_error(client: &mut Http3Client, server: &mut TestServer, error: &Error)6134     fn handshake_client_error(client: &mut Http3Client, server: &mut TestServer, error: &Error) {
6135         let out = handshake_only(client, server);
6136         client.process(out.dgram(), now());
6137         assert_closed(&client, error);
6138     }
6139 
6140     /// Client fails to create a control stream, since server does not allow it.
6141     #[test]
client_control_stream_create_failed()6142     fn client_control_stream_create_failed() {
6143         let mut client = default_http3_client();
6144         let mut server = TestServer::new();
6145         server.set_max_uni_stream(0);
6146         handshake_client_error(&mut client, &mut server, &Error::StreamLimitError);
6147     }
6148 
6149     /// 2 streams isn't enough for control and QPACK streams.
6150     #[test]
client_qpack_stream_create_failed()6151     fn client_qpack_stream_create_failed() {
6152         let mut client = default_http3_client();
6153         let mut server = TestServer::new();
6154         server.set_max_uni_stream(2);
6155         handshake_client_error(&mut client, &mut server, &Error::StreamLimitError);
6156     }
6157 
do_malformed_response_test(headers: &[Header])6158     fn do_malformed_response_test(headers: &[Header]) {
6159         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
6160 
6161         setup_server_side_encoder(&mut client, &mut server);
6162 
6163         let mut d = Encoder::default();
6164         server.encode_headers(request_stream_id, &headers, &mut d);
6165 
6166         // Send response
6167         server_send_response_and_exchange_packet(
6168             &mut client,
6169             &mut server,
6170             request_stream_id,
6171             &d,
6172             false,
6173         );
6174 
6175         // Stream has been reset because of the malformed headers.
6176         let e = client.events().next().unwrap();
6177         assert_eq!(
6178             e,
6179             Http3ClientEvent::Reset {
6180                 stream_id: request_stream_id,
6181                 error: Error::InvalidHeader.code(),
6182                 local: true,
6183             }
6184         );
6185     }
6186 
6187     #[test]
malformed_response_pseudo_header_after_regular_header()6188     fn malformed_response_pseudo_header_after_regular_header() {
6189         do_malformed_response_test(&[
6190             Header::new("content-type", "text/plain"),
6191             Header::new(":status", "100"),
6192         ]);
6193     }
6194 
6195     #[test]
malformed_response_undefined_pseudo_header()6196     fn malformed_response_undefined_pseudo_header() {
6197         do_malformed_response_test(&[Header::new(":status", "200"), Header::new(":cheese", "200")]);
6198     }
6199 
6200     #[test]
malformed_response_duplicate_pseudo_header()6201     fn malformed_response_duplicate_pseudo_header() {
6202         do_malformed_response_test(&[
6203             Header::new(":status", "200"),
6204             Header::new(":status", "100"),
6205             Header::new("content-type", "text/plain"),
6206         ]);
6207     }
6208 
6209     #[test]
malformed_response_uppercase_header()6210     fn malformed_response_uppercase_header() {
6211         do_malformed_response_test(&[
6212             Header::new(":status", "200"),
6213             Header::new("content-Type", "text/plain"),
6214         ]);
6215     }
6216 
6217     #[test]
malformed_response_excluded_header()6218     fn malformed_response_excluded_header() {
6219         let (mut client, mut server, request_stream_id) = connect_and_send_request(true);
6220 
6221         setup_server_side_encoder(&mut client, &mut server);
6222 
6223         let mut d = Encoder::default();
6224         server.encode_headers(
6225             request_stream_id,
6226             &[
6227                 Header::new(":status", "200"),
6228                 Header::new("content-type", "text/plain"),
6229                 Header::new("connection", "close"),
6230             ],
6231             &mut d,
6232         );
6233 
6234         // Send response
6235         server_send_response_and_exchange_packet(
6236             &mut client,
6237             &mut server,
6238             request_stream_id,
6239             &d,
6240             false,
6241         );
6242 
6243         // Stream has been reset because of the malformed headers.
6244         let e = client.events().next().unwrap();
6245         assert_eq!(
6246             e,
6247             Http3ClientEvent::HeaderReady {
6248                 stream_id: request_stream_id,
6249                 headers: vec!(
6250                     Header::new(":status", "200"),
6251                     Header::new("content-type", "text/plain")
6252                 ),
6253                 interim: false,
6254                 fin: false,
6255             }
6256         );
6257     }
6258 
6259     #[test]
malformed_response_excluded_byte_in_header()6260     fn malformed_response_excluded_byte_in_header() {
6261         do_malformed_response_test(&[
6262             Header::new(":status", "200"),
6263             Header::new("content:type", "text/plain"),
6264         ]);
6265     }
6266 
6267     #[test]
malformed_response_request_header_in_response()6268     fn malformed_response_request_header_in_response() {
6269         do_malformed_response_test(&[
6270             Header::new(":status", "200"),
6271             Header::new(":method", "GET"),
6272             Header::new("content-type", "text/plain"),
6273         ]);
6274     }
6275 
maybe_authenticate(conn: &mut Http3Client)6276     fn maybe_authenticate(conn: &mut Http3Client) {
6277         let authentication_needed = |e| matches!(e, Http3ClientEvent::AuthenticationNeeded);
6278         if conn.events().any(authentication_needed) {
6279             conn.authenticated(AuthenticationStatus::Ok, now());
6280         }
6281     }
6282 
6283     const MAX_TABLE_SIZE: u64 = 65536;
6284     const MAX_BLOCKED_STREAMS: u16 = 5;
6285 
get_resumption_token(server: &mut Http3Server) -> ResumptionToken6286     fn get_resumption_token(server: &mut Http3Server) -> ResumptionToken {
6287         let mut client = default_http3_client_param(MAX_TABLE_SIZE);
6288 
6289         let mut datagram = None;
6290         let is_done = |c: &Http3Client| matches!(c.state(), Http3State::Connected);
6291         while !is_done(&mut client) {
6292             maybe_authenticate(&mut client);
6293             datagram = client.process(datagram, now()).dgram();
6294             datagram = server.process(datagram, now()).dgram();
6295         }
6296 
6297         // exchange qpack settings, server will send a token as well.
6298         datagram = client.process(datagram, now()).dgram();
6299         datagram = server.process(datagram, now()).dgram();
6300         mem::drop(client.process(datagram, now()).dgram());
6301 
6302         client
6303             .events()
6304             .find_map(|e| {
6305                 if let Http3ClientEvent::ResumptionToken(token) = e {
6306                     Some(token)
6307                 } else {
6308                     None
6309                 }
6310             })
6311             .unwrap()
6312     }
6313 
6314     // Test that decoder stream type is always sent before any other instruction also
6315     // in case when 0RTT is used.
6316     // A client will send a request that uses the dynamic table. This will trigger a header-ack
6317     // from a server. We will use stats to check that a header-ack has been received.
6318     #[test]
zerortt_request_use_dynamic_table()6319     fn zerortt_request_use_dynamic_table() {
6320         let mut server = Http3Server::new(
6321             now(),
6322             DEFAULT_KEYS,
6323             DEFAULT_ALPN_H3,
6324             anti_replay(),
6325             Rc::new(RefCell::new(CountingConnectionIdGenerator::default())),
6326             QpackSettings {
6327                 max_table_size_encoder: MAX_TABLE_SIZE,
6328                 max_table_size_decoder: MAX_TABLE_SIZE,
6329                 max_blocked_streams: MAX_BLOCKED_STREAMS,
6330             },
6331             None,
6332         )
6333         .unwrap();
6334 
6335         let token = get_resumption_token(&mut server);
6336         // Make a new connection.
6337         let mut client = default_http3_client_param(MAX_TABLE_SIZE);
6338         assert_eq!(client.state(), Http3State::Initializing);
6339         client
6340             .enable_resumption(now(), &token)
6341             .expect("Set resumption token.");
6342 
6343         assert_eq!(client.state(), Http3State::ZeroRtt);
6344         let zerortt_event = |e| matches!(e, Http3ClientEvent::StateChange(Http3State::ZeroRtt));
6345         assert!(client.events().any(zerortt_event));
6346 
6347         // Make a request that uses the dynamic table.
6348         let _ = make_request(&mut client, true, &[Header::new("myheaders", "myvalue")]);
6349         // Assert that the request has used dynamic table. That will trigger a header_ack.
6350         assert_eq!(client.qpack_encoder_stats().dynamic_table_references, 1);
6351 
6352         // Exchange packets until header-ack is received.
6353         // These many packet exchange is needed, to get a header-ack.
6354         // TODO this may be optimize at Http3Server.
6355         let out = client.process(None, now()).dgram();
6356         let out = server.process(out, now()).dgram();
6357         let out = client.process(out, now()).dgram();
6358         let out = server.process(out, now()).dgram();
6359         let out = client.process(out, now()).dgram();
6360         let out = server.process(out, now()).dgram();
6361         let out = client.process(out, now()).dgram();
6362         let out = server.process(out, now()).dgram();
6363         mem::drop(client.process(out, now()));
6364 
6365         // The header ack for the first request has been received.
6366         assert_eq!(client.qpack_encoder_stats().header_acks_recv, 1);
6367     }
6368 
manipulate_conrol_stream(client: &mut Http3Client, stream_id: u64)6369     fn manipulate_conrol_stream(client: &mut Http3Client, stream_id: u64) {
6370         assert_eq!(
6371             client
6372                 .stream_reset(stream_id, Error::HttpNoError.code())
6373                 .unwrap_err(),
6374             Error::InvalidStreamId
6375         );
6376         assert_eq!(
6377             client.stream_close_send(stream_id).unwrap_err(),
6378             Error::InvalidStreamId
6379         );
6380         let mut buf = [0; 2];
6381         assert_eq!(
6382             client.send_request_body(stream_id, &buf).unwrap_err(),
6383             Error::InvalidStreamId
6384         );
6385         assert_eq!(
6386             client
6387                 .read_response_data(now(), stream_id, &mut buf)
6388                 .unwrap_err(),
6389             Error::InvalidStreamId
6390         );
6391     }
6392 
6393     #[test]
manipulate_conrol_streams()6394     fn manipulate_conrol_streams() {
6395         let (mut client, server, request_stream_id) = connect_and_send_request(false);
6396         manipulate_conrol_stream(&mut client, CLIENT_SIDE_CONTROL_STREAM_ID);
6397         manipulate_conrol_stream(&mut client, CLIENT_SIDE_ENCODER_STREAM_ID);
6398         manipulate_conrol_stream(&mut client, CLIENT_SIDE_DECODER_STREAM_ID);
6399         manipulate_conrol_stream(&mut client, server.control_stream_id.unwrap());
6400         manipulate_conrol_stream(&mut client, server.encoder_stream_id.unwrap());
6401         manipulate_conrol_stream(&mut client, server.decoder_stream_id.unwrap());
6402         client
6403             .stream_reset(request_stream_id, Error::HttpNoError.code())
6404             .unwrap();
6405     }
6406 
6407     // Client: receive a push stream
6408     #[test]
incomple_push_stream()6409     fn incomple_push_stream() {
6410         let (mut client, mut server) = connect();
6411 
6412         // Create a push stream
6413         let push_stream_id = server.conn.stream_create(StreamType::UniDi).unwrap();
6414         let _ = server
6415             .conn
6416             .stream_send(push_stream_id, PUSH_STREAM_TYPE)
6417             .unwrap();
6418         let _ = server.conn.stream_send(push_stream_id, &[0]).unwrap();
6419         server.conn.stream_close_send(push_stream_id).unwrap();
6420         let out = server.conn.process(None, now());
6421         client.process(out.dgram(), now());
6422         assert_closed(&client, &Error::HttpGeneralProtocol);
6423     }
6424 }
6425