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
5485 #[test]
5486 fn request_max_header_size_limit() {
5488 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5489 config
5490 .load_cert_chain_from_pem_file("examples/cert.crt")
5491 .unwrap();
5492 config
5493 .load_priv_key_from_pem_file("examples/cert.key")
5494 .unwrap();
5495 config.set_application_protos(&[b"h3"]).unwrap();
5496 config.set_initial_max_data(1500);
5497 config.set_initial_max_stream_data_bidi_local(150);
5498 config.set_initial_max_stream_data_bidi_remote(150);
5499 config.set_initial_max_stream_data_uni(150);
5500 config.set_initial_max_streams_bidi(5);
5501 config.set_initial_max_streams_uni(5);
5502 config.verify_peer(false);
5503
5504 let mut h3_config = Config::new().unwrap();
5505 h3_config.set_max_field_section_size(65);
5506
5507 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5508
5509 s.handshake().unwrap();
5510
5511 let req = vec![
5512 Header::new(b":method", b"GET"),
5513 Header::new(b":scheme", b"https"),
5514 Header::new(b":authority", b"quic.tech"),
5515 Header::new(b":path", b"/test"),
5516 Header::new(b"aaaaaaa", b"aaaaaaaa"),
5517 ];
5518
5519 let stream = s
5520 .client
5521 .send_request(&mut s.pipe.client, &req, true)
5522 .unwrap();
5523
5524 s.advance().ok();
5525
5526 assert_eq!(stream, 0);
5527
5528 assert_eq!(s.poll_server(), Err(Error::ExcessiveLoad));
5529
5530 assert_eq!(
5531 s.pipe.server.local_error.as_ref().unwrap().error_code,
5532 Error::to_wire(Error::ExcessiveLoad)
5533 );
5534 }
5535
5536 #[test]
5537 fn transport_error() {
5539 let mut s = Session::new().unwrap();
5540 s.handshake().unwrap();
5541
5542 let req = vec![
5543 Header::new(b":method", b"GET"),
5544 Header::new(b":scheme", b"https"),
5545 Header::new(b":authority", b"quic.tech"),
5546 Header::new(b":path", b"/test"),
5547 Header::new(b"user-agent", b"quiche-test"),
5548 ];
5549
5550 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(0));
5555 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(4));
5556 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(8));
5557 assert_eq!(
5558 s.client.send_request(&mut s.pipe.client, &req, true),
5559 Ok(12)
5560 );
5561 assert_eq!(
5562 s.client.send_request(&mut s.pipe.client, &req, true),
5563 Ok(16)
5564 );
5565
5566 assert_eq!(
5567 s.client.send_request(&mut s.pipe.client, &req, true),
5568 Err(Error::TransportError(crate::Error::StreamLimit))
5569 );
5570 }
5571
5572 #[test]
5573 fn data_before_headers() {
5575 let mut s = Session::new().unwrap();
5576 s.handshake().unwrap();
5577
5578 let mut d = [42; 128];
5579 let mut b = octets::OctetsMut::with_slice(&mut d);
5580
5581 let frame_type = b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
5582 s.pipe.client.stream_send(0, frame_type, false).unwrap();
5583
5584 let frame_len = b.put_varint(5).unwrap();
5585 s.pipe.client.stream_send(0, frame_len, false).unwrap();
5586
5587 s.pipe.client.stream_send(0, b"hello", false).unwrap();
5588
5589 s.advance().ok();
5590
5591 assert_eq!(
5592 s.server.poll(&mut s.pipe.server),
5593 Err(Error::FrameUnexpected)
5594 );
5595 }
5596
5597 #[test]
5598 fn poll_after_error() {
5600 let mut s = Session::new().unwrap();
5601 s.handshake().unwrap();
5602
5603 let mut d = [42; 128];
5604 let mut b = octets::OctetsMut::with_slice(&mut d);
5605
5606 let frame_type = b.put_varint(148_764_065_110_560_899).unwrap();
5607 s.pipe.client.stream_send(0, frame_type, false).unwrap();
5608
5609 let frame_len = b.put_varint(1 << 24).unwrap();
5610 s.pipe.client.stream_send(0, frame_len, false).unwrap();
5611
5612 s.pipe.client.stream_send(0, &d, false).unwrap();
5613
5614 s.advance().ok();
5615
5616 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::ExcessiveLoad));
5617
5618 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::Done));
5620 }
5621
5622 #[test]
5623 fn headers_blocked() {
5625 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5626 config
5627 .load_cert_chain_from_pem_file("examples/cert.crt")
5628 .unwrap();
5629 config
5630 .load_priv_key_from_pem_file("examples/cert.key")
5631 .unwrap();
5632 config.set_application_protos(&[b"h3"]).unwrap();
5633 config.set_initial_max_data(70);
5634 config.set_initial_max_stream_data_bidi_local(150);
5635 config.set_initial_max_stream_data_bidi_remote(150);
5636 config.set_initial_max_stream_data_uni(150);
5637 config.set_initial_max_streams_bidi(100);
5638 config.set_initial_max_streams_uni(5);
5639 config.verify_peer(false);
5640
5641 let h3_config = Config::new().unwrap();
5642
5643 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5644
5645 s.handshake().unwrap();
5646
5647 let req = vec![
5648 Header::new(b":method", b"GET"),
5649 Header::new(b":scheme", b"https"),
5650 Header::new(b":authority", b"quic.tech"),
5651 Header::new(b":path", b"/test"),
5652 ];
5653
5654 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(0));
5655
5656 assert_eq!(
5657 s.client.send_request(&mut s.pipe.client, &req, true),
5658 Err(Error::StreamBlocked)
5659 );
5660
5661 assert_eq!(s.pipe.client.stream_writable_next(), Some(2));
5663 assert_eq!(s.pipe.client.stream_writable_next(), Some(6));
5664 assert_eq!(s.pipe.client.stream_writable_next(), Some(10));
5665 assert_eq!(s.pipe.client.stream_writable_next(), None);
5666
5667 s.advance().ok();
5668
5669 assert_eq!(s.pipe.client.stream_writable_next(), Some(4));
5672 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(4));
5673 }
5674
5675 #[test]
5676 fn headers_blocked_on_conn() {
5678 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5679 config
5680 .load_cert_chain_from_pem_file("examples/cert.crt")
5681 .unwrap();
5682 config
5683 .load_priv_key_from_pem_file("examples/cert.key")
5684 .unwrap();
5685 config.set_application_protos(&[b"h3"]).unwrap();
5686 config.set_initial_max_data(70);
5687 config.set_initial_max_stream_data_bidi_local(150);
5688 config.set_initial_max_stream_data_bidi_remote(150);
5689 config.set_initial_max_stream_data_uni(150);
5690 config.set_initial_max_streams_bidi(100);
5691 config.set_initial_max_streams_uni(5);
5692 config.verify_peer(false);
5693
5694 let h3_config = Config::new().unwrap();
5695
5696 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5697
5698 s.handshake().unwrap();
5699
5700 let d = [42; 28];
5704 assert_eq!(s.pipe.client.stream_send(2, &d, false), Ok(23));
5705
5706 let req = vec![
5707 Header::new(b":method", b"GET"),
5708 Header::new(b":scheme", b"https"),
5709 Header::new(b":authority", b"quic.tech"),
5710 Header::new(b":path", b"/test"),
5711 ];
5712
5713 assert_eq!(
5716 s.client.send_request(&mut s.pipe.client, &req, true),
5717 Err(Error::StreamBlocked)
5718 );
5719 assert_eq!(s.pipe.client.stream_writable_next(), None);
5720
5721 s.advance().ok();
5724 assert_eq!(s.poll_server(), Err(Error::Done));
5725 s.advance().ok();
5726
5727 assert_eq!(s.pipe.client.stream_writable_next(), Some(2));
5729 assert_eq!(s.pipe.client.stream_writable_next(), Some(6));
5730 assert_eq!(s.client.send_request(&mut s.pipe.client, &req, true), Ok(0));
5731 }
5732
5733 #[test]
5734 fn send_body_truncation_stream_blocked() {
5737 use crate::test_utils::decode_pkt;
5738
5739 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5740 config
5741 .load_cert_chain_from_pem_file("examples/cert.crt")
5742 .unwrap();
5743 config
5744 .load_priv_key_from_pem_file("examples/cert.key")
5745 .unwrap();
5746 config.set_application_protos(&[b"h3"]).unwrap();
5747 config.set_initial_max_data(10000); config.set_initial_max_stream_data_bidi_local(80);
5749 config.set_initial_max_stream_data_bidi_remote(80);
5750 config.set_initial_max_stream_data_uni(150);
5751 config.set_initial_max_streams_bidi(100);
5752 config.set_initial_max_streams_uni(5);
5753 config.verify_peer(false);
5754
5755 let h3_config = Config::new().unwrap();
5756
5757 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5758
5759 s.handshake().unwrap();
5760
5761 let (stream, req) = s.send_request(true).unwrap();
5762
5763 let ev_headers = Event::Headers {
5764 list: req,
5765 more_frames: false,
5766 };
5767
5768 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
5769 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
5770
5771 let _ = s.send_response(stream, false).unwrap();
5772
5773 assert_eq!(s.pipe.server.streams.blocked().len(), 0);
5774
5775 let d = [42; 500];
5777 let mut off = 0;
5778
5779 let sent = s
5780 .server
5781 .send_body(&mut s.pipe.server, stream, &d, true)
5782 .unwrap();
5783 assert_eq!(sent, 25);
5784 off += sent;
5785
5786 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5788 assert_eq!(
5789 s.server
5790 .send_body(&mut s.pipe.server, stream, &d[off..], true),
5791 Err(Error::Done)
5792 );
5793 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5794
5795 let mut buf = [0; 65535];
5797 let (len, _) = s.pipe.server.send(&mut buf).unwrap();
5798
5799 let frames = decode_pkt(&mut s.pipe.client, &mut buf[..len]).unwrap();
5800
5801 let mut iter = frames.iter();
5802
5803 assert_eq!(
5804 iter.next(),
5805 Some(&crate::frame::Frame::StreamDataBlocked {
5806 stream_id: 0,
5807 limit: 80,
5808 })
5809 );
5810
5811 assert_eq!(s.pipe.server.streams.blocked().len(), 0);
5814
5815 assert_eq!(
5821 s.server
5822 .send_body(&mut s.pipe.server, stream, &d[off..], true),
5823 Err(Error::Done)
5824 );
5825 assert_eq!(s.pipe.server.streams.blocked().len(), 0);
5826 assert_eq!(s.pipe.server.send(&mut buf), Err(crate::Error::Done));
5827
5828 let frames = [crate::frame::Frame::MaxStreamData {
5830 stream_id: 0,
5831 max: 100,
5832 }];
5833
5834 let pkt_type = crate::packet::Type::Short;
5835 assert_eq!(
5836 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
5837 Ok(39),
5838 );
5839
5840 let sent = s
5841 .server
5842 .send_body(&mut s.pipe.server, stream, &d[off..], true)
5843 .unwrap();
5844 assert_eq!(sent, 18);
5845
5846 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5848 assert_eq!(
5849 s.server
5850 .send_body(&mut s.pipe.server, stream, &d[off..], true),
5851 Err(Error::Done)
5852 );
5853 assert_eq!(s.pipe.server.streams.blocked().len(), 1);
5854
5855 let (len, _) = s.pipe.server.send(&mut buf).unwrap();
5856
5857 let frames = decode_pkt(&mut s.pipe.client, &mut buf[..len]).unwrap();
5858
5859 let mut iter = frames.iter();
5860
5861 assert_eq!(
5862 iter.next(),
5863 Some(&crate::frame::Frame::StreamDataBlocked {
5864 stream_id: 0,
5865 limit: 100,
5866 })
5867 );
5868 }
5869
5870 #[test]
5871 fn send_body_stream_blocked_by_small_cwnd() {
5873 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5874 config
5875 .load_cert_chain_from_pem_file("examples/cert.crt")
5876 .unwrap();
5877 config
5878 .load_priv_key_from_pem_file("examples/cert.key")
5879 .unwrap();
5880 config.set_application_protos(&[b"h3"]).unwrap();
5881 config.set_initial_max_data(100000); config.set_initial_max_stream_data_bidi_local(100000);
5883 config.set_initial_max_stream_data_bidi_remote(50000);
5884 config.set_initial_max_stream_data_uni(150);
5885 config.set_initial_max_streams_bidi(100);
5886 config.set_initial_max_streams_uni(5);
5887 config.verify_peer(false);
5888
5889 let h3_config = Config::new().unwrap();
5890
5891 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5892
5893 s.handshake().unwrap();
5894
5895 let (stream, req) = s.send_request(true).unwrap();
5896
5897 let ev_headers = Event::Headers {
5898 list: req,
5899 more_frames: false,
5900 };
5901
5902 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
5903 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
5904
5905 let _ = s.send_response(stream, false).unwrap();
5906
5907 assert_eq!(s.pipe.server.stream_writable_next(), Some(3));
5909 assert_eq!(s.pipe.server.stream_writable_next(), Some(7));
5910 assert_eq!(s.pipe.server.stream_writable_next(), Some(11));
5911 assert_eq!(s.pipe.server.stream_writable_next(), Some(stream));
5912 assert_eq!(s.pipe.server.stream_writable_next(), None);
5913
5914 let send_buf = [42; 80000];
5916
5917 let sent = s
5918 .server
5919 .send_body(&mut s.pipe.server, stream, &send_buf, true)
5920 .unwrap();
5921
5922 assert_eq!(sent, 11995);
5924
5925 s.advance().ok();
5926
5927 let mut recv_buf = [42; 80000];
5929 assert!(s.poll_client().is_ok());
5930 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
5931 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(11995));
5932
5933 s.advance().ok();
5934
5935 assert!(s.pipe.server.tx_cap < send_buf.len() - sent);
5937
5938 assert_eq!(s.pipe.server.stream_writable_next(), Some(0));
5940 }
5941
5942 #[test]
5943 fn send_body_stream_blocked_zero_length() {
5945 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
5946 config
5947 .load_cert_chain_from_pem_file("examples/cert.crt")
5948 .unwrap();
5949 config
5950 .load_priv_key_from_pem_file("examples/cert.key")
5951 .unwrap();
5952 config.set_application_protos(&[b"h3"]).unwrap();
5953 config.set_initial_max_data(100000); config.set_initial_max_stream_data_bidi_local(100000);
5955 config.set_initial_max_stream_data_bidi_remote(50000);
5956 config.set_initial_max_stream_data_uni(150);
5957 config.set_initial_max_streams_bidi(100);
5958 config.set_initial_max_streams_uni(5);
5959 config.verify_peer(false);
5960
5961 let h3_config = Config::new().unwrap();
5962
5963 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
5964
5965 s.handshake().unwrap();
5966
5967 let (stream, req) = s.send_request(true).unwrap();
5968
5969 let ev_headers = Event::Headers {
5970 list: req,
5971 more_frames: false,
5972 };
5973
5974 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
5975 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
5976
5977 let _ = s.send_response(stream, false).unwrap();
5978
5979 assert_eq!(s.pipe.server.stream_writable_next(), Some(3));
5981 assert_eq!(s.pipe.server.stream_writable_next(), Some(7));
5982 assert_eq!(s.pipe.server.stream_writable_next(), Some(11));
5983 assert_eq!(s.pipe.server.stream_writable_next(), Some(stream));
5984 assert_eq!(s.pipe.server.stream_writable_next(), None);
5985
5986 let send_buf = [42; 11994];
5989
5990 let sent = s
5991 .server
5992 .send_body(&mut s.pipe.server, stream, &send_buf, false)
5993 .unwrap();
5994
5995 assert_eq!(sent, 11994);
5996
5997 assert_eq!(s.pipe.server.stream_capacity(stream).unwrap(), 3);
6000 assert_eq!(
6001 s.server
6002 .send_body(&mut s.pipe.server, stream, &send_buf, false),
6003 Err(Error::Done)
6004 );
6005
6006 s.advance().ok();
6007
6008 let mut recv_buf = [42; 80000];
6010 assert!(s.poll_client().is_ok());
6011 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6012 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(11994));
6013
6014 s.advance().ok();
6015
6016 assert_eq!(s.pipe.server.stream_writable_next(), Some(0));
6018 }
6019
6020 #[test]
6021 fn zero_length_data() {
6023 let mut s = Session::new().unwrap();
6024 s.handshake().unwrap();
6025
6026 let (stream, req) = s.send_request(false).unwrap();
6027
6028 assert_eq!(
6029 s.client.send_body(&mut s.pipe.client, 0, b"", false),
6030 Err(Error::Done)
6031 );
6032 assert_eq!(s.client.send_body(&mut s.pipe.client, 0, b"", true), Ok(0));
6033
6034 s.advance().ok();
6035
6036 let mut recv_buf = vec![0; 100];
6037
6038 let ev_headers = Event::Headers {
6039 list: req,
6040 more_frames: true,
6041 };
6042
6043 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6044
6045 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6046 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Err(Error::Done));
6047
6048 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6049 assert_eq!(s.poll_server(), Err(Error::Done));
6050
6051 let resp = s.send_response(stream, false).unwrap();
6052
6053 assert_eq!(
6054 s.server.send_body(&mut s.pipe.server, 0, b"", false),
6055 Err(Error::Done)
6056 );
6057 assert_eq!(s.server.send_body(&mut s.pipe.server, 0, b"", true), Ok(0));
6058
6059 s.advance().ok();
6060
6061 let ev_headers = Event::Headers {
6062 list: resp,
6063 more_frames: true,
6064 };
6065
6066 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
6067
6068 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6069 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Err(Error::Done));
6070
6071 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
6072 assert_eq!(s.poll_client(), Err(Error::Done));
6073 }
6074
6075 #[test]
6076 fn zero_length_data_blocked() {
6078 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6079 config
6080 .load_cert_chain_from_pem_file("examples/cert.crt")
6081 .unwrap();
6082 config
6083 .load_priv_key_from_pem_file("examples/cert.key")
6084 .unwrap();
6085 config.set_application_protos(&[b"h3"]).unwrap();
6086 config.set_initial_max_data(69);
6087 config.set_initial_max_stream_data_bidi_local(150);
6088 config.set_initial_max_stream_data_bidi_remote(150);
6089 config.set_initial_max_stream_data_uni(150);
6090 config.set_initial_max_streams_bidi(100);
6091 config.set_initial_max_streams_uni(5);
6092 config.verify_peer(false);
6093
6094 let h3_config = Config::new().unwrap();
6095
6096 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6097
6098 s.handshake().unwrap();
6099
6100 let req = vec![
6101 Header::new(b":method", b"GET"),
6102 Header::new(b":scheme", b"https"),
6103 Header::new(b":authority", b"quic.tech"),
6104 Header::new(b":path", b"/test"),
6105 ];
6106
6107 assert_eq!(
6108 s.client.send_request(&mut s.pipe.client, &req, false),
6109 Ok(0)
6110 );
6111
6112 assert_eq!(
6113 s.client.send_body(&mut s.pipe.client, 0, b"", true),
6114 Err(Error::Done)
6115 );
6116
6117 assert_eq!(s.pipe.client.stream_writable_next(), Some(2));
6119 assert_eq!(s.pipe.client.stream_writable_next(), Some(6));
6120 assert_eq!(s.pipe.client.stream_writable_next(), Some(10));
6121 assert_eq!(s.pipe.client.stream_writable_next(), None);
6122
6123 s.advance().ok();
6124
6125 assert_eq!(s.pipe.client.stream_writable_next(), Some(0));
6127 assert_eq!(s.client.send_body(&mut s.pipe.client, 0, b"", true), Ok(0));
6128 }
6129
6130 #[test]
6131 fn empty_settings() {
6133 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6134 config
6135 .load_cert_chain_from_pem_file("examples/cert.crt")
6136 .unwrap();
6137 config
6138 .load_priv_key_from_pem_file("examples/cert.key")
6139 .unwrap();
6140 config.set_application_protos(&[b"h3"]).unwrap();
6141 config.set_initial_max_data(1500);
6142 config.set_initial_max_stream_data_bidi_local(150);
6143 config.set_initial_max_stream_data_bidi_remote(150);
6144 config.set_initial_max_stream_data_uni(150);
6145 config.set_initial_max_streams_bidi(5);
6146 config.set_initial_max_streams_uni(5);
6147 config.verify_peer(false);
6148 config.set_ack_delay_exponent(8);
6149 config.grease(false);
6150
6151 let h3_config = Config::new().unwrap();
6152 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6153
6154 s.handshake().unwrap();
6155
6156 assert!(s.client.peer_settings_raw().is_some());
6157 assert!(s.server.peer_settings_raw().is_some());
6158 }
6159
6160 #[test]
6161 fn dgram_setting() {
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(70);
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(100);
6176 config.set_initial_max_streams_uni(5);
6177 config.enable_dgram(true, 1000, 1000);
6178 config.verify_peer(false);
6179
6180 let h3_config = Config::new().unwrap();
6181
6182 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6183 assert_eq!(s.pipe.handshake(), Ok(()));
6184
6185 s.client.send_settings(&mut s.pipe.client).unwrap();
6186 assert_eq!(s.pipe.advance(), Ok(()));
6187
6188 assert!(!s.server.dgram_enabled_by_peer(&s.pipe.server));
6191
6192 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::Done));
6194 assert!(s.server.dgram_enabled_by_peer(&s.pipe.server));
6195
6196 s.server.send_settings(&mut s.pipe.server).unwrap();
6198 assert_eq!(s.pipe.advance(), Ok(()));
6199 assert!(!s.client.dgram_enabled_by_peer(&s.pipe.client));
6200 assert_eq!(s.client.poll(&mut s.pipe.client), Err(Error::Done));
6201 assert!(s.client.dgram_enabled_by_peer(&s.pipe.client));
6202 }
6203
6204 #[test]
6205 fn dgram_setting_no_tp() {
6208 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6209 config
6210 .load_cert_chain_from_pem_file("examples/cert.crt")
6211 .unwrap();
6212 config
6213 .load_priv_key_from_pem_file("examples/cert.key")
6214 .unwrap();
6215 config.set_application_protos(&[b"h3"]).unwrap();
6216 config.set_initial_max_data(70);
6217 config.set_initial_max_stream_data_bidi_local(150);
6218 config.set_initial_max_stream_data_bidi_remote(150);
6219 config.set_initial_max_stream_data_uni(150);
6220 config.set_initial_max_streams_bidi(100);
6221 config.set_initial_max_streams_uni(5);
6222 config.verify_peer(false);
6223
6224 let h3_config = Config::new().unwrap();
6225
6226 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6227 assert_eq!(s.pipe.handshake(), Ok(()));
6228
6229 s.client.control_stream_id = Some(
6230 s.client
6231 .open_uni_stream(
6232 &mut s.pipe.client,
6233 stream::HTTP3_CONTROL_STREAM_TYPE_ID,
6234 )
6235 .unwrap(),
6236 );
6237
6238 let settings = frame::Frame::Settings {
6239 max_field_section_size: None,
6240 qpack_max_table_capacity: None,
6241 qpack_blocked_streams: None,
6242 connect_protocol_enabled: None,
6243 h3_datagram: Some(1),
6244 grease: None,
6245 additional_settings: Default::default(),
6246 raw: Default::default(),
6247 };
6248
6249 s.send_frame_client(settings, s.client.control_stream_id.unwrap(), false)
6250 .unwrap();
6251
6252 assert_eq!(s.pipe.advance(), Ok(()));
6253
6254 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::SettingsError));
6255 }
6256
6257 #[test]
6258 fn settings_h2_prohibited() {
6260 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6261 config
6262 .load_cert_chain_from_pem_file("examples/cert.crt")
6263 .unwrap();
6264 config
6265 .load_priv_key_from_pem_file("examples/cert.key")
6266 .unwrap();
6267 config.set_application_protos(&[b"h3"]).unwrap();
6268 config.set_initial_max_data(70);
6269 config.set_initial_max_stream_data_bidi_local(150);
6270 config.set_initial_max_stream_data_bidi_remote(150);
6271 config.set_initial_max_stream_data_uni(150);
6272 config.set_initial_max_streams_bidi(100);
6273 config.set_initial_max_streams_uni(5);
6274 config.verify_peer(false);
6275
6276 let h3_config = Config::new().unwrap();
6277
6278 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6279 assert_eq!(s.pipe.handshake(), Ok(()));
6280
6281 s.client.control_stream_id = Some(
6282 s.client
6283 .open_uni_stream(
6284 &mut s.pipe.client,
6285 stream::HTTP3_CONTROL_STREAM_TYPE_ID,
6286 )
6287 .unwrap(),
6288 );
6289
6290 s.server.control_stream_id = Some(
6291 s.server
6292 .open_uni_stream(
6293 &mut s.pipe.server,
6294 stream::HTTP3_CONTROL_STREAM_TYPE_ID,
6295 )
6296 .unwrap(),
6297 );
6298
6299 let frame_payload_len = 2u64;
6300 let settings = [
6301 frame::SETTINGS_FRAME_TYPE_ID as u8,
6302 frame_payload_len as u8,
6303 0x2, 1,
6305 ];
6306
6307 s.send_arbitrary_stream_data_client(
6308 &settings,
6309 s.client.control_stream_id.unwrap(),
6310 false,
6311 )
6312 .unwrap();
6313
6314 s.send_arbitrary_stream_data_server(
6315 &settings,
6316 s.server.control_stream_id.unwrap(),
6317 false,
6318 )
6319 .unwrap();
6320
6321 assert_eq!(s.pipe.advance(), Ok(()));
6322
6323 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::SettingsError));
6324
6325 assert_eq!(s.client.poll(&mut s.pipe.client), Err(Error::SettingsError));
6326 }
6327
6328 #[test]
6329 fn set_prohibited_additional_settings() {
6331 let mut h3_config = Config::new().unwrap();
6332 assert_eq!(
6333 h3_config.set_additional_settings(vec![(
6334 frame::SETTINGS_QPACK_MAX_TABLE_CAPACITY,
6335 43
6336 )]),
6337 Err(Error::SettingsError)
6338 );
6339 assert_eq!(
6340 h3_config.set_additional_settings(vec![(
6341 frame::SETTINGS_MAX_FIELD_SECTION_SIZE,
6342 43
6343 )]),
6344 Err(Error::SettingsError)
6345 );
6346 assert_eq!(
6347 h3_config.set_additional_settings(vec![(
6348 frame::SETTINGS_QPACK_BLOCKED_STREAMS,
6349 43
6350 )]),
6351 Err(Error::SettingsError)
6352 );
6353 assert_eq!(
6354 h3_config.set_additional_settings(vec![(
6355 frame::SETTINGS_ENABLE_CONNECT_PROTOCOL,
6356 43
6357 )]),
6358 Err(Error::SettingsError)
6359 );
6360 assert_eq!(
6361 h3_config
6362 .set_additional_settings(vec![(frame::SETTINGS_H3_DATAGRAM, 43)]),
6363 Err(Error::SettingsError)
6364 );
6365 }
6366
6367 #[test]
6368 fn set_additional_settings() {
6370 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6371 config
6372 .load_cert_chain_from_pem_file("examples/cert.crt")
6373 .unwrap();
6374 config
6375 .load_priv_key_from_pem_file("examples/cert.key")
6376 .unwrap();
6377 config.set_application_protos(&[b"h3"]).unwrap();
6378 config.set_initial_max_data(70);
6379 config.set_initial_max_stream_data_bidi_local(150);
6380 config.set_initial_max_stream_data_bidi_remote(150);
6381 config.set_initial_max_stream_data_uni(150);
6382 config.set_initial_max_streams_bidi(100);
6383 config.set_initial_max_streams_uni(5);
6384 config.verify_peer(false);
6385 config.grease(false);
6386
6387 let mut h3_config = Config::new().unwrap();
6388 h3_config
6389 .set_additional_settings(vec![(42, 43), (44, 45)])
6390 .unwrap();
6391
6392 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6393 assert_eq!(s.pipe.handshake(), Ok(()));
6394
6395 assert_eq!(s.pipe.advance(), Ok(()));
6396
6397 s.client.send_settings(&mut s.pipe.client).unwrap();
6398 assert_eq!(s.pipe.advance(), Ok(()));
6399 assert_eq!(s.server.poll(&mut s.pipe.server), Err(Error::Done));
6400
6401 s.server.send_settings(&mut s.pipe.server).unwrap();
6402 assert_eq!(s.pipe.advance(), Ok(()));
6403 assert_eq!(s.client.poll(&mut s.pipe.client), Err(Error::Done));
6404
6405 assert_eq!(
6406 s.server.peer_settings_raw(),
6407 Some(&[(42, 43), (44, 45)][..])
6408 );
6409 assert_eq!(
6410 s.client.peer_settings_raw(),
6411 Some(&[(42, 43), (44, 45)][..])
6412 );
6413 }
6414
6415 #[test]
6416 fn single_dgram() {
6418 let mut buf = [0; 65535];
6419 let mut s = Session::new().unwrap();
6420 s.handshake().unwrap();
6421
6422 let result = (11, 0, 1);
6424
6425 s.send_dgram_client(0).unwrap();
6426
6427 assert_eq!(s.poll_server(), Err(Error::Done));
6428 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6429
6430 s.send_dgram_server(0).unwrap();
6431 assert_eq!(s.poll_client(), Err(Error::Done));
6432 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6433 }
6434
6435 #[test]
6436 fn multiple_dgram() {
6438 let mut buf = [0; 65535];
6439 let mut s = Session::new().unwrap();
6440 s.handshake().unwrap();
6441
6442 let result = (11, 0, 1);
6444
6445 s.send_dgram_client(0).unwrap();
6446 s.send_dgram_client(0).unwrap();
6447 s.send_dgram_client(0).unwrap();
6448
6449 assert_eq!(s.poll_server(), Err(Error::Done));
6450 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6451 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6452 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6453 assert_eq!(s.recv_dgram_server(&mut buf), Err(Error::Done));
6454
6455 s.send_dgram_server(0).unwrap();
6456 s.send_dgram_server(0).unwrap();
6457 s.send_dgram_server(0).unwrap();
6458
6459 assert_eq!(s.poll_client(), Err(Error::Done));
6460 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6461 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6462 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6463 assert_eq!(s.recv_dgram_client(&mut buf), Err(Error::Done));
6464 }
6465
6466 #[test]
6467 fn multiple_dgram_overflow() {
6469 let mut buf = [0; 65535];
6470 let mut s = Session::new().unwrap();
6471 s.handshake().unwrap();
6472
6473 let result = (11, 0, 1);
6475
6476 s.send_dgram_client(0).unwrap();
6478 s.send_dgram_client(0).unwrap();
6479 s.send_dgram_client(0).unwrap();
6480 s.send_dgram_client(0).unwrap();
6481 s.send_dgram_client(0).unwrap();
6482
6483 assert_eq!(s.poll_server(), Err(Error::Done));
6485 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6486 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6487 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6488 assert_eq!(s.recv_dgram_server(&mut buf), Err(Error::Done));
6489 }
6490
6491 #[test]
6492 fn poll_datagram_cycling_no_read() {
6494 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6495 config
6496 .load_cert_chain_from_pem_file("examples/cert.crt")
6497 .unwrap();
6498 config
6499 .load_priv_key_from_pem_file("examples/cert.key")
6500 .unwrap();
6501 config.set_application_protos(&[b"h3"]).unwrap();
6502 config.set_initial_max_data(1500);
6503 config.set_initial_max_stream_data_bidi_local(150);
6504 config.set_initial_max_stream_data_bidi_remote(150);
6505 config.set_initial_max_stream_data_uni(150);
6506 config.set_initial_max_streams_bidi(100);
6507 config.set_initial_max_streams_uni(5);
6508 config.verify_peer(false);
6509 config.enable_dgram(true, 100, 100);
6510
6511 let h3_config = Config::new().unwrap();
6512 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6513 s.handshake().unwrap();
6514
6515 let (stream, req) = s.send_request(false).unwrap();
6517
6518 s.send_body_client(stream, true).unwrap();
6519
6520 let ev_headers = Event::Headers {
6521 list: req,
6522 more_frames: true,
6523 };
6524
6525 s.send_dgram_client(0).unwrap();
6526
6527 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6528 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6529
6530 assert_eq!(s.poll_server(), Err(Error::Done));
6531 }
6532
6533 #[test]
6534 fn poll_datagram_single_read() {
6536 let mut buf = [0; 65535];
6537
6538 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6539 config
6540 .load_cert_chain_from_pem_file("examples/cert.crt")
6541 .unwrap();
6542 config
6543 .load_priv_key_from_pem_file("examples/cert.key")
6544 .unwrap();
6545 config.set_application_protos(&[b"h3"]).unwrap();
6546 config.set_initial_max_data(1500);
6547 config.set_initial_max_stream_data_bidi_local(150);
6548 config.set_initial_max_stream_data_bidi_remote(150);
6549 config.set_initial_max_stream_data_uni(150);
6550 config.set_initial_max_streams_bidi(100);
6551 config.set_initial_max_streams_uni(5);
6552 config.verify_peer(false);
6553 config.enable_dgram(true, 100, 100);
6554
6555 let h3_config = Config::new().unwrap();
6556 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6557 s.handshake().unwrap();
6558
6559 let result = (11, 0, 1);
6561
6562 let (stream, req) = s.send_request(false).unwrap();
6564
6565 let body = s.send_body_client(stream, true).unwrap();
6566
6567 let mut recv_buf = vec![0; body.len()];
6568
6569 let ev_headers = Event::Headers {
6570 list: req,
6571 more_frames: true,
6572 };
6573
6574 s.send_dgram_client(0).unwrap();
6575
6576 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6577 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6578
6579 assert_eq!(s.poll_server(), Err(Error::Done));
6580
6581 assert_eq!(s.recv_dgram_server(&mut buf), Ok(result));
6582
6583 assert_eq!(s.poll_server(), Err(Error::Done));
6584
6585 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
6586 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6587 assert_eq!(s.poll_server(), Err(Error::Done));
6588
6589 let resp = s.send_response(stream, false).unwrap();
6591
6592 let body = s.send_body_server(stream, true).unwrap();
6593
6594 let mut recv_buf = vec![0; body.len()];
6595
6596 let ev_headers = Event::Headers {
6597 list: resp,
6598 more_frames: true,
6599 };
6600
6601 s.send_dgram_server(0).unwrap();
6602
6603 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
6604 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6605
6606 assert_eq!(s.poll_client(), Err(Error::Done));
6607
6608 assert_eq!(s.recv_dgram_client(&mut buf), Ok(result));
6609
6610 assert_eq!(s.poll_client(), Err(Error::Done));
6611
6612 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(body.len()));
6613
6614 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
6615 assert_eq!(s.poll_client(), Err(Error::Done));
6616 }
6617
6618 #[test]
6619 fn poll_datagram_multi_read() {
6621 let mut buf = [0; 65535];
6622
6623 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6624 config
6625 .load_cert_chain_from_pem_file("examples/cert.crt")
6626 .unwrap();
6627 config
6628 .load_priv_key_from_pem_file("examples/cert.key")
6629 .unwrap();
6630 config.set_application_protos(&[b"h3"]).unwrap();
6631 config.set_initial_max_data(1500);
6632 config.set_initial_max_stream_data_bidi_local(150);
6633 config.set_initial_max_stream_data_bidi_remote(150);
6634 config.set_initial_max_stream_data_uni(150);
6635 config.set_initial_max_streams_bidi(100);
6636 config.set_initial_max_streams_uni(5);
6637 config.verify_peer(false);
6638 config.enable_dgram(true, 100, 100);
6639
6640 let h3_config = Config::new().unwrap();
6641 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
6642 s.handshake().unwrap();
6643
6644 let flow_0_result = (11, 0, 1);
6646 let flow_2_result = (11, 2, 1);
6647
6648 let (stream, req) = s.send_request(false).unwrap();
6650
6651 let body = s.send_body_client(stream, true).unwrap();
6652
6653 let mut recv_buf = vec![0; body.len()];
6654
6655 let ev_headers = Event::Headers {
6656 list: req,
6657 more_frames: true,
6658 };
6659
6660 s.send_dgram_client(0).unwrap();
6661 s.send_dgram_client(0).unwrap();
6662 s.send_dgram_client(0).unwrap();
6663 s.send_dgram_client(0).unwrap();
6664 s.send_dgram_client(0).unwrap();
6665 s.send_dgram_client(2).unwrap();
6666 s.send_dgram_client(2).unwrap();
6667 s.send_dgram_client(2).unwrap();
6668 s.send_dgram_client(2).unwrap();
6669 s.send_dgram_client(2).unwrap();
6670
6671 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6672 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6673
6674 assert_eq!(s.poll_server(), Err(Error::Done));
6675
6676 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6678 assert_eq!(s.poll_server(), Err(Error::Done));
6679 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6680 assert_eq!(s.poll_server(), Err(Error::Done));
6681 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6682 assert_eq!(s.poll_server(), Err(Error::Done));
6683
6684 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
6685 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6686
6687 assert_eq!(s.poll_server(), Err(Error::Done));
6688
6689 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6691 assert_eq!(s.poll_server(), Err(Error::Done));
6692 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
6693 assert_eq!(s.poll_server(), Err(Error::Done));
6694 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6695 assert_eq!(s.poll_server(), Err(Error::Done));
6696 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6697 assert_eq!(s.poll_server(), Err(Error::Done));
6698 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6699 assert_eq!(s.poll_server(), Err(Error::Done));
6700 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6701 assert_eq!(s.poll_server(), Err(Error::Done));
6702 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
6703 assert_eq!(s.poll_server(), Err(Error::Done));
6704
6705 let resp = s.send_response(stream, false).unwrap();
6707
6708 let body = s.send_body_server(stream, true).unwrap();
6709
6710 let mut recv_buf = vec![0; body.len()];
6711
6712 let ev_headers = Event::Headers {
6713 list: resp,
6714 more_frames: true,
6715 };
6716
6717 s.send_dgram_server(0).unwrap();
6718 s.send_dgram_server(0).unwrap();
6719 s.send_dgram_server(0).unwrap();
6720 s.send_dgram_server(0).unwrap();
6721 s.send_dgram_server(0).unwrap();
6722 s.send_dgram_server(2).unwrap();
6723 s.send_dgram_server(2).unwrap();
6724 s.send_dgram_server(2).unwrap();
6725 s.send_dgram_server(2).unwrap();
6726 s.send_dgram_server(2).unwrap();
6727
6728 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
6729 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
6730
6731 assert_eq!(s.poll_client(), Err(Error::Done));
6732
6733 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6735 assert_eq!(s.poll_client(), Err(Error::Done));
6736 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6737 assert_eq!(s.poll_client(), Err(Error::Done));
6738 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6739 assert_eq!(s.poll_client(), Err(Error::Done));
6740
6741 assert_eq!(s.recv_body_client(stream, &mut recv_buf), Ok(body.len()));
6742 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
6743
6744 assert_eq!(s.poll_client(), Err(Error::Done));
6745
6746 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6748 assert_eq!(s.poll_client(), Err(Error::Done));
6749 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_0_result));
6750 assert_eq!(s.poll_client(), Err(Error::Done));
6751 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6752 assert_eq!(s.poll_client(), Err(Error::Done));
6753 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6754 assert_eq!(s.poll_client(), Err(Error::Done));
6755 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6756 assert_eq!(s.poll_client(), Err(Error::Done));
6757 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6758 assert_eq!(s.poll_client(), Err(Error::Done));
6759 assert_eq!(s.recv_dgram_client(&mut buf), Ok(flow_2_result));
6760 assert_eq!(s.poll_client(), Err(Error::Done));
6761 }
6762
6763 #[test]
6764 fn finished_is_for_requests() {
6767 let mut s = Session::new().unwrap();
6768 s.handshake().unwrap();
6769
6770 assert_eq!(s.poll_client(), Err(Error::Done));
6771 assert_eq!(s.poll_server(), Err(Error::Done));
6772
6773 assert_eq!(s.client.open_grease_stream(&mut s.pipe.client), Ok(()));
6774 assert_eq!(s.pipe.advance(), Ok(()));
6775
6776 assert_eq!(s.poll_client(), Err(Error::Done));
6777 assert_eq!(s.poll_server(), Err(Error::Done));
6778 }
6779
6780 #[test]
6781 fn finished_once() {
6783 let mut s = Session::new().unwrap();
6784 s.handshake().unwrap();
6785
6786 let (stream, req) = s.send_request(false).unwrap();
6787 let body = s.send_body_client(stream, true).unwrap();
6788
6789 let mut recv_buf = vec![0; body.len()];
6790
6791 let ev_headers = Event::Headers {
6792 list: req,
6793 more_frames: true,
6794 };
6795
6796 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
6797 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
6798
6799 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
6800 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
6801
6802 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Err(Error::Done));
6803 assert_eq!(s.poll_server(), Err(Error::Done));
6804 }
6805
6806 #[test]
6807 fn data_event_rearm() {
6809 let bytes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
6810
6811 let mut s = Session::new().unwrap();
6812 s.handshake().unwrap();
6813
6814 let (r1_id, r1_hdrs) = s.send_request(false).unwrap();
6815
6816 let mut recv_buf = vec![0; bytes.len()];
6817
6818 let r1_ev_headers = Event::Headers {
6819 list: r1_hdrs,
6820 more_frames: true,
6821 };
6822
6823 {
6826 let mut d = [42; 10];
6827 let mut b = octets::OctetsMut::with_slice(&mut d);
6828
6829 b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
6830 b.put_varint(bytes.len() as u64).unwrap();
6831 let off = b.off();
6832 s.pipe.client.stream_send(r1_id, &d[..off], false).unwrap();
6833
6834 assert_eq!(
6835 s.pipe.client.stream_send(r1_id, &bytes[..5], false),
6836 Ok(5)
6837 );
6838
6839 s.advance().ok();
6840 }
6841
6842 assert_eq!(s.poll_server(), Ok((r1_id, r1_ev_headers)));
6843 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6844 assert_eq!(s.poll_server(), Err(Error::Done));
6845
6846 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(5));
6848
6849 assert_eq!(s.pipe.client.stream_send(r1_id, &bytes[5..], false), Ok(5));
6851 s.advance().ok();
6852
6853 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6854 assert_eq!(s.poll_server(), Err(Error::Done));
6855
6856 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(5));
6858 assert_eq!(s.poll_server(), Err(Error::Done));
6859
6860 let r1_body = s.send_body_client(r1_id, false).unwrap();
6862
6863 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6864 assert_eq!(s.poll_server(), Err(Error::Done));
6865
6866 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(r1_body.len()));
6867
6868 let (r2_id, r2_hdrs) = s.send_request(false).unwrap();
6870 let r2_ev_headers = Event::Headers {
6871 list: r2_hdrs,
6872 more_frames: true,
6873 };
6874 let r2_body = s.send_body_client(r2_id, false).unwrap();
6875
6876 s.advance().ok();
6877
6878 assert_eq!(s.poll_server(), Ok((r2_id, r2_ev_headers)));
6879 assert_eq!(s.poll_server(), Ok((r2_id, Event::Data)));
6880 assert_eq!(s.recv_body_server(r2_id, &mut recv_buf), Ok(r2_body.len()));
6881 assert_eq!(s.poll_server(), Err(Error::Done));
6882
6883 let r1_body = s.send_body_client(r1_id, false).unwrap();
6885
6886 let trailers = vec![Header::new(b"hello", b"world")];
6887
6888 s.client
6889 .send_headers(&mut s.pipe.client, r1_id, &trailers, true)
6890 .unwrap();
6891
6892 let r1_ev_trailers = Event::Headers {
6893 list: trailers.clone(),
6894 more_frames: false,
6895 };
6896
6897 s.advance().ok();
6898
6899 assert_eq!(s.poll_server(), Ok((r1_id, Event::Data)));
6900 assert_eq!(s.recv_body_server(r1_id, &mut recv_buf), Ok(r1_body.len()));
6901
6902 assert_eq!(s.poll_server(), Ok((r1_id, r1_ev_trailers)));
6903 assert_eq!(s.poll_server(), Ok((r1_id, Event::Finished)));
6904 assert_eq!(s.poll_server(), Err(Error::Done));
6905
6906 let r2_body = s.send_body_client(r2_id, false).unwrap();
6908
6909 s.client
6910 .send_headers(&mut s.pipe.client, r2_id, &trailers, false)
6911 .unwrap();
6912
6913 let r2_ev_trailers = Event::Headers {
6914 list: trailers,
6915 more_frames: true,
6916 };
6917
6918 s.advance().ok();
6919
6920 assert_eq!(s.poll_server(), Ok((r2_id, Event::Data)));
6921 assert_eq!(s.recv_body_server(r2_id, &mut recv_buf), Ok(r2_body.len()));
6922 assert_eq!(s.poll_server(), Ok((r2_id, r2_ev_trailers)));
6923 assert_eq!(s.poll_server(), Err(Error::Done));
6924
6925 let (r3_id, r3_hdrs) = s.send_request(false).unwrap();
6926
6927 let r3_ev_headers = Event::Headers {
6928 list: r3_hdrs,
6929 more_frames: true,
6930 };
6931
6932 {
6934 let mut d = [42; 10];
6935 let mut b = octets::OctetsMut::with_slice(&mut d);
6936
6937 b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
6938 b.put_varint(bytes.len() as u64).unwrap();
6939 let off = b.off();
6940 s.pipe.client.stream_send(r3_id, &d[..off], false).unwrap();
6941
6942 s.advance().ok();
6943 }
6944
6945 assert_eq!(s.poll_server(), Ok((r3_id, r3_ev_headers)));
6946 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
6947 assert_eq!(s.poll_server(), Err(Error::Done));
6948
6949 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Err(Error::Done));
6950
6951 assert_eq!(s.pipe.client.stream_send(r3_id, &bytes[..5], false), Ok(5));
6952
6953 s.advance().ok();
6954
6955 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
6956 assert_eq!(s.poll_server(), Err(Error::Done));
6957
6958 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Ok(5));
6959
6960 assert_eq!(s.pipe.client.stream_send(r3_id, &bytes[5..], false), Ok(5));
6961 s.advance().ok();
6962
6963 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
6964 assert_eq!(s.poll_server(), Err(Error::Done));
6965
6966 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Ok(5));
6967
6968 let body = s.send_body_client(r3_id, false).unwrap();
6970 s.send_body_client(r3_id, false).unwrap();
6971 s.send_body_client(r3_id, false).unwrap();
6972
6973 assert_eq!(s.poll_server(), Ok((r3_id, Event::Data)));
6974 assert_eq!(s.poll_server(), Err(Error::Done));
6975
6976 {
6977 let mut d = [42; 10];
6978 let mut b = octets::OctetsMut::with_slice(&mut d);
6979
6980 b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
6981 b.put_varint(0).unwrap();
6982 let off = b.off();
6983 s.pipe.client.stream_send(r3_id, &d[..off], true).unwrap();
6984
6985 s.advance().ok();
6986 }
6987
6988 let mut recv_buf = vec![0; bytes.len() * 3];
6989
6990 assert_eq!(s.recv_body_server(r3_id, &mut recv_buf), Ok(body.len() * 3));
6991 }
6992
6993 #[test]
6994 fn dgram_event_rearm() {
6996 let mut buf = [0; 65535];
6997
6998 let mut config = crate::Config::new(crate::PROTOCOL_VERSION).unwrap();
6999 config
7000 .load_cert_chain_from_pem_file("examples/cert.crt")
7001 .unwrap();
7002 config
7003 .load_priv_key_from_pem_file("examples/cert.key")
7004 .unwrap();
7005 config.set_application_protos(&[b"h3"]).unwrap();
7006 config.set_initial_max_data(1500);
7007 config.set_initial_max_stream_data_bidi_local(150);
7008 config.set_initial_max_stream_data_bidi_remote(150);
7009 config.set_initial_max_stream_data_uni(150);
7010 config.set_initial_max_streams_bidi(100);
7011 config.set_initial_max_streams_uni(5);
7012 config.verify_peer(false);
7013 config.enable_dgram(true, 100, 100);
7014
7015 let h3_config = Config::new().unwrap();
7016 let mut s = Session::with_configs(&mut config, &h3_config).unwrap();
7017 s.handshake().unwrap();
7018
7019 let flow_0_result = (11, 0, 1);
7021 let flow_2_result = (11, 2, 1);
7022
7023 let (stream, req) = s.send_request(false).unwrap();
7025
7026 let body = s.send_body_client(stream, true).unwrap();
7027
7028 let mut recv_buf = vec![0; body.len()];
7029
7030 let ev_headers = Event::Headers {
7031 list: req,
7032 more_frames: true,
7033 };
7034
7035 s.send_dgram_client(0).unwrap();
7036 s.send_dgram_client(0).unwrap();
7037 s.send_dgram_client(2).unwrap();
7038 s.send_dgram_client(2).unwrap();
7039
7040 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7041 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7042
7043 assert_eq!(s.poll_server(), Err(Error::Done));
7044 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
7045
7046 assert_eq!(s.poll_server(), Err(Error::Done));
7047 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
7048
7049 assert_eq!(s.poll_server(), Err(Error::Done));
7050 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
7051
7052 assert_eq!(s.poll_server(), Err(Error::Done));
7053 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
7054
7055 assert_eq!(s.poll_server(), Err(Error::Done));
7056
7057 s.send_dgram_client(0).unwrap();
7058 s.send_dgram_client(2).unwrap();
7059
7060 assert_eq!(s.poll_server(), Err(Error::Done));
7061
7062 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_0_result));
7063 assert_eq!(s.poll_server(), Err(Error::Done));
7064
7065 assert_eq!(s.recv_dgram_server(&mut buf), Ok(flow_2_result));
7066 assert_eq!(s.poll_server(), Err(Error::Done));
7067
7068 assert_eq!(s.recv_body_server(stream, &mut recv_buf), Ok(body.len()));
7069 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7070 }
7071
7072 #[test]
7073 fn reset_stream() {
7074 let mut buf = [0; 65535];
7075
7076 let mut s = Session::new().unwrap();
7077 s.handshake().unwrap();
7078
7079 let (stream, req) = s.send_request(false).unwrap();
7081
7082 let ev_headers = Event::Headers {
7083 list: req,
7084 more_frames: true,
7085 };
7086
7087 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7089 assert_eq!(s.poll_server(), Err(Error::Done));
7090
7091 let resp = s.send_response(stream, true).unwrap();
7092
7093 let ev_headers = Event::Headers {
7094 list: resp,
7095 more_frames: false,
7096 };
7097
7098 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7099 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7100 assert_eq!(s.poll_client(), Err(Error::Done));
7101
7102 let frames = [crate::frame::Frame::ResetStream {
7104 stream_id: stream,
7105 error_code: 42,
7106 final_size: 68,
7107 }];
7108
7109 let pkt_type = crate::packet::Type::Short;
7110 assert_eq!(
7111 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
7112 Ok(39)
7113 );
7114
7115 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(42))));
7117 assert_eq!(s.poll_server(), Err(Error::Done));
7118
7119 assert_eq!(
7121 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
7122 Ok(39)
7123 );
7124
7125 assert_eq!(s.poll_server(), Err(Error::Done));
7126 }
7127
7128 #[test]
7131 fn client_shutdown_write_server_fin() {
7132 let mut buf = [0; 65535];
7133 let mut s = Session::new().unwrap();
7134 s.handshake().unwrap();
7135
7136 let (stream, req) = s.send_request(false).unwrap();
7138
7139 let ev_headers = Event::Headers {
7140 list: req,
7141 more_frames: true,
7142 };
7143
7144 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7146 assert_eq!(s.poll_server(), Err(Error::Done));
7147
7148 let resp = s.send_response(stream, true).unwrap();
7149
7150 let ev_headers = Event::Headers {
7151 list: resp,
7152 more_frames: false,
7153 };
7154
7155 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7156 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7157 assert_eq!(s.poll_client(), Err(Error::Done));
7158
7159 assert_eq!(
7161 s.pipe
7162 .client
7163 .stream_shutdown(stream, crate::Shutdown::Write, 42),
7164 Ok(())
7165 );
7166 assert_eq!(s.advance(), Ok(()));
7167
7168 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(42))));
7170 assert_eq!(s.poll_server(), Err(Error::Done));
7171
7172 assert!(s.pipe.server.streams.is_collected(stream));
7174 assert!(s.pipe.client.streams.is_collected(stream));
7175
7176 let (stream, req) = s.send_request(false).unwrap();
7179
7180 let ev_headers = Event::Headers {
7181 list: req,
7182 more_frames: true,
7183 };
7184
7185 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7187 assert_eq!(s.poll_server(), Err(Error::Done));
7188
7189 let resp = s.send_response(stream, false).unwrap();
7191
7192 let ev_headers = Event::Headers {
7193 list: resp,
7194 more_frames: true,
7195 };
7196
7197 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7198 assert_eq!(s.poll_client(), Err(Error::Done));
7199
7200 assert_eq!(
7202 s.pipe
7203 .client
7204 .stream_shutdown(stream, crate::Shutdown::Write, 42),
7205 Ok(())
7206 );
7207 assert_eq!(s.advance(), Ok(()));
7208
7209 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(42))));
7211 assert_eq!(s.poll_server(), Err(Error::Done));
7212
7213 s.send_body_server(stream, true).unwrap();
7215
7216 assert!(s.pipe.server.streams.is_collected(stream));
7218 assert!(!s.pipe.client.streams.is_collected(stream));
7221 assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
7222 s.recv_body_client(stream, &mut buf).unwrap();
7223 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7224 assert_eq!(s.poll_client(), Err(Error::Done));
7225 assert!(s.pipe.client.streams.is_collected(stream));
7226 }
7227
7228 #[test]
7229 fn client_shutdown_read() {
7230 let mut buf = [0; 65535];
7231 let mut s = Session::new().unwrap();
7232 s.handshake().unwrap();
7233
7234 let (stream, req) = s.send_request(false).unwrap();
7236
7237 let ev_headers = Event::Headers {
7238 list: req,
7239 more_frames: true,
7240 };
7241
7242 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7244 assert_eq!(s.poll_server(), Err(Error::Done));
7245
7246 let resp = s.send_response(stream, false).unwrap();
7247
7248 let ev_headers = Event::Headers {
7249 list: resp,
7250 more_frames: true,
7251 };
7252
7253 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7254 assert_eq!(s.poll_client(), Err(Error::Done));
7255 assert_eq!(
7257 s.pipe
7258 .client
7259 .stream_shutdown(stream, crate::Shutdown::Read, 42),
7260 Ok(())
7261 );
7262 assert_eq!(s.advance(), Ok(()));
7263
7264 assert_eq!(s.poll_server(), Err(Error::Done));
7266 let writables: Vec<u64> = s.pipe.server.writable().collect();
7267 assert!(writables.contains(&stream));
7268 assert_eq!(
7269 s.send_body_server(stream, false),
7270 Err(Error::TransportError(crate::Error::StreamStopped(42)))
7271 );
7272
7273 assert_eq!(
7275 s.client.send_body(&mut s.pipe.client, stream, &[], true),
7276 Ok(0)
7277 );
7278 assert_eq!(s.advance(), Ok(()));
7279 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7282 assert_eq!(s.recv_body_server(stream, &mut buf), Err(Error::Done));
7283 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7284 assert_eq!(s.poll_server(), Err(Error::Done));
7285
7286 assert!(s.pipe.client.streams.is_collected(stream));
7289 assert!(s.pipe.server.streams.is_collected(stream));
7290 }
7291
7292 #[test]
7293 fn reset_finished_at_server() {
7294 let mut s = Session::new().unwrap();
7295 s.handshake().unwrap();
7296
7297 let (stream, _req) = s.send_request(false).unwrap();
7299
7300 assert_eq!(
7302 s.pipe.client.stream_shutdown(0, crate::Shutdown::Write, 0),
7303 Ok(())
7304 );
7305
7306 assert_eq!(s.pipe.advance(), Ok(()));
7307
7308 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(0))));
7310 assert_eq!(s.poll_server(), Err(Error::Done));
7311
7312 let (stream, req) = s.send_request(true).unwrap();
7314
7315 assert_eq!(
7317 s.pipe.client.stream_shutdown(4, crate::Shutdown::Write, 0),
7318 Ok(())
7319 );
7320
7321 let ev_headers = Event::Headers {
7322 list: req,
7323 more_frames: false,
7324 };
7325
7326 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7328 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7329 assert_eq!(s.poll_server(), Err(Error::Done));
7330 }
7331
7332 #[test]
7333 fn reset_finished_at_server_with_data_pending() {
7334 let mut s = Session::new().unwrap();
7335 s.handshake().unwrap();
7336
7337 let (stream, req) = s.send_request(false).unwrap();
7339
7340 assert!(s.send_body_client(stream, false).is_ok());
7341
7342 assert_eq!(s.pipe.advance(), Ok(()));
7343
7344 let ev_headers = Event::Headers {
7345 list: req,
7346 more_frames: true,
7347 };
7348
7349 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7351 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7352
7353 assert_eq!(
7355 s.pipe
7356 .client
7357 .stream_shutdown(stream, crate::Shutdown::Write, 0),
7358 Ok(())
7359 );
7360
7361 assert_eq!(s.pipe.advance(), Ok(()));
7362
7363 assert_eq!(s.poll_server(), Ok((stream, Event::Reset(0))));
7367 assert_eq!(s.poll_server(), Err(Error::Done));
7368 assert_eq!(s.pipe.server.readable().len(), 0);
7369 }
7370
7371 #[test]
7372 fn reset_finished_at_server_with_data_pending_2() {
7373 let mut s = Session::new().unwrap();
7374 s.handshake().unwrap();
7375
7376 let (stream, req) = s.send_request(false).unwrap();
7378
7379 assert!(s.send_body_client(stream, false).is_ok());
7380
7381 assert_eq!(s.pipe.advance(), Ok(()));
7382
7383 let ev_headers = Event::Headers {
7384 list: req,
7385 more_frames: true,
7386 };
7387
7388 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7390 assert_eq!(s.poll_server(), Ok((stream, Event::Data)));
7391
7392 assert_eq!(
7394 s.pipe
7395 .client
7396 .stream_shutdown(stream, crate::Shutdown::Write, 0),
7397 Ok(())
7398 );
7399
7400 assert_eq!(s.pipe.advance(), Ok(()));
7401
7402 assert_eq!(
7405 s.recv_body_server(stream, &mut [0; 100]),
7406 Err(Error::TransportError(crate::Error::StreamReset(0)))
7407 );
7408
7409 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_client() {
7416 let mut buf = [0; 65535];
7417 let mut s = Session::new().unwrap();
7418 s.handshake().unwrap();
7419
7420 let (stream, req) = s.send_request(false).unwrap();
7422
7423 let ev_headers = Event::Headers {
7424 list: req,
7425 more_frames: true,
7426 };
7427
7428 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7430 assert_eq!(s.poll_server(), Err(Error::Done));
7431
7432 s.send_response(stream, false).unwrap();
7434
7435 assert_eq!(s.pipe.advance(), Ok(()));
7436
7437 assert_eq!(
7439 s.pipe
7440 .server
7441 .stream_shutdown(stream, crate::Shutdown::Write, 0),
7442 Ok(())
7443 );
7444
7445 assert_eq!(s.pipe.advance(), Ok(()));
7446
7447 assert_eq!(s.poll_client(), Ok((stream, Event::Reset(0))));
7449 assert_eq!(s.poll_server(), Err(Error::Done));
7450
7451 let (stream, req) = s.send_request(true).unwrap();
7453
7454 let ev_headers = Event::Headers {
7455 list: req,
7456 more_frames: false,
7457 };
7458
7459 assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7461 assert_eq!(s.poll_server(), Ok((stream, Event::Finished)));
7462 assert_eq!(s.poll_server(), Err(Error::Done));
7463
7464 let resp = s.send_response(stream, true).unwrap();
7466
7467 assert_eq!(s.pipe.advance(), Ok(()));
7468
7469 let frames = [crate::frame::Frame::ResetStream {
7471 stream_id: stream,
7472 error_code: 42,
7473 final_size: 68,
7474 }];
7475
7476 let pkt_type = crate::packet::Type::Short;
7477 assert_eq!(
7478 s.pipe.send_pkt_to_server(pkt_type, &frames, &mut buf),
7479 Ok(39)
7480 );
7481
7482 assert_eq!(s.pipe.advance(), Ok(()));
7483
7484 let ev_headers = Event::Headers {
7485 list: resp,
7486 more_frames: false,
7487 };
7488
7489 assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7491 assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7492 assert_eq!(s.poll_client(), Err(Error::Done));
7493 }
7494}
7495
7496#[cfg(feature = "ffi")]
7497mod ffi;
7498#[cfg(feature = "internal")]
7499#[doc(hidden)]
7500pub mod frame;
7501#[cfg(not(feature = "internal"))]
7502mod frame;
7503#[doc(hidden)]
7504pub mod qpack;
7505mod stream;