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