1use std::collections::HashSet;
286use std::collections::VecDeque;
287
288#[cfg(feature = "sfv")]
289use std::convert::TryFrom;
290use std::fmt;
291use std::fmt::Write;
292
293#[cfg(feature = "qlog")]
294use qlog::events::h3::H3FrameCreated;
295#[cfg(feature = "qlog")]
296use qlog::events::h3::H3FrameParsed;
297#[cfg(feature = "qlog")]
298use qlog::events::h3::H3Owner;
299#[cfg(feature = "qlog")]
300use qlog::events::h3::H3PriorityTargetStreamType;
301#[cfg(feature = "qlog")]
302use qlog::events::h3::H3StreamType;
303#[cfg(feature = "qlog")]
304use qlog::events::h3::H3StreamTypeSet;
305#[cfg(feature = "qlog")]
306use qlog::events::h3::Http3EventType;
307#[cfg(feature = "qlog")]
308use qlog::events::h3::Http3Frame;
309#[cfg(feature = "qlog")]
310use qlog::events::EventData;
311#[cfg(feature = "qlog")]
312use qlog::events::EventImportance;
313#[cfg(feature = "qlog")]
314use qlog::events::EventType;
315
316use crate::range_buf::BufFactory;
317use crate::BufSplit;
318
319pub const APPLICATION_PROTOCOL: &[&[u8]] = &[b"h3"];
327
328const PRIORITY_URGENCY_OFFSET: u8 = 124;
330
331const PRIORITY_URGENCY_LOWER_BOUND: u8 = 0;
335const PRIORITY_URGENCY_UPPER_BOUND: u8 = 7;
336const PRIORITY_URGENCY_DEFAULT: u8 = 3;
337const PRIORITY_INCREMENTAL_DEFAULT: bool = false;
338
339#[cfg(feature = "qlog")]
340const QLOG_FRAME_CREATED: EventType =
341 EventType::Http3EventType(Http3EventType::FrameCreated);
342#[cfg(feature = "qlog")]
343const QLOG_FRAME_PARSED: EventType =
344 EventType::Http3EventType(Http3EventType::FrameParsed);
345#[cfg(feature = "qlog")]
346const QLOG_STREAM_TYPE_SET: EventType =
347 EventType::Http3EventType(Http3EventType::StreamTypeSet);
348
349pub type Result<T> = std::result::Result<T, Error>;
356
357#[derive(Clone, Copy, Debug, PartialEq, Eq)]
359pub enum Error {
360 Done,
362
363 BufferTooShort,
365
366 InternalError,
368
369 ExcessiveLoad,
372
373 IdError,
377
378 StreamCreationError,
381
382 ClosedCriticalStream,
384
385 MissingSettings,
387
388 FrameUnexpected,
390
391 FrameError,
393
394 QpackDecompressionFailed,
396
397 TransportError(crate::Error),
399
400 StreamBlocked,
403
404 SettingsError,
406
407 RequestRejected,
409
410 RequestCancelled,
412
413 RequestIncomplete,
416
417 MessageError,
419
420 ConnectError,
423
424 VersionFallback,
427}
428
429#[derive(Copy, Clone, Debug, Eq, PartialEq)]
433pub enum WireErrorCode {
434 NoError = 0x100,
437 GeneralProtocolError = 0x101,
441 InternalError = 0x102,
443 StreamCreationError = 0x103,
446 ClosedCriticalStream = 0x104,
448 FrameUnexpected = 0x105,
451 FrameError = 0x106,
454 ExcessiveLoad = 0x107,
457 IdError = 0x108,
460 SettingsError = 0x109,
462 MissingSettings = 0x10a,
464 RequestRejected = 0x10b,
467 RequestCancelled = 0x10c,
469 RequestIncomplete = 0x10d,
472 MessageError = 0x10e,
474 ConnectError = 0x10f,
477 VersionFallback = 0x110,
480}
481
482impl Error {
483 fn to_wire(self) -> u64 {
484 match self {
485 Error::Done => WireErrorCode::NoError as u64,
486 Error::InternalError => WireErrorCode::InternalError as u64,
487 Error::StreamCreationError =>
488 WireErrorCode::StreamCreationError as u64,
489 Error::ClosedCriticalStream =>
490 WireErrorCode::ClosedCriticalStream as u64,
491 Error::FrameUnexpected => WireErrorCode::FrameUnexpected as u64,
492 Error::FrameError => WireErrorCode::FrameError as u64,
493 Error::ExcessiveLoad => WireErrorCode::ExcessiveLoad as u64,
494 Error::IdError => WireErrorCode::IdError as u64,
495 Error::MissingSettings => WireErrorCode::MissingSettings as u64,
496 Error::QpackDecompressionFailed => 0x200,
497 Error::BufferTooShort => 0x999,
498 Error::TransportError { .. } | Error::StreamBlocked => 0xFF,
499 Error::SettingsError => WireErrorCode::SettingsError as u64,
500 Error::RequestRejected => WireErrorCode::RequestRejected as u64,
501 Error::RequestCancelled => WireErrorCode::RequestCancelled as u64,
502 Error::RequestIncomplete => WireErrorCode::RequestIncomplete as u64,
503 Error::MessageError => WireErrorCode::MessageError as u64,
504 Error::ConnectError => WireErrorCode::ConnectError as u64,
505 Error::VersionFallback => WireErrorCode::VersionFallback as u64,
506 }
507 }
508
509 #[cfg(feature = "ffi")]
510 fn to_c(self) -> libc::ssize_t {
511 match self {
512 Error::Done => -1,
513 Error::BufferTooShort => -2,
514 Error::InternalError => -3,
515 Error::ExcessiveLoad => -4,
516 Error::IdError => -5,
517 Error::StreamCreationError => -6,
518 Error::ClosedCriticalStream => -7,
519 Error::MissingSettings => -8,
520 Error::FrameUnexpected => -9,
521 Error::FrameError => -10,
522 Error::QpackDecompressionFailed => -11,
523 Error::StreamBlocked => -13,
525 Error::SettingsError => -14,
526 Error::RequestRejected => -15,
527 Error::RequestCancelled => -16,
528 Error::RequestIncomplete => -17,
529 Error::MessageError => -18,
530 Error::ConnectError => -19,
531 Error::VersionFallback => -20,
532
533 Error::TransportError(quic_error) => quic_error.to_c() - 1000,
534 }
535 }
536}
537
538impl fmt::Display for Error {
539 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
540 write!(f, "{self:?}")
541 }
542}
543
544impl std::error::Error for Error {
545 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
546 None
547 }
548}
549
550impl From<super::Error> for Error {
551 fn from(err: super::Error) -> Self {
552 match err {
553 super::Error::Done => Error::Done,
554
555 _ => Error::TransportError(err),
556 }
557 }
558}
559
560impl From<octets::BufferTooShortError> for Error {
561 fn from(_err: octets::BufferTooShortError) -> Self {
562 Error::BufferTooShort
563 }
564}
565
566pub struct Config {
568 max_field_section_size: Option<u64>,
569 qpack_max_table_capacity: Option<u64>,
570 qpack_blocked_streams: Option<u64>,
571 connect_protocol_enabled: Option<u64>,
572 additional_settings: Option<Vec<(u64, u64)>>,
575}
576
577impl Config {
578 pub const fn new() -> Result<Config> {
580 Ok(Config {
581 max_field_section_size: None,
582 qpack_max_table_capacity: None,
583 qpack_blocked_streams: None,
584 connect_protocol_enabled: None,
585 additional_settings: None,
586 })
587 }
588
589 pub fn set_max_field_section_size(&mut self, v: u64) {
599 self.max_field_section_size = Some(v);
600 }
601
602 pub fn set_qpack_max_table_capacity(&mut self, v: u64) {
606 self.qpack_max_table_capacity = Some(v);
607 }
608
609 pub fn set_qpack_blocked_streams(&mut self, v: u64) {
613 self.qpack_blocked_streams = Some(v);
614 }
615
616 pub fn enable_extended_connect(&mut self, enabled: bool) {
620 if enabled {
621 self.connect_protocol_enabled = Some(1);
622 } else {
623 self.connect_protocol_enabled = None;
624 }
625 }
626
627 pub fn set_additional_settings(
647 &mut self, additional_settings: Vec<(u64, u64)>,
648 ) -> Result<()> {
649 let explicit_quiche_settings = HashSet::from([
650 frame::SETTINGS_QPACK_MAX_TABLE_CAPACITY,
651 frame::SETTINGS_MAX_FIELD_SECTION_SIZE,
652 frame::SETTINGS_QPACK_BLOCKED_STREAMS,
653 frame::SETTINGS_ENABLE_CONNECT_PROTOCOL,
654 frame::SETTINGS_H3_DATAGRAM,
655 frame::SETTINGS_H3_DATAGRAM_00,
656 ]);
657
658 let dedup_settings: HashSet<u64> =
659 additional_settings.iter().map(|(key, _)| *key).collect();
660
661 if dedup_settings.len() != additional_settings.len() ||
662 !explicit_quiche_settings.is_disjoint(&dedup_settings)
663 {
664 return Err(Error::SettingsError);
665 }
666 self.additional_settings = Some(additional_settings);
667 Ok(())
668 }
669}
670
671pub trait NameValue {
673 fn name(&self) -> &[u8];
675
676 fn value(&self) -> &[u8];
678}
679
680impl<N, V> NameValue for (N, V)
681where
682 N: AsRef<[u8]>,
683 V: AsRef<[u8]>,
684{
685 fn name(&self) -> &[u8] {
686 self.0.as_ref()
687 }
688
689 fn value(&self) -> &[u8] {
690 self.1.as_ref()
691 }
692}
693
694#[derive(Clone, PartialEq, Eq)]
696pub struct Header(Vec<u8>, Vec<u8>);
697
698fn try_print_as_readable(hdr: &[u8], f: &mut fmt::Formatter) -> fmt::Result {
699 match std::str::from_utf8(hdr) {
700 Ok(s) => f.write_str(&s.escape_default().to_string()),
701 Err(_) => write!(f, "{hdr:?}"),
702 }
703}
704
705impl fmt::Debug for Header {
706 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
707 f.write_char('"')?;
708 try_print_as_readable(&self.0, f)?;
709 f.write_str(": ")?;
710 try_print_as_readable(&self.1, f)?;
711 f.write_char('"')
712 }
713}
714
715impl Header {
716 pub fn new(name: &[u8], value: &[u8]) -> Self {
720 Self(name.to_vec(), value.to_vec())
721 }
722}
723
724impl NameValue for Header {
725 fn name(&self) -> &[u8] {
726 &self.0
727 }
728
729 fn value(&self) -> &[u8] {
730 &self.1
731 }
732}
733
734#[derive(Clone, Debug, PartialEq, Eq)]
736pub struct HeaderRef<'a>(&'a [u8], &'a [u8]);
737
738impl<'a> HeaderRef<'a> {
739 pub const fn new(name: &'a [u8], value: &'a [u8]) -> Self {
741 Self(name, value)
742 }
743}
744
745impl NameValue for HeaderRef<'_> {
746 fn name(&self) -> &[u8] {
747 self.0
748 }
749
750 fn value(&self) -> &[u8] {
751 self.1
752 }
753}
754
755#[derive(Clone, Debug, PartialEq, Eq)]
757pub enum Event {
758 Headers {
760 list: Vec<Header>,
763
764 more_frames: bool,
766 },
767
768 Data,
780
781 Finished,
783
784 Reset(u64),
788
789 PriorityUpdate,
803
804 GoAway,
806}
807
808#[derive(Clone, Copy, Debug, PartialEq, Eq)]
815#[repr(C)]
816pub struct Priority {
817 urgency: u8,
818 incremental: bool,
819}
820
821impl Default for Priority {
822 fn default() -> Self {
823 Priority {
824 urgency: PRIORITY_URGENCY_DEFAULT,
825 incremental: PRIORITY_INCREMENTAL_DEFAULT,
826 }
827 }
828}
829
830impl Priority {
831 pub const fn new(urgency: u8, incremental: bool) -> Self {
833 Priority {
834 urgency,
835 incremental,
836 }
837 }
838}
839
840#[cfg(feature = "sfv")]
841#[cfg_attr(docsrs, doc(cfg(feature = "sfv")))]
842impl TryFrom<&[u8]> for Priority {
843 type Error = Error;
844
845 fn try_from(value: &[u8]) -> std::result::Result<Self, Self::Error> {
861 let dict = match sfv::Parser::parse_dictionary(value) {
862 Ok(v) => v,
863
864 Err(_) => return Err(Error::Done),
865 };
866
867 let urgency = match dict.get("u") {
868 Some(sfv::ListEntry::Item(item)) => match item.bare_item.as_int() {
874 Some(v) => {
875 if !(PRIORITY_URGENCY_LOWER_BOUND as i64..=
876 PRIORITY_URGENCY_UPPER_BOUND as i64)
877 .contains(&v)
878 {
879 PRIORITY_URGENCY_UPPER_BOUND
880 } else {
881 v as u8
882 }
883 },
884
885 None => return Err(Error::Done),
886 },
887
888 Some(sfv::ListEntry::InnerList(_)) => return Err(Error::Done),
889
890 None => PRIORITY_URGENCY_DEFAULT,
892 };
893
894 let incremental = match dict.get("i") {
895 Some(sfv::ListEntry::Item(item)) =>
896 item.bare_item.as_bool().ok_or(Error::Done)?,
897
898 _ => false,
900 };
901
902 Ok(Priority::new(urgency, incremental))
903 }
904}
905
906struct ConnectionSettings {
907 pub max_field_section_size: Option<u64>,
908 pub qpack_max_table_capacity: Option<u64>,
909 pub qpack_blocked_streams: Option<u64>,
910 pub connect_protocol_enabled: Option<u64>,
911 pub h3_datagram: Option<u64>,
912 pub additional_settings: Option<Vec<(u64, u64)>>,
913 pub raw: Option<Vec<(u64, u64)>>,
914}
915
916#[derive(Default)]
917struct QpackStreams {
918 pub encoder_stream_id: Option<u64>,
919 pub encoder_stream_bytes: u64,
920 pub decoder_stream_id: Option<u64>,
921 pub decoder_stream_bytes: u64,
922}
923
924#[derive(Clone, Default)]
930pub struct Stats {
931 pub qpack_encoder_stream_recv_bytes: u64,
933 pub qpack_decoder_stream_recv_bytes: u64,
935}
936
937fn close_conn_critical_stream<F: BufFactory>(
938 conn: &mut super::Connection<F>,
939) -> Result<()> {
940 conn.close(
941 true,
942 Error::ClosedCriticalStream.to_wire(),
943 b"Critical stream closed.",
944 )?;
945
946 Err(Error::ClosedCriticalStream)
947}
948
949fn close_conn_if_critical_stream_finished<F: BufFactory>(
950 conn: &mut super::Connection<F>, stream_id: u64,
951) -> Result<()> {
952 if conn.stream_finished(stream_id) {
953 close_conn_critical_stream(conn)?;
954 }
955
956 Ok(())
957}
958
959pub struct Connection {
961 is_server: bool,
962
963 next_request_stream_id: u64,
964 next_uni_stream_id: u64,
965
966 streams: crate::stream::StreamIdHashMap<stream::Stream>,
967
968 local_settings: ConnectionSettings,
969 peer_settings: ConnectionSettings,
970
971 control_stream_id: Option<u64>,
972 peer_control_stream_id: Option<u64>,
973
974 qpack_encoder: qpack::Encoder,
975 qpack_decoder: qpack::Decoder,
976
977 local_qpack_streams: QpackStreams,
978 peer_qpack_streams: QpackStreams,
979
980 max_push_id: u64,
981
982 finished_streams: VecDeque<u64>,
983
984 frames_greased: bool,
985
986 local_goaway_id: Option<u64>,
987 peer_goaway_id: Option<u64>,
988}
989
990impl Connection {
991 fn new(
992 config: &Config, is_server: bool, enable_dgram: bool,
993 ) -> Result<Connection> {
994 let initial_uni_stream_id = if is_server { 0x3 } else { 0x2 };
995 let h3_datagram = if enable_dgram { Some(1) } else { None };
996
997 Ok(Connection {
998 is_server,
999
1000 next_request_stream_id: 0,
1001
1002 next_uni_stream_id: initial_uni_stream_id,
1003
1004 streams: Default::default(),
1005
1006 local_settings: ConnectionSettings {
1007 max_field_section_size: config.max_field_section_size,
1008 qpack_max_table_capacity: config.qpack_max_table_capacity,
1009 qpack_blocked_streams: config.qpack_blocked_streams,
1010 connect_protocol_enabled: config.connect_protocol_enabled,
1011 h3_datagram,
1012 additional_settings: config.additional_settings.clone(),
1013 raw: Default::default(),
1014 },
1015
1016 peer_settings: ConnectionSettings {
1017 max_field_section_size: None,
1018 qpack_max_table_capacity: None,
1019 qpack_blocked_streams: None,
1020 h3_datagram: None,
1021 connect_protocol_enabled: None,
1022 additional_settings: Default::default(),
1023 raw: Default::default(),
1024 },
1025
1026 control_stream_id: None,
1027 peer_control_stream_id: None,
1028
1029 qpack_encoder: qpack::Encoder::new(),
1030 qpack_decoder: qpack::Decoder::new(),
1031
1032 local_qpack_streams: Default::default(),
1033 peer_qpack_streams: Default::default(),
1034
1035 max_push_id: 0,
1036
1037 finished_streams: VecDeque::new(),
1038
1039 frames_greased: false,
1040
1041 local_goaway_id: None,
1042 peer_goaway_id: None,
1043 })
1044 }
1045
1046 pub fn with_transport<F: BufFactory>(
1063 conn: &mut super::Connection<F>, config: &Config,
1064 ) -> Result<Connection> {
1065 let is_client = !conn.is_server;
1066 if is_client && !(conn.is_established() || conn.is_in_early_data()) {
1067 trace!("{} QUIC connection must be established or in early data before creating an HTTP/3 connection", conn.trace_id());
1068 return Err(Error::InternalError);
1069 }
1070
1071 let mut http3_conn =
1072 Connection::new(config, conn.is_server, conn.dgram_enabled())?;
1073
1074 match http3_conn.send_settings(conn) {
1075 Ok(_) => (),
1076
1077 Err(e) => {
1078 conn.close(true, e.to_wire(), b"Error opening control stream")?;
1079 return Err(e);
1080 },
1081 };
1082
1083 http3_conn.open_qpack_encoder_stream(conn).ok();
1086 http3_conn.open_qpack_decoder_stream(conn).ok();
1087
1088 if conn.grease {
1089 http3_conn.open_grease_stream(conn).ok();
1092 }
1093
1094 Ok(http3_conn)
1095 }
1096
1097 pub fn send_request<T: NameValue, F: BufFactory>(
1114 &mut self, conn: &mut super::Connection<F>, headers: &[T], fin: bool,
1115 ) -> Result<u64> {
1116 if self.peer_goaway_id.is_some() {
1119 return Err(Error::FrameUnexpected);
1120 }
1121
1122 let stream_id = self.next_request_stream_id;
1123
1124 self.streams
1125 .insert(stream_id, <stream::Stream>::new(stream_id, true));
1126
1127 if let Err(e) = conn.stream_send(stream_id, b"", false) {
1132 self.streams.remove(&stream_id);
1133
1134 if e == super::Error::Done {
1135 return Err(Error::StreamBlocked);
1136 }
1137
1138 return Err(e.into());
1139 };
1140
1141 self.send_headers(conn, stream_id, headers, fin)?;
1142
1143 self.next_request_stream_id = self
1146 .next_request_stream_id
1147 .checked_add(4)
1148 .ok_or(Error::IdError)?;
1149
1150 Ok(stream_id)
1151 }
1152
1153 pub fn send_response<T: NameValue, F: BufFactory>(
1191 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1192 headers: &[T], fin: bool,
1193 ) -> Result<()> {
1194 let priority = Default::default();
1195
1196 self.send_response_with_priority(
1197 conn, stream_id, headers, &priority, fin,
1198 )?;
1199
1200 Ok(())
1201 }
1202
1203 pub fn send_response_with_priority<T: NameValue, F: BufFactory>(
1247 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1248 headers: &[T], priority: &Priority, fin: bool,
1249 ) -> Result<()> {
1250 match self.streams.get(&stream_id) {
1251 Some(s) => {
1252 if s.local_initialized() {
1254 return Err(Error::FrameUnexpected);
1255 }
1256
1257 s
1258 },
1259
1260 None => return Err(Error::FrameUnexpected),
1261 };
1262
1263 self.send_headers(conn, stream_id, headers, fin)?;
1264
1265 let urgency = priority
1267 .urgency
1268 .clamp(PRIORITY_URGENCY_LOWER_BOUND, PRIORITY_URGENCY_UPPER_BOUND) +
1269 PRIORITY_URGENCY_OFFSET;
1270
1271 conn.stream_priority(stream_id, urgency, priority.incremental)?;
1272
1273 Ok(())
1274 }
1275
1276 pub fn send_additional_headers<T: NameValue, F: BufFactory>(
1303 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1304 headers: &[T], is_trailer_section: bool, fin: bool,
1305 ) -> Result<()> {
1306 if !self.is_server && !is_trailer_section {
1308 return Err(Error::FrameUnexpected);
1309 }
1310
1311 match self.streams.get(&stream_id) {
1312 Some(s) => {
1313 if !s.local_initialized() {
1315 return Err(Error::FrameUnexpected);
1316 }
1317
1318 if s.trailers_sent() {
1320 return Err(Error::FrameUnexpected);
1321 }
1322
1323 s
1324 },
1325
1326 None => return Err(Error::FrameUnexpected),
1327 };
1328
1329 self.send_headers(conn, stream_id, headers, fin)?;
1330
1331 if is_trailer_section {
1332 if let Some(s) = self.streams.get_mut(&stream_id) {
1335 s.mark_trailers_sent();
1336 }
1337 }
1338
1339 Ok(())
1340 }
1341
1342 pub fn send_additional_headers_with_priority<T: NameValue, F: BufFactory>(
1374 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1375 headers: &[T], priority: &Priority, is_trailer_section: bool, fin: bool,
1376 ) -> Result<()> {
1377 self.send_additional_headers(
1378 conn,
1379 stream_id,
1380 headers,
1381 is_trailer_section,
1382 fin,
1383 )?;
1384
1385 let urgency = priority
1387 .urgency
1388 .clamp(PRIORITY_URGENCY_LOWER_BOUND, PRIORITY_URGENCY_UPPER_BOUND) +
1389 PRIORITY_URGENCY_OFFSET;
1390
1391 conn.stream_priority(stream_id, urgency, priority.incremental)?;
1392
1393 Ok(())
1394 }
1395
1396 fn encode_header_block<T: NameValue>(
1397 &mut self, headers: &[T],
1398 ) -> Result<Vec<u8>> {
1399 let headers_len = headers
1400 .iter()
1401 .fold(0, |acc, h| acc + h.value().len() + h.name().len() + 32);
1402
1403 let mut header_block = vec![0; headers_len];
1404 let len = self
1405 .qpack_encoder
1406 .encode(headers, &mut header_block)
1407 .map_err(|_| Error::InternalError)?;
1408
1409 header_block.truncate(len);
1410
1411 Ok(header_block)
1412 }
1413
1414 fn send_headers<T: NameValue, F: BufFactory>(
1415 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1416 headers: &[T], fin: bool,
1417 ) -> Result<()> {
1418 let mut d = [42; 10];
1419 let mut b = octets::OctetsMut::with_slice(&mut d);
1420
1421 if !self.frames_greased && conn.grease {
1422 self.send_grease_frames(conn, stream_id)?;
1423 self.frames_greased = true;
1424 }
1425
1426 let header_block = self.encode_header_block(headers)?;
1427
1428 let overhead = octets::varint_len(frame::HEADERS_FRAME_TYPE_ID) +
1429 octets::varint_len(header_block.len() as u64);
1430
1431 match conn.stream_writable(stream_id, overhead + header_block.len()) {
1434 Ok(true) => (),
1435
1436 Ok(false) => return Err(Error::StreamBlocked),
1437
1438 Err(e) => {
1439 if conn.stream_finished(stream_id) {
1440 self.streams.remove(&stream_id);
1441 }
1442
1443 return Err(e.into());
1444 },
1445 };
1446
1447 b.put_varint(frame::HEADERS_FRAME_TYPE_ID)?;
1448 b.put_varint(header_block.len() as u64)?;
1449 let off = b.off();
1450 conn.stream_send(stream_id, &d[..off], false)?;
1451
1452 conn.stream_send(stream_id, &header_block, fin)?;
1454
1455 trace!(
1456 "{} tx frm HEADERS stream={} len={} fin={}",
1457 conn.trace_id(),
1458 stream_id,
1459 header_block.len(),
1460 fin
1461 );
1462
1463 qlog_with_type!(QLOG_FRAME_CREATED, conn.qlog, q, {
1464 let qlog_headers = headers
1465 .iter()
1466 .map(|h| qlog::events::h3::HttpHeader {
1467 name: String::from_utf8_lossy(h.name()).into_owned(),
1468 value: String::from_utf8_lossy(h.value()).into_owned(),
1469 })
1470 .collect();
1471
1472 let frame = Http3Frame::Headers {
1473 headers: qlog_headers,
1474 };
1475 let ev_data = EventData::H3FrameCreated(H3FrameCreated {
1476 stream_id,
1477 length: Some(header_block.len() as u64),
1478 frame,
1479 ..Default::default()
1480 });
1481
1482 q.add_event_data_now(ev_data).ok();
1483 });
1484
1485 if let Some(s) = self.streams.get_mut(&stream_id) {
1486 s.initialize_local();
1487 }
1488
1489 if fin && conn.stream_finished(stream_id) {
1490 self.streams.remove(&stream_id);
1491 }
1492
1493 Ok(())
1494 }
1495
1496 pub fn send_body<F: BufFactory>(
1511 &mut self, conn: &mut super::Connection<F>, stream_id: u64, body: &[u8],
1512 fin: bool,
1513 ) -> Result<usize> {
1514 self.do_send_body(
1515 conn,
1516 stream_id,
1517 body,
1518 fin,
1519 |conn: &mut super::Connection<F>,
1520 header: &[u8],
1521 stream_id: u64,
1522 body: &[u8],
1523 body_len: usize,
1524 fin: bool| {
1525 conn.stream_send(stream_id, header, false)?;
1526 Ok(conn
1527 .stream_send(stream_id, &body[..body_len], fin)
1528 .map(|v| (v, v))?)
1529 },
1530 )
1531 }
1532
1533 pub fn send_body_zc<F>(
1552 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1553 body: &mut F::Buf, fin: bool,
1554 ) -> Result<usize>
1555 where
1556 F: BufFactory,
1557 F::Buf: BufSplit,
1558 {
1559 self.do_send_body(
1560 conn,
1561 stream_id,
1562 body,
1563 fin,
1564 |conn: &mut super::Connection<F>,
1565 header: &[u8],
1566 stream_id: u64,
1567 body: &mut F::Buf,
1568 mut body_len: usize,
1569 fin: bool| {
1570 let with_prefix = body.try_add_prefix(header);
1571 if !with_prefix {
1572 conn.stream_send(stream_id, header, false)?;
1573 } else {
1574 body_len += header.len();
1575 }
1576
1577 let (mut n, rem) = conn.stream_send_zc(
1578 stream_id,
1579 body.clone(),
1580 Some(body_len),
1581 fin,
1582 )?;
1583
1584 if with_prefix {
1585 n -= header.len();
1586 }
1587
1588 if let Some(rem) = rem {
1589 let _ = std::mem::replace(body, rem);
1590 }
1591
1592 Ok((n, n))
1593 },
1594 )
1595 }
1596
1597 fn do_send_body<F, B, R, SND>(
1598 &mut self, conn: &mut super::Connection<F>, stream_id: u64, body: B,
1599 fin: bool, write_fn: SND,
1600 ) -> Result<R>
1601 where
1602 F: BufFactory,
1603 B: AsRef<[u8]>,
1604 SND: FnOnce(
1605 &mut super::Connection<F>,
1606 &[u8],
1607 u64,
1608 B,
1609 usize,
1610 bool,
1611 ) -> Result<(usize, R)>,
1612 {
1613 let mut d = [42; 10];
1614 let mut b = octets::OctetsMut::with_slice(&mut d);
1615
1616 let len = body.as_ref().len();
1617
1618 if stream_id % 4 != 0 {
1620 return Err(Error::FrameUnexpected);
1621 }
1622
1623 match self.streams.get_mut(&stream_id) {
1624 Some(s) => {
1625 if !s.local_initialized() {
1626 return Err(Error::FrameUnexpected);
1627 }
1628
1629 if s.trailers_sent() {
1630 return Err(Error::FrameUnexpected);
1631 }
1632 },
1633
1634 None => {
1635 return Err(Error::FrameUnexpected);
1636 },
1637 };
1638
1639 if len == 0 && !fin {
1641 return Err(Error::Done);
1642 }
1643
1644 let overhead = octets::varint_len(frame::DATA_FRAME_TYPE_ID) +
1645 octets::varint_len(len as u64);
1646
1647 let stream_cap = match conn.stream_capacity(stream_id) {
1648 Ok(v) => v,
1649
1650 Err(e) => {
1651 if conn.stream_finished(stream_id) {
1652 self.streams.remove(&stream_id);
1653 }
1654
1655 return Err(e.into());
1656 },
1657 };
1658
1659 if stream_cap < overhead {
1661 let _ = conn.stream_writable(stream_id, overhead + 1);
1662 return Err(Error::Done);
1663 }
1664
1665 let body_len = std::cmp::min(len, stream_cap - overhead);
1667
1668 let fin = if body_len != len { false } else { fin };
1671
1672 if body_len == 0 && !fin {
1674 let _ = conn.stream_writable(stream_id, overhead + 1);
1675 return Err(Error::Done);
1676 }
1677
1678 b.put_varint(frame::DATA_FRAME_TYPE_ID)?;
1679 b.put_varint(body_len as u64)?;
1680 let off = b.off();
1681
1682 let (written, ret) =
1685 write_fn(conn, &d[..off], stream_id, body, body_len, fin)?;
1686
1687 trace!(
1688 "{} tx frm DATA stream={} len={} fin={}",
1689 conn.trace_id(),
1690 stream_id,
1691 written,
1692 fin
1693 );
1694
1695 qlog_with_type!(QLOG_FRAME_CREATED, conn.qlog, q, {
1696 let frame = Http3Frame::Data { raw: None };
1697 let ev_data = EventData::H3FrameCreated(H3FrameCreated {
1698 stream_id,
1699 length: Some(written as u64),
1700 frame,
1701 ..Default::default()
1702 });
1703
1704 q.add_event_data_now(ev_data).ok();
1705 });
1706
1707 if written < len {
1708 let _ = conn.stream_writable(stream_id, overhead + 1);
1715 }
1716
1717 if fin && written == len && conn.stream_finished(stream_id) {
1718 self.streams.remove(&stream_id);
1719 }
1720
1721 Ok(ret)
1722 }
1723
1724 pub fn dgram_enabled_by_peer<F: BufFactory>(
1732 &self, conn: &super::Connection<F>,
1733 ) -> bool {
1734 self.peer_settings.h3_datagram == Some(1) &&
1735 conn.dgram_max_writable_len().is_some()
1736 }
1737
1738 pub fn extended_connect_enabled_by_peer(&self) -> bool {
1746 self.peer_settings.connect_protocol_enabled == Some(1)
1747 }
1748
1749 pub fn recv_body<F: BufFactory>(
1761 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1762 out: &mut [u8],
1763 ) -> Result<usize> {
1764 let mut total = 0;
1765
1766 while total < out.len() {
1769 let stream = self.streams.get_mut(&stream_id).ok_or(Error::Done)?;
1770
1771 if stream.state() != stream::State::Data {
1772 break;
1773 }
1774
1775 let (read, fin) =
1776 match stream.try_consume_data(conn, &mut out[total..]) {
1777 Ok(v) => v,
1778
1779 Err(Error::Done) => break,
1780
1781 Err(e) => return Err(e),
1782 };
1783
1784 total += read;
1785
1786 if read == 0 || fin {
1788 break;
1789 }
1790
1791 match self.process_readable_stream(conn, stream_id, false) {
1796 Ok(_) => unreachable!(),
1797
1798 Err(Error::Done) => (),
1799
1800 Err(e) => return Err(e),
1801 };
1802
1803 if conn.stream_finished(stream_id) {
1804 break;
1805 }
1806 }
1807
1808 if conn.stream_finished(stream_id) {
1811 self.process_finished_stream(stream_id);
1812 }
1813
1814 if total == 0 {
1815 return Err(Error::Done);
1816 }
1817
1818 Ok(total)
1819 }
1820
1821 pub fn send_priority_update_for_request<F: BufFactory>(
1836 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
1837 priority: &Priority,
1838 ) -> Result<()> {
1839 let mut d = [42; 20];
1840 let mut b = octets::OctetsMut::with_slice(&mut d);
1841
1842 if self.is_server {
1844 return Err(Error::FrameUnexpected);
1845 }
1846
1847 if stream_id % 4 != 0 {
1848 return Err(Error::FrameUnexpected);
1849 }
1850
1851 let control_stream_id =
1852 self.control_stream_id.ok_or(Error::FrameUnexpected)?;
1853
1854 let urgency = priority
1855 .urgency
1856 .clamp(PRIORITY_URGENCY_LOWER_BOUND, PRIORITY_URGENCY_UPPER_BOUND);
1857
1858 let mut field_value = format!("u={urgency}");
1859
1860 if priority.incremental {
1861 field_value.push_str(",i");
1862 }
1863
1864 let priority_field_value = field_value.as_bytes();
1865 let frame_payload_len =
1866 octets::varint_len(stream_id) + priority_field_value.len();
1867
1868 let overhead =
1869 octets::varint_len(frame::PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID) +
1870 octets::varint_len(stream_id) +
1871 octets::varint_len(frame_payload_len as u64);
1872
1873 match conn.stream_writable(
1875 control_stream_id,
1876 overhead + priority_field_value.len(),
1877 ) {
1878 Ok(true) => (),
1879
1880 Ok(false) => return Err(Error::StreamBlocked),
1881
1882 Err(e) => {
1883 return Err(e.into());
1884 },
1885 }
1886
1887 b.put_varint(frame::PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID)?;
1888 b.put_varint(frame_payload_len as u64)?;
1889 b.put_varint(stream_id)?;
1890 let off = b.off();
1891 conn.stream_send(control_stream_id, &d[..off], false)?;
1892
1893 conn.stream_send(control_stream_id, priority_field_value, false)?;
1895
1896 trace!(
1897 "{} tx frm PRIORITY_UPDATE request_stream={} priority_field_value={}",
1898 conn.trace_id(),
1899 stream_id,
1900 field_value,
1901 );
1902
1903 qlog_with_type!(QLOG_FRAME_CREATED, conn.qlog, q, {
1904 let frame = Http3Frame::PriorityUpdate {
1905 target_stream_type: H3PriorityTargetStreamType::Request,
1906 prioritized_element_id: stream_id,
1907 priority_field_value: field_value.clone(),
1908 };
1909
1910 let ev_data = EventData::H3FrameCreated(H3FrameCreated {
1911 stream_id,
1912 length: Some(priority_field_value.len() as u64),
1913 frame,
1914 ..Default::default()
1915 });
1916
1917 q.add_event_data_now(ev_data).ok();
1918 });
1919
1920 Ok(())
1921 }
1922
1923 pub fn take_last_priority_update(
1938 &mut self, prioritized_element_id: u64,
1939 ) -> Result<Vec<u8>> {
1940 if let Some(stream) = self.streams.get_mut(&prioritized_element_id) {
1941 return stream.take_last_priority_update().ok_or(Error::Done);
1942 }
1943
1944 Err(Error::Done)
1945 }
1946
1947 pub fn poll<F: BufFactory>(
1985 &mut self, conn: &mut super::Connection<F>,
1986 ) -> Result<(u64, Event)> {
1987 if conn.local_error.is_some() {
1991 return Err(Error::Done);
1992 }
1993
1994 if let Some(stream_id) = self.peer_control_stream_id {
1996 match self.process_control_stream(conn, stream_id) {
1997 Ok(ev) => return Ok(ev),
1998
1999 Err(Error::Done) => (),
2000
2001 Err(e) => return Err(e),
2002 };
2003 }
2004
2005 if let Some(stream_id) = self.peer_qpack_streams.encoder_stream_id {
2006 match self.process_control_stream(conn, stream_id) {
2007 Ok(ev) => return Ok(ev),
2008
2009 Err(Error::Done) => (),
2010
2011 Err(e) => return Err(e),
2012 };
2013 }
2014
2015 if let Some(stream_id) = self.peer_qpack_streams.decoder_stream_id {
2016 match self.process_control_stream(conn, stream_id) {
2017 Ok(ev) => return Ok(ev),
2018
2019 Err(Error::Done) => (),
2020
2021 Err(e) => return Err(e),
2022 };
2023 }
2024
2025 if let Some(finished) = self.finished_streams.pop_front() {
2027 return Ok((finished, Event::Finished));
2028 }
2029
2030 for s in conn.readable() {
2032 trace!("{} stream id {} is readable", conn.trace_id(), s);
2033
2034 let ev = match self.process_readable_stream(conn, s, true) {
2035 Ok(v) => Some(v),
2036
2037 Err(Error::Done) => None,
2038
2039 Err(Error::TransportError(crate::Error::StreamReset(e))) =>
2042 return Ok((s, Event::Reset(e))),
2043
2044 Err(e) => return Err(e),
2045 };
2046
2047 if conn.stream_finished(s) {
2048 self.process_finished_stream(s);
2049 }
2050
2051 if let Some(ev) = ev {
2053 return Ok(ev);
2054 }
2055 }
2056
2057 if let Some(finished) = self.finished_streams.pop_front() {
2061 if conn.stream_readable(finished) {
2062 if let Err(crate::Error::StreamReset(e)) =
2065 conn.stream_recv(finished, &mut [])
2066 {
2067 return Ok((finished, Event::Reset(e)));
2068 }
2069 }
2070 return Ok((finished, Event::Finished));
2071 }
2072
2073 Err(Error::Done)
2074 }
2075
2076 pub fn send_goaway<F: BufFactory>(
2088 &mut self, conn: &mut super::Connection<F>, id: u64,
2089 ) -> Result<()> {
2090 let mut id = id;
2091
2092 if !self.is_server {
2096 id = 0;
2097 }
2098
2099 if self.is_server && id % 4 != 0 {
2100 return Err(Error::IdError);
2101 }
2102
2103 if let Some(sent_id) = self.local_goaway_id {
2104 if id > sent_id {
2105 return Err(Error::IdError);
2106 }
2107 }
2108
2109 if let Some(stream_id) = self.control_stream_id {
2110 let mut d = [42; 10];
2111 let mut b = octets::OctetsMut::with_slice(&mut d);
2112
2113 let frame = frame::Frame::GoAway { id };
2114
2115 let wire_len = frame.to_bytes(&mut b)?;
2116 let stream_cap = conn.stream_capacity(stream_id)?;
2117
2118 if stream_cap < wire_len {
2119 return Err(Error::StreamBlocked);
2120 }
2121
2122 trace!("{} tx frm {:?}", conn.trace_id(), frame);
2123
2124 qlog_with_type!(QLOG_FRAME_CREATED, conn.qlog, q, {
2125 let ev_data = EventData::H3FrameCreated(H3FrameCreated {
2126 stream_id,
2127 length: Some(octets::varint_len(id) as u64),
2128 frame: frame.to_qlog(),
2129 ..Default::default()
2130 });
2131
2132 q.add_event_data_now(ev_data).ok();
2133 });
2134
2135 let off = b.off();
2136 conn.stream_send(stream_id, &d[..off], false)?;
2137
2138 self.local_goaway_id = Some(id);
2139 }
2140
2141 Ok(())
2142 }
2143
2144 pub fn peer_settings_raw(&self) -> Option<&[(u64, u64)]> {
2148 self.peer_settings.raw.as_deref()
2149 }
2150
2151 fn open_uni_stream<F: BufFactory>(
2152 &mut self, conn: &mut super::Connection<F>, ty: u64,
2153 ) -> Result<u64> {
2154 let stream_id = self.next_uni_stream_id;
2155
2156 let mut d = [0; 8];
2157 let mut b = octets::OctetsMut::with_slice(&mut d);
2158
2159 match ty {
2160 stream::HTTP3_CONTROL_STREAM_TYPE_ID |
2162 stream::QPACK_ENCODER_STREAM_TYPE_ID |
2163 stream::QPACK_DECODER_STREAM_TYPE_ID => {
2164 conn.stream_priority(stream_id, 0, false)?;
2165 },
2166
2167 stream::HTTP3_PUSH_STREAM_TYPE_ID => (),
2169
2170 _ => {
2172 conn.stream_priority(stream_id, 255, false)?;
2173 },
2174 }
2175
2176 conn.stream_send(stream_id, b.put_varint(ty)?, false)?;
2177
2178 self.next_uni_stream_id = self
2181 .next_uni_stream_id
2182 .checked_add(4)
2183 .ok_or(Error::IdError)?;
2184
2185 Ok(stream_id)
2186 }
2187
2188 fn open_qpack_encoder_stream<F: BufFactory>(
2189 &mut self, conn: &mut super::Connection<F>,
2190 ) -> Result<()> {
2191 let stream_id =
2192 self.open_uni_stream(conn, stream::QPACK_ENCODER_STREAM_TYPE_ID)?;
2193
2194 self.local_qpack_streams.encoder_stream_id = Some(stream_id);
2195
2196 qlog_with_type!(QLOG_STREAM_TYPE_SET, conn.qlog, q, {
2197 let ev_data = EventData::H3StreamTypeSet(H3StreamTypeSet {
2198 stream_id,
2199 owner: Some(H3Owner::Local),
2200 stream_type: H3StreamType::QpackEncode,
2201 ..Default::default()
2202 });
2203
2204 q.add_event_data_now(ev_data).ok();
2205 });
2206
2207 Ok(())
2208 }
2209
2210 fn open_qpack_decoder_stream<F: BufFactory>(
2211 &mut self, conn: &mut super::Connection<F>,
2212 ) -> Result<()> {
2213 let stream_id =
2214 self.open_uni_stream(conn, stream::QPACK_DECODER_STREAM_TYPE_ID)?;
2215
2216 self.local_qpack_streams.decoder_stream_id = Some(stream_id);
2217
2218 qlog_with_type!(QLOG_STREAM_TYPE_SET, conn.qlog, q, {
2219 let ev_data = EventData::H3StreamTypeSet(H3StreamTypeSet {
2220 stream_id,
2221 owner: Some(H3Owner::Local),
2222 stream_type: H3StreamType::QpackDecode,
2223 ..Default::default()
2224 });
2225
2226 q.add_event_data_now(ev_data).ok();
2227 });
2228
2229 Ok(())
2230 }
2231
2232 fn send_grease_frames<F: BufFactory>(
2234 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
2235 ) -> Result<()> {
2236 let mut d = [0; 8];
2237
2238 let stream_cap = match conn.stream_capacity(stream_id) {
2239 Ok(v) => v,
2240
2241 Err(e) => {
2242 if conn.stream_finished(stream_id) {
2243 self.streams.remove(&stream_id);
2244 }
2245
2246 return Err(e.into());
2247 },
2248 };
2249
2250 let grease_frame1 = grease_value();
2251 let grease_frame2 = grease_value();
2252 let grease_payload = b"GREASE is the word";
2253
2254 let overhead = octets::varint_len(grease_frame1) + 1 + octets::varint_len(grease_frame2) + 1 + grease_payload.len(); if stream_cap < overhead {
2263 return Ok(());
2264 }
2265
2266 let mut b = octets::OctetsMut::with_slice(&mut d);
2268 conn.stream_send(stream_id, b.put_varint(grease_frame1)?, false)?;
2269
2270 let mut b = octets::OctetsMut::with_slice(&mut d);
2271 conn.stream_send(stream_id, b.put_varint(0)?, false)?;
2272
2273 trace!(
2274 "{} tx frm GREASE stream={} len=0",
2275 conn.trace_id(),
2276 stream_id
2277 );
2278
2279 qlog_with_type!(QLOG_FRAME_CREATED, conn.qlog, q, {
2280 let frame = Http3Frame::Reserved { length: Some(0) };
2281 let ev_data = EventData::H3FrameCreated(H3FrameCreated {
2282 stream_id,
2283 length: Some(0),
2284 frame,
2285 ..Default::default()
2286 });
2287
2288 q.add_event_data_now(ev_data).ok();
2289 });
2290
2291 let mut b = octets::OctetsMut::with_slice(&mut d);
2293 conn.stream_send(stream_id, b.put_varint(grease_frame2)?, false)?;
2294
2295 let mut b = octets::OctetsMut::with_slice(&mut d);
2296 conn.stream_send(stream_id, b.put_varint(18)?, false)?;
2297
2298 conn.stream_send(stream_id, grease_payload, false)?;
2299
2300 trace!(
2301 "{} tx frm GREASE stream={} len={}",
2302 conn.trace_id(),
2303 stream_id,
2304 grease_payload.len()
2305 );
2306
2307 qlog_with_type!(QLOG_FRAME_CREATED, conn.qlog, q, {
2308 let frame = Http3Frame::Reserved {
2309 length: Some(grease_payload.len() as u64),
2310 };
2311 let ev_data = EventData::H3FrameCreated(H3FrameCreated {
2312 stream_id,
2313 length: Some(grease_payload.len() as u64),
2314 frame,
2315 ..Default::default()
2316 });
2317
2318 q.add_event_data_now(ev_data).ok();
2319 });
2320
2321 Ok(())
2322 }
2323
2324 fn open_grease_stream<F: BufFactory>(
2327 &mut self, conn: &mut super::Connection<F>,
2328 ) -> Result<()> {
2329 let ty = grease_value();
2330 match self.open_uni_stream(conn, ty) {
2331 Ok(stream_id) => {
2332 conn.stream_send(stream_id, b"GREASE is the word", true)?;
2333
2334 trace!("{} open GREASE stream {}", conn.trace_id(), stream_id);
2335
2336 qlog_with_type!(QLOG_STREAM_TYPE_SET, conn.qlog, q, {
2337 let ev_data = EventData::H3StreamTypeSet(H3StreamTypeSet {
2338 stream_id,
2339 owner: Some(H3Owner::Local),
2340 stream_type: H3StreamType::Unknown,
2341 stream_type_value: Some(ty),
2342 ..Default::default()
2343 });
2344
2345 q.add_event_data_now(ev_data).ok();
2346 });
2347 },
2348
2349 Err(Error::IdError) => {
2350 trace!("{} GREASE stream blocked", conn.trace_id(),);
2351
2352 return Ok(());
2353 },
2354
2355 Err(e) => return Err(e),
2356 };
2357
2358 Ok(())
2359 }
2360
2361 fn send_settings<F: BufFactory>(
2363 &mut self, conn: &mut super::Connection<F>,
2364 ) -> Result<()> {
2365 let stream_id = match self
2366 .open_uni_stream(conn, stream::HTTP3_CONTROL_STREAM_TYPE_ID)
2367 {
2368 Ok(v) => v,
2369
2370 Err(e) => {
2371 trace!("{} Control stream blocked", conn.trace_id(),);
2372
2373 if e == Error::Done {
2374 return Err(Error::InternalError);
2375 }
2376
2377 return Err(e);
2378 },
2379 };
2380
2381 self.control_stream_id = Some(stream_id);
2382
2383 qlog_with_type!(QLOG_STREAM_TYPE_SET, conn.qlog, q, {
2384 let ev_data = EventData::H3StreamTypeSet(H3StreamTypeSet {
2385 stream_id,
2386 owner: Some(H3Owner::Local),
2387 stream_type: H3StreamType::Control,
2388 ..Default::default()
2389 });
2390
2391 q.add_event_data_now(ev_data).ok();
2392 });
2393
2394 let grease = if conn.grease {
2395 Some((grease_value(), grease_value()))
2396 } else {
2397 None
2398 };
2399
2400 let frame = frame::Frame::Settings {
2401 max_field_section_size: self.local_settings.max_field_section_size,
2402 qpack_max_table_capacity: self
2403 .local_settings
2404 .qpack_max_table_capacity,
2405 qpack_blocked_streams: self.local_settings.qpack_blocked_streams,
2406 connect_protocol_enabled: self
2407 .local_settings
2408 .connect_protocol_enabled,
2409 h3_datagram: self.local_settings.h3_datagram,
2410 grease,
2411 additional_settings: self.local_settings.additional_settings.clone(),
2412 raw: Default::default(),
2413 };
2414
2415 let mut d = [42; 128];
2416 let mut b = octets::OctetsMut::with_slice(&mut d);
2417
2418 frame.to_bytes(&mut b)?;
2419
2420 let off = b.off();
2421
2422 if let Some(id) = self.control_stream_id {
2423 conn.stream_send(id, &d[..off], false)?;
2424
2425 trace!(
2426 "{} tx frm SETTINGS stream={} len={}",
2427 conn.trace_id(),
2428 id,
2429 off
2430 );
2431
2432 qlog_with_type!(QLOG_FRAME_CREATED, conn.qlog, q, {
2433 let frame = frame.to_qlog();
2434 let ev_data = EventData::H3FrameCreated(H3FrameCreated {
2435 stream_id: id,
2436 length: Some(off as u64),
2437 frame,
2438 ..Default::default()
2439 });
2440
2441 q.add_event_data_now(ev_data).ok();
2442 });
2443 }
2444
2445 Ok(())
2446 }
2447
2448 fn process_control_stream<F: BufFactory>(
2449 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
2450 ) -> Result<(u64, Event)> {
2451 close_conn_if_critical_stream_finished(conn, stream_id)?;
2452
2453 if !conn.stream_readable(stream_id) {
2454 return Err(Error::Done);
2455 }
2456
2457 match self.process_readable_stream(conn, stream_id, true) {
2458 Ok(ev) => return Ok(ev),
2459
2460 Err(Error::Done) => (),
2461
2462 Err(e) => return Err(e),
2463 };
2464
2465 close_conn_if_critical_stream_finished(conn, stream_id)?;
2466
2467 Err(Error::Done)
2468 }
2469
2470 fn process_readable_stream<F: BufFactory>(
2471 &mut self, conn: &mut super::Connection<F>, stream_id: u64, polling: bool,
2472 ) -> Result<(u64, Event)> {
2473 self.streams
2474 .entry(stream_id)
2475 .or_insert_with(|| <stream::Stream>::new(stream_id, false));
2476
2477 while let Some(stream) = self.streams.get_mut(&stream_id) {
2482 match stream.state() {
2483 stream::State::StreamType => {
2484 stream.try_fill_buffer(conn)?;
2485
2486 let varint = match stream.try_consume_varint() {
2487 Ok(v) => v,
2488
2489 Err(_) => continue,
2490 };
2491
2492 let ty = stream::Type::deserialize(varint)?;
2493
2494 if let Err(e) = stream.set_ty(ty) {
2495 conn.close(true, e.to_wire(), b"")?;
2496 return Err(e);
2497 }
2498
2499 qlog_with_type!(QLOG_STREAM_TYPE_SET, conn.qlog, q, {
2500 let ty_val = if matches!(ty, stream::Type::Unknown) {
2501 Some(varint)
2502 } else {
2503 None
2504 };
2505
2506 let ev_data =
2507 EventData::H3StreamTypeSet(H3StreamTypeSet {
2508 stream_id,
2509 owner: Some(H3Owner::Remote),
2510 stream_type: ty.to_qlog(),
2511 stream_type_value: ty_val,
2512 ..Default::default()
2513 });
2514
2515 q.add_event_data_now(ev_data).ok();
2516 });
2517
2518 match &ty {
2519 stream::Type::Control => {
2520 if self.peer_control_stream_id.is_some() {
2522 conn.close(
2523 true,
2524 Error::StreamCreationError.to_wire(),
2525 b"Received multiple control streams",
2526 )?;
2527
2528 return Err(Error::StreamCreationError);
2529 }
2530
2531 trace!(
2532 "{} open peer's control stream {}",
2533 conn.trace_id(),
2534 stream_id
2535 );
2536
2537 close_conn_if_critical_stream_finished(
2538 conn, stream_id,
2539 )?;
2540
2541 self.peer_control_stream_id = Some(stream_id);
2542 },
2543
2544 stream::Type::Push => {
2545 if self.is_server {
2547 conn.close(
2548 true,
2549 Error::StreamCreationError.to_wire(),
2550 b"Server received push stream.",
2551 )?;
2552
2553 return Err(Error::StreamCreationError);
2554 }
2555 },
2556
2557 stream::Type::QpackEncoder => {
2558 if self.peer_qpack_streams.encoder_stream_id.is_some()
2560 {
2561 conn.close(
2562 true,
2563 Error::StreamCreationError.to_wire(),
2564 b"Received multiple QPACK encoder streams",
2565 )?;
2566
2567 return Err(Error::StreamCreationError);
2568 }
2569
2570 close_conn_if_critical_stream_finished(
2571 conn, stream_id,
2572 )?;
2573
2574 self.peer_qpack_streams.encoder_stream_id =
2575 Some(stream_id);
2576 },
2577
2578 stream::Type::QpackDecoder => {
2579 if self.peer_qpack_streams.decoder_stream_id.is_some()
2581 {
2582 conn.close(
2583 true,
2584 Error::StreamCreationError.to_wire(),
2585 b"Received multiple QPACK decoder streams",
2586 )?;
2587
2588 return Err(Error::StreamCreationError);
2589 }
2590
2591 close_conn_if_critical_stream_finished(
2592 conn, stream_id,
2593 )?;
2594
2595 self.peer_qpack_streams.decoder_stream_id =
2596 Some(stream_id);
2597 },
2598
2599 stream::Type::Unknown => {
2600 },
2603
2604 stream::Type::Request => unreachable!(),
2605 }
2606 },
2607
2608 stream::State::PushId => {
2609 stream.try_fill_buffer(conn)?;
2610
2611 let varint = match stream.try_consume_varint() {
2612 Ok(v) => v,
2613
2614 Err(_) => continue,
2615 };
2616
2617 if let Err(e) = stream.set_push_id(varint) {
2618 conn.close(true, e.to_wire(), b"")?;
2619 return Err(e);
2620 }
2621 },
2622
2623 stream::State::FrameType => {
2624 stream.try_fill_buffer(conn)?;
2625
2626 let varint = match stream.try_consume_varint() {
2627 Ok(v) => v,
2628
2629 Err(_) => continue,
2630 };
2631
2632 match stream.set_frame_type(varint) {
2633 Err(Error::FrameUnexpected) => {
2634 let msg = format!("Unexpected frame type {varint}");
2635
2636 conn.close(
2637 true,
2638 Error::FrameUnexpected.to_wire(),
2639 msg.as_bytes(),
2640 )?;
2641
2642 return Err(Error::FrameUnexpected);
2643 },
2644
2645 Err(e) => {
2646 conn.close(
2647 true,
2648 e.to_wire(),
2649 b"Error handling frame.",
2650 )?;
2651
2652 return Err(e);
2653 },
2654
2655 _ => (),
2656 }
2657 },
2658
2659 stream::State::FramePayloadLen => {
2660 stream.try_fill_buffer(conn)?;
2661
2662 let payload_len = match stream.try_consume_varint() {
2663 Ok(v) => v,
2664
2665 Err(_) => continue,
2666 };
2667
2668 if Some(frame::DATA_FRAME_TYPE_ID) == stream.frame_type() {
2671 trace!(
2672 "{} rx frm DATA stream={} wire_payload_len={}",
2673 conn.trace_id(),
2674 stream_id,
2675 payload_len
2676 );
2677
2678 qlog_with_type!(QLOG_FRAME_PARSED, conn.qlog, q, {
2679 let frame = Http3Frame::Data { raw: None };
2680
2681 let ev_data =
2682 EventData::H3FrameParsed(H3FrameParsed {
2683 stream_id,
2684 length: Some(payload_len),
2685 frame,
2686 ..Default::default()
2687 });
2688
2689 q.add_event_data_now(ev_data).ok();
2690 });
2691 }
2692
2693 if let Err(e) = stream.set_frame_payload_len(payload_len) {
2694 conn.close(true, e.to_wire(), b"")?;
2695 return Err(e);
2696 }
2697 },
2698
2699 stream::State::FramePayload => {
2700 if !polling {
2702 break;
2703 }
2704
2705 stream.try_fill_buffer(conn)?;
2706
2707 let (frame, payload_len) = match stream.try_consume_frame() {
2708 Ok(frame) => frame,
2709
2710 Err(Error::Done) => return Err(Error::Done),
2711
2712 Err(e) => {
2713 conn.close(
2714 true,
2715 e.to_wire(),
2716 b"Error handling frame.",
2717 )?;
2718
2719 return Err(e);
2720 },
2721 };
2722
2723 match self.process_frame(conn, stream_id, frame, payload_len)
2724 {
2725 Ok(ev) => return Ok(ev),
2726
2727 Err(Error::Done) => {
2728 if conn.stream_finished(stream_id) {
2733 break;
2734 }
2735 },
2736
2737 Err(e) => return Err(e),
2738 };
2739 },
2740
2741 stream::State::Data => {
2742 if !polling {
2744 break;
2745 }
2746
2747 if !stream.try_trigger_data_event() {
2748 break;
2749 }
2750
2751 return Ok((stream_id, Event::Data));
2752 },
2753
2754 stream::State::QpackInstruction => {
2755 let mut d = [0; 4096];
2756
2757 loop {
2759 let (recv, fin) = conn.stream_recv(stream_id, &mut d)?;
2760
2761 match stream.ty() {
2762 Some(stream::Type::QpackEncoder) =>
2763 self.peer_qpack_streams.encoder_stream_bytes +=
2764 recv as u64,
2765 Some(stream::Type::QpackDecoder) =>
2766 self.peer_qpack_streams.decoder_stream_bytes +=
2767 recv as u64,
2768 _ => unreachable!(),
2769 };
2770
2771 if fin {
2772 close_conn_critical_stream(conn)?;
2773 }
2774 }
2775 },
2776
2777 stream::State::Drain => {
2778 conn.stream_shutdown(
2780 stream_id,
2781 crate::Shutdown::Read,
2782 0x100,
2783 )?;
2784
2785 break;
2786 },
2787
2788 stream::State::Finished => break,
2789 }
2790 }
2791
2792 Err(Error::Done)
2793 }
2794
2795 fn process_finished_stream(&mut self, stream_id: u64) {
2796 let stream = match self.streams.get_mut(&stream_id) {
2797 Some(v) => v,
2798
2799 None => return,
2800 };
2801
2802 if stream.state() == stream::State::Finished {
2803 return;
2804 }
2805
2806 match stream.ty() {
2807 Some(stream::Type::Request) | Some(stream::Type::Push) => {
2808 stream.finished();
2809
2810 self.finished_streams.push_back(stream_id);
2811 },
2812
2813 _ => (),
2814 };
2815 }
2816
2817 fn process_frame<F: BufFactory>(
2818 &mut self, conn: &mut super::Connection<F>, stream_id: u64,
2819 frame: frame::Frame, payload_len: u64,
2820 ) -> Result<(u64, Event)> {
2821 trace!(
2822 "{} rx frm {:?} stream={} payload_len={}",
2823 conn.trace_id(),
2824 frame,
2825 stream_id,
2826 payload_len
2827 );
2828
2829 qlog_with_type!(QLOG_FRAME_PARSED, conn.qlog, q, {
2830 if !matches!(frame, frame::Frame::Headers { .. }) {
2832 let frame = frame.to_qlog();
2833 let ev_data = EventData::H3FrameParsed(H3FrameParsed {
2834 stream_id,
2835 length: Some(payload_len),
2836 frame,
2837 ..Default::default()
2838 });
2839
2840 q.add_event_data_now(ev_data).ok();
2841 }
2842 });
2843
2844 match frame {
2845 frame::Frame::Settings {
2846 max_field_section_size,
2847 qpack_max_table_capacity,
2848 qpack_blocked_streams,
2849 connect_protocol_enabled,
2850 h3_datagram,
2851 additional_settings,
2852 raw,
2853 ..
2854 } => {
2855 self.peer_settings = ConnectionSettings {
2856 max_field_section_size,
2857 qpack_max_table_capacity,
2858 qpack_blocked_streams,
2859 connect_protocol_enabled,
2860 h3_datagram,
2861 additional_settings,
2862 raw,
2863 };
2864
2865 if let Some(1) = h3_datagram {
2866 if conn.dgram_max_writable_len().is_none() {
2868 conn.close(
2869 true,
2870 Error::SettingsError.to_wire(),
2871 b"H3_DATAGRAM sent with value 1 but max_datagram_frame_size TP not set.",
2872 )?;
2873
2874 return Err(Error::SettingsError);
2875 }
2876 }
2877 },
2878
2879 frame::Frame::Headers { header_block } => {
2880 if let Some(s) = self.streams.get_mut(&stream_id) {
2882 if self.is_server && s.headers_received_count() == 2 {
2883 conn.close(
2884 true,
2885 Error::FrameUnexpected.to_wire(),
2886 b"Too many HEADERS frames",
2887 )?;
2888 return Err(Error::FrameUnexpected);
2889 }
2890
2891 s.increment_headers_received();
2892 }
2893
2894 let max_size = self
2897 .local_settings
2898 .max_field_section_size
2899 .unwrap_or(u64::MAX);
2900
2901 let headers = match self
2902 .qpack_decoder
2903 .decode(&header_block[..], max_size)
2904 {
2905 Ok(v) => v,
2906
2907 Err(e) => {
2908 let e = match e {
2909 qpack::Error::HeaderListTooLarge =>
2910 Error::ExcessiveLoad,
2911
2912 _ => Error::QpackDecompressionFailed,
2913 };
2914
2915 conn.close(true, e.to_wire(), b"Error parsing headers.")?;
2916
2917 return Err(e);
2918 },
2919 };
2920
2921 qlog_with_type!(QLOG_FRAME_PARSED, conn.qlog, q, {
2922 let qlog_headers = headers
2923 .iter()
2924 .map(|h| qlog::events::h3::HttpHeader {
2925 name: String::from_utf8_lossy(h.name()).into_owned(),
2926 value: String::from_utf8_lossy(h.value())
2927 .into_owned(),
2928 })
2929 .collect();
2930
2931 let frame = Http3Frame::Headers {
2932 headers: qlog_headers,
2933 };
2934
2935 let ev_data = EventData::H3FrameParsed(H3FrameParsed {
2936 stream_id,
2937 length: Some(payload_len),
2938 frame,
2939 ..Default::default()
2940 });
2941
2942 q.add_event_data_now(ev_data).ok();
2943 });
2944
2945 let more_frames = !conn.stream_finished(stream_id);
2946
2947 return Ok((stream_id, Event::Headers {
2948 list: headers,
2949 more_frames,
2950 }));
2951 },
2952
2953 frame::Frame::Data { .. } => {
2954 },
2956
2957 frame::Frame::GoAway { id } => {
2958 if !self.is_server && id % 4 != 0 {
2959 conn.close(
2960 true,
2961 Error::FrameUnexpected.to_wire(),
2962 b"GOAWAY received with ID of non-request stream",
2963 )?;
2964
2965 return Err(Error::IdError);
2966 }
2967
2968 if let Some(received_id) = self.peer_goaway_id {
2969 if id > received_id {
2970 conn.close(
2971 true,
2972 Error::IdError.to_wire(),
2973 b"GOAWAY received with ID larger than previously received",
2974 )?;
2975
2976 return Err(Error::IdError);
2977 }
2978 }
2979
2980 self.peer_goaway_id = Some(id);
2981
2982 return Ok((id, Event::GoAway));
2983 },
2984
2985 frame::Frame::MaxPushId { push_id } => {
2986 if !self.is_server {
2987 conn.close(
2988 true,
2989 Error::FrameUnexpected.to_wire(),
2990 b"MAX_PUSH_ID received by client",
2991 )?;
2992
2993 return Err(Error::FrameUnexpected);
2994 }
2995
2996 if push_id < self.max_push_id {
2997 conn.close(
2998 true,
2999 Error::IdError.to_wire(),
3000 b"MAX_PUSH_ID reduced limit",
3001 )?;
3002
3003 return Err(Error::IdError);
3004 }
3005
3006 self.max_push_id = push_id;
3007 },
3008
3009 frame::Frame::PushPromise { .. } => {
3010 if self.is_server {
3011 conn.close(
3012 true,
3013 Error::FrameUnexpected.to_wire(),
3014 b"PUSH_PROMISE received by server",
3015 )?;
3016
3017 return Err(Error::FrameUnexpected);
3018 }
3019
3020 if stream_id % 4 != 0 {
3021 conn.close(
3022 true,
3023 Error::FrameUnexpected.to_wire(),
3024 b"PUSH_PROMISE received on non-request stream",
3025 )?;
3026
3027 return Err(Error::FrameUnexpected);
3028 }
3029
3030 },
3032
3033 frame::Frame::CancelPush { .. } => {
3034 },
3036
3037 frame::Frame::PriorityUpdateRequest {
3038 prioritized_element_id,
3039 priority_field_value,
3040 } => {
3041 if !self.is_server {
3042 conn.close(
3043 true,
3044 Error::FrameUnexpected.to_wire(),
3045 b"PRIORITY_UPDATE received by client",
3046 )?;
3047
3048 return Err(Error::FrameUnexpected);
3049 }
3050
3051 if prioritized_element_id % 4 != 0 {
3052 conn.close(
3053 true,
3054 Error::FrameUnexpected.to_wire(),
3055 b"PRIORITY_UPDATE for request stream type with wrong ID",
3056 )?;
3057
3058 return Err(Error::FrameUnexpected);
3059 }
3060
3061 if prioritized_element_id > conn.streams.max_streams_bidi() * 4 {
3062 conn.close(
3063 true,
3064 Error::IdError.to_wire(),
3065 b"PRIORITY_UPDATE for request stream beyond max streams limit",
3066 )?;
3067
3068 return Err(Error::IdError);
3069 }
3070
3071 if conn.streams.is_collected(prioritized_element_id) {
3078 return Err(Error::Done);
3079 }
3080
3081 let stream =
3083 self.streams.entry(prioritized_element_id).or_insert_with(
3084 || <stream::Stream>::new(prioritized_element_id, false),
3085 );
3086
3087 let had_priority_update = stream.has_last_priority_update();
3088 stream.set_last_priority_update(Some(priority_field_value));
3089
3090 if !had_priority_update {
3093 return Ok((prioritized_element_id, Event::PriorityUpdate));
3094 } else {
3095 return Err(Error::Done);
3096 }
3097 },
3098
3099 frame::Frame::PriorityUpdatePush {
3100 prioritized_element_id,
3101 ..
3102 } => {
3103 if !self.is_server {
3104 conn.close(
3105 true,
3106 Error::FrameUnexpected.to_wire(),
3107 b"PRIORITY_UPDATE received by client",
3108 )?;
3109
3110 return Err(Error::FrameUnexpected);
3111 }
3112
3113 if prioritized_element_id % 3 != 0 {
3114 conn.close(
3115 true,
3116 Error::FrameUnexpected.to_wire(),
3117 b"PRIORITY_UPDATE for push stream type with wrong ID",
3118 )?;
3119
3120 return Err(Error::FrameUnexpected);
3121 }
3122
3123 },
3125
3126 frame::Frame::Unknown { .. } => (),
3127 }
3128
3129 Err(Error::Done)
3130 }
3131
3132 #[inline]
3134 pub fn stats(&self) -> Stats {
3135 Stats {
3136 qpack_encoder_stream_recv_bytes: self
3137 .peer_qpack_streams
3138 .encoder_stream_bytes,
3139 qpack_decoder_stream_recv_bytes: self
3140 .peer_qpack_streams
3141 .decoder_stream_bytes,
3142 }
3143 }
3144}
3145
3146pub fn grease_value() -> u64 {
3148 let n = super::rand::rand_u64_uniform(148_764_065_110_560_899);
3149 31 * n + 33
3150}
3151
3152#[doc(hidden)]
3153pub mod testing {
3154 use super::*;
3155
3156 use crate::test_utils;
3157
3158 pub struct Session {
3173 pub pipe: test_utils::Pipe,
3174 pub client: Connection,
3175 pub server: Connection,
3176 }
3177
3178 impl Session {
3179 pub fn new() -> Result<Session> {
3180 fn path_relative_to_manifest_dir(path: &str) -> String {
3181 std::fs::canonicalize(
3182 std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join(path),
3183 )
3184 .unwrap()
3185 .to_string_lossy()
3186 .into_owned()
3187 }
3188
3189 let mut config = crate::Config::new(crate::PROTOCOL_VERSION)?;
3190 config.load_cert_chain_from_pem_file(
3191 &path_relative_to_manifest_dir("examples/cert.crt"),
3192 )?;
3193 config.load_priv_key_from_pem_file(
3194 &path_relative_to_manifest_dir("examples/cert.key"),
3195 )?;
3196 config.set_application_protos(&[b"h3"])?;
3197 config.set_initial_max_data(1500);
3198 config.set_initial_max_stream_data_bidi_local(150);
3199 config.set_initial_max_stream_data_bidi_remote(150);
3200 config.set_initial_max_stream_data_uni(150);
3201 config.set_initial_max_streams_bidi(5);
3202 config.set_initial_max_streams_uni(5);
3203 config.verify_peer(false);
3204 config.enable_dgram(true, 3, 3);
3205 config.set_ack_delay_exponent(8);
3206
3207 let h3_config = Config::new()?;
3208 Session::with_configs(&mut config, &h3_config)
3209 }
3210
3211 pub fn with_configs(
3212 config: &mut crate::Config, h3_config: &Config,
3213 ) -> Result<Session> {
3214 let pipe = test_utils::Pipe::with_config(config)?;
3215 let client_dgram = pipe.client.dgram_enabled();
3216 let server_dgram = pipe.server.dgram_enabled();
3217 Ok(Session {
3218 pipe,
3219 client: Connection::new(h3_config, false, client_dgram)?,
3220 server: Connection::new(h3_config, true, server_dgram)?,
3221 })
3222 }
3223
3224 pub fn handshake(&mut self) -> Result<()> {
3226 self.pipe.handshake()?;
3227
3228 self.client.send_settings(&mut self.pipe.client)?;
3230 self.pipe.advance().ok();
3231
3232 self.client
3233 .open_qpack_encoder_stream(&mut self.pipe.client)?;
3234 self.pipe.advance().ok();
3235
3236 self.client
3237 .open_qpack_decoder_stream(&mut self.pipe.client)?;
3238 self.pipe.advance().ok();
3239
3240 if self.pipe.client.grease {
3241 self.client.open_grease_stream(&mut self.pipe.client)?;
3242 }
3243
3244 self.pipe.advance().ok();
3245
3246 self.server.send_settings(&mut self.pipe.server)?;
3248 self.pipe.advance().ok();
3249
3250 self.server
3251 .open_qpack_encoder_stream(&mut self.pipe.server)?;
3252 self.pipe.advance().ok();
3253
3254 self.server
3255 .open_qpack_decoder_stream(&mut self.pipe.server)?;
3256 self.pipe.advance().ok();
3257
3258 if self.pipe.server.grease {
3259 self.server.open_grease_stream(&mut self.pipe.server)?;
3260 }
3261
3262 self.advance().ok();
3263
3264 while self.client.poll(&mut self.pipe.client).is_ok() {
3265 }
3267
3268 while self.server.poll(&mut self.pipe.server).is_ok() {
3269 }
3271
3272 Ok(())
3273 }
3274
3275 pub fn advance(&mut self) -> crate::Result<()> {
3277 self.pipe.advance()
3278 }
3279
3280 pub fn poll_client(&mut self) -> Result<(u64, Event)> {
3282 self.client.poll(&mut self.pipe.client)
3283 }
3284
3285 pub fn poll_server(&mut self) -> Result<(u64, Event)> {
3287 self.server.poll(&mut self.pipe.server)
3288 }
3289
3290 pub fn send_request(&mut self, fin: bool) -> Result<(u64, Vec<Header>)> {
3294 let req = vec![
3295 Header::new(b":method", b"GET"),
3296 Header::new(b":scheme", b"https"),
3297 Header::new(b":authority", b"quic.tech"),
3298 Header::new(b":path", b"/test"),
3299 Header::new(b"user-agent", b"quiche-test"),
3300 ];
3301
3302 let stream =
3303 self.client.send_request(&mut self.pipe.client, &req, fin)?;
3304
3305 self.advance().ok();
3306
3307 Ok((stream, req))
3308 }
3309
3310 pub fn send_response(
3314 &mut self, stream: u64, fin: bool,
3315 ) -> Result<Vec<Header>> {
3316 let resp = vec![
3317 Header::new(b":status", b"200"),
3318 Header::new(b"server", b"quiche-test"),
3319 ];
3320
3321 self.server.send_response(
3322 &mut self.pipe.server,
3323 stream,
3324 &resp,
3325 fin,
3326 )?;
3327
3328 self.advance().ok();
3329
3330 Ok(resp)
3331 }
3332
3333 pub fn send_body_client(
3337 &mut self, stream: u64, fin: bool,
3338 ) -> Result<Vec<u8>> {
3339 let bytes = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3340
3341 self.client
3342 .send_body(&mut self.pipe.client, stream, &bytes, fin)?;
3343
3344 self.advance().ok();
3345
3346 Ok(bytes)
3347 }
3348
3349 pub fn recv_body_client(
3353 &mut self, stream: u64, buf: &mut [u8],
3354 ) -> Result<usize> {
3355 self.client.recv_body(&mut self.pipe.client, stream, buf)
3356 }
3357
3358 pub fn send_body_server(
3362 &mut self, stream: u64, fin: bool,
3363 ) -> Result<Vec<u8>> {
3364 let bytes = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3365
3366 self.server
3367 .send_body(&mut self.pipe.server, stream, &bytes, fin)?;
3368
3369 self.advance().ok();
3370
3371 Ok(bytes)
3372 }
3373
3374 pub fn recv_body_server(
3378 &mut self, stream: u64, buf: &mut [u8],
3379 ) -> Result<usize> {
3380 self.server.recv_body(&mut self.pipe.server, stream, buf)
3381 }
3382
3383 pub fn send_frame_client(
3385 &mut self, frame: frame::Frame, stream_id: u64, fin: bool,
3386 ) -> Result<()> {
3387 let mut d = [42; 65535];
3388
3389 let mut b = octets::OctetsMut::with_slice(&mut d);
3390
3391 frame.to_bytes(&mut b)?;
3392
3393 let off = b.off();
3394 self.pipe.client.stream_send(stream_id, &d[..off], fin)?;
3395
3396 self.advance().ok();
3397
3398 Ok(())
3399 }
3400
3401 pub fn send_dgram_client(&mut self, flow_id: u64) -> Result<Vec<u8>> {
3405 let bytes = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3406 let len = octets::varint_len(flow_id) + bytes.len();
3407 let mut d = vec![0; len];
3408 let mut b = octets::OctetsMut::with_slice(&mut d);
3409
3410 b.put_varint(flow_id)?;
3411 b.put_bytes(&bytes)?;
3412
3413 self.pipe.client.dgram_send(&d)?;
3414
3415 self.advance().ok();
3416
3417 Ok(bytes)
3418 }
3419
3420 pub fn recv_dgram_client(
3425 &mut self, buf: &mut [u8],
3426 ) -> Result<(usize, u64, usize)> {
3427 let len = self.pipe.client.dgram_recv(buf)?;
3428 let mut b = octets::Octets::with_slice(buf);
3429 let flow_id = b.get_varint()?;
3430
3431 Ok((len, flow_id, b.off()))
3432 }
3433
3434 pub fn send_dgram_server(&mut self, flow_id: u64) -> Result<Vec<u8>> {
3438 let bytes = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3439 let len = octets::varint_len(flow_id) + bytes.len();
3440 let mut d = vec![0; len];
3441 let mut b = octets::OctetsMut::with_slice(&mut d);
3442
3443 b.put_varint(flow_id)?;
3444 b.put_bytes(&bytes)?;
3445
3446 self.pipe.server.dgram_send(&d)?;
3447
3448 self.advance().ok();
3449
3450 Ok(bytes)
3451 }
3452
3453 pub fn recv_dgram_server(
3458 &mut self, buf: &mut [u8],
3459 ) -> Result<(usize, u64, usize)> {
3460 let len = self.pipe.server.dgram_recv(buf)?;
3461 let mut b = octets::Octets::with_slice(buf);
3462 let flow_id = b.get_varint()?;
3463
3464 Ok((len, flow_id, b.off()))
3465 }
3466
3467 pub fn send_frame_server(
3469 &mut self, frame: frame::Frame, stream_id: u64, fin: bool,
3470 ) -> Result<()> {
3471 let mut d = [42; 65535];
3472
3473 let mut b = octets::OctetsMut::with_slice(&mut d);
3474
3475 frame.to_bytes(&mut b)?;
3476
3477 let off = b.off();
3478 self.pipe.server.stream_send(stream_id, &d[..off], fin)?;
3479
3480 self.advance().ok();
3481
3482 Ok(())
3483 }
3484
3485 pub fn send_arbitrary_stream_data_client(
3487 &mut self, data: &[u8], stream_id: u64, fin: bool,
3488 ) -> Result<()> {
3489 self.pipe.client.stream_send(stream_id, data, fin)?;
3490
3491 self.advance().ok();
3492
3493 Ok(())
3494 }
3495
3496 pub fn send_arbitrary_stream_data_server(
3498 &mut self, data: &[u8], stream_id: u64, fin: bool,
3499 ) -> Result<()> {
3500 self.pipe.server.stream_send(stream_id, data, fin)?;
3501
3502 self.advance().ok();
3503
3504 Ok(())
3505 }
3506 }
3507}
3508
3509#[cfg(test)]
3510mod tests {
3511 use super::*;
3512
3513 use super::testing::*;
3514
3515 #[test]
3516 fn grease_value_in_varint_limit() {
3518 assert!(grease_value() < 2u64.pow(62) - 1);
3519 }
3520
3521 #[cfg(not(feature = "openssl"))] #[test]
3523 fn h3_handshake_0rtt() {
3524 let mut buf = [0; 65535];
3525
3526 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
3527 config
3528 .load_cert_chain_from_pem_file("examples/cert.crt")
3529 .unwrap();
3530 config
3531 .load_priv_key_from_pem_file("examples/cert.key")
3532 .unwrap();
3533 config
3534 .set_application_protos(&[b"proto1", b"proto2"])
3535 .unwrap();
3536 config.set_initial_max_data(30);
3537 config.set_initial_max_stream_data_bidi_local(15);
3538 config.set_initial_max_stream_data_bidi_remote(15);
3539 config.set_initial_max_stream_data_uni(15);
3540 config.set_initial_max_streams_bidi(3);
3541 config.set_initial_max_streams_uni(3);
3542 config.enable_early_data();
3543 config.verify_peer(false);
3544
3545 let h3_config = Config::new().unwrap();
3546
3547 let mut pipe = crate::test_utils::Pipe::with_config(&mut config).unwrap();
3549 assert_eq!(pipe.handshake(), Ok(()));
3550
3551 let session = pipe.client.session().unwrap();
3553
3554 let mut pipe = crate::test_utils::Pipe::with_config(&mut config).unwrap();
3556 assert_eq!(pipe.client.set_session(session), Ok(()));
3557
3558 assert!(matches!(
3561 Connection::with_transport(&mut pipe.client, &h3_config),
3562 Err(Error::InternalError)
3563 ));
3564
3565 let (len, _) = pipe.client.send(&mut buf).unwrap();
3567
3568 assert!(Connection::with_transport(&mut pipe.client, &h3_config).is_ok());
3570 assert_eq!(pipe.server_recv(&mut buf[..len]), Ok(len));
3571
3572 let pkt_type = crate::packet::Type::ZeroRTT;
3574
3575 let frames = [crate::frame::Frame::Stream {
3576 stream_id: 6,
3577 data: <crate::range_buf::RangeBuf>::from(b"aaaaa", 0, true),
3578 }];
3579
3580 assert_eq!(
3581 pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
3582 Ok(1200)
3583 );
3584
3585 assert_eq!(pipe.server.undecryptable_pkts.len(), 0);
3586
3587 let mut r = pipe.server.readable();
3589 assert_eq!(r.next(), Some(6));
3590 assert_eq!(r.next(), None);
3591
3592 let mut b = [0; 15];
3593 assert_eq!(pipe.server.stream_recv(6, &mut b), Ok((5, true)));
3594 assert_eq!(&b[..5], b"aaaaa");
3595 }
3596
3597 #[test]
3598 fn request_no_body_response_no_body() {
3600 let mut s = Session::new().unwrap();
3601 s.handshake().unwrap();
3602
3603 let (stream, req) = s.send_request(true).unwrap();
3604
3605 assert_eq!(stream, 0);
3606
3607 let ev_headers = Event::Headers {
3608 list: req,
3609 more_frames: false,
3610 };
3611
3612 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3613 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3614
3615 let resp = s.send_response(stream, true).unwrap();
3616
3617 let ev_headers = Event::Headers {
3618 list: resp,
3619 more_frames: false,
3620 };
3621
3622 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
3623 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3624 assert_eq!(s.poll_client(), Err(Error::Done));
3625 }
3626
3627 #[test]
3628 fn request_no_body_response_one_chunk() {
3630 let mut s = Session::new().unwrap();
3631 s.handshake().unwrap();
3632
3633 let (stream, req) = s.send_request(true).unwrap();
3634 assert_eq!(stream, 0);
3635
3636 let ev_headers = Event::Headers {
3637 list: req,
3638 more_frames: false,
3639 };
3640
3641 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3642
3643 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3644
3645 let resp = s.send_response(stream, false).unwrap();
3646
3647 let body = s.send_body_server(stream, true).unwrap();
3648
3649 let mut recv_buf = vec![0; body.len()];
3650
3651 let ev_headers = Event::Headers {
3652 list: resp,
3653 more_frames: true,
3654 };
3655
3656 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
3657
3658 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
3659 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(body.len()));
3660
3661 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3662 assert_eq!(s.poll_client(), Err(Error::Done));
3663 }
3664
3665 #[test]
3666 fn request_no_body_response_many_chunks() {
3668 let mut s = Session::new().unwrap();
3669 s.handshake().unwrap();
3670
3671 let (stream, req) = s.send_request(true).unwrap();
3672
3673 let ev_headers = Event::Headers {
3674 list: req,
3675 more_frames: false,
3676 };
3677
3678 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3679 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3680
3681 let total_data_frames = 4;
3682
3683 let resp = s.send_response(stream, false).unwrap();
3684
3685 for _ in 0..total_data_frames - 1 {
3686 s.send_body_server(stream, false).unwrap();
3687 }
3688
3689 let body = s.send_body_server(stream, true).unwrap();
3690
3691 let mut recv_buf = vec![0; body.len()];
3692
3693 let ev_headers = Event::Headers {
3694 list: resp,
3695 more_frames: true,
3696 };
3697
3698 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
3699 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
3700 assert_eq!(s.poll_client(), Err(Error::Done));
3701
3702 for _ in 0..total_data_frames {
3703 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(body.len()));
3704 }
3705
3706 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3707 assert_eq!(s.poll_client(), Err(Error::Done));
3708 }
3709
3710 #[test]
3711 fn request_one_chunk_response_no_body() {
3713 let mut s = Session::new().unwrap();
3714 s.handshake().unwrap();
3715
3716 let (stream, req) = s.send_request(false).unwrap();
3717
3718 let body = s.send_body_client(stream, true).unwrap();
3719
3720 let mut recv_buf = vec![0; body.len()];
3721
3722 let ev_headers = Event::Headers {
3723 list: req,
3724 more_frames: true,
3725 };
3726
3727 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3728
3729 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
3730 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
3731
3732 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3733
3734 let resp = s.send_response(stream, true).unwrap();
3735
3736 let ev_headers = Event::Headers {
3737 list: resp,
3738 more_frames: false,
3739 };
3740
3741 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
3742 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3743 }
3744
3745 #[test]
3746 fn request_many_chunks_response_no_body() {
3748 let mut s = Session::new().unwrap();
3749 s.handshake().unwrap();
3750
3751 let (stream, req) = s.send_request(false).unwrap();
3752
3753 let total_data_frames = 4;
3754
3755 for _ in 0..total_data_frames - 1 {
3756 s.send_body_client(stream, false).unwrap();
3757 }
3758
3759 let body = s.send_body_client(stream, true).unwrap();
3760
3761 let mut recv_buf = vec![0; body.len()];
3762
3763 let ev_headers = Event::Headers {
3764 list: req,
3765 more_frames: true,
3766 };
3767
3768 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3769 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
3770 assert_eq!(s.poll_server(), Err(Error::Done));
3771
3772 for _ in 0..total_data_frames {
3773 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
3774 }
3775
3776 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3777
3778 let resp = s.send_response(stream, true).unwrap();
3779
3780 let ev_headers = Event::Headers {
3781 list: resp,
3782 more_frames: false,
3783 };
3784
3785 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
3786 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3787 }
3788
3789 #[test]
3790 fn many_requests_many_chunks_response_one_chunk() {
3793 let mut s = Session::new().unwrap();
3794 s.handshake().unwrap();
3795
3796 let mut reqs = Vec::new();
3797
3798 let (stream1, req1) = s.send_request(false).unwrap();
3799 assert_eq!(stream1, 0);
3800 reqs.push(req1);
3801
3802 let (stream2, req2) = s.send_request(false).unwrap();
3803 assert_eq!(stream2, 4);
3804 reqs.push(req2);
3805
3806 let (stream3, req3) = s.send_request(false).unwrap();
3807 assert_eq!(stream3, 8);
3808 reqs.push(req3);
3809
3810 let body = s.send_body_client(stream1, false).unwrap();
3811 s.send_body_client(stream2, false).unwrap();
3812 s.send_body_client(stream3, false).unwrap();
3813
3814 let mut recv_buf = vec![0; body.len()];
3815
3816 s.send_body_client(stream3, true).unwrap();
3819 s.send_body_client(stream2, true).unwrap();
3820 s.send_body_client(stream1, true).unwrap();
3821
3822 let (_, ev) = s.poll_server().unwrap();
3823 let ev_headers = Event::Headers {
3824 list: reqs[0].clone(),
3825 more_frames: true,
3826 };
3827 assert_eq!(ev, ev_headers);
3828
3829 let (_, ev) = s.poll_server().unwrap();
3830 let ev_headers = Event::Headers {
3831 list: reqs[1].clone(),
3832 more_frames: true,
3833 };
3834 assert_eq!(ev, ev_headers);
3835
3836 let (_, ev) = s.poll_server().unwrap();
3837 let ev_headers = Event::Headers {
3838 list: reqs[2].clone(),
3839 more_frames: true,
3840 };
3841 assert_eq!(ev, ev_headers);
3842
3843 assert_eq!(s.poll_server(), Ok((0, Event::Data)));
3844 assert_eq!(s.recv_body_server(0, &mut recv_buf), Ok(body.len()));
3845 assert_eq!(s.poll_client(), Err(Error::Done));
3846 assert_eq!(s.recv_body_server(0, &mut recv_buf), Ok(body.len()));
3847 assert_eq!(s.poll_server(), Ok((0, Event::Finished)));
3848
3849 assert_eq!(s.poll_server(), Ok((4, Event::Data)));
3850 assert_eq!(s.recv_body_server(4, &mut recv_buf), Ok(body.len()));
3851 assert_eq!(s.poll_client(), Err(Error::Done));
3852 assert_eq!(s.recv_body_server(4, &mut recv_buf), Ok(body.len()));
3853 assert_eq!(s.poll_server(), Ok((4, Event::Finished)));
3854
3855 assert_eq!(s.poll_server(), Ok((8, Event::Data)));
3856 assert_eq!(s.recv_body_server(8, &mut recv_buf), Ok(body.len()));
3857 assert_eq!(s.poll_client(), Err(Error::Done));
3858 assert_eq!(s.recv_body_server(8, &mut recv_buf), Ok(body.len()));
3859 assert_eq!(s.poll_server(), Ok((8, Event::Finished)));
3860
3861 assert_eq!(s.poll_server(), Err(Error::Done));
3862
3863 let mut resps = Vec::new();
3864
3865 let resp1 = s.send_response(stream1, true).unwrap();
3866 resps.push(resp1);
3867
3868 let resp2 = s.send_response(stream2, true).unwrap();
3869 resps.push(resp2);
3870
3871 let resp3 = s.send_response(stream3, true).unwrap();
3872 resps.push(resp3);
3873
3874 for _ in 0..resps.len() {
3875 let (stream, ev) = s.poll_client().unwrap();
3876 let ev_headers = Event::Headers {
3877 list: resps[(stream / 4) as usize].clone(),
3878 more_frames: false,
3879 };
3880 assert_eq!(ev, ev_headers);
3881 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3882 }
3883
3884 assert_eq!(s.poll_client(), Err(Error::Done));
3885 }
3886
3887 #[test]
3888 fn request_no_body_response_one_chunk_empty_fin() {
3891 let mut s = Session::new().unwrap();
3892 s.handshake().unwrap();
3893
3894 let (stream, req) = s.send_request(true).unwrap();
3895
3896 let ev_headers = Event::Headers {
3897 list: req,
3898 more_frames: false,
3899 };
3900
3901 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3902 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3903
3904 let resp = s.send_response(stream, false).unwrap();
3905
3906 let body = s.send_body_server(stream, false).unwrap();
3907
3908 let mut recv_buf = vec![0; body.len()];
3909
3910 let ev_headers = Event::Headers {
3911 list: resp,
3912 more_frames: true,
3913 };
3914
3915 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
3916
3917 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
3918 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(body.len()));
3919
3920 assert_eq!(s.pipe.server.stream_send(stream, &[], true), Ok(0));
3921 s.advance().ok();
3922
3923 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3924 assert_eq!(s.poll_client(), Err(Error::Done));
3925 }
3926
3927 #[test]
3928 fn request_no_body_response_no_body_with_grease() {
3931 let mut s = Session::new().unwrap();
3932 s.handshake().unwrap();
3933
3934 let (stream, req) = s.send_request(true).unwrap();
3935
3936 assert_eq!(stream, 0);
3937
3938 let ev_headers = Event::Headers {
3939 list: req,
3940 more_frames: false,
3941 };
3942
3943 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3944 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3945
3946 let resp = s.send_response(stream, false).unwrap();
3947
3948 let ev_headers = Event::Headers {
3949 list: resp,
3950 more_frames: true,
3951 };
3952
3953 let mut d = [42; 10];
3955 let mut b = octets::OctetsMut::with_slice(&mut d);
3956
3957 let frame_type = b.put_varint(148_764_065_110_560_899).unwrap();
3958 s.pipe.server.stream_send(0, frame_type, false).unwrap();
3959
3960 let frame_len = b.put_varint(10).unwrap();
3961 s.pipe.server.stream_send(0, frame_len, false).unwrap();
3962
3963 s.pipe.server.stream_send(0, &d, true).unwrap();
3964
3965 s.advance().ok();
3966
3967 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
3968 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
3969 assert_eq!(s.poll_client(), Err(Error::Done));
3970 }
3971
3972 #[test]
3973 fn body_response_before_headers() {
3975 let mut s = Session::new().unwrap();
3976 s.handshake().unwrap();
3977
3978 let (stream, req) = s.send_request(true).unwrap();
3979 assert_eq!(stream, 0);
3980
3981 let ev_headers = Event::Headers {
3982 list: req,
3983 more_frames: false,
3984 };
3985
3986 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
3987
3988 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
3989
3990 assert_eq!(
3991 s.send_body_server(stream, true),
3992 Err(Error::FrameUnexpected)
3993 );
3994
3995 assert_eq!(s.poll_client(), Err(Error::Done));
3996 }
3997
3998 #[test]
3999 fn send_body_invalid_client_stream() {
4002 let mut s = Session::new().unwrap();
4003 s.handshake().unwrap();
4004
4005 assert_eq!(s.send_body_client(0, true), Err(Error::FrameUnexpected));
4006
4007 assert_eq!(
4008 s.send_body_client(s.client.control_stream_id.unwrap(), true),
4009 Err(Error::FrameUnexpected)
4010 );
4011
4012 assert_eq!(
4013 s.send_body_client(
4014 s.client.local_qpack_streams.encoder_stream_id.unwrap(),
4015 true
4016 ),
4017 Err(Error::FrameUnexpected)
4018 );
4019
4020 assert_eq!(
4021 s.send_body_client(
4022 s.client.local_qpack_streams.decoder_stream_id.unwrap(),
4023 true
4024 ),
4025 Err(Error::FrameUnexpected)
4026 );
4027
4028 assert_eq!(
4029 s.send_body_client(s.client.peer_control_stream_id.unwrap(), true),
4030 Err(Error::FrameUnexpected)
4031 );
4032
4033 assert_eq!(
4034 s.send_body_client(
4035 s.client.peer_qpack_streams.encoder_stream_id.unwrap(),
4036 true
4037 ),
4038 Err(Error::FrameUnexpected)
4039 );
4040
4041 assert_eq!(
4042 s.send_body_client(
4043 s.client.peer_qpack_streams.decoder_stream_id.unwrap(),
4044 true
4045 ),
4046 Err(Error::FrameUnexpected)
4047 );
4048 }
4049
4050 #[test]
4051 fn send_body_invalid_server_stream() {
4054 let mut s = Session::new().unwrap();
4055 s.handshake().unwrap();
4056
4057 assert_eq!(s.send_body_server(0, true), Err(Error::FrameUnexpected));
4058
4059 assert_eq!(
4060 s.send_body_server(s.server.control_stream_id.unwrap(), true),
4061 Err(Error::FrameUnexpected)
4062 );
4063
4064 assert_eq!(
4065 s.send_body_server(
4066 s.server.local_qpack_streams.encoder_stream_id.unwrap(),
4067 true
4068 ),
4069 Err(Error::FrameUnexpected)
4070 );
4071
4072 assert_eq!(
4073 s.send_body_server(
4074 s.server.local_qpack_streams.decoder_stream_id.unwrap(),
4075 true
4076 ),
4077 Err(Error::FrameUnexpected)
4078 );
4079
4080 assert_eq!(
4081 s.send_body_server(s.server.peer_control_stream_id.unwrap(), true),
4082 Err(Error::FrameUnexpected)
4083 );
4084
4085 assert_eq!(
4086 s.send_body_server(
4087 s.server.peer_qpack_streams.encoder_stream_id.unwrap(),
4088 true
4089 ),
4090 Err(Error::FrameUnexpected)
4091 );
4092
4093 assert_eq!(
4094 s.send_body_server(
4095 s.server.peer_qpack_streams.decoder_stream_id.unwrap(),
4096 true
4097 ),
4098 Err(Error::FrameUnexpected)
4099 );
4100 }
4101
4102 #[test]
4103 fn trailers() {
4105 let mut s = Session::new().unwrap();
4106 s.handshake().unwrap();
4107
4108 let (stream, req) = s.send_request(false).unwrap();
4109
4110 let body = s.send_body_client(stream, false).unwrap();
4111
4112 let mut recv_buf = vec![0; body.len()];
4113
4114 let req_trailers = vec![Header::new(b"foo", b"bar")];
4115
4116 s.client
4117 .send_additional_headers(
4118 &mut s.pipe.client,
4119 stream,
4120 &req_trailers,
4121 true,
4122 true,
4123 )
4124 .unwrap();
4125
4126 s.advance().ok();
4127
4128 let ev_headers = Event::Headers {
4129 list: req,
4130 more_frames: true,
4131 };
4132
4133 let ev_trailers = Event::Headers {
4134 list: req_trailers,
4135 more_frames: false,
4136 };
4137
4138 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4139
4140 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
4141 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
4142
4143 assert_eq!(s.poll_server(), Ok((stream, ev_trailers)));
4144 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
4145 }
4146
4147 #[test]
4148 fn informational_response() {
4150 let mut s = Session::new().unwrap();
4151 s.handshake().unwrap();
4152
4153 let (stream, req) = s.send_request(true).unwrap();
4154
4155 assert_eq!(stream, 0);
4156
4157 let ev_headers = Event::Headers {
4158 list: req,
4159 more_frames: false,
4160 };
4161
4162 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4163 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
4164
4165 let info_resp = vec![
4166 Header::new(b":status", b"103"),
4167 Header::new(b"link", b"<https://example.com>; rel=\"preconnect\""),
4168 ];
4169
4170 let resp = vec![
4171 Header::new(b":status", b"200"),
4172 Header::new(b"server", b"quiche-test"),
4173 ];
4174
4175 s.server
4176 .send_response(&mut s.pipe.server, stream, &info_resp, false)
4177 .unwrap();
4178
4179 s.server
4180 .send_additional_headers(
4181 &mut s.pipe.server,
4182 stream,
4183 &resp,
4184 false,
4185 true,
4186 )
4187 .unwrap();
4188
4189 s.advance().ok();
4190
4191 let ev_info_headers = Event::Headers {
4192 list: info_resp,
4193 more_frames: true,
4194 };
4195
4196 let ev_headers = Event::Headers {
4197 list: resp,
4198 more_frames: false,
4199 };
4200
4201 assert_eq!(s.poll_client(), Ok((stream, ev_info_headers)));
4202 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
4203 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
4204 assert_eq!(s.poll_client(), Err(Error::Done));
4205 }
4206
4207 #[test]
4208 fn no_multiple_response() {
4211 let mut s = Session::new().unwrap();
4212 s.handshake().unwrap();
4213
4214 let (stream, req) = s.send_request(true).unwrap();
4215
4216 assert_eq!(stream, 0);
4217
4218 let ev_headers = Event::Headers {
4219 list: req,
4220 more_frames: false,
4221 };
4222
4223 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4224 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
4225
4226 let info_resp = vec![
4227 Header::new(b":status", b"103"),
4228 Header::new(b"link", b"<https://example.com>; rel=\"preconnect\""),
4229 ];
4230
4231 let resp = vec![
4232 Header::new(b":status", b"200"),
4233 Header::new(b"server", b"quiche-test"),
4234 ];
4235
4236 s.server
4237 .send_response(&mut s.pipe.server, stream, &info_resp, false)
4238 .unwrap();
4239
4240 assert_eq!(
4241 Err(Error::FrameUnexpected),
4242 s.server
4243 .send_response(&mut s.pipe.server, stream, &resp, true)
4244 );
4245
4246 s.advance().ok();
4247
4248 let ev_info_headers = Event::Headers {
4249 list: info_resp,
4250 more_frames: true,
4251 };
4252
4253 assert_eq!(s.poll_client(), Ok((stream, ev_info_headers)));
4254 assert_eq!(s.poll_client(), Err(Error::Done));
4255 }
4256
4257 #[test]
4258 fn no_send_additional_before_initial_response() {
4260 let mut s = Session::new().unwrap();
4261 s.handshake().unwrap();
4262
4263 let (stream, req) = s.send_request(true).unwrap();
4264
4265 assert_eq!(stream, 0);
4266
4267 let ev_headers = Event::Headers {
4268 list: req,
4269 more_frames: false,
4270 };
4271
4272 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4273 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
4274
4275 let info_resp = vec![
4276 Header::new(b":status", b"103"),
4277 Header::new(b"link", b"<https://example.com>; rel=\"preconnect\""),
4278 ];
4279
4280 assert_eq!(
4281 Err(Error::FrameUnexpected),
4282 s.server.send_additional_headers(
4283 &mut s.pipe.server,
4284 stream,
4285 &info_resp,
4286 false,
4287 false
4288 )
4289 );
4290
4291 s.advance().ok();
4292
4293 assert_eq!(s.poll_client(), Err(Error::Done));
4294 }
4295
4296 #[test]
4297 fn additional_headers_before_data_client() {
4299 let mut s = Session::new().unwrap();
4300 s.handshake().unwrap();
4301
4302 let (stream, req) = s.send_request(false).unwrap();
4303
4304 let req_trailer = vec![Header::new(b"goodbye", b"world")];
4305
4306 assert_eq!(
4307 s.client.send_additional_headers(
4308 &mut s.pipe.client,
4309 stream,
4310 &req_trailer,
4311 true,
4312 false
4313 ),
4314 Ok(())
4315 );
4316
4317 s.advance().ok();
4318
4319 let ev_initial_headers = Event::Headers {
4320 list: req,
4321 more_frames: true,
4322 };
4323
4324 let ev_trailing_headers = Event::Headers {
4325 list: req_trailer,
4326 more_frames: true,
4327 };
4328
4329 assert_eq!(s.poll_server(), Ok((stream, ev_initial_headers)));
4330 assert_eq!(s.poll_server(), Ok((stream, ev_trailing_headers)));
4331 assert_eq!(s.poll_server(), Err(Error::Done));
4332 }
4333
4334 #[test]
4335 fn data_after_trailers_client() {
4337 let mut s = Session::new().unwrap();
4338 s.handshake().unwrap();
4339
4340 let (stream, req) = s.send_request(false).unwrap();
4341
4342 let body = s.send_body_client(stream, false).unwrap();
4343
4344 let mut recv_buf = vec![0; body.len()];
4345
4346 let req_trailers = vec![Header::new(b"foo", b"bar")];
4347
4348 s.client
4349 .send_additional_headers(
4350 &mut s.pipe.client,
4351 stream,
4352 &req_trailers,
4353 true,
4354 false,
4355 )
4356 .unwrap();
4357
4358 s.advance().ok();
4359
4360 s.send_frame_client(
4361 frame::Frame::Data {
4362 payload: vec![1, 2, 3, 4],
4363 },
4364 stream,
4365 true,
4366 )
4367 .unwrap();
4368
4369 let ev_headers = Event::Headers {
4370 list: req,
4371 more_frames: true,
4372 };
4373
4374 let ev_trailers = Event::Headers {
4375 list: req_trailers,
4376 more_frames: true,
4377 };
4378
4379 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4380 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
4381 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
4382 assert_eq!(s.poll_server(), Ok((stream, ev_trailers)));
4383 assert_eq!(s.poll_server(), Err(Error::FrameUnexpected));
4384 }
4385
4386 #[test]
4387 fn max_push_id_from_client_good() {
4389 let mut s = Session::new().unwrap();
4390 s.handshake().unwrap();
4391
4392 s.send_frame_client(
4393 frame::Frame::MaxPushId { push_id: 1 },
4394 s.client.control_stream_id.unwrap(),
4395 false,
4396 )
4397 .unwrap();
4398
4399 assert_eq!(s.poll_server(), Err(Error::Done));
4400 }
4401
4402 #[test]
4403 fn max_push_id_from_client_bad_stream() {
4405 let mut s = Session::new().unwrap();
4406 s.handshake().unwrap();
4407
4408 let (stream, req) = s.send_request(false).unwrap();
4409
4410 s.send_frame_client(
4411 frame::Frame::MaxPushId { push_id: 2 },
4412 stream,
4413 false,
4414 )
4415 .unwrap();
4416
4417 let ev_headers = Event::Headers {
4418 list: req,
4419 more_frames: true,
4420 };
4421
4422 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4423 assert_eq!(s.poll_server(), Err(Error::FrameUnexpected));
4424 }
4425
4426 #[test]
4427 fn max_push_id_from_client_limit_reduction() {
4430 let mut s = Session::new().unwrap();
4431 s.handshake().unwrap();
4432
4433 s.send_frame_client(
4434 frame::Frame::MaxPushId { push_id: 2 },
4435 s.client.control_stream_id.unwrap(),
4436 false,
4437 )
4438 .unwrap();
4439
4440 s.send_frame_client(
4441 frame::Frame::MaxPushId { push_id: 1 },
4442 s.client.control_stream_id.unwrap(),
4443 false,
4444 )
4445 .unwrap();
4446
4447 assert_eq!(s.poll_server(), Err(Error::IdError));
4448 }
4449
4450 #[test]
4451 fn max_push_id_from_server() {
4453 let mut s = Session::new().unwrap();
4454 s.handshake().unwrap();
4455
4456 s.send_frame_server(
4457 frame::Frame::MaxPushId { push_id: 1 },
4458 s.server.control_stream_id.unwrap(),
4459 false,
4460 )
4461 .unwrap();
4462
4463 assert_eq!(s.poll_client(), Err(Error::FrameUnexpected));
4464 }
4465
4466 #[test]
4467 fn push_promise_from_client() {
4469 let mut s = Session::new().unwrap();
4470 s.handshake().unwrap();
4471
4472 let (stream, req) = s.send_request(false).unwrap();
4473
4474 let header_block = s.client.encode_header_block(&req).unwrap();
4475
4476 s.send_frame_client(
4477 frame::Frame::PushPromise {
4478 push_id: 1,
4479 header_block,
4480 },
4481 stream,
4482 false,
4483 )
4484 .unwrap();
4485
4486 let ev_headers = Event::Headers {
4487 list: req,
4488 more_frames: true,
4489 };
4490
4491 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4492 assert_eq!(s.poll_server(), Err(Error::FrameUnexpected));
4493 }
4494
4495 #[test]
4496 fn cancel_push_from_client() {
4498 let mut s = Session::new().unwrap();
4499 s.handshake().unwrap();
4500
4501 s.send_frame_client(
4502 frame::Frame::CancelPush { push_id: 1 },
4503 s.client.control_stream_id.unwrap(),
4504 false,
4505 )
4506 .unwrap();
4507
4508 assert_eq!(s.poll_server(), Err(Error::Done));
4509 }
4510
4511 #[test]
4512 fn cancel_push_from_client_bad_stream() {
4514 let mut s = Session::new().unwrap();
4515 s.handshake().unwrap();
4516
4517 let (stream, req) = s.send_request(false).unwrap();
4518
4519 s.send_frame_client(
4520 frame::Frame::CancelPush { push_id: 2 },
4521 stream,
4522 false,
4523 )
4524 .unwrap();
4525
4526 let ev_headers = Event::Headers {
4527 list: req,
4528 more_frames: true,
4529 };
4530
4531 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4532 assert_eq!(s.poll_server(), Err(Error::FrameUnexpected));
4533 }
4534
4535 #[test]
4536 fn cancel_push_from_server() {
4538 let mut s = Session::new().unwrap();
4539 s.handshake().unwrap();
4540
4541 s.send_frame_server(
4542 frame::Frame::CancelPush { push_id: 1 },
4543 s.server.control_stream_id.unwrap(),
4544 false,
4545 )
4546 .unwrap();
4547
4548 assert_eq!(s.poll_client(), Err(Error::Done));
4549 }
4550
4551 #[test]
4552 fn goaway_from_client_good() {
4554 let mut s = Session::new().unwrap();
4555 s.handshake().unwrap();
4556
4557 s.client.send_goaway(&mut s.pipe.client, 100).unwrap();
4558
4559 s.advance().ok();
4560
4561 assert_eq!(s.poll_server(), Ok((0, Event::GoAway)));
4563 }
4564
4565 #[test]
4566 fn goaway_from_server_good() {
4568 let mut s = Session::new().unwrap();
4569 s.handshake().unwrap();
4570
4571 s.server.send_goaway(&mut s.pipe.server, 4000).unwrap();
4572
4573 s.advance().ok();
4574
4575 assert_eq!(s.poll_client(), Ok((4000, Event::GoAway)));
4576 }
4577
4578 #[test]
4579 fn client_request_after_goaway() {
4581 let mut s = Session::new().unwrap();
4582 s.handshake().unwrap();
4583
4584 s.server.send_goaway(&mut s.pipe.server, 4000).unwrap();
4585
4586 s.advance().ok();
4587
4588 assert_eq!(s.poll_client(), Ok((4000, Event::GoAway)));
4589
4590 assert_eq!(s.send_request(true), Err(Error::FrameUnexpected));
4591 }
4592
4593 #[test]
4594 fn goaway_from_server_invalid_id() {
4596 let mut s = Session::new().unwrap();
4597 s.handshake().unwrap();
4598
4599 s.send_frame_server(
4600 frame::Frame::GoAway { id: 1 },
4601 s.server.control_stream_id.unwrap(),
4602 false,
4603 )
4604 .unwrap();
4605
4606 assert_eq!(s.poll_client(), Err(Error::IdError));
4607 }
4608
4609 #[test]
4610 fn goaway_from_server_increase_id() {
4613 let mut s = Session::new().unwrap();
4614 s.handshake().unwrap();
4615
4616 s.send_frame_server(
4617 frame::Frame::GoAway { id: 0 },
4618 s.server.control_stream_id.unwrap(),
4619 false,
4620 )
4621 .unwrap();
4622
4623 s.send_frame_server(
4624 frame::Frame::GoAway { id: 4 },
4625 s.server.control_stream_id.unwrap(),
4626 false,
4627 )
4628 .unwrap();
4629
4630 assert_eq!(s.poll_client(), Ok((0, Event::GoAway)));
4631
4632 assert_eq!(s.poll_client(), Err(Error::IdError));
4633 }
4634
4635 #[test]
4636 #[cfg(feature = "sfv")]
4637 fn parse_priority_field_value() {
4638 assert_eq!(
4640 Ok(Priority::new(0, false)),
4641 Priority::try_from(b"u=0".as_slice())
4642 );
4643 assert_eq!(
4644 Ok(Priority::new(3, false)),
4645 Priority::try_from(b"u=3".as_slice())
4646 );
4647 assert_eq!(
4648 Ok(Priority::new(7, false)),
4649 Priority::try_from(b"u=7".as_slice())
4650 );
4651
4652 assert_eq!(
4653 Ok(Priority::new(0, true)),
4654 Priority::try_from(b"u=0, i".as_slice())
4655 );
4656 assert_eq!(
4657 Ok(Priority::new(3, true)),
4658 Priority::try_from(b"u=3, i".as_slice())
4659 );
4660 assert_eq!(
4661 Ok(Priority::new(7, true)),
4662 Priority::try_from(b"u=7, i".as_slice())
4663 );
4664
4665 assert_eq!(
4666 Ok(Priority::new(0, true)),
4667 Priority::try_from(b"u=0, i=?1".as_slice())
4668 );
4669 assert_eq!(
4670 Ok(Priority::new(3, true)),
4671 Priority::try_from(b"u=3, i=?1".as_slice())
4672 );
4673 assert_eq!(
4674 Ok(Priority::new(7, true)),
4675 Priority::try_from(b"u=7, i=?1".as_slice())
4676 );
4677
4678 assert_eq!(
4679 Ok(Priority::new(3, false)),
4680 Priority::try_from(b"".as_slice())
4681 );
4682
4683 assert_eq!(
4684 Ok(Priority::new(0, true)),
4685 Priority::try_from(b"u=0;foo, i;bar".as_slice())
4686 );
4687 assert_eq!(
4688 Ok(Priority::new(3, true)),
4689 Priority::try_from(b"u=3;hello, i;world".as_slice())
4690 );
4691 assert_eq!(
4692 Ok(Priority::new(7, true)),
4693 Priority::try_from(b"u=7;croeso, i;gymru".as_slice())
4694 );
4695
4696 assert_eq!(
4697 Ok(Priority::new(0, true)),
4698 Priority::try_from(b"u=0, i, spinaltap=11".as_slice())
4699 );
4700
4701 assert_eq!(Err(Error::Done), Priority::try_from(b"0".as_slice()));
4703 assert_eq!(
4704 Ok(Priority::new(7, false)),
4705 Priority::try_from(b"u=-1".as_slice())
4706 );
4707 assert_eq!(Err(Error::Done), Priority::try_from(b"u=0.2".as_slice()));
4708 assert_eq!(
4709 Ok(Priority::new(7, false)),
4710 Priority::try_from(b"u=100".as_slice())
4711 );
4712 assert_eq!(
4713 Err(Error::Done),
4714 Priority::try_from(b"u=3, i=true".as_slice())
4715 );
4716
4717 assert_eq!(Err(Error::Done), Priority::try_from(b"u=7, ".as_slice()));
4719 }
4720
4721 #[test]
4722 fn priority_update_request() {
4724 let mut s = Session::new().unwrap();
4725 s.handshake().unwrap();
4726
4727 s.client
4728 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4729 urgency: 3,
4730 incremental: false,
4731 })
4732 .unwrap();
4733 s.advance().ok();
4734
4735 assert_eq!(s.poll_server(), Ok((0, Event::PriorityUpdate)));
4736 assert_eq!(s.poll_server(), Err(Error::Done));
4737 }
4738
4739 #[test]
4740 fn priority_update_single_stream_rearm() {
4742 let mut s = Session::new().unwrap();
4743 s.handshake().unwrap();
4744
4745 s.client
4746 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4747 urgency: 3,
4748 incremental: false,
4749 })
4750 .unwrap();
4751 s.advance().ok();
4752
4753 assert_eq!(s.poll_server(), Ok((0, Event::PriorityUpdate)));
4754 assert_eq!(s.poll_server(), Err(Error::Done));
4755
4756 s.client
4757 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4758 urgency: 5,
4759 incremental: false,
4760 })
4761 .unwrap();
4762 s.advance().ok();
4763
4764 assert_eq!(s.poll_server(), Err(Error::Done));
4765
4766 assert_eq!(s.server.take_last_priority_update(0), Ok(b"u=5".to_vec()));
4769 assert_eq!(s.server.take_last_priority_update(0), Err(Error::Done));
4770
4771 s.client
4772 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4773 urgency: 7,
4774 incremental: false,
4775 })
4776 .unwrap();
4777 s.advance().ok();
4778
4779 assert_eq!(s.poll_server(), Ok((0, Event::PriorityUpdate)));
4780 assert_eq!(s.poll_server(), Err(Error::Done));
4781
4782 assert_eq!(s.server.take_last_priority_update(0), Ok(b"u=7".to_vec()));
4783 assert_eq!(s.server.take_last_priority_update(0), Err(Error::Done));
4784 }
4785
4786 #[test]
4787 fn priority_update_request_multiple_stream_arm_multiple_flights() {
4790 let mut s = Session::new().unwrap();
4791 s.handshake().unwrap();
4792
4793 s.client
4794 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4795 urgency: 3,
4796 incremental: false,
4797 })
4798 .unwrap();
4799 s.advance().ok();
4800
4801 assert_eq!(s.poll_server(), Ok((0, Event::PriorityUpdate)));
4802 assert_eq!(s.poll_server(), Err(Error::Done));
4803
4804 s.client
4805 .send_priority_update_for_request(&mut s.pipe.client, 4, &Priority {
4806 urgency: 1,
4807 incremental: false,
4808 })
4809 .unwrap();
4810 s.advance().ok();
4811
4812 assert_eq!(s.poll_server(), Ok((4, Event::PriorityUpdate)));
4813 assert_eq!(s.poll_server(), Err(Error::Done));
4814
4815 s.client
4816 .send_priority_update_for_request(&mut s.pipe.client, 8, &Priority {
4817 urgency: 2,
4818 incremental: false,
4819 })
4820 .unwrap();
4821 s.advance().ok();
4822
4823 assert_eq!(s.poll_server(), Ok((8, Event::PriorityUpdate)));
4824 assert_eq!(s.poll_server(), Err(Error::Done));
4825
4826 assert_eq!(s.server.take_last_priority_update(0), Ok(b"u=3".to_vec()));
4827 assert_eq!(s.server.take_last_priority_update(4), Ok(b"u=1".to_vec()));
4828 assert_eq!(s.server.take_last_priority_update(8), Ok(b"u=2".to_vec()));
4829 assert_eq!(s.server.take_last_priority_update(0), Err(Error::Done));
4830 }
4831
4832 #[test]
4833 fn priority_update_request_multiple_stream_arm_single_flight() {
4836 let mut s = Session::new().unwrap();
4837 s.handshake().unwrap();
4838
4839 let mut d = [42; 65535];
4840
4841 let mut b = octets::OctetsMut::with_slice(&mut d);
4842
4843 let p1 = frame::Frame::PriorityUpdateRequest {
4844 prioritized_element_id: 0,
4845 priority_field_value: b"u=3".to_vec(),
4846 };
4847
4848 let p2 = frame::Frame::PriorityUpdateRequest {
4849 prioritized_element_id: 4,
4850 priority_field_value: b"u=3".to_vec(),
4851 };
4852
4853 let p3 = frame::Frame::PriorityUpdateRequest {
4854 prioritized_element_id: 8,
4855 priority_field_value: b"u=3".to_vec(),
4856 };
4857
4858 p1.to_bytes(&mut b).unwrap();
4859 p2.to_bytes(&mut b).unwrap();
4860 p3.to_bytes(&mut b).unwrap();
4861
4862 let off = b.off();
4863 s.pipe
4864 .client
4865 .stream_send(s.client.control_stream_id.unwrap(), &d[..off], false)
4866 .unwrap();
4867
4868 s.advance().ok();
4869
4870 assert_eq!(s.poll_server(), Ok((0, Event::PriorityUpdate)));
4871 assert_eq!(s.poll_server(), Ok((4, Event::PriorityUpdate)));
4872 assert_eq!(s.poll_server(), Ok((8, Event::PriorityUpdate)));
4873 assert_eq!(s.poll_server(), Err(Error::Done));
4874
4875 assert_eq!(s.server.take_last_priority_update(0), Ok(b"u=3".to_vec()));
4876 assert_eq!(s.server.take_last_priority_update(4), Ok(b"u=3".to_vec()));
4877 assert_eq!(s.server.take_last_priority_update(8), Ok(b"u=3".to_vec()));
4878
4879 assert_eq!(s.server.take_last_priority_update(0), Err(Error::Done));
4880 }
4881
4882 #[test]
4883 fn priority_update_request_collected_completed() {
4886 let mut s = Session::new().unwrap();
4887 s.handshake().unwrap();
4888
4889 s.client
4890 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4891 urgency: 3,
4892 incremental: false,
4893 })
4894 .unwrap();
4895 s.advance().ok();
4896
4897 let (stream, req) = s.send_request(true).unwrap();
4898 let ev_headers = Event::Headers {
4899 list: req,
4900 more_frames: false,
4901 };
4902
4903 assert_eq!(s.poll_server(), Ok((0, Event::PriorityUpdate)));
4905 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4906 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
4907 assert_eq!(s.poll_server(), Err(Error::Done));
4908
4909 assert_eq!(s.server.take_last_priority_update(0), Ok(b"u=3".to_vec()));
4910 assert_eq!(s.server.take_last_priority_update(0), Err(Error::Done));
4911
4912 let resp = s.send_response(stream, true).unwrap();
4913
4914 let ev_headers = Event::Headers {
4915 list: resp,
4916 more_frames: false,
4917 };
4918
4919 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
4920 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
4921 assert_eq!(s.poll_client(), Err(Error::Done));
4922
4923 s.client
4925 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4926 urgency: 3,
4927 incremental: false,
4928 })
4929 .unwrap();
4930 s.advance().ok();
4931
4932 assert_eq!(s.poll_server(), Err(Error::Done));
4934 }
4935
4936 #[test]
4937 fn priority_update_request_collected_stopped() {
4940 let mut s = Session::new().unwrap();
4941 s.handshake().unwrap();
4942
4943 s.client
4944 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4945 urgency: 3,
4946 incremental: false,
4947 })
4948 .unwrap();
4949 s.advance().ok();
4950
4951 let (stream, req) = s.send_request(false).unwrap();
4952 let ev_headers = Event::Headers {
4953 list: req,
4954 more_frames: true,
4955 };
4956
4957 assert_eq!(s.poll_server(), Ok((0, Event::PriorityUpdate)));
4959 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
4960 assert_eq!(s.poll_server(), Err(Error::Done));
4961
4962 assert_eq!(s.server.take_last_priority_update(0), Ok(b"u=3".to_vec()));
4963 assert_eq!(s.server.take_last_priority_update(0), Err(Error::Done));
4964
4965 s.pipe
4966 .client
4967 .stream_shutdown(stream, crate::Shutdown::Write, 0x100)
4968 .unwrap();
4969 s.pipe
4970 .client
4971 .stream_shutdown(stream, crate::Shutdown::Read, 0x100)
4972 .unwrap();
4973
4974 s.advance().ok();
4975
4976 assert_eq!(s.poll_server(), Ok((0, Event::Reset(0x100))));
4977 assert_eq!(s.poll_server(), Err(Error::Done));
4978
4979 s.client
4981 .send_priority_update_for_request(&mut s.pipe.client, 0, &Priority {
4982 urgency: 3,
4983 incremental: false,
4984 })
4985 .unwrap();
4986 s.advance().ok();
4987
4988 assert_eq!(s.poll_server(), Err(Error::Done));
4990
4991 assert!(s.pipe.server.streams.is_collected(0));
4992 assert!(s.pipe.client.streams.is_collected(0));
4993 }
4994
4995 #[test]
4996 fn priority_update_push() {
4998 let mut s = Session::new().unwrap();
4999 s.handshake().unwrap();
5000
5001 s.send_frame_client(
5002 frame::Frame::PriorityUpdatePush {
5003 prioritized_element_id: 3,
5004 priority_field_value: b"u=3".to_vec(),
5005 },
5006 s.client.control_stream_id.unwrap(),
5007 false,
5008 )
5009 .unwrap();
5010
5011 assert_eq!(s.poll_server(), Err(Error::Done));
5012 }
5013
5014 #[test]
5015 fn priority_update_request_bad_stream() {
5018 let mut s = Session::new().unwrap();
5019 s.handshake().unwrap();
5020
5021 s.send_frame_client(
5022 frame::Frame::PriorityUpdateRequest {
5023 prioritized_element_id: 5,
5024 priority_field_value: b"u=3".to_vec(),
5025 },
5026 s.client.control_stream_id.unwrap(),
5027 false,
5028 )
5029 .unwrap();
5030
5031 assert_eq!(s.poll_server(), Err(Error::FrameUnexpected));
5032 }
5033
5034 #[test]
5035 fn priority_update_push_bad_stream() {
5038 let mut s = Session::new().unwrap();
5039 s.handshake().unwrap();
5040
5041 s.send_frame_client(
5042 frame::Frame::PriorityUpdatePush {
5043 prioritized_element_id: 5,
5044 priority_field_value: b"u=3".to_vec(),
5045 },
5046 s.client.control_stream_id.unwrap(),
5047 false,
5048 )
5049 .unwrap();
5050
5051 assert_eq!(s.poll_server(), Err(Error::FrameUnexpected));
5052 }
5053
5054 #[test]
5055 fn priority_update_request_from_server() {
5057 let mut s = Session::new().unwrap();
5058 s.handshake().unwrap();
5059
5060 s.send_frame_server(
5061 frame::Frame::PriorityUpdateRequest {
5062 prioritized_element_id: 0,
5063 priority_field_value: b"u=3".to_vec(),
5064 },
5065 s.server.control_stream_id.unwrap(),
5066 false,
5067 )
5068 .unwrap();
5069
5070 assert_eq!(s.poll_client(), Err(Error::FrameUnexpected));
5071 }
5072
5073 #[test]
5074 fn priority_update_push_from_server() {
5076 let mut s = Session::new().unwrap();
5077 s.handshake().unwrap();
5078
5079 s.send_frame_server(
5080 frame::Frame::PriorityUpdatePush {
5081 prioritized_element_id: 0,
5082 priority_field_value: b"u=3".to_vec(),
5083 },
5084 s.server.control_stream_id.unwrap(),
5085 false,
5086 )
5087 .unwrap();
5088
5089 assert_eq!(s.poll_client(), Err(Error::FrameUnexpected));
5090 }
5091
5092 #[test]
5093 fn uni_stream_local_counting() {
5095 let config = Config::new().unwrap();
5096
5097 let h3_cln = Connection::new(&config, false, false).unwrap();
5098 assert_eq!(h3_cln.next_uni_stream_id, 2);
5099
5100 let h3_srv = Connection::new(&config, true, false).unwrap();
5101 assert_eq!(h3_srv.next_uni_stream_id, 3);
5102 }
5103
5104 #[test]
5105 fn open_multiple_control_streams() {
5107 let mut s = Session::new().unwrap();
5108 s.handshake().unwrap();
5109
5110 let stream_id = s.client.next_uni_stream_id;
5111
5112 let mut d = [42; 8];
5113 let mut b = octets::OctetsMut::with_slice(&mut d);
5114
5115 s.pipe
5116 .client
5117 .stream_send(
5118 stream_id,
5119 b.put_varint(stream::HTTP3_CONTROL_STREAM_TYPE_ID).unwrap(),
5120 false,
5121 )
5122 .unwrap();
5123
5124 s.advance().ok();
5125
5126 assert_eq!(s.poll_server(), Err(Error::StreamCreationError));
5127 }
5128
5129 #[test]
5130 fn close_control_stream_after_type() {
5132 let mut s = Session::new().unwrap();
5133 s.handshake().unwrap();
5134
5135 s.pipe
5136 .client
5137 .stream_send(s.client.control_stream_id.unwrap(), &[], true)
5138 .unwrap();
5139
5140 s.advance().ok();
5141
5142 assert_eq!(
5143 Err(Error::ClosedCriticalStream),
5144 s.server.poll(&mut s.pipe.server)
5145 );
5146 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5147 }
5148
5149 #[test]
5150 fn close_control_stream_after_frame() {
5153 let mut s = Session::new().unwrap();
5154 s.handshake().unwrap();
5155
5156 s.send_frame_client(
5157 frame::Frame::MaxPushId { push_id: 1 },
5158 s.client.control_stream_id.unwrap(),
5159 true,
5160 )
5161 .unwrap();
5162
5163 assert_eq!(
5164 Err(Error::ClosedCriticalStream),
5165 s.server.poll(&mut s.pipe.server)
5166 );
5167 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5168 }
5169
5170 #[test]
5171 fn reset_control_stream_after_type() {
5173 let mut s = Session::new().unwrap();
5174 s.handshake().unwrap();
5175
5176 s.pipe
5177 .client
5178 .stream_shutdown(
5179 s.client.control_stream_id.unwrap(),
5180 crate::Shutdown::Write,
5181 0,
5182 )
5183 .unwrap();
5184
5185 s.advance().ok();
5186
5187 assert_eq!(
5188 Err(Error::ClosedCriticalStream),
5189 s.server.poll(&mut s.pipe.server)
5190 );
5191 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5192 }
5193
5194 #[test]
5195 fn reset_control_stream_after_frame() {
5198 let mut s = Session::new().unwrap();
5199 s.handshake().unwrap();
5200
5201 s.send_frame_client(
5202 frame::Frame::MaxPushId { push_id: 1 },
5203 s.client.control_stream_id.unwrap(),
5204 false,
5205 )
5206 .unwrap();
5207
5208 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5209
5210 s.pipe
5211 .client
5212 .stream_shutdown(
5213 s.client.control_stream_id.unwrap(),
5214 crate::Shutdown::Write,
5215 0,
5216 )
5217 .unwrap();
5218
5219 s.advance().ok();
5220
5221 assert_eq!(
5222 Err(Error::ClosedCriticalStream),
5223 s.server.poll(&mut s.pipe.server)
5224 );
5225 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5226 }
5227
5228 #[test]
5229 fn close_qpack_stream_after_type() {
5231 let mut s = Session::new().unwrap();
5232 s.handshake().unwrap();
5233
5234 s.pipe
5235 .client
5236 .stream_send(
5237 s.client.local_qpack_streams.encoder_stream_id.unwrap(),
5238 &[],
5239 true,
5240 )
5241 .unwrap();
5242
5243 s.advance().ok();
5244
5245 assert_eq!(
5246 Err(Error::ClosedCriticalStream),
5247 s.server.poll(&mut s.pipe.server)
5248 );
5249 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5250 }
5251
5252 #[test]
5253 fn close_qpack_stream_after_data() {
5255 let mut s = Session::new().unwrap();
5256 s.handshake().unwrap();
5257
5258 let stream_id = s.client.local_qpack_streams.encoder_stream_id.unwrap();
5259 let d = [0; 1];
5260
5261 s.pipe.client.stream_send(stream_id, &d, false).unwrap();
5262 s.pipe.client.stream_send(stream_id, &d, true).unwrap();
5263
5264 s.advance().ok();
5265
5266 assert_eq!(
5267 Err(Error::ClosedCriticalStream),
5268 s.server.poll(&mut s.pipe.server)
5269 );
5270 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5271 }
5272
5273 #[test]
5274 fn reset_qpack_stream_after_type() {
5276 let mut s = Session::new().unwrap();
5277 s.handshake().unwrap();
5278
5279 s.pipe
5280 .client
5281 .stream_shutdown(
5282 s.client.local_qpack_streams.encoder_stream_id.unwrap(),
5283 crate::Shutdown::Write,
5284 0,
5285 )
5286 .unwrap();
5287
5288 s.advance().ok();
5289
5290 assert_eq!(
5291 Err(Error::ClosedCriticalStream),
5292 s.server.poll(&mut s.pipe.server)
5293 );
5294 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5295 }
5296
5297 #[test]
5298 fn reset_qpack_stream_after_data() {
5300 let mut s = Session::new().unwrap();
5301 s.handshake().unwrap();
5302
5303 let stream_id = s.client.local_qpack_streams.encoder_stream_id.unwrap();
5304 let d = [0; 1];
5305
5306 s.pipe.client.stream_send(stream_id, &d, false).unwrap();
5307 s.pipe.client.stream_send(stream_id, &d, false).unwrap();
5308
5309 s.advance().ok();
5310
5311 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5312
5313 s.pipe
5314 .client
5315 .stream_shutdown(stream_id, crate::Shutdown::Write, 0)
5316 .unwrap();
5317
5318 s.advance().ok();
5319
5320 assert_eq!(
5321 Err(Error::ClosedCriticalStream),
5322 s.server.poll(&mut s.pipe.server)
5323 );
5324 assert_eq!(Err(Error::Done), s.server.poll(&mut s.pipe.server));
5325 }
5326
5327 #[test]
5328 fn qpack_data() {
5330 let mut s = Session::new().unwrap();
5333 s.handshake().unwrap();
5334
5335 let e_stream_id = s.client.local_qpack_streams.encoder_stream_id.unwrap();
5336 let d_stream_id = s.client.local_qpack_streams.decoder_stream_id.unwrap();
5337 let d = [0; 20];
5338
5339 s.pipe.client.stream_send(e_stream_id, &d, false).unwrap();
5340 s.advance().ok();
5341
5342 s.pipe.client.stream_send(d_stream_id, &d, false).unwrap();
5343 s.advance().ok();
5344
5345 match s.server.poll(&mut s.pipe.server) {
5346 Ok(_) => panic!(),
5347
5348 Err(Error::Done) => {
5349 assert_eq!(s.server.peer_qpack_streams.encoder_stream_bytes, 20);
5350 assert_eq!(s.server.peer_qpack_streams.decoder_stream_bytes, 20);
5351 },
5352
5353 Err(_) => {
5354 panic!();
5355 },
5356 }
5357
5358 let stats = s.server.stats();
5359 assert_eq!(stats.qpack_encoder_stream_recv_bytes, 20);
5360 assert_eq!(stats.qpack_decoder_stream_recv_bytes, 20);
5361 }
5362
5363 #[test]
5364 fn max_state_buf_size() {
5366 let mut s = Session::new().unwrap();
5367 s.handshake().unwrap();
5368
5369 let req = vec![
5370 Header::new(b":method", b"GET"),
5371 Header::new(b":scheme", b"https"),
5372 Header::new(b":authority", b"quic.tech"),
5373 Header::new(b":path", b"/test"),
5374 Header::new(b"user-agent", b"quiche-test"),
5375 ];
5376
5377 assert_eq!(
5378 s.client.send_request(&mut s.pipe.client, &req, false),
5379 Ok(0)
5380 );
5381
5382 s.advance().ok();
5383
5384 let ev_headers = Event::Headers {
5385 list: req,
5386 more_frames: true,
5387 };
5388
5389 assert_eq!(s.server.poll(&mut s.pipe.server), Ok((0, ev_headers)));
5390
5391 let mut d = [42; 128];
5393 let mut b = octets::OctetsMut::with_slice(&mut d);
5394
5395 let frame_type = b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
5396 s.pipe.client.stream_send(0, frame_type, false).unwrap();
5397
5398 let frame_len = b.put_varint(1 << 24).unwrap();
5399 s.pipe.client.stream_send(0, frame_len, false).unwrap();
5400
5401 s.pipe.client.stream_send(0, &d, false).unwrap();
5402
5403 s.advance().ok();
5404
5405 assert_eq!(s.server.poll(&mut s.pipe.server), Ok((0, Event::Data)));
5406
5407 let mut s = Session::new().unwrap();
5409 s.handshake().unwrap();
5410
5411 let mut d = [42; 128];
5412 let mut b = octets::OctetsMut::with_slice(&mut d);
5413
5414 let frame_type = b.put_varint(148_764_065_110_560_899).unwrap();
5415 s.pipe.client.stream_send(0, frame_type, false).unwrap();
5416
5417 let frame_len = b.put_varint(1 << 24).unwrap();
5418 s.pipe.client.stream_send(0, frame_len, false).unwrap();
5419
5420 s.pipe.client.stream_send(0, &d, false).unwrap();
5421
5422 s.advance().ok();
5423
5424 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::ExcessiveLoad));
5425 }
5426
5427 #[test]
5428 fn stream_backpressure() {
5431 let bytes = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
5432
5433 let mut s = Session::new().unwrap();
5434 s.handshake().unwrap();
5435
5436 let (stream, req) = s.send_request(false).unwrap();
5437
5438 let total_data_frames = 6;
5439
5440 for _ in 0..total_data_frames {
5441 assert_eq!(
5442 s.client
5443 .send_body(&mut s.pipe.client, stream, &bytes, false),
5444 Ok(bytes.len())
5445 );
5446
5447 s.advance().ok();
5448 }
5449
5450 assert_eq!(
5451 s.client.send_body(&mut s.pipe.client, stream, &bytes, true),
5452 Ok(bytes.len() - 2)
5453 );
5454
5455 s.advance().ok();
5456
5457 let mut recv_buf = vec![0; bytes.len()];
5458
5459 let ev_headers = Event::Headers {
5460 list: req,
5461 more_frames: true,
5462 };
5463
5464 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
5465 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
5466 assert_eq!(s.poll_server(), Err(Error::Done));
5467
5468 for _ in 0..total_data_frames {
5469 assert_eq!(
5470 s.recv_body_server(stream, &mut recv_buf),
5471 Ok(bytes.len())
5472 );
5473 }
5474
5475 assert_eq!(
5476 s.recv_body_server(stream, &mut recv_buf),
5477 Ok(bytes.len() - 2)
5478 );
5479
5480 assert_eq!(s.poll_server(), Err(Error::Done));
5483
5484 assert_eq!(s.pipe.server.data_blocked_sent_count, 0);
5485 assert_eq!(s.pipe.server.stream_data_blocked_sent_count, 0);
5486 assert_eq!(s.pipe.server.data_blocked_recv_count, 0);
5487 assert_eq!(s.pipe.server.stream_data_blocked_recv_count, 1);
5488
5489 assert_eq!(s.pipe.client.data_blocked_sent_count, 0);
5490 assert_eq!(s.pipe.client.stream_data_blocked_sent_count, 1);
5491 assert_eq!(s.pipe.client.data_blocked_recv_count, 0);
5492 assert_eq!(s.pipe.client.stream_data_blocked_recv_count, 0);
5493 }
5494
5495 #[test]
5496 fn request_max_header_size_limit() {
5498 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5499 config
5500 .load_cert_chain_from_pem_file("examples/cert.crt")
5501 .unwrap();
5502 config
5503 .load_priv_key_from_pem_file("examples/cert.key")
5504 .unwrap();
5505 config.set_application_protos(&[b"h3"]).unwrap();
5506 config.set_initial_max_data(1500);
5507 config.set_initial_max_stream_data_bidi_local(150);
5508 config.set_initial_max_stream_data_bidi_remote(150);
5509 config.set_initial_max_stream_data_uni(150);
5510 config.set_initial_max_streams_bidi(5);
5511 config.set_initial_max_streams_uni(5);
5512 config.verify_peer(false);
5513
5514 let mut h3_config = Config::new().unwrap();
5515 h3_config.set_max_field_section_size(65);
5516
5517 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5518
5519 s.handshake().unwrap();
5520
5521 let req = vec![
5522 Header::new(b":method", b"GET"),
5523 Header::new(b":scheme", b"https"),
5524 Header::new(b":authority", b"quic.tech"),
5525 Header::new(b":path", b"/test"),
5526 Header::new(b"aaaaaaa", b"aaaaaaaa"),
5527 ];
5528
5529 let stream = s
5530 .client
5531 .send_request(&mut s.pipe.client, &req, true)
5532 .unwrap();
5533
5534 s.advance().ok();
5535
5536 assert_eq!(stream, 0);
5537
5538 assert_eq!(s.poll_server(), Err(Error::ExcessiveLoad));
5539
5540 assert_eq!(
5541 s.pipe.server.local_error.as_ref().unwrap().error_code,
5542 Error::to_wire(Error::ExcessiveLoad)
5543 );
5544 }
5545
5546 #[test]
5547 fn transport_error() {
5549 let mut s = Session::new().unwrap();
5550 s.handshake().unwrap();
5551
5552 let req = vec![
5553 Header::new(b":method", b"GET"),
5554 Header::new(b":scheme", b"https"),
5555 Header::new(b":authority", b"quic.tech"),
5556 Header::new(b":path", b"/test"),
5557 Header::new(b"user-agent", b"quiche-test"),
5558 ];
5559
5560 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(0));
5565 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(4));
5566 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(8));
5567 assert_eq!(
5568 s.client.send_request(&mut s.pipe.client, &req, true),
5569 Ok(12)
5570 );
5571 assert_eq!(
5572 s.client.send_request(&mut s.pipe.client, &req, true),
5573 Ok(16)
5574 );
5575
5576 assert_eq!(
5577 s.client.send_request(&mut s.pipe.client, &req, true),
5578 Err(Error::TransportError(crate::Error::StreamLimit))
5579 );
5580 }
5581
5582 #[test]
5583 fn data_before_headers() {
5585 let mut s = Session::new().unwrap();
5586 s.handshake().unwrap();
5587
5588 let mut d = [42; 128];
5589 let mut b = octets::OctetsMut::with_slice(&mut d);
5590
5591 let frame_type = b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
5592 s.pipe.client.stream_send(0, frame_type, false).unwrap();
5593
5594 let frame_len = b.put_varint(5).unwrap();
5595 s.pipe.client.stream_send(0, frame_len, false).unwrap();
5596
5597 s.pipe.client.stream_send(0, b"hello", false).unwrap();
5598
5599 s.advance().ok();
5600
5601 assert_eq!(
5602 s.server.poll(&mut s.pipe.server),
5603 Err(Error::FrameUnexpected)
5604 );
5605 }
5606
5607 #[test]
5608 fn poll_after_error() {
5610 let mut s = Session::new().unwrap();
5611 s.handshake().unwrap();
5612
5613 let mut d = [42; 128];
5614 let mut b = octets::OctetsMut::with_slice(&mut d);
5615
5616 let frame_type = b.put_varint(148_764_065_110_560_899).unwrap();
5617 s.pipe.client.stream_send(0, frame_type, false).unwrap();
5618
5619 let frame_len = b.put_varint(1 << 24).unwrap();
5620 s.pipe.client.stream_send(0, frame_len, false).unwrap();
5621
5622 s.pipe.client.stream_send(0, &d, false).unwrap();
5623
5624 s.advance().ok();
5625
5626 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::ExcessiveLoad));
5627
5628 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::Done));
5630 }
5631
5632 #[test]
5633 fn headers_blocked() {
5635 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5636 config
5637 .load_cert_chain_from_pem_file("examples/cert.crt")
5638 .unwrap();
5639 config
5640 .load_priv_key_from_pem_file("examples/cert.key")
5641 .unwrap();
5642 config.set_application_protos(&[b"h3"]).unwrap();
5643 config.set_initial_max_data(70);
5644 config.set_initial_max_stream_data_bidi_local(150);
5645 config.set_initial_max_stream_data_bidi_remote(150);
5646 config.set_initial_max_stream_data_uni(150);
5647 config.set_initial_max_streams_bidi(100);
5648 config.set_initial_max_streams_uni(5);
5649 config.verify_peer(false);
5650
5651 let h3_config = Config::new().unwrap();
5652
5653 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5654
5655 s.handshake().unwrap();
5656
5657 let req = vec![
5658 Header::new(b":method", b"GET"),
5659 Header::new(b":scheme", b"https"),
5660 Header::new(b":authority", b"quic.tech"),
5661 Header::new(b":path", b"/test"),
5662 ];
5663
5664 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(0));
5665
5666 assert_eq!(
5667 s.client.send_request(&mut s.pipe.client, &req, true),
5668 Err(Error::StreamBlocked)
5669 );
5670
5671 assert_eq!(s.pipe.client.stream_writable_next(), Some(2));
5673 assert_eq!(s.pipe.client.stream_writable_next(), Some(6));
5674 assert_eq!(s.pipe.client.stream_writable_next(), Some(10));
5675 assert_eq!(s.pipe.client.stream_writable_next(), None);
5676
5677 s.advance().ok();
5678
5679 assert_eq!(s.pipe.client.stream_writable_next(), Some(4));
5682 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(4));
5683
5684 assert_eq!(s.pipe.server.data_blocked_sent_count, 0);
5685 assert_eq!(s.pipe.server.stream_data_blocked_sent_count, 0);
5686 assert_eq!(s.pipe.server.data_blocked_recv_count, 1);
5687 assert_eq!(s.pipe.server.stream_data_blocked_recv_count, 0);
5688
5689 assert_eq!(s.pipe.client.data_blocked_sent_count, 1);
5690 assert_eq!(s.pipe.client.stream_data_blocked_sent_count, 0);
5691 assert_eq!(s.pipe.client.data_blocked_recv_count, 0);
5692 assert_eq!(s.pipe.client.stream_data_blocked_recv_count, 0);
5693 }
5694
5695 #[test]
5696 fn headers_blocked_on_conn() {
5698 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5699 config
5700 .load_cert_chain_from_pem_file("examples/cert.crt")
5701 .unwrap();
5702 config
5703 .load_priv_key_from_pem_file("examples/cert.key")
5704 .unwrap();
5705 config.set_application_protos(&[b"h3"]).unwrap();
5706 config.set_initial_max_data(70);
5707 config.set_initial_max_stream_data_bidi_local(150);
5708 config.set_initial_max_stream_data_bidi_remote(150);
5709 config.set_initial_max_stream_data_uni(150);
5710 config.set_initial_max_streams_bidi(100);
5711 config.set_initial_max_streams_uni(5);
5712 config.verify_peer(false);
5713
5714 let h3_config = Config::new().unwrap();
5715
5716 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5717
5718 s.handshake().unwrap();
5719
5720 let d = [42; 28];
5724 assert_eq!(s.pipe.client.stream_send(2, &d, false), Ok(23));
5725
5726 let req = vec![
5727 Header::new(b":method", b"GET"),
5728 Header::new(b":scheme", b"https"),
5729 Header::new(b":authority", b"quic.tech"),
5730 Header::new(b":path", b"/test"),
5731 ];
5732
5733 assert_eq!(
5736 s.client.send_request(&mut s.pipe.client, &req, true),
5737 Err(Error::StreamBlocked)
5738 );
5739 assert_eq!(s.pipe.client.stream_writable_next(), None);
5740
5741 s.advance().ok();
5744 assert_eq!(s.poll_server(), Err(Error::Done));
5745 s.advance().ok();
5746
5747 assert_eq!(s.pipe.client.stream_writable_next(), Some(2));
5749 assert_eq!(s.pipe.client.stream_writable_next(), Some(6));
5750 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(0));
5751
5752 assert_eq!(s.pipe.server.data_blocked_sent_count, 0);
5753 assert_eq!(s.pipe.server.stream_data_blocked_sent_count, 0);
5754 assert_eq!(s.pipe.server.data_blocked_recv_count, 1);
5755 assert_eq!(s.pipe.server.stream_data_blocked_recv_count, 0);
5756
5757 assert_eq!(s.pipe.client.data_blocked_sent_count, 1);
5758 assert_eq!(s.pipe.client.stream_data_blocked_sent_count, 0);
5759 assert_eq!(s.pipe.client.data_blocked_recv_count, 0);
5760 assert_eq!(s.pipe.client.stream_data_blocked_recv_count, 0);
5761 }
5762
5763 #[test]
5764 fn send_body_truncation_stream_blocked() {
5767 use crate::test_utils::decode_pkt;
5768
5769 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5770 config
5771 .load_cert_chain_from_pem_file("examples/cert.crt")
5772 .unwrap();
5773 config
5774 .load_priv_key_from_pem_file("examples/cert.key")
5775 .unwrap();
5776 config.set_application_protos(&[b"h3"]).unwrap();
5777 config.set_initial_max_data(10000); config.set_initial_max_stream_data_bidi_local(80);
5779 config.set_initial_max_stream_data_bidi_remote(80);
5780 config.set_initial_max_stream_data_uni(150);
5781 config.set_initial_max_streams_bidi(100);
5782 config.set_initial_max_streams_uni(5);
5783 config.verify_peer(false);
5784
5785 let h3_config = Config::new().unwrap();
5786
5787 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5788
5789 s.handshake().unwrap();
5790
5791 let (stream, req) = s.send_request(true).unwrap();
5792
5793 let ev_headers = Event::Headers {
5794 list: req,
5795 more_frames: false,
5796 };
5797
5798 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
5799 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
5800
5801 let _ = s.send_response(stream, false).unwrap();
5802
5803 assert_eq!(s.pipe.server.streams.blocked().len(), 0);
5804
5805 let d = [42; 500];
5807 let mut off = 0;
5808
5809 let sent = s
5810 .server
5811 .send_body(&mut s.pipe.server, stream, &d, true)
5812 .unwrap();
5813 assert_eq!(sent, 25);
5814 off += sent;
5815
5816 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5818 assert_eq!(
5819 s.server
5820 .send_body(&mut s.pipe.server, stream, &d[off..], true),
5821 Err(Error::Done)
5822 );
5823 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5824
5825 let mut buf = [0; 65535];
5827 let (len, _) = s.pipe.server.send(&mut buf).unwrap();
5828
5829 let frames = decode_pkt(&mut s.pipe.client, &mut buf[..len]).unwrap();
5830
5831 let mut iter = frames.iter();
5832
5833 assert_eq!(
5834 iter.next(),
5835 Some(&crate::frame::Frame::StreamDataBlocked {
5836 stream_id: 0,
5837 limit: 80,
5838 })
5839 );
5840
5841 assert_eq!(s.pipe.server.streams.blocked().len(), 0);
5844
5845 assert_eq!(
5851 s.server
5852 .send_body(&mut s.pipe.server, stream, &d[off..], true),
5853 Err(Error::Done)
5854 );
5855 assert_eq!(s.pipe.server.streams.blocked().len(), 0);
5856 assert_eq!(s.pipe.server.send(&mut buf), Err(crate::Error::Done));
5857
5858 let frames = [crate::frame::Frame::MaxStreamData {
5860 stream_id: 0,
5861 max: 100,
5862 }];
5863
5864 let pkt_type = crate::packet::Type::Short;
5865 assert_eq!(
5866 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
5867 Ok(39),
5868 );
5869
5870 let sent = s
5871 .server
5872 .send_body(&mut s.pipe.server, stream, &d[off..], true)
5873 .unwrap();
5874 assert_eq!(sent, 18);
5875
5876 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5878 assert_eq!(
5879 s.server
5880 .send_body(&mut s.pipe.server, stream, &d[off..], true),
5881 Err(Error::Done)
5882 );
5883 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5884
5885 let (len, _) = s.pipe.server.send(&mut buf).unwrap();
5886
5887 let frames = decode_pkt(&mut s.pipe.client, &mut buf[..len]).unwrap();
5888
5889 let mut iter = frames.iter();
5890
5891 assert_eq!(
5892 iter.next(),
5893 Some(&crate::frame::Frame::StreamDataBlocked {
5894 stream_id: 0,
5895 limit: 100,
5896 })
5897 );
5898 }
5899
5900 #[test]
5901 fn send_body_stream_blocked_by_small_cwnd() {
5903 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5904 config
5905 .load_cert_chain_from_pem_file("examples/cert.crt")
5906 .unwrap();
5907 config
5908 .load_priv_key_from_pem_file("examples/cert.key")
5909 .unwrap();
5910 config.set_application_protos(&[b"h3"]).unwrap();
5911 config.set_initial_max_data(100000); config.set_initial_max_stream_data_bidi_local(100000);
5913 config.set_initial_max_stream_data_bidi_remote(50000);
5914 config.set_initial_max_stream_data_uni(150);
5915 config.set_initial_max_streams_bidi(100);
5916 config.set_initial_max_streams_uni(5);
5917 config.verify_peer(false);
5918
5919 let h3_config = Config::new().unwrap();
5920
5921 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5922
5923 s.handshake().unwrap();
5924
5925 let (stream, req) = s.send_request(true).unwrap();
5926
5927 let ev_headers = Event::Headers {
5928 list: req,
5929 more_frames: false,
5930 };
5931
5932 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
5933 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
5934
5935 let _ = s.send_response(stream, false).unwrap();
5936
5937 assert_eq!(s.pipe.server.stream_writable_next(), Some(3));
5939 assert_eq!(s.pipe.server.stream_writable_next(), Some(7));
5940 assert_eq!(s.pipe.server.stream_writable_next(), Some(11));
5941 assert_eq!(s.pipe.server.stream_writable_next(), Some(stream));
5942 assert_eq!(s.pipe.server.stream_writable_next(), None);
5943
5944 let send_buf = [42; 80000];
5946
5947 let sent = s
5948 .server
5949 .send_body(&mut s.pipe.server, stream, &send_buf, true)
5950 .unwrap();
5951
5952 assert_eq!(sent, 11995);
5954
5955 s.advance().ok();
5956
5957 let mut recv_buf = [42; 80000];
5959 assert!(s.poll_client().is_ok());
5960 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
5961 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(11995));
5962
5963 s.advance().ok();
5964
5965 assert!(s.pipe.server.tx_cap < send_buf.len() - sent);
5967
5968 assert_eq!(s.pipe.server.stream_writable_next(), Some(0));
5970 }
5971
5972 #[test]
5973 fn send_body_stream_blocked_zero_length() {
5975 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5976 config
5977 .load_cert_chain_from_pem_file("examples/cert.crt")
5978 .unwrap();
5979 config
5980 .load_priv_key_from_pem_file("examples/cert.key")
5981 .unwrap();
5982 config.set_application_protos(&[b"h3"]).unwrap();
5983 config.set_initial_max_data(100000); config.set_initial_max_stream_data_bidi_local(100000);
5985 config.set_initial_max_stream_data_bidi_remote(50000);
5986 config.set_initial_max_stream_data_uni(150);
5987 config.set_initial_max_streams_bidi(100);
5988 config.set_initial_max_streams_uni(5);
5989 config.verify_peer(false);
5990
5991 let h3_config = Config::new().unwrap();
5992
5993 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5994
5995 s.handshake().unwrap();
5996
5997 let (stream, req) = s.send_request(true).unwrap();
5998
5999 let ev_headers = Event::Headers {
6000 list: req,
6001 more_frames: false,
6002 };
6003
6004 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6005 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6006
6007 let _ = s.send_response(stream, false).unwrap();
6008
6009 assert_eq!(s.pipe.server.stream_writable_next(), Some(3));
6011 assert_eq!(s.pipe.server.stream_writable_next(), Some(7));
6012 assert_eq!(s.pipe.server.stream_writable_next(), Some(11));
6013 assert_eq!(s.pipe.server.stream_writable_next(), Some(stream));
6014 assert_eq!(s.pipe.server.stream_writable_next(), None);
6015
6016 let send_buf = [42; 11994];
6019
6020 let sent = s
6021 .server
6022 .send_body(&mut s.pipe.server, stream, &send_buf, false)
6023 .unwrap();
6024
6025 assert_eq!(sent, 11994);
6026
6027 assert_eq!(s.pipe.server.stream_capacity(stream).unwrap(), 3);
6030 assert_eq!(
6031 s.server
6032 .send_body(&mut s.pipe.server, stream, &send_buf, false),
6033 Err(Error::Done)
6034 );
6035
6036 s.advance().ok();
6037
6038 let mut recv_buf = [42; 80000];
6040 assert!(s.poll_client().is_ok());
6041 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6042 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(11994));
6043
6044 s.advance().ok();
6045
6046 assert_eq!(s.pipe.server.stream_writable_next(), Some(0));
6048 }
6049
6050 #[test]
6051 fn zero_length_data() {
6053 let mut s = Session::new().unwrap();
6054 s.handshake().unwrap();
6055
6056 let (stream, req) = s.send_request(false).unwrap();
6057
6058 assert_eq!(
6059 s.client.send_body(&mut s.pipe.client, 0, b"", false),
6060 Err(Error::Done)
6061 );
6062 assert_eq!(s.client.send_body(&mut s.pipe.client, 0, b"", true), Ok(0));
6063
6064 s.advance().ok();
6065
6066 let mut recv_buf = vec![0; 100];
6067
6068 let ev_headers = Event::Headers {
6069 list: req,
6070 more_frames: true,
6071 };
6072
6073 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6074
6075 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6076 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Err(Error::Done));
6077
6078 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6079 assert_eq!(s.poll_server(), Err(Error::Done));
6080
6081 let resp = s.send_response(stream, false).unwrap();
6082
6083 assert_eq!(
6084 s.server.send_body(&mut s.pipe.server, 0, b"", false),
6085 Err(Error::Done)
6086 );
6087 assert_eq!(s.server.send_body(&mut s.pipe.server, 0, b"", true), Ok(0));
6088
6089 s.advance().ok();
6090
6091 let ev_headers = Event::Headers {
6092 list: resp,
6093 more_frames: true,
6094 };
6095
6096 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
6097
6098 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6099 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Err(Error::Done));
6100
6101 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
6102 assert_eq!(s.poll_client(), Err(Error::Done));
6103 }
6104
6105 #[test]
6106 fn zero_length_data_blocked() {
6108 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6109 config
6110 .load_cert_chain_from_pem_file("examples/cert.crt")
6111 .unwrap();
6112 config
6113 .load_priv_key_from_pem_file("examples/cert.key")
6114 .unwrap();
6115 config.set_application_protos(&[b"h3"]).unwrap();
6116 config.set_initial_max_data(69);
6117 config.set_initial_max_stream_data_bidi_local(150);
6118 config.set_initial_max_stream_data_bidi_remote(150);
6119 config.set_initial_max_stream_data_uni(150);
6120 config.set_initial_max_streams_bidi(100);
6121 config.set_initial_max_streams_uni(5);
6122 config.verify_peer(false);
6123
6124 let h3_config = Config::new().unwrap();
6125
6126 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6127
6128 s.handshake().unwrap();
6129
6130 let req = vec![
6131 Header::new(b":method", b"GET"),
6132 Header::new(b":scheme", b"https"),
6133 Header::new(b":authority", b"quic.tech"),
6134 Header::new(b":path", b"/test"),
6135 ];
6136
6137 assert_eq!(
6138 s.client.send_request(&mut s.pipe.client, &req, false),
6139 Ok(0)
6140 );
6141
6142 assert_eq!(
6143 s.client.send_body(&mut s.pipe.client, 0, b"", true),
6144 Err(Error::Done)
6145 );
6146
6147 assert_eq!(s.pipe.client.stream_writable_next(), Some(2));
6149 assert_eq!(s.pipe.client.stream_writable_next(), Some(6));
6150 assert_eq!(s.pipe.client.stream_writable_next(), Some(10));
6151 assert_eq!(s.pipe.client.stream_writable_next(), None);
6152
6153 s.advance().ok();
6154
6155 assert_eq!(s.pipe.client.stream_writable_next(), Some(0));
6157 assert_eq!(s.client.send_body(&mut s.pipe.client, 0, b"", true), Ok(0));
6158 }
6159
6160 #[test]
6161 fn empty_settings() {
6163 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6164 config
6165 .load_cert_chain_from_pem_file("examples/cert.crt")
6166 .unwrap();
6167 config
6168 .load_priv_key_from_pem_file("examples/cert.key")
6169 .unwrap();
6170 config.set_application_protos(&[b"h3"]).unwrap();
6171 config.set_initial_max_data(1500);
6172 config.set_initial_max_stream_data_bidi_local(150);
6173 config.set_initial_max_stream_data_bidi_remote(150);
6174 config.set_initial_max_stream_data_uni(150);
6175 config.set_initial_max_streams_bidi(5);
6176 config.set_initial_max_streams_uni(5);
6177 config.verify_peer(false);
6178 config.set_ack_delay_exponent(8);
6179 config.grease(false);
6180
6181 let h3_config = Config::new().unwrap();
6182 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6183
6184 s.handshake().unwrap();
6185
6186 assert!(s.client.peer_settings_raw().is_some());
6187 assert!(s.server.peer_settings_raw().is_some());
6188 }
6189
6190 #[test]
6191 fn dgram_setting() {
6193 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6194 config
6195 .load_cert_chain_from_pem_file("examples/cert.crt")
6196 .unwrap();
6197 config
6198 .load_priv_key_from_pem_file("examples/cert.key")
6199 .unwrap();
6200 config.set_application_protos(&[b"h3"]).unwrap();
6201 config.set_initial_max_data(70);
6202 config.set_initial_max_stream_data_bidi_local(150);
6203 config.set_initial_max_stream_data_bidi_remote(150);
6204 config.set_initial_max_stream_data_uni(150);
6205 config.set_initial_max_streams_bidi(100);
6206 config.set_initial_max_streams_uni(5);
6207 config.enable_dgram(true, 1000, 1000);
6208 config.verify_peer(false);
6209
6210 let h3_config = Config::new().unwrap();
6211
6212 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6213 assert_eq!(s.pipe.handshake(), Ok(()));
6214
6215 s.client.send_settings(&mut s.pipe.client).unwrap();
6216 assert_eq!(s.pipe.advance(), Ok(()));
6217
6218 assert!(!s.server.dgram_enabled_by_peer(&s.pipe.server));
6221
6222 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::Done));
6224 assert!(s.server.dgram_enabled_by_peer(&s.pipe.server));
6225
6226 s.server.send_settings(&mut s.pipe.server).unwrap();
6228 assert_eq!(s.pipe.advance(), Ok(()));
6229 assert!(!s.client.dgram_enabled_by_peer(&s.pipe.client));
6230 assert_eq!(s.client.poll(&mut s.pipe.client), Err(Error::Done));
6231 assert!(s.client.dgram_enabled_by_peer(&s.pipe.client));
6232 }
6233
6234 #[test]
6235 fn dgram_setting_no_tp() {
6238 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6239 config
6240 .load_cert_chain_from_pem_file("examples/cert.crt")
6241 .unwrap();
6242 config
6243 .load_priv_key_from_pem_file("examples/cert.key")
6244 .unwrap();
6245 config.set_application_protos(&[b"h3"]).unwrap();
6246 config.set_initial_max_data(70);
6247 config.set_initial_max_stream_data_bidi_local(150);
6248 config.set_initial_max_stream_data_bidi_remote(150);
6249 config.set_initial_max_stream_data_uni(150);
6250 config.set_initial_max_streams_bidi(100);
6251 config.set_initial_max_streams_uni(5);
6252 config.verify_peer(false);
6253
6254 let h3_config = Config::new().unwrap();
6255
6256 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6257 assert_eq!(s.pipe.handshake(), Ok(()));
6258
6259 s.client.control_stream_id = Some(
6260 s.client
6261 .open_uni_stream(
6262 &mut s.pipe.client,
6263 stream::HTTP3_CONTROL_STREAM_TYPE_ID,
6264 )
6265 .unwrap(),
6266 );
6267
6268 let settings = frame::Frame::Settings {
6269 max_field_section_size: None,
6270 qpack_max_table_capacity: None,
6271 qpack_blocked_streams: None,
6272 connect_protocol_enabled: None,
6273 h3_datagram: Some(1),
6274 grease: None,
6275 additional_settings: Default::default(),
6276 raw: Default::default(),
6277 };
6278
6279 s.send_frame_client(settings, s.client.control_stream_id.unwrap(), false)
6280 .unwrap();
6281
6282 assert_eq!(s.pipe.advance(), Ok(()));
6283
6284 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::SettingsError));
6285 }
6286
6287 #[test]
6288 fn settings_h2_prohibited() {
6290 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6291 config
6292 .load_cert_chain_from_pem_file("examples/cert.crt")
6293 .unwrap();
6294 config
6295 .load_priv_key_from_pem_file("examples/cert.key")
6296 .unwrap();
6297 config.set_application_protos(&[b"h3"]).unwrap();
6298 config.set_initial_max_data(70);
6299 config.set_initial_max_stream_data_bidi_local(150);
6300 config.set_initial_max_stream_data_bidi_remote(150);
6301 config.set_initial_max_stream_data_uni(150);
6302 config.set_initial_max_streams_bidi(100);
6303 config.set_initial_max_streams_uni(5);
6304 config.verify_peer(false);
6305
6306 let h3_config = Config::new().unwrap();
6307
6308 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6309 assert_eq!(s.pipe.handshake(), Ok(()));
6310
6311 s.client.control_stream_id = Some(
6312 s.client
6313 .open_uni_stream(
6314 &mut s.pipe.client,
6315 stream::HTTP3_CONTROL_STREAM_TYPE_ID,
6316 )
6317 .unwrap(),
6318 );
6319
6320 s.server.control_stream_id = Some(
6321 s.server
6322 .open_uni_stream(
6323 &mut s.pipe.server,
6324 stream::HTTP3_CONTROL_STREAM_TYPE_ID,
6325 )
6326 .unwrap(),
6327 );
6328
6329 let frame_payload_len = 2u64;
6330 let settings = [
6331 frame::SETTINGS_FRAME_TYPE_ID as u8,
6332 frame_payload_len as u8,
6333 0x2, 1,
6335 ];
6336
6337 s.send_arbitrary_stream_data_client(
6338 &settings,
6339 s.client.control_stream_id.unwrap(),
6340 false,
6341 )
6342 .unwrap();
6343
6344 s.send_arbitrary_stream_data_server(
6345 &settings,
6346 s.server.control_stream_id.unwrap(),
6347 false,
6348 )
6349 .unwrap();
6350
6351 assert_eq!(s.pipe.advance(), Ok(()));
6352
6353 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::SettingsError));
6354
6355 assert_eq!(s.client.poll(&mut s.pipe.client), Err(Error::SettingsError));
6356 }
6357
6358 #[test]
6359 fn set_prohibited_additional_settings() {
6361 let mut h3_config = Config::new().unwrap();
6362 assert_eq!(
6363 h3_config.set_additional_settings(vec![(
6364 frame::SETTINGS_QPACK_MAX_TABLE_CAPACITY,
6365 43
6366 )]),
6367 Err(Error::SettingsError)
6368 );
6369 assert_eq!(
6370 h3_config.set_additional_settings(vec![(
6371 frame::SETTINGS_MAX_FIELD_SECTION_SIZE,
6372 43
6373 )]),
6374 Err(Error::SettingsError)
6375 );
6376 assert_eq!(
6377 h3_config.set_additional_settings(vec![(
6378 frame::SETTINGS_QPACK_BLOCKED_STREAMS,
6379 43
6380 )]),
6381 Err(Error::SettingsError)
6382 );
6383 assert_eq!(
6384 h3_config.set_additional_settings(vec![(
6385 frame::SETTINGS_ENABLE_CONNECT_PROTOCOL,
6386 43
6387 )]),
6388 Err(Error::SettingsError)
6389 );
6390 assert_eq!(
6391 h3_config
6392 .set_additional_settings(vec![(frame::SETTINGS_H3_DATAGRAM, 43)]),
6393 Err(Error::SettingsError)
6394 );
6395 }
6396
6397 #[test]
6398 fn set_additional_settings() {
6400 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6401 config
6402 .load_cert_chain_from_pem_file("examples/cert.crt")
6403 .unwrap();
6404 config
6405 .load_priv_key_from_pem_file("examples/cert.key")
6406 .unwrap();
6407 config.set_application_protos(&[b"h3"]).unwrap();
6408 config.set_initial_max_data(70);
6409 config.set_initial_max_stream_data_bidi_local(150);
6410 config.set_initial_max_stream_data_bidi_remote(150);
6411 config.set_initial_max_stream_data_uni(150);
6412 config.set_initial_max_streams_bidi(100);
6413 config.set_initial_max_streams_uni(5);
6414 config.verify_peer(false);
6415 config.grease(false);
6416
6417 let mut h3_config = Config::new().unwrap();
6418 h3_config
6419 .set_additional_settings(vec![(42, 43), (44, 45)])
6420 .unwrap();
6421
6422 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6423 assert_eq!(s.pipe.handshake(), Ok(()));
6424
6425 assert_eq!(s.pipe.advance(), Ok(()));
6426
6427 s.client.send_settings(&mut s.pipe.client).unwrap();
6428 assert_eq!(s.pipe.advance(), Ok(()));
6429 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::Done));
6430
6431 s.server.send_settings(&mut s.pipe.server).unwrap();
6432 assert_eq!(s.pipe.advance(), Ok(()));
6433 assert_eq!(s.client.poll(&mut s.pipe.client), Err(Error::Done));
6434
6435 assert_eq!(
6436 s.server.peer_settings_raw(),
6437 Some(&[(42, 43), (44, 45)][..])
6438 );
6439 assert_eq!(
6440 s.client.peer_settings_raw(),
6441 Some(&[(42, 43), (44, 45)][..])
6442 );
6443 }
6444
6445 #[test]
6446 fn single_dgram() {
6448 let mut buf = [0; 65535];
6449 let mut s = Session::new().unwrap();
6450 s.handshake().unwrap();
6451
6452 let result = (11, 0, 1);
6454
6455 s.send_dgram_client(0).unwrap();
6456
6457 assert_eq!(s.poll_server(), Err(Error::Done));
6458 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6459
6460 s.send_dgram_server(0).unwrap();
6461 assert_eq!(s.poll_client(), Err(Error::Done));
6462 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6463 }
6464
6465 #[test]
6466 fn multiple_dgram() {
6468 let mut buf = [0; 65535];
6469 let mut s = Session::new().unwrap();
6470 s.handshake().unwrap();
6471
6472 let result = (11, 0, 1);
6474
6475 s.send_dgram_client(0).unwrap();
6476 s.send_dgram_client(0).unwrap();
6477 s.send_dgram_client(0).unwrap();
6478
6479 assert_eq!(s.poll_server(), Err(Error::Done));
6480 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6481 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6482 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6483 assert_eq!(s.recv_dgram_server(&mut buf), Err(Error::Done));
6484
6485 s.send_dgram_server(0).unwrap();
6486 s.send_dgram_server(0).unwrap();
6487 s.send_dgram_server(0).unwrap();
6488
6489 assert_eq!(s.poll_client(), Err(Error::Done));
6490 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6491 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6492 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6493 assert_eq!(s.recv_dgram_client(&mut buf), Err(Error::Done));
6494 }
6495
6496 #[test]
6497 fn multiple_dgram_overflow() {
6499 let mut buf = [0; 65535];
6500 let mut s = Session::new().unwrap();
6501 s.handshake().unwrap();
6502
6503 let result = (11, 0, 1);
6505
6506 s.send_dgram_client(0).unwrap();
6508 s.send_dgram_client(0).unwrap();
6509 s.send_dgram_client(0).unwrap();
6510 s.send_dgram_client(0).unwrap();
6511 s.send_dgram_client(0).unwrap();
6512
6513 assert_eq!(s.poll_server(), Err(Error::Done));
6515 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6516 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6517 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6518 assert_eq!(s.recv_dgram_server(&mut buf), Err(Error::Done));
6519 }
6520
6521 #[test]
6522 fn poll_datagram_cycling_no_read() {
6524 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6525 config
6526 .load_cert_chain_from_pem_file("examples/cert.crt")
6527 .unwrap();
6528 config
6529 .load_priv_key_from_pem_file("examples/cert.key")
6530 .unwrap();
6531 config.set_application_protos(&[b"h3"]).unwrap();
6532 config.set_initial_max_data(1500);
6533 config.set_initial_max_stream_data_bidi_local(150);
6534 config.set_initial_max_stream_data_bidi_remote(150);
6535 config.set_initial_max_stream_data_uni(150);
6536 config.set_initial_max_streams_bidi(100);
6537 config.set_initial_max_streams_uni(5);
6538 config.verify_peer(false);
6539 config.enable_dgram(true, 100, 100);
6540
6541 let h3_config = Config::new().unwrap();
6542 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6543 s.handshake().unwrap();
6544
6545 let (stream, req) = s.send_request(false).unwrap();
6547
6548 s.send_body_client(stream, true).unwrap();
6549
6550 let ev_headers = Event::Headers {
6551 list: req,
6552 more_frames: true,
6553 };
6554
6555 s.send_dgram_client(0).unwrap();
6556
6557 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6558 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6559
6560 assert_eq!(s.poll_server(), Err(Error::Done));
6561 }
6562
6563 #[test]
6564 fn poll_datagram_single_read() {
6566 let mut buf = [0; 65535];
6567
6568 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6569 config
6570 .load_cert_chain_from_pem_file("examples/cert.crt")
6571 .unwrap();
6572 config
6573 .load_priv_key_from_pem_file("examples/cert.key")
6574 .unwrap();
6575 config.set_application_protos(&[b"h3"]).unwrap();
6576 config.set_initial_max_data(1500);
6577 config.set_initial_max_stream_data_bidi_local(150);
6578 config.set_initial_max_stream_data_bidi_remote(150);
6579 config.set_initial_max_stream_data_uni(150);
6580 config.set_initial_max_streams_bidi(100);
6581 config.set_initial_max_streams_uni(5);
6582 config.verify_peer(false);
6583 config.enable_dgram(true, 100, 100);
6584
6585 let h3_config = Config::new().unwrap();
6586 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6587 s.handshake().unwrap();
6588
6589 let result = (11, 0, 1);
6591
6592 let (stream, req) = s.send_request(false).unwrap();
6594
6595 let body = s.send_body_client(stream, true).unwrap();
6596
6597 let mut recv_buf = vec![0; body.len()];
6598
6599 let ev_headers = Event::Headers {
6600 list: req,
6601 more_frames: true,
6602 };
6603
6604 s.send_dgram_client(0).unwrap();
6605
6606 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6607 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6608
6609 assert_eq!(s.poll_server(), Err(Error::Done));
6610
6611 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6612
6613 assert_eq!(s.poll_server(), Err(Error::Done));
6614
6615 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
6616 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6617 assert_eq!(s.poll_server(), Err(Error::Done));
6618
6619 let resp = s.send_response(stream, false).unwrap();
6621
6622 let body = s.send_body_server(stream, true).unwrap();
6623
6624 let mut recv_buf = vec![0; body.len()];
6625
6626 let ev_headers = Event::Headers {
6627 list: resp,
6628 more_frames: true,
6629 };
6630
6631 s.send_dgram_server(0).unwrap();
6632
6633 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
6634 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6635
6636 assert_eq!(s.poll_client(), Err(Error::Done));
6637
6638 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6639
6640 assert_eq!(s.poll_client(), Err(Error::Done));
6641
6642 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(body.len()));
6643
6644 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
6645 assert_eq!(s.poll_client(), Err(Error::Done));
6646 }
6647
6648 #[test]
6649 fn poll_datagram_multi_read() {
6651 let mut buf = [0; 65535];
6652
6653 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6654 config
6655 .load_cert_chain_from_pem_file("examples/cert.crt")
6656 .unwrap();
6657 config
6658 .load_priv_key_from_pem_file("examples/cert.key")
6659 .unwrap();
6660 config.set_application_protos(&[b"h3"]).unwrap();
6661 config.set_initial_max_data(1500);
6662 config.set_initial_max_stream_data_bidi_local(150);
6663 config.set_initial_max_stream_data_bidi_remote(150);
6664 config.set_initial_max_stream_data_uni(150);
6665 config.set_initial_max_streams_bidi(100);
6666 config.set_initial_max_streams_uni(5);
6667 config.verify_peer(false);
6668 config.enable_dgram(true, 100, 100);
6669
6670 let h3_config = Config::new().unwrap();
6671 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6672 s.handshake().unwrap();
6673
6674 let flow_0_result = (11, 0, 1);
6676 let flow_2_result = (11, 2, 1);
6677
6678 let (stream, req) = s.send_request(false).unwrap();
6680
6681 let body = s.send_body_client(stream, true).unwrap();
6682
6683 let mut recv_buf = vec![0; body.len()];
6684
6685 let ev_headers = Event::Headers {
6686 list: req,
6687 more_frames: true,
6688 };
6689
6690 s.send_dgram_client(0).unwrap();
6691 s.send_dgram_client(0).unwrap();
6692 s.send_dgram_client(0).unwrap();
6693 s.send_dgram_client(0).unwrap();
6694 s.send_dgram_client(0).unwrap();
6695 s.send_dgram_client(2).unwrap();
6696 s.send_dgram_client(2).unwrap();
6697 s.send_dgram_client(2).unwrap();
6698 s.send_dgram_client(2).unwrap();
6699 s.send_dgram_client(2).unwrap();
6700
6701 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6702 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6703
6704 assert_eq!(s.poll_server(), Err(Error::Done));
6705
6706 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6708 assert_eq!(s.poll_server(), Err(Error::Done));
6709 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6710 assert_eq!(s.poll_server(), Err(Error::Done));
6711 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6712 assert_eq!(s.poll_server(), Err(Error::Done));
6713
6714 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
6715 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6716
6717 assert_eq!(s.poll_server(), Err(Error::Done));
6718
6719 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6721 assert_eq!(s.poll_server(), Err(Error::Done));
6722 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6723 assert_eq!(s.poll_server(), Err(Error::Done));
6724 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6725 assert_eq!(s.poll_server(), Err(Error::Done));
6726 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6727 assert_eq!(s.poll_server(), Err(Error::Done));
6728 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6729 assert_eq!(s.poll_server(), Err(Error::Done));
6730 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6731 assert_eq!(s.poll_server(), Err(Error::Done));
6732 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6733 assert_eq!(s.poll_server(), Err(Error::Done));
6734
6735 let resp = s.send_response(stream, false).unwrap();
6737
6738 let body = s.send_body_server(stream, true).unwrap();
6739
6740 let mut recv_buf = vec![0; body.len()];
6741
6742 let ev_headers = Event::Headers {
6743 list: resp,
6744 more_frames: true,
6745 };
6746
6747 s.send_dgram_server(0).unwrap();
6748 s.send_dgram_server(0).unwrap();
6749 s.send_dgram_server(0).unwrap();
6750 s.send_dgram_server(0).unwrap();
6751 s.send_dgram_server(0).unwrap();
6752 s.send_dgram_server(2).unwrap();
6753 s.send_dgram_server(2).unwrap();
6754 s.send_dgram_server(2).unwrap();
6755 s.send_dgram_server(2).unwrap();
6756 s.send_dgram_server(2).unwrap();
6757
6758 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
6759 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6760
6761 assert_eq!(s.poll_client(), Err(Error::Done));
6762
6763 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6765 assert_eq!(s.poll_client(), Err(Error::Done));
6766 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6767 assert_eq!(s.poll_client(), Err(Error::Done));
6768 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6769 assert_eq!(s.poll_client(), Err(Error::Done));
6770
6771 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(body.len()));
6772 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
6773
6774 assert_eq!(s.poll_client(), Err(Error::Done));
6775
6776 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6778 assert_eq!(s.poll_client(), Err(Error::Done));
6779 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6780 assert_eq!(s.poll_client(), Err(Error::Done));
6781 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6782 assert_eq!(s.poll_client(), Err(Error::Done));
6783 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6784 assert_eq!(s.poll_client(), Err(Error::Done));
6785 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6786 assert_eq!(s.poll_client(), Err(Error::Done));
6787 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6788 assert_eq!(s.poll_client(), Err(Error::Done));
6789 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6790 assert_eq!(s.poll_client(), Err(Error::Done));
6791 }
6792
6793 #[test]
6794 fn finished_is_for_requests() {
6797 let mut s = Session::new().unwrap();
6798 s.handshake().unwrap();
6799
6800 assert_eq!(s.poll_client(), Err(Error::Done));
6801 assert_eq!(s.poll_server(), Err(Error::Done));
6802
6803 assert_eq!(s.client.open_grease_stream(&mut s.pipe.client), Ok(()));
6804 assert_eq!(s.pipe.advance(), Ok(()));
6805
6806 assert_eq!(s.poll_client(), Err(Error::Done));
6807 assert_eq!(s.poll_server(), Err(Error::Done));
6808 }
6809
6810 #[test]
6811 fn finished_once() {
6813 let mut s = Session::new().unwrap();
6814 s.handshake().unwrap();
6815
6816 let (stream, req) = s.send_request(false).unwrap();
6817 let body = s.send_body_client(stream, true).unwrap();
6818
6819 let mut recv_buf = vec![0; body.len()];
6820
6821 let ev_headers = Event::Headers {
6822 list: req,
6823 more_frames: true,
6824 };
6825
6826 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6827 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6828
6829 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
6830 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6831
6832 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Err(Error::Done));
6833 assert_eq!(s.poll_server(), Err(Error::Done));
6834 }
6835
6836 #[test]
6837 fn data_event_rearm() {
6839 let bytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
6840
6841 let mut s = Session::new().unwrap();
6842 s.handshake().unwrap();
6843
6844 let (r1_id, r1_hdrs) = s.send_request(false).unwrap();
6845
6846 let mut recv_buf = vec![0; bytes.len()];
6847
6848 let r1_ev_headers = Event::Headers {
6849 list: r1_hdrs,
6850 more_frames: true,
6851 };
6852
6853 {
6856 let mut d = [42; 10];
6857 let mut b = octets::OctetsMut::with_slice(&mut d);
6858
6859 b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
6860 b.put_varint(bytes.len() as u64).unwrap();
6861 let off = b.off();
6862 s.pipe.client.stream_send(r1_id, &d[..off], false).unwrap();
6863
6864 assert_eq!(
6865 s.pipe.client.stream_send(r1_id, &bytes[..5], false),
6866 Ok(5)
6867 );
6868
6869 s.advance().ok();
6870 }
6871
6872 assert_eq!(s.poll_server(), Ok((r1_id, r1_ev_headers)));
6873 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6874 assert_eq!(s.poll_server(), Err(Error::Done));
6875
6876 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(5));
6878
6879 assert_eq!(s.pipe.client.stream_send(r1_id, &bytes[5..], false), Ok(5));
6881 s.advance().ok();
6882
6883 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6884 assert_eq!(s.poll_server(), Err(Error::Done));
6885
6886 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(5));
6888 assert_eq!(s.poll_server(), Err(Error::Done));
6889
6890 let r1_body = s.send_body_client(r1_id, false).unwrap();
6892
6893 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6894 assert_eq!(s.poll_server(), Err(Error::Done));
6895
6896 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(r1_body.len()));
6897
6898 let (r2_id, r2_hdrs) = s.send_request(false).unwrap();
6900 let r2_ev_headers = Event::Headers {
6901 list: r2_hdrs,
6902 more_frames: true,
6903 };
6904 let r2_body = s.send_body_client(r2_id, false).unwrap();
6905
6906 s.advance().ok();
6907
6908 assert_eq!(s.poll_server(), Ok((r2_id, r2_ev_headers)));
6909 assert_eq!(s.poll_server(), Ok((r2_id, Event::Data)));
6910 assert_eq!(s.recv_body_server(r2_id, &mut recv_buf), Ok(r2_body.len()));
6911 assert_eq!(s.poll_server(), Err(Error::Done));
6912
6913 let r1_body = s.send_body_client(r1_id, false).unwrap();
6915
6916 let trailers = vec![Header::new(b"hello", b"world")];
6917
6918 s.client
6919 .send_headers(&mut s.pipe.client, r1_id, &trailers, true)
6920 .unwrap();
6921
6922 let r1_ev_trailers = Event::Headers {
6923 list: trailers.clone(),
6924 more_frames: false,
6925 };
6926
6927 s.advance().ok();
6928
6929 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6930 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(r1_body.len()));
6931
6932 assert_eq!(s.poll_server(), Ok((r1_id, r1_ev_trailers)));
6933 assert_eq!(s.poll_server(), Ok((r1_id, Event::Finished)));
6934 assert_eq!(s.poll_server(), Err(Error::Done));
6935
6936 let r2_body = s.send_body_client(r2_id, false).unwrap();
6938
6939 s.client
6940 .send_headers(&mut s.pipe.client, r2_id, &trailers, false)
6941 .unwrap();
6942
6943 let r2_ev_trailers = Event::Headers {
6944 list: trailers,
6945 more_frames: true,
6946 };
6947
6948 s.advance().ok();
6949
6950 assert_eq!(s.poll_server(), Ok((r2_id, Event::Data)));
6951 assert_eq!(s.recv_body_server(r2_id, &mut recv_buf), Ok(r2_body.len()));
6952 assert_eq!(s.poll_server(), Ok((r2_id, r2_ev_trailers)));
6953 assert_eq!(s.poll_server(), Err(Error::Done));
6954
6955 let (r3_id, r3_hdrs) = s.send_request(false).unwrap();
6956
6957 let r3_ev_headers = Event::Headers {
6958 list: r3_hdrs,
6959 more_frames: true,
6960 };
6961
6962 {
6964 let mut d = [42; 10];
6965 let mut b = octets::OctetsMut::with_slice(&mut d);
6966
6967 b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
6968 b.put_varint(bytes.len() as u64).unwrap();
6969 let off = b.off();
6970 s.pipe.client.stream_send(r3_id, &d[..off], false).unwrap();
6971
6972 s.advance().ok();
6973 }
6974
6975 assert_eq!(s.poll_server(), Ok((r3_id, r3_ev_headers)));
6976 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
6977 assert_eq!(s.poll_server(), Err(Error::Done));
6978
6979 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Err(Error::Done));
6980
6981 assert_eq!(s.pipe.client.stream_send(r3_id, &bytes[..5], false), Ok(5));
6982
6983 s.advance().ok();
6984
6985 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
6986 assert_eq!(s.poll_server(), Err(Error::Done));
6987
6988 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Ok(5));
6989
6990 assert_eq!(s.pipe.client.stream_send(r3_id, &bytes[5..], false), Ok(5));
6991 s.advance().ok();
6992
6993 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
6994 assert_eq!(s.poll_server(), Err(Error::Done));
6995
6996 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Ok(5));
6997
6998 let body = s.send_body_client(r3_id, false).unwrap();
7000 s.send_body_client(r3_id, false).unwrap();
7001 s.send_body_client(r3_id, false).unwrap();
7002
7003 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
7004 assert_eq!(s.poll_server(), Err(Error::Done));
7005
7006 {
7007 let mut d = [42; 10];
7008 let mut b = octets::OctetsMut::with_slice(&mut d);
7009
7010 b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
7011 b.put_varint(0).unwrap();
7012 let off = b.off();
7013 s.pipe.client.stream_send(r3_id, &d[..off], true).unwrap();
7014
7015 s.advance().ok();
7016 }
7017
7018 let mut recv_buf = vec![0; bytes.len() * 3];
7019
7020 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Ok(body.len() * 3));
7021 }
7022
7023 #[test]
7024 fn dgram_event_rearm() {
7026 let mut buf = [0; 65535];
7027
7028 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
7029 config
7030 .load_cert_chain_from_pem_file("examples/cert.crt")
7031 .unwrap();
7032 config
7033 .load_priv_key_from_pem_file("examples/cert.key")
7034 .unwrap();
7035 config.set_application_protos(&[b"h3"]).unwrap();
7036 config.set_initial_max_data(1500);
7037 config.set_initial_max_stream_data_bidi_local(150);
7038 config.set_initial_max_stream_data_bidi_remote(150);
7039 config.set_initial_max_stream_data_uni(150);
7040 config.set_initial_max_streams_bidi(100);
7041 config.set_initial_max_streams_uni(5);
7042 config.verify_peer(false);
7043 config.enable_dgram(true, 100, 100);
7044
7045 let h3_config = Config::new().unwrap();
7046 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
7047 s.handshake().unwrap();
7048
7049 let flow_0_result = (11, 0, 1);
7051 let flow_2_result = (11, 2, 1);
7052
7053 let (stream, req) = s.send_request(false).unwrap();
7055
7056 let body = s.send_body_client(stream, true).unwrap();
7057
7058 let mut recv_buf = vec![0; body.len()];
7059
7060 let ev_headers = Event::Headers {
7061 list: req,
7062 more_frames: true,
7063 };
7064
7065 s.send_dgram_client(0).unwrap();
7066 s.send_dgram_client(0).unwrap();
7067 s.send_dgram_client(2).unwrap();
7068 s.send_dgram_client(2).unwrap();
7069
7070 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7071 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7072
7073 assert_eq!(s.poll_server(), Err(Error::Done));
7074 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
7075
7076 assert_eq!(s.poll_server(), Err(Error::Done));
7077 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
7078
7079 assert_eq!(s.poll_server(), Err(Error::Done));
7080 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
7081
7082 assert_eq!(s.poll_server(), Err(Error::Done));
7083 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
7084
7085 assert_eq!(s.poll_server(), Err(Error::Done));
7086
7087 s.send_dgram_client(0).unwrap();
7088 s.send_dgram_client(2).unwrap();
7089
7090 assert_eq!(s.poll_server(), Err(Error::Done));
7091
7092 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
7093 assert_eq!(s.poll_server(), Err(Error::Done));
7094
7095 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
7096 assert_eq!(s.poll_server(), Err(Error::Done));
7097
7098 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
7099 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7100
7101 assert_eq!(s.pipe.client.dgram_sent_count, 6);
7103 assert_eq!(s.pipe.client.dgram_recv_count, 0);
7104 assert_eq!(s.pipe.server.dgram_sent_count, 0);
7105 assert_eq!(s.pipe.server.dgram_recv_count, 6);
7106
7107 let server_path = s.pipe.server.paths.get_active().expect("no active");
7108 let client_path = s.pipe.client.paths.get_active().expect("no active");
7109 assert_eq!(client_path.dgram_sent_count, 6);
7110 assert_eq!(client_path.dgram_recv_count, 0);
7111 assert_eq!(server_path.dgram_sent_count, 0);
7112 assert_eq!(server_path.dgram_recv_count, 6);
7113 }
7114
7115 #[test]
7116 fn reset_stream() {
7117 let mut buf = [0; 65535];
7118
7119 let mut s = Session::new().unwrap();
7120 s.handshake().unwrap();
7121
7122 let (stream, req) = s.send_request(false).unwrap();
7124
7125 let ev_headers = Event::Headers {
7126 list: req,
7127 more_frames: true,
7128 };
7129
7130 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7132 assert_eq!(s.poll_server(), Err(Error::Done));
7133
7134 let resp = s.send_response(stream, true).unwrap();
7135
7136 let ev_headers = Event::Headers {
7137 list: resp,
7138 more_frames: false,
7139 };
7140
7141 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7142 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7143 assert_eq!(s.poll_client(), Err(Error::Done));
7144
7145 let frames = [crate::frame::Frame::ResetStream {
7147 stream_id: stream,
7148 error_code: 42,
7149 final_size: 68,
7150 }];
7151
7152 let pkt_type = crate::packet::Type::Short;
7153 assert_eq!(
7154 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
7155 Ok(39)
7156 );
7157
7158 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(42))));
7160 assert_eq!(s.poll_server(), Err(Error::Done));
7161
7162 assert_eq!(
7164 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
7165 Ok(39)
7166 );
7167
7168 assert_eq!(s.poll_server(), Err(Error::Done));
7169 }
7170
7171 #[test]
7174 fn client_shutdown_write_server_fin() {
7175 let mut buf = [0; 65535];
7176 let mut s = Session::new().unwrap();
7177 s.handshake().unwrap();
7178
7179 let (stream, req) = s.send_request(false).unwrap();
7181
7182 let ev_headers = Event::Headers {
7183 list: req,
7184 more_frames: true,
7185 };
7186
7187 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7189 assert_eq!(s.poll_server(), Err(Error::Done));
7190
7191 let resp = s.send_response(stream, true).unwrap();
7192
7193 let ev_headers = Event::Headers {
7194 list: resp,
7195 more_frames: false,
7196 };
7197
7198 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7199 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7200 assert_eq!(s.poll_client(), Err(Error::Done));
7201
7202 assert_eq!(
7204 s.pipe
7205 .client
7206 .stream_shutdown(stream, crate::Shutdown::Write, 42),
7207 Ok(())
7208 );
7209 assert_eq!(s.advance(), Ok(()));
7210
7211 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(42))));
7213 assert_eq!(s.poll_server(), Err(Error::Done));
7214
7215 assert!(s.pipe.server.streams.is_collected(stream));
7217 assert!(s.pipe.client.streams.is_collected(stream));
7218
7219 let (stream, req) = s.send_request(false).unwrap();
7222
7223 let ev_headers = Event::Headers {
7224 list: req,
7225 more_frames: true,
7226 };
7227
7228 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7230 assert_eq!(s.poll_server(), Err(Error::Done));
7231
7232 let resp = s.send_response(stream, false).unwrap();
7234
7235 let ev_headers = Event::Headers {
7236 list: resp,
7237 more_frames: true,
7238 };
7239
7240 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7241 assert_eq!(s.poll_client(), Err(Error::Done));
7242
7243 assert_eq!(
7245 s.pipe
7246 .client
7247 .stream_shutdown(stream, crate::Shutdown::Write, 42),
7248 Ok(())
7249 );
7250 assert_eq!(s.advance(), Ok(()));
7251
7252 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(42))));
7254 assert_eq!(s.poll_server(), Err(Error::Done));
7255
7256 s.send_body_server(stream, true).unwrap();
7258
7259 assert!(s.pipe.server.streams.is_collected(stream));
7261 assert!(!s.pipe.client.streams.is_collected(stream));
7264 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
7265 s.recv_body_client(stream, &mut buf).unwrap();
7266 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7267 assert_eq!(s.poll_client(), Err(Error::Done));
7268 assert!(s.pipe.client.streams.is_collected(stream));
7269 }
7270
7271 #[test]
7272 fn client_shutdown_read() {
7273 let mut buf = [0; 65535];
7274 let mut s = Session::new().unwrap();
7275 s.handshake().unwrap();
7276
7277 let (stream, req) = s.send_request(false).unwrap();
7279
7280 let ev_headers = Event::Headers {
7281 list: req,
7282 more_frames: true,
7283 };
7284
7285 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7287 assert_eq!(s.poll_server(), Err(Error::Done));
7288
7289 let resp = s.send_response(stream, false).unwrap();
7290
7291 let ev_headers = Event::Headers {
7292 list: resp,
7293 more_frames: true,
7294 };
7295
7296 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7297 assert_eq!(s.poll_client(), Err(Error::Done));
7298 assert_eq!(
7300 s.pipe
7301 .client
7302 .stream_shutdown(stream, crate::Shutdown::Read, 42),
7303 Ok(())
7304 );
7305 assert_eq!(s.advance(), Ok(()));
7306
7307 assert_eq!(s.poll_server(), Err(Error::Done));
7309 let writables: Vec<u64> = s.pipe.server.writable().collect();
7310 assert!(writables.contains(&stream));
7311 assert_eq!(
7312 s.send_body_server(stream, false),
7313 Err(Error::TransportError(crate::Error::StreamStopped(42)))
7314 );
7315
7316 assert_eq!(
7318 s.client.send_body(&mut s.pipe.client, stream, &[], true),
7319 Ok(0)
7320 );
7321 assert_eq!(s.advance(), Ok(()));
7322 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7325 assert_eq!(s.recv_body_server(stream, &mut buf), Err(Error::Done));
7326 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7327 assert_eq!(s.poll_server(), Err(Error::Done));
7328
7329 assert!(s.pipe.client.streams.is_collected(stream));
7332 assert!(s.pipe.server.streams.is_collected(stream));
7333 }
7334
7335 #[test]
7336 fn reset_finished_at_server() {
7337 let mut s = Session::new().unwrap();
7338 s.handshake().unwrap();
7339
7340 let (stream, _req) = s.send_request(false).unwrap();
7342
7343 assert_eq!(
7345 s.pipe.client.stream_shutdown(0, crate::Shutdown::Write, 0),
7346 Ok(())
7347 );
7348
7349 assert_eq!(s.pipe.advance(), Ok(()));
7350
7351 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(0))));
7353 assert_eq!(s.poll_server(), Err(Error::Done));
7354
7355 let (stream, req) = s.send_request(true).unwrap();
7357
7358 assert_eq!(
7360 s.pipe.client.stream_shutdown(4, crate::Shutdown::Write, 0),
7361 Ok(())
7362 );
7363
7364 let ev_headers = Event::Headers {
7365 list: req,
7366 more_frames: false,
7367 };
7368
7369 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7371 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7372 assert_eq!(s.poll_server(), Err(Error::Done));
7373 }
7374
7375 #[test]
7376 fn reset_finished_at_server_with_data_pending() {
7377 let mut s = Session::new().unwrap();
7378 s.handshake().unwrap();
7379
7380 let (stream, req) = s.send_request(false).unwrap();
7382
7383 assert!(s.send_body_client(stream, false).is_ok());
7384
7385 assert_eq!(s.pipe.advance(), Ok(()));
7386
7387 let ev_headers = Event::Headers {
7388 list: req,
7389 more_frames: true,
7390 };
7391
7392 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7394 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7395
7396 assert_eq!(
7398 s.pipe
7399 .client
7400 .stream_shutdown(stream, crate::Shutdown::Write, 0),
7401 Ok(())
7402 );
7403
7404 assert_eq!(s.pipe.advance(), Ok(()));
7405
7406 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(0))));
7410 assert_eq!(s.poll_server(), Err(Error::Done));
7411 assert_eq!(s.pipe.server.readable().len(), 0);
7412 }
7413
7414 #[test]
7415 fn reset_finished_at_server_with_data_pending_2() {
7416 let mut s = Session::new().unwrap();
7417 s.handshake().unwrap();
7418
7419 let (stream, req) = s.send_request(false).unwrap();
7421
7422 assert!(s.send_body_client(stream, false).is_ok());
7423
7424 assert_eq!(s.pipe.advance(), Ok(()));
7425
7426 let ev_headers = Event::Headers {
7427 list: req,
7428 more_frames: true,
7429 };
7430
7431 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7433 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7434
7435 assert_eq!(
7437 s.pipe
7438 .client
7439 .stream_shutdown(stream, crate::Shutdown::Write, 0),
7440 Ok(())
7441 );
7442
7443 assert_eq!(s.pipe.advance(), Ok(()));
7444
7445 assert_eq!(
7448 s.recv_body_server(stream, &mut [0; 100]),
7449 Err(Error::TransportError(crate::Error::StreamReset(0)))
7450 );
7451
7452 assert_eq!(s.poll_server(), Err(Error::Done));
7454 assert_eq!(s.pipe.server.readable().len(), 0);
7455 }
7456
7457 #[test]
7458 fn reset_finished_at_client() {
7459 let mut buf = [0; 65535];
7460 let mut s = Session::new().unwrap();
7461 s.handshake().unwrap();
7462
7463 let (stream, req) = s.send_request(false).unwrap();
7465
7466 let ev_headers = Event::Headers {
7467 list: req,
7468 more_frames: true,
7469 };
7470
7471 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7473 assert_eq!(s.poll_server(), Err(Error::Done));
7474
7475 s.send_response(stream, false).unwrap();
7477
7478 assert_eq!(s.pipe.advance(), Ok(()));
7479
7480 assert_eq!(
7482 s.pipe
7483 .server
7484 .stream_shutdown(stream, crate::Shutdown::Write, 0),
7485 Ok(())
7486 );
7487
7488 assert_eq!(s.pipe.advance(), Ok(()));
7489
7490 assert_eq!(s.poll_client(), Ok((stream, Event::Reset(0))));
7492 assert_eq!(s.poll_server(), Err(Error::Done));
7493
7494 let (stream, req) = s.send_request(true).unwrap();
7496
7497 let ev_headers = Event::Headers {
7498 list: req,
7499 more_frames: false,
7500 };
7501
7502 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7504 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7505 assert_eq!(s.poll_server(), Err(Error::Done));
7506
7507 let resp = s.send_response(stream, true).unwrap();
7509
7510 assert_eq!(s.pipe.advance(), Ok(()));
7511
7512 let frames = [crate::frame::Frame::ResetStream {
7514 stream_id: stream,
7515 error_code: 42,
7516 final_size: 68,
7517 }];
7518
7519 let pkt_type = crate::packet::Type::Short;
7520 assert_eq!(
7521 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
7522 Ok(39)
7523 );
7524
7525 assert_eq!(s.pipe.advance(), Ok(()));
7526
7527 let ev_headers = Event::Headers {
7528 list: resp,
7529 more_frames: false,
7530 };
7531
7532 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7534 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7535 assert_eq!(s.poll_client(), Err(Error::Done));
7536 }
7537}
7538
7539#[cfg(feature = "ffi")]
7540mod ffi;
7541#[cfg(feature = "internal")]
7542#[doc(hidden)]
7543pub mod frame;
7544#[cfg(not(feature = "internal"))]
7545mod frame;
7546#[doc(hidden)]
7547pub mod qpack;
7548mod stream;