1use std::mem::MaybeUninit;
28
29use crate::buffers::BufFactory;
30
31use super::Error;
32use super::Result;
33
34use super::frame;
35
36pub const HTTP3_CONTROL_STREAM_TYPE_ID: u64 = 0x0;
37pub const HTTP3_PUSH_STREAM_TYPE_ID: u64 = 0x1;
38pub const QPACK_ENCODER_STREAM_TYPE_ID: u64 = 0x2;
39pub const QPACK_DECODER_STREAM_TYPE_ID: u64 = 0x3;
40
41const MAX_STATE_BUF_SIZE: usize = (1 << 24) - 1;
42const MAX_STATE_BUF_ALLOC_SIZE: usize = 4096;
43#[derive(Clone, Copy, Debug, PartialEq, Eq)]
44pub enum Type {
45 Control,
46 Request,
47 Push,
48 QpackEncoder,
49 QpackDecoder,
50 Unknown,
51}
52
53impl Type {
54 #[cfg(feature = "qlog")]
55 pub fn to_qlog(self) -> qlog::events::http3::StreamType {
56 match self {
57 Type::Control => qlog::events::http3::StreamType::Control,
58 Type::Request => qlog::events::http3::StreamType::Request,
59 Type::Push => qlog::events::http3::StreamType::Push,
60 Type::QpackEncoder => qlog::events::http3::StreamType::QpackEncode,
61 Type::QpackDecoder => qlog::events::http3::StreamType::QpackDecode,
62 Type::Unknown => qlog::events::http3::StreamType::Unknown,
63 }
64 }
65}
66
67#[derive(Clone, Copy, Debug, PartialEq, Eq)]
68pub enum State {
69 StreamType,
71
72 FrameType,
74
75 FramePayloadLen,
77
78 FramePayload,
80
81 Data,
83
84 PushId,
86
87 QpackInstruction,
89
90 SkipFramePayload,
92
93 Drain,
95
96 Finished,
98}
99
100impl Type {
101 pub fn deserialize(v: u64) -> Result<Type> {
102 match v {
103 HTTP3_CONTROL_STREAM_TYPE_ID => Ok(Type::Control),
104 HTTP3_PUSH_STREAM_TYPE_ID => Ok(Type::Push),
105 QPACK_ENCODER_STREAM_TYPE_ID => Ok(Type::QpackEncoder),
106 QPACK_DECODER_STREAM_TYPE_ID => Ok(Type::QpackDecoder),
107
108 _ => Ok(Type::Unknown),
109 }
110 }
111}
112
113#[derive(Debug)]
128pub struct Stream {
129 id: u64,
131
132 ty: Option<Type>,
134
135 state: State,
137
138 state_buf: Vec<u8>,
140
141 state_len: usize,
143
144 state_off: usize,
148
149 frame_type: Option<u64>,
151
152 is_local: bool,
154
155 remote_initialized: bool,
157
158 local_initialized: bool,
160
161 local_finished: bool,
163
164 data_event_triggered: bool,
166
167 last_priority_update: Option<Vec<u8>>,
169
170 headers_received_count: usize,
172
173 data_received: bool,
175
176 trailers_sent: bool,
178
179 trailers_received: bool,
181
182 max_encoded_headers_payload_size: u64,
186
187 max_priority_update_size: u64,
190}
191
192impl Stream {
193 pub fn new(
198 id: u64, is_local: bool, max_field_section_size: u64,
199 max_priority_update_size: u64,
200 ) -> Stream {
201 let (ty, state) = if crate::stream::is_bidi(id) {
202 (Some(Type::Request), State::FrameType)
205 } else {
206 (None, State::StreamType)
208 };
209
210 let max_encoded_headers_payload_size =
214 max_field_section_size.saturating_add(max_field_section_size / 2);
215
216 Stream {
217 id,
218 ty,
219
220 state,
221
222 state_buf: Vec::with_capacity(16),
224
225 state_len: 1,
228 state_off: 0,
229
230 frame_type: None,
231
232 is_local,
233
234 remote_initialized: false,
235
236 local_initialized: false,
237 local_finished: false,
238
239 data_event_triggered: false,
240
241 last_priority_update: None,
242
243 headers_received_count: 0,
244
245 data_received: false,
246
247 trailers_sent: false,
248 trailers_received: false,
249
250 max_encoded_headers_payload_size,
251 max_priority_update_size,
252 }
253 }
254
255 pub fn ty(&self) -> Option<Type> {
256 self.ty
257 }
258
259 pub fn state(&self) -> State {
260 self.state
261 }
262
263 pub fn set_ty(&mut self, ty: Type) -> Result<()> {
265 assert_eq!(self.state, State::StreamType);
266
267 self.ty = Some(ty);
268
269 let state = match ty {
270 Type::Control | Type::Request => State::FrameType,
271
272 Type::Push => State::PushId,
273
274 Type::QpackEncoder | Type::QpackDecoder => {
275 self.remote_initialized = true;
276
277 State::QpackInstruction
278 },
279
280 Type::Unknown => State::Drain,
281 };
282
283 self.state_transition(state, 1, true)?;
284
285 Ok(())
286 }
287
288 pub fn set_push_id(&mut self, _id: u64) -> Result<()> {
290 assert_eq!(self.state, State::PushId);
291
292 self.state_transition(State::FrameType, 1, true)?;
295
296 Ok(())
297 }
298
299 pub fn set_frame_type(&mut self, ty: u64) -> Result<()> {
301 assert_eq!(self.state, State::FrameType);
302
303 match self.ty {
305 Some(Type::Control) => {
306 match (ty, self.remote_initialized) {
310 (frame::SETTINGS_FRAME_TYPE_ID, false) =>
312 self.remote_initialized = true,
313
314 (_, false) => return Err(Error::MissingSettings),
317
318 (frame::SETTINGS_FRAME_TYPE_ID, true) =>
320 return Err(Error::FrameUnexpected),
321
322 (frame::DATA_FRAME_TYPE_ID, true) =>
325 return Err(Error::FrameUnexpected),
326
327 (frame::HEADERS_FRAME_TYPE_ID, true) =>
328 return Err(Error::FrameUnexpected),
329
330 (frame::PUSH_PROMISE_FRAME_TYPE_ID, true) =>
331 return Err(Error::FrameUnexpected),
332
333 (_, true) => (),
335 }
336 },
337
338 Some(Type::Request) => {
339 self.validate_request_frame_type(ty)?;
340 },
341
342 Some(Type::Push) => {
343 match ty {
344 frame::CANCEL_PUSH_FRAME_TYPE_ID =>
346 return Err(Error::FrameUnexpected),
347
348 frame::SETTINGS_FRAME_TYPE_ID =>
349 return Err(Error::FrameUnexpected),
350
351 frame::PUSH_PROMISE_FRAME_TYPE_ID =>
352 return Err(Error::FrameUnexpected),
353
354 frame::GOAWAY_FRAME_TYPE_ID =>
355 return Err(Error::FrameUnexpected),
356
357 frame::MAX_PUSH_FRAME_TYPE_ID =>
358 return Err(Error::FrameUnexpected),
359
360 _ => (),
361 }
362 },
363
364 _ => return Err(Error::FrameUnexpected),
365 }
366
367 self.frame_type = Some(ty);
368
369 self.state_transition(State::FramePayloadLen, 1, true)?;
370
371 Ok(())
372 }
373
374 fn validate_request_frame_type(&mut self, ty: u64) -> Result<()> {
387 if matches!(
390 ty,
391 frame::CANCEL_PUSH_FRAME_TYPE_ID |
392 frame::SETTINGS_FRAME_TYPE_ID |
393 frame::GOAWAY_FRAME_TYPE_ID |
394 frame::MAX_PUSH_FRAME_TYPE_ID |
395 frame::PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID |
396 frame::PRIORITY_UPDATE_FRAME_PUSH_TYPE_ID
397 ) {
398 return Err(Error::FrameUnexpected);
399 }
400
401 if self.is_local {
404 return Ok(());
405 }
406
407 match (ty, self.remote_initialized) {
408 (frame::HEADERS_FRAME_TYPE_ID, false) => {
409 self.remote_initialized = true;
410 },
411
412 (frame::DATA_FRAME_TYPE_ID, false) =>
413 return Err(Error::FrameUnexpected),
414
415 (frame::HEADERS_FRAME_TYPE_ID, true) => {
416 if self.trailers_received {
417 return Err(Error::FrameUnexpected);
418 }
419
420 if self.data_received {
421 self.trailers_received = true;
422 }
423 },
424
425 (frame::DATA_FRAME_TYPE_ID, true) => {
426 if self.trailers_received {
427 return Err(Error::FrameUnexpected);
428 }
429
430 self.data_received = true;
431 },
432
433 _ => (),
435 }
436
437 Ok(())
438 }
439
440 pub fn frame_type(&self) -> Option<u64> {
442 self.frame_type
443 }
444
445 pub fn set_frame_payload_len(&mut self, len: u64) -> Result<()> {
447 assert_eq!(self.state, State::FramePayloadLen);
448
449 if !matches!(self.ty, Some(Type::Control | Type::Request | Type::Push)) {
451 return Err(Error::InternalError);
452 }
453
454 let (state, resize) = match self.frame_type {
455 Some(frame::DATA_FRAME_TYPE_ID) => (State::Data, false),
456
457 Some(frame::HEADERS_FRAME_TYPE_ID) => {
458 if len > self.max_encoded_headers_payload_size {
459 return Err(Error::ExcessiveLoad);
460 }
461
462 (State::FramePayload, true)
463 },
464
465 Some(frame::CANCEL_PUSH_FRAME_TYPE_ID) |
468 Some(frame::GOAWAY_FRAME_TYPE_ID) |
469 Some(frame::MAX_PUSH_FRAME_TYPE_ID) => {
470 if !(1..=8).contains(&len) {
471 return Err(Error::FrameError);
472 }
473
474 (State::FramePayload, true)
475 },
476
477 Some(frame::SETTINGS_FRAME_TYPE_ID) => {
478 if len > frame::MAX_SETTINGS_PAYLOAD_SIZE as u64 {
479 return Err(Error::FrameError);
480 }
481
482 (State::FramePayload, true)
483 },
484
485 Some(frame::PUSH_PROMISE_FRAME_TYPE_ID) => {
486 let max_push_promise_size =
488 self.max_encoded_headers_payload_size.saturating_add(8);
489
490 if len == 0 {
491 return Err(Error::FrameError);
492 }
493
494 if len > max_push_promise_size {
495 return Err(Error::ExcessiveLoad);
496 }
497
498 (State::FramePayload, true)
499 },
500
501 Some(frame::PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID) |
502 Some(frame::PRIORITY_UPDATE_FRAME_PUSH_TYPE_ID) => {
503 if len == 0 {
504 return Err(Error::FrameError);
505 }
506
507 if len > self.max_priority_update_size {
508 return Err(Error::ExcessiveLoad);
509 }
510
511 (State::FramePayload, true)
512 },
513
514 _ => {
516 if len > MAX_STATE_BUF_SIZE as u64 {
517 return Err(Error::ExcessiveLoad);
518 }
519
520 (State::SkipFramePayload, false)
521 },
522 };
523
524 self.state_transition(state, len as usize, resize)?;
525
526 Ok(())
527 }
528
529 fn spare_state_buf(&mut self) -> &mut [u8] {
535 let need = self.state_len - self.state_off;
536 let spare = self
537 .state_buf
538 .capacity()
539 .saturating_sub(self.state_buf.len());
540
541 if spare == 0 {
542 let additional = std::cmp::min(MAX_STATE_BUF_ALLOC_SIZE, need);
543 self.state_buf.reserve(additional);
544 }
545
546 let buf = self.state_buf.spare_capacity_mut();
547 let usable = std::cmp::min(need, buf.len());
548
549 unsafe {
553 std::mem::transmute::<&mut [MaybeUninit<u8>], &mut [u8]>(
554 &mut buf[..usable],
555 )
556 }
557 }
558
559 fn commit_state_buf_read(&mut self, read: usize) {
563 let buf_len = self.state_buf.len();
564 debug_assert!(buf_len + read <= self.state_buf.capacity());
565 unsafe { self.state_buf.set_len(buf_len + read) };
569
570 self.state_off += read;
571 }
572
573 pub fn try_fill_buffer<F: BufFactory>(
579 &mut self, conn: &mut crate::Connection<F>,
580 ) -> Result<()> {
581 if self.state_buffer_complete() {
583 return Ok(());
584 }
585
586 loop {
587 let stream_id = self.id;
588
589 let spare_buf = self.spare_state_buf();
590 let spare_len = spare_buf.len();
591
592 match conn.stream_recv(stream_id, spare_buf) {
593 Ok((read, fin)) => {
594 self.commit_state_buf_read(read);
595
596 if self.critical_stream_closed(fin) {
597 super::close_conn_critical_stream(conn)?;
598 }
599
600 trace!(
601 "{} read {} bytes on stream {}",
602 conn.trace_id(),
603 read,
604 self.id,
605 );
606
607 if read < spare_len {
608 break;
609 }
610
611 if self.state_buffer_complete() {
612 return Ok(());
613 }
614 },
615
616 Err(e @ crate::Error::StreamReset(_)) => {
617 if self.critical_stream_closed(true) {
618 super::close_conn_critical_stream(conn)?;
619 }
620
621 return Err(e.into());
622 },
623
624 Err(e) => {
625 if e == crate::Error::Done {
628 self.reset_data_event();
629 }
630
631 return Err(e.into());
632 },
633 };
634 }
635
636 if !self.state_buffer_complete() {
637 self.reset_data_event();
638
639 return Err(Error::Done);
640 }
641
642 Ok(())
643 }
644
645 pub fn try_skip_data<F: BufFactory>(
651 &mut self, conn: &mut crate::Connection<F>,
652 ) -> Result<()> {
653 if self.state_buffer_complete() {
655 return Ok(());
656 }
657
658 let len = self.state_len - self.state_off;
659
660 let read = match conn.stream_discard(self.id, len) {
661 Ok((len, fin)) => {
662 if self.critical_stream_closed(fin) {
663 super::close_conn_critical_stream(conn)?;
664 }
665
666 len
667 },
668
669 Err(e @ crate::Error::StreamReset(_)) => {
670 if self.critical_stream_closed(true) {
671 super::close_conn_critical_stream(conn)?;
672 }
673
674 return Err(e.into());
675 },
676
677 Err(e) => {
678 if e == crate::Error::Done {
681 self.reset_data_event();
682 }
683
684 return Err(e.into());
685 },
686 };
687
688 trace!(
689 "{} discarded {} bytes on stream {}",
690 conn.trace_id(),
691 read,
692 self.id,
693 );
694
695 self.state_off += read;
696
697 if !self.state_buffer_complete() {
698 self.reset_data_event();
699
700 return Err(Error::Done);
701 }
702
703 Ok(())
704 }
705
706 pub fn initialize_local(&mut self) {
708 self.local_initialized = true
709 }
710
711 pub fn local_initialized(&self) -> bool {
713 self.local_initialized
714 }
715
716 pub fn finish_local(&mut self) {
718 self.local_finished = true
719 }
720
721 pub fn local_finished(&self) -> bool {
723 self.local_finished
724 }
725
726 pub fn increment_headers_received(&mut self) {
727 self.headers_received_count =
728 self.headers_received_count.saturating_add(1);
729 }
730
731 pub fn headers_received_count(&self) -> usize {
732 self.headers_received_count
733 }
734
735 pub fn mark_trailers_sent(&mut self) {
736 self.trailers_sent = true;
737 }
738
739 pub fn trailers_sent(&self) -> bool {
740 self.trailers_sent
741 }
742
743 #[cfg(test)]
748 fn try_fill_buffer_for_tests(
749 &mut self, stream: &mut std::io::Cursor<Vec<u8>>,
750 ) -> Result<()> {
751 if self.state_buffer_complete() {
753 return Ok(());
754 }
755
756 loop {
757 let spare_buf = self.spare_state_buf();
758 let spare_len = spare_buf.len();
759
760 let read = match std::io::Read::read(stream, spare_buf) {
761 Ok(0) => {
762 break;
764 },
765
766 Ok(v) => v,
767
768 Err(_) => {
769 panic!("Test buffer reading should never fail");
770 },
771 };
772
773 self.commit_state_buf_read(read);
774
775 if read < spare_len {
776 break;
777 }
778
779 if self.state_buffer_complete() {
780 break;
781 }
782 }
783
784 if !self.state_buffer_complete() {
785 return Err(Error::Done);
786 }
787
788 Ok(())
789 }
790
791 pub fn try_consume_varint(&mut self) -> Result<u64> {
793 if self.state_off == 1 {
794 self.state_len = octets::varint_parse_len(self.state_buf[0]);
795 self.state_buf.reserve(self.state_len);
796 }
797
798 if !self.state_buffer_complete() {
801 return Err(Error::Done);
802 }
803
804 let varint = octets::Octets::with_slice(&self.state_buf).get_varint()?;
805
806 Ok(varint)
807 }
808
809 pub fn try_consume_frame(&mut self) -> Result<(frame::Frame, u64)> {
813 debug_assert_eq!(self.state, State::FramePayload);
814 self.reset_data_event();
816
817 let payload_len = self.state_len as u64;
818
819 let frame = frame::Frame::from_bytes(
821 self.frame_type.unwrap(),
822 payload_len,
823 &self.state_buf,
824 )?;
825
826 self.state_transition(State::FrameType, 1, true)?;
827
828 Ok((frame, payload_len))
829 }
830
831 pub fn try_skip_frame<F: BufFactory>(
833 &mut self, conn: &mut crate::Connection<F>,
834 ) -> Result<()> {
835 self.try_skip_data(conn)?;
836
837 self.reset_data_event();
839
840 self.state_transition(State::FrameType, 1, true)?;
841
842 Ok(())
843 }
844
845 pub fn try_consume_data<F: BufFactory, OUT: bytes::BufMut>(
847 &mut self, conn: &mut crate::Connection<F>, out: OUT,
848 ) -> Result<(usize, bool)> {
849 debug_assert_eq!(self.state, State::Data);
850 let out = out.limit(self.state_len - self.state_off);
851
852 let (len, fin) = match conn.stream_recv_buf(self.id, out) {
853 Ok(v) => v,
854
855 Err(e) => {
856 if e == crate::Error::Done {
858 self.reset_data_event();
859 }
860
861 return Err(e.into());
862 },
863 };
864
865 self.state_off += len;
866 debug_assert!(self.state_len >= self.state_off);
867
868 if !conn.stream_readable(self.id) {
870 self.reset_data_event();
871 }
872
873 if self.state_buffer_complete() {
874 self.state_transition(State::FrameType, 1, true)?;
875 }
876
877 Ok((len, fin))
878 }
879
880 pub fn finished(&mut self) {
882 let _ = self.state_transition(State::Finished, 0, false);
883 }
884
885 #[cfg(test)]
890 fn try_consume_data_for_tests(
891 &mut self, stream: &mut std::io::Cursor<Vec<u8>>, out: &mut [u8],
892 ) -> Result<usize> {
893 let left = std::cmp::min(out.len(), self.state_len - self.state_off);
894
895 let len = std::io::Read::read(stream, &mut out[..left]).unwrap();
896
897 self.state_off += len;
898
899 if self.state_buffer_complete() {
900 self.state_transition(State::FrameType, 1, true)?;
901 }
902
903 Ok(len)
904 }
905
906 pub fn try_trigger_data_event(&mut self) -> bool {
911 if self.data_event_triggered {
912 return false;
913 }
914
915 self.data_event_triggered = true;
916
917 true
918 }
919
920 fn reset_data_event(&mut self) {
922 self.data_event_triggered = false;
923 }
924
925 pub fn set_last_priority_update(&mut self, priority_update: Option<Vec<u8>>) {
927 self.last_priority_update = priority_update;
928 }
929
930 pub fn take_last_priority_update(&mut self) -> Option<Vec<u8>> {
932 self.last_priority_update.take()
933 }
934
935 pub fn has_last_priority_update(&self) -> bool {
937 self.last_priority_update.is_some()
938 }
939
940 fn critical_stream_closed(&self, fin: bool) -> bool {
942 fin && matches!(
943 self.ty,
944 Some(Type::Control) |
945 Some(Type::QpackEncoder) |
946 Some(Type::QpackDecoder)
947 )
948 }
949
950 fn state_buffer_complete(&self) -> bool {
952 self.state_off == self.state_len
953 }
954
955 fn state_transition(
958 &mut self, new_state: State, expected_len: usize, resize: bool,
959 ) -> Result<()> {
960 self.state_buf.clear();
961
962 if resize {
965 if expected_len > MAX_STATE_BUF_SIZE {
969 return Err(Error::ExcessiveLoad);
970 }
971
972 let reserve_len =
973 std::cmp::min(expected_len, MAX_STATE_BUF_ALLOC_SIZE);
974 self.state_buf.reserve(reserve_len);
975 }
976
977 self.state = new_state;
978 self.state_off = 0;
979 self.state_len = expected_len;
980
981 Ok(())
982 }
983}
984
985#[cfg(test)]
986mod tests {
987 use crate::h3::frame::*;
988 use crate::h3::PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT;
989 use crate::h3::SETTINGS_MAX_FIELD_SECTION_SIZE_DEFAULT;
990
991 use super::*;
992
993 fn open_uni(b: &mut octets::OctetsMut, ty: u64) -> Result<Stream> {
994 let stream = <Stream>::new(
995 2,
996 false,
997 SETTINGS_MAX_FIELD_SECTION_SIZE_DEFAULT,
998 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
999 );
1000 assert_eq!(stream.state, State::StreamType);
1001
1002 b.put_varint(ty)?;
1003
1004 Ok(stream)
1005 }
1006
1007 fn open_remote_request_stream() -> Stream {
1008 Stream::new(
1009 0,
1010 false,
1011 SETTINGS_MAX_FIELD_SECTION_SIZE_DEFAULT,
1012 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
1013 )
1014 }
1015
1016 fn parse_uni(
1017 stream: &mut Stream, ty: u64, cursor: &mut std::io::Cursor<Vec<u8>>,
1018 ) -> Result<()> {
1019 stream.try_fill_buffer_for_tests(cursor)?;
1020
1021 let stream_ty = stream.try_consume_varint()?;
1022 assert_eq!(stream_ty, ty);
1023 stream.set_ty(Type::deserialize(stream_ty).unwrap())?;
1024
1025 Ok(())
1026 }
1027
1028 fn parse_multibyte_varint(
1032 stream: &mut Stream, cursor: &mut std::io::Cursor<Vec<u8>>,
1033 ) -> Result<u64> {
1034 stream.try_fill_buffer_for_tests(cursor)?;
1035 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
1036 stream.try_fill_buffer_for_tests(cursor)?;
1037 stream.try_consume_varint()
1038 }
1039
1040 fn parse_skip_frame(
1041 stream: &mut Stream, cursor: &mut std::io::Cursor<Vec<u8>>,
1042 ) -> Result<()> {
1043 stream.try_fill_buffer_for_tests(cursor)?;
1045
1046 let frame_ty = stream.try_consume_varint()?;
1047
1048 stream.set_frame_type(frame_ty)?;
1049 assert_eq!(stream.state, State::FramePayloadLen);
1050
1051 stream.try_fill_buffer_for_tests(cursor)?;
1053
1054 let frame_payload_len = stream.try_consume_varint()?;
1055 stream.set_frame_payload_len(frame_payload_len)?;
1056 assert_eq!(stream.state, State::FramePayload);
1057
1058 stream.try_fill_buffer_for_tests(cursor)?;
1060
1061 stream.try_consume_frame()?;
1062 assert_eq!(stream.state, State::FrameType);
1063
1064 Ok(())
1065 }
1066
1067 #[test]
1068 fn control_good() {
1070 let mut d = vec![42; 40];
1071 let mut b = octets::OctetsMut::with_slice(&mut d);
1072
1073 let raw_settings = vec![
1074 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
1075 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
1076 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
1077 ];
1078
1079 let frame = Frame::Settings {
1080 max_field_section_size: Some(0),
1081 qpack_max_table_capacity: Some(0),
1082 qpack_blocked_streams: Some(0),
1083 connect_protocol_enabled: None,
1084 h3_datagram: None,
1085 grease: None,
1086 additional_settings: None,
1087 raw: Some(raw_settings),
1088 };
1089
1090 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1091 frame.to_bytes(&mut b).unwrap();
1092
1093 let mut cursor = std::io::Cursor::new(d);
1094
1095 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1096 .unwrap();
1097 assert_eq!(stream.state, State::FrameType);
1098
1099 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1101
1102 let frame_ty = stream.try_consume_varint().unwrap();
1103 assert_eq!(frame_ty, SETTINGS_FRAME_TYPE_ID);
1104
1105 stream.set_frame_type(frame_ty).unwrap();
1106 assert_eq!(stream.state, State::FramePayloadLen);
1107
1108 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1110
1111 let frame_payload_len = stream.try_consume_varint().unwrap();
1112 assert_eq!(frame_payload_len, 6);
1113 stream.set_frame_payload_len(frame_payload_len).unwrap();
1114 assert_eq!(stream.state, State::FramePayload);
1115
1116 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1118
1119 assert_eq!(stream.try_consume_frame(), Ok((frame, 6)));
1120 assert_eq!(stream.state, State::FrameType);
1121 }
1122
1123 #[test]
1124 fn control_empty_settings() {
1126 let mut d = vec![42; 40];
1127 let mut b = octets::OctetsMut::with_slice(&mut d);
1128
1129 let frame = Frame::Settings {
1130 max_field_section_size: None,
1131 qpack_max_table_capacity: None,
1132 qpack_blocked_streams: None,
1133 connect_protocol_enabled: None,
1134 h3_datagram: None,
1135 grease: None,
1136 additional_settings: None,
1137 raw: Some(vec![]),
1138 };
1139
1140 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1141 frame.to_bytes(&mut b).unwrap();
1142
1143 let mut cursor = std::io::Cursor::new(d);
1144
1145 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1146 .unwrap();
1147 assert_eq!(stream.state, State::FrameType);
1148
1149 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1151
1152 let frame_ty = stream.try_consume_varint().unwrap();
1153 assert_eq!(frame_ty, SETTINGS_FRAME_TYPE_ID);
1154
1155 stream.set_frame_type(frame_ty).unwrap();
1156 assert_eq!(stream.state, State::FramePayloadLen);
1157
1158 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1160
1161 let frame_payload_len = stream.try_consume_varint().unwrap();
1162 assert_eq!(frame_payload_len, 0);
1163 stream.set_frame_payload_len(frame_payload_len).unwrap();
1164 assert_eq!(stream.state, State::FramePayload);
1165
1166 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1168
1169 assert_eq!(stream.try_consume_frame(), Ok((frame, 0)));
1170 assert_eq!(stream.state, State::FrameType);
1171 }
1172
1173 #[test]
1174 fn control_bad_multiple_settings() {
1176 let mut d = vec![42; 40];
1177 let mut b = octets::OctetsMut::with_slice(&mut d);
1178
1179 let raw_settings = vec![
1180 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
1181 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
1182 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
1183 ];
1184
1185 let frame = Frame::Settings {
1186 max_field_section_size: Some(0),
1187 qpack_max_table_capacity: Some(0),
1188 qpack_blocked_streams: Some(0),
1189 connect_protocol_enabled: None,
1190 h3_datagram: None,
1191 grease: None,
1192 additional_settings: None,
1193 raw: Some(raw_settings),
1194 };
1195
1196 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1197 frame.to_bytes(&mut b).unwrap();
1198 frame.to_bytes(&mut b).unwrap();
1199
1200 let mut cursor = std::io::Cursor::new(d);
1201
1202 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1203 .unwrap();
1204 assert_eq!(stream.state, State::FrameType);
1205
1206 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1208
1209 let frame_ty = stream.try_consume_varint().unwrap();
1210 assert_eq!(frame_ty, SETTINGS_FRAME_TYPE_ID);
1211
1212 stream.set_frame_type(frame_ty).unwrap();
1213 assert_eq!(stream.state, State::FramePayloadLen);
1214
1215 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1217
1218 let frame_payload_len = stream.try_consume_varint().unwrap();
1219 assert_eq!(frame_payload_len, 6);
1220 stream.set_frame_payload_len(frame_payload_len).unwrap();
1221 assert_eq!(stream.state, State::FramePayload);
1222
1223 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1225
1226 assert_eq!(stream.try_consume_frame(), Ok((frame, 6)));
1227 assert_eq!(stream.state, State::FrameType);
1228
1229 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1231
1232 let frame_ty = stream.try_consume_varint().unwrap();
1233 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::FrameUnexpected));
1234 }
1235
1236 #[test]
1237 fn control_bad_late_settings() {
1239 let mut d = vec![42; 40];
1240 let mut b = octets::OctetsMut::with_slice(&mut d);
1241
1242 let goaway = Frame::GoAway { id: 0 };
1243
1244 let raw_settings = vec![
1245 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
1246 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
1247 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
1248 ];
1249
1250 let settings = Frame::Settings {
1251 max_field_section_size: Some(0),
1252 qpack_max_table_capacity: Some(0),
1253 qpack_blocked_streams: Some(0),
1254 connect_protocol_enabled: None,
1255 h3_datagram: None,
1256 grease: None,
1257 additional_settings: None,
1258 raw: Some(raw_settings),
1259 };
1260
1261 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1262 goaway.to_bytes(&mut b).unwrap();
1263 settings.to_bytes(&mut b).unwrap();
1264
1265 let mut cursor = std::io::Cursor::new(d);
1266
1267 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1268 .unwrap();
1269 assert_eq!(stream.state, State::FrameType);
1270
1271 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1273
1274 let frame_ty = stream.try_consume_varint().unwrap();
1275 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::MissingSettings));
1276 }
1277
1278 #[test]
1279 fn control_bad_frame() {
1281 let mut d = vec![42; 40];
1282 let mut b = octets::OctetsMut::with_slice(&mut d);
1283
1284 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1285 let hdrs = Frame::Headers { header_block };
1286
1287 let raw_settings = vec![
1288 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
1289 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
1290 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
1291 (33, 33),
1292 ];
1293
1294 let settings = Frame::Settings {
1295 max_field_section_size: Some(0),
1296 qpack_max_table_capacity: Some(0),
1297 qpack_blocked_streams: Some(0),
1298 connect_protocol_enabled: None,
1299 h3_datagram: None,
1300 grease: None,
1301 additional_settings: None,
1302 raw: Some(raw_settings),
1303 };
1304
1305 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1306 settings.to_bytes(&mut b).unwrap();
1307 hdrs.to_bytes(&mut b).unwrap();
1308
1309 let mut cursor = std::io::Cursor::new(d);
1310
1311 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1312 .unwrap();
1313 assert_eq!(stream.state, State::FrameType);
1314
1315 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1317
1318 let frame_ty = stream.try_consume_varint().unwrap();
1319 stream.set_frame_type(frame_ty).unwrap();
1320
1321 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1322
1323 let frame_payload_len = stream.try_consume_varint().unwrap();
1324 stream.set_frame_payload_len(frame_payload_len).unwrap();
1325
1326 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1327
1328 assert!(stream.try_consume_frame().is_ok());
1329
1330 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1332
1333 let frame_ty = stream.try_consume_varint().unwrap();
1334 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::FrameUnexpected));
1335 }
1336
1337 #[test]
1338 fn request_no_data() {
1339 let mut stream = open_remote_request_stream();
1340
1341 assert_eq!(stream.ty, Some(Type::Request));
1342 assert_eq!(stream.state, State::FrameType);
1343
1344 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
1345 }
1346
1347 #[test]
1348 fn request_good() {
1349 let mut stream = open_remote_request_stream();
1350
1351 let mut d = vec![42; 128];
1352 let mut b = octets::OctetsMut::with_slice(&mut d);
1353
1354 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1355 let payload = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1356 let hdrs = Frame::Headers { header_block };
1357 let data = Frame::Data {
1358 payload: payload.clone(),
1359 };
1360
1361 hdrs.to_bytes(&mut b).unwrap();
1362 data.to_bytes(&mut b).unwrap();
1363
1364 let mut cursor = std::io::Cursor::new(d);
1365
1366 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1368
1369 let frame_ty = stream.try_consume_varint().unwrap();
1370 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1371
1372 stream.set_frame_type(frame_ty).unwrap();
1373 assert_eq!(stream.state, State::FramePayloadLen);
1374
1375 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1377
1378 let frame_payload_len = stream.try_consume_varint().unwrap();
1379 assert_eq!(frame_payload_len, 12);
1380
1381 stream.set_frame_payload_len(frame_payload_len).unwrap();
1382 assert_eq!(stream.state, State::FramePayload);
1383
1384 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1386
1387 assert_eq!(stream.try_consume_frame(), Ok((hdrs, 12)));
1388 assert_eq!(stream.state, State::FrameType);
1389
1390 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1392
1393 let frame_ty = stream.try_consume_varint().unwrap();
1394 assert_eq!(frame_ty, DATA_FRAME_TYPE_ID);
1395
1396 stream.set_frame_type(frame_ty).unwrap();
1397 assert_eq!(stream.state, State::FramePayloadLen);
1398
1399 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1401
1402 let frame_payload_len = stream.try_consume_varint().unwrap();
1403 assert_eq!(frame_payload_len, 12);
1404
1405 stream.set_frame_payload_len(frame_payload_len).unwrap();
1406 assert_eq!(stream.state, State::Data);
1407
1408 let mut recv_buf = vec![0; payload.len()];
1410 assert_eq!(
1411 stream.try_consume_data_for_tests(&mut cursor, &mut recv_buf),
1412 Ok(payload.len())
1413 );
1414 assert_eq!(payload, recv_buf);
1415
1416 assert_eq!(stream.state, State::FrameType);
1417 }
1418
1419 #[test]
1420 fn push_good() {
1421 let mut d = vec![42; 128];
1422 let mut b = octets::OctetsMut::with_slice(&mut d);
1423
1424 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1425 let payload = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1426 let hdrs = Frame::Headers { header_block };
1427 let data = Frame::Data {
1428 payload: payload.clone(),
1429 };
1430
1431 let mut stream = open_uni(&mut b, HTTP3_PUSH_STREAM_TYPE_ID).unwrap();
1432 b.put_varint(1).unwrap();
1433 hdrs.to_bytes(&mut b).unwrap();
1434 data.to_bytes(&mut b).unwrap();
1435
1436 let mut cursor = std::io::Cursor::new(d);
1437
1438 parse_uni(&mut stream, HTTP3_PUSH_STREAM_TYPE_ID, &mut cursor).unwrap();
1439 assert_eq!(stream.state, State::PushId);
1440
1441 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1443
1444 let push_id = stream.try_consume_varint().unwrap();
1445 assert_eq!(push_id, 1);
1446
1447 stream.set_push_id(push_id).unwrap();
1448 assert_eq!(stream.state, State::FrameType);
1449
1450 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1452
1453 let frame_ty = stream.try_consume_varint().unwrap();
1454 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1455
1456 stream.set_frame_type(frame_ty).unwrap();
1457 assert_eq!(stream.state, State::FramePayloadLen);
1458
1459 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1461
1462 let frame_payload_len = stream.try_consume_varint().unwrap();
1463 assert_eq!(frame_payload_len, 12);
1464
1465 stream.set_frame_payload_len(frame_payload_len).unwrap();
1466 assert_eq!(stream.state, State::FramePayload);
1467
1468 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1470
1471 assert_eq!(stream.try_consume_frame(), Ok((hdrs, 12)));
1472 assert_eq!(stream.state, State::FrameType);
1473
1474 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1476
1477 let frame_ty = stream.try_consume_varint().unwrap();
1478 assert_eq!(frame_ty, DATA_FRAME_TYPE_ID);
1479
1480 stream.set_frame_type(frame_ty).unwrap();
1481 assert_eq!(stream.state, State::FramePayloadLen);
1482
1483 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1485
1486 let frame_payload_len = stream.try_consume_varint().unwrap();
1487 assert_eq!(frame_payload_len, 12);
1488
1489 stream.set_frame_payload_len(frame_payload_len).unwrap();
1490 assert_eq!(stream.state, State::Data);
1491
1492 let mut recv_buf = vec![0; payload.len()];
1494 assert_eq!(
1495 stream.try_consume_data_for_tests(&mut cursor, &mut recv_buf),
1496 Ok(payload.len())
1497 );
1498 assert_eq!(payload, recv_buf);
1499
1500 assert_eq!(stream.state, State::FrameType);
1501 }
1502
1503 #[test]
1504 fn grease() {
1505 let mut d = vec![42; 20];
1506 let mut b = octets::OctetsMut::with_slice(&mut d);
1507
1508 let mut stream = open_uni(&mut b, 33).unwrap();
1509
1510 let mut cursor = std::io::Cursor::new(d);
1511
1512 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1514
1515 let stream_ty = stream.try_consume_varint().unwrap();
1516 assert_eq!(stream_ty, 33);
1517 stream
1518 .set_ty(Type::deserialize(stream_ty).unwrap())
1519 .unwrap();
1520 assert_eq!(stream.state, State::Drain);
1521 }
1522
1523 #[test]
1524 fn data_before_headers() {
1525 let mut stream = open_remote_request_stream();
1526
1527 let mut d = vec![42; 128];
1528 let mut b = octets::OctetsMut::with_slice(&mut d);
1529
1530 let data = Frame::Data {
1531 payload: vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
1532 };
1533
1534 data.to_bytes(&mut b).unwrap();
1535
1536 let mut cursor = std::io::Cursor::new(d);
1537
1538 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1540
1541 let frame_ty = stream.try_consume_varint().unwrap();
1542 assert_eq!(frame_ty, DATA_FRAME_TYPE_ID);
1543
1544 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::FrameUnexpected));
1545 }
1546
1547 #[test]
1548 fn additional_headers() {
1549 let mut stream = open_remote_request_stream();
1550
1551 let mut d = vec![42; 128];
1552 let mut b = octets::OctetsMut::with_slice(&mut d);
1553
1554 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1555 let payload = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1556 let info_hdrs = Frame::Headers {
1557 header_block: header_block.clone(),
1558 };
1559 let non_info_hdrs = Frame::Headers {
1560 header_block: header_block.clone(),
1561 };
1562 let trailers = Frame::Headers { header_block };
1563 let data = Frame::Data {
1564 payload: payload.clone(),
1565 };
1566
1567 info_hdrs.to_bytes(&mut b).unwrap();
1568 non_info_hdrs.to_bytes(&mut b).unwrap();
1569 data.to_bytes(&mut b).unwrap();
1570 trailers.to_bytes(&mut b).unwrap();
1571
1572 let mut cursor = std::io::Cursor::new(d);
1573
1574 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1576
1577 let frame_ty = stream.try_consume_varint().unwrap();
1578 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1579
1580 stream.set_frame_type(frame_ty).unwrap();
1581 assert_eq!(stream.state, State::FramePayloadLen);
1582
1583 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1585
1586 let frame_payload_len = stream.try_consume_varint().unwrap();
1587 assert_eq!(frame_payload_len, 12);
1588
1589 stream.set_frame_payload_len(frame_payload_len).unwrap();
1590 assert_eq!(stream.state, State::FramePayload);
1591
1592 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1594
1595 assert_eq!(stream.try_consume_frame(), Ok((info_hdrs, 12)));
1596 assert_eq!(stream.state, State::FrameType);
1597
1598 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1600
1601 let frame_ty = stream.try_consume_varint().unwrap();
1602 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1603
1604 stream.set_frame_type(frame_ty).unwrap();
1605 assert_eq!(stream.state, State::FramePayloadLen);
1606
1607 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1609
1610 let frame_payload_len = stream.try_consume_varint().unwrap();
1611 assert_eq!(frame_payload_len, 12);
1612
1613 stream.set_frame_payload_len(frame_payload_len).unwrap();
1614 assert_eq!(stream.state, State::FramePayload);
1615
1616 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1618
1619 assert_eq!(stream.try_consume_frame(), Ok((non_info_hdrs, 12)));
1620 assert_eq!(stream.state, State::FrameType);
1621
1622 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1624
1625 let frame_ty = stream.try_consume_varint().unwrap();
1626 assert_eq!(frame_ty, DATA_FRAME_TYPE_ID);
1627
1628 stream.set_frame_type(frame_ty).unwrap();
1629 assert_eq!(stream.state, State::FramePayloadLen);
1630
1631 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1633
1634 let frame_payload_len = stream.try_consume_varint().unwrap();
1635 assert_eq!(frame_payload_len, 12);
1636
1637 stream.set_frame_payload_len(frame_payload_len).unwrap();
1638 assert_eq!(stream.state, State::Data);
1639
1640 let mut recv_buf = vec![0; payload.len()];
1642 assert_eq!(
1643 stream.try_consume_data_for_tests(&mut cursor, &mut recv_buf),
1644 Ok(payload.len())
1645 );
1646 assert_eq!(payload, recv_buf);
1647
1648 assert_eq!(stream.state, State::FrameType);
1649
1650 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1652
1653 let frame_ty = stream.try_consume_varint().unwrap();
1654 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1655
1656 stream.set_frame_type(frame_ty).unwrap();
1657 assert_eq!(stream.state, State::FramePayloadLen);
1658
1659 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1661
1662 let frame_payload_len = stream.try_consume_varint().unwrap();
1663 assert_eq!(frame_payload_len, 12);
1664
1665 stream.set_frame_payload_len(frame_payload_len).unwrap();
1666 assert_eq!(stream.state, State::FramePayload);
1667
1668 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1670
1671 assert_eq!(stream.try_consume_frame(), Ok((trailers, 12)));
1672 assert_eq!(stream.state, State::FrameType);
1673 }
1674
1675 fn frame_type_id(frame: &Frame) -> u64 {
1677 match frame {
1678 Frame::Data { .. } => DATA_FRAME_TYPE_ID,
1679 Frame::Headers { .. } => HEADERS_FRAME_TYPE_ID,
1680 Frame::CancelPush { .. } => CANCEL_PUSH_FRAME_TYPE_ID,
1681 Frame::Settings { .. } => SETTINGS_FRAME_TYPE_ID,
1682 Frame::PushPromise { .. } => PUSH_PROMISE_FRAME_TYPE_ID,
1683 Frame::GoAway { .. } => GOAWAY_FRAME_TYPE_ID,
1684 Frame::MaxPushId { .. } => MAX_PUSH_FRAME_TYPE_ID,
1685 Frame::PriorityUpdateRequest { .. } =>
1686 PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID,
1687 Frame::PriorityUpdatePush { .. } =>
1688 PRIORITY_UPDATE_FRAME_PUSH_TYPE_ID,
1689 Frame::Unknown { .. } => unreachable!(),
1690 }
1691 }
1692
1693 fn check_large_frame_size_limit(
1707 stream: &mut Stream, frame: Frame, expected_payload_len: u64,
1708 expect_accept: bool,
1709 ) {
1710 let expected_type_id = frame_type_id(&frame);
1711
1712 let mut d = vec![42; 20000];
1713 let mut b = octets::OctetsMut::with_slice(&mut d);
1714 frame.to_bytes(&mut b).unwrap();
1715 let mut cursor = std::io::Cursor::new(d);
1716
1717 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1719 let frame_ty = stream.try_consume_varint().unwrap();
1720 assert_eq!(frame_ty, expected_type_id);
1721
1722 stream.set_frame_type(frame_ty).unwrap();
1723 assert_eq!(stream.state, State::FramePayloadLen);
1724
1725 let frame_payload_len =
1727 parse_multibyte_varint(stream, &mut cursor).unwrap();
1728 assert_eq!(frame_payload_len, expected_payload_len);
1729
1730 if expect_accept {
1731 stream.set_frame_payload_len(frame_payload_len).unwrap();
1732 assert_eq!(stream.state, State::FramePayload);
1733
1734 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1735
1736 assert_eq!(
1737 stream.try_consume_frame(),
1738 Ok((frame, expected_payload_len))
1739 );
1740 assert_eq!(stream.state, State::FrameType);
1741 } else {
1742 assert_eq!(
1743 stream.set_frame_payload_len(frame_payload_len),
1744 Err(Error::ExcessiveLoad)
1745 );
1746 }
1747 }
1748
1749 #[test]
1750 fn large_headers_default_limit() {
1751 let mut stream = open_remote_request_stream();
1752 let header_block = vec![0; 16384];
1753 let frame = Frame::Headers {
1754 header_block: header_block.clone(),
1755 };
1756
1757 check_large_frame_size_limit(&mut stream, frame, 16384, true);
1758 }
1759
1760 #[test]
1761 fn large_headers_limit_with_huffman() {
1762 let mut stream = Stream::new(
1764 0,
1765 false,
1766 4196,
1767 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
1768 );
1769
1770 let header_block = vec![0; 6294];
1773 let frame = Frame::Headers {
1774 header_block: header_block.clone(),
1775 };
1776
1777 check_large_frame_size_limit(&mut stream, frame, 6294, true);
1778 }
1779
1780 #[test]
1781 fn large_headers_small_limit() {
1782 let mut stream = Stream::new(
1785 0,
1786 false,
1787 4196,
1788 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
1789 );
1790 let header_block = vec![0; 16384];
1791 let frame = Frame::Headers {
1792 header_block: header_block.clone(),
1793 };
1794
1795 check_large_frame_size_limit(&mut stream, frame, 16384, false);
1796 }
1797
1798 #[test]
1799 fn large_push_promise_default_limit() {
1800 let mut stream = open_remote_request_stream();
1801 let header_block = vec![0; 16384];
1802 let frame = Frame::PushPromise {
1803 push_id: 0,
1804 header_block: header_block.clone(),
1805 };
1806
1807 check_large_frame_size_limit(&mut stream, frame, 1 + 16384, true);
1808 }
1809
1810 #[test]
1811 fn large_push_promise_limit_with_huffman() {
1812 let mut stream = Stream::new(
1814 0,
1815 false,
1816 4196,
1817 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
1818 );
1819
1820 let header_block = vec![0; 6294];
1823 let frame = Frame::PushPromise {
1824 push_id: 0,
1825 header_block: header_block.clone(),
1826 };
1827
1828 check_large_frame_size_limit(&mut stream, frame, 1 + 6294, true);
1829 }
1830
1831 #[test]
1832 fn large_push_promise_small_limit() {
1833 let mut stream = Stream::new(
1836 0,
1837 false,
1838 4196,
1839 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
1840 );
1841 let header_block = vec![0; 16384];
1842 let frame = Frame::PushPromise {
1843 push_id: 0,
1844 header_block: header_block.clone(),
1845 };
1846
1847 check_large_frame_size_limit(&mut stream, frame, 1 + 16384, false);
1848 }
1849
1850 #[test]
1851 fn large_priority_update_large_limit() {
1852 let settings = Frame::Settings {
1853 max_field_section_size: None,
1854 qpack_max_table_capacity: None,
1855 qpack_blocked_streams: None,
1856 connect_protocol_enabled: None,
1857 h3_datagram: None,
1858 grease: None,
1859 additional_settings: None,
1860 raw: Some(vec![]),
1861 };
1862
1863 let mut d = vec![42; 20000];
1864 let mut b = octets::OctetsMut::with_slice(&mut d);
1865
1866 let mut stream = <Stream>::new(
1869 2,
1870 false,
1871 SETTINGS_MAX_FIELD_SECTION_SIZE_DEFAULT,
1872 20000,
1873 );
1874 b.put_varint(HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1875 settings.to_bytes(&mut b).unwrap();
1876
1877 let priority_field_value = vec![0; 16384];
1878 let pu = Frame::PriorityUpdateRequest {
1879 prioritized_element_id: 0,
1880 priority_field_value,
1881 };
1882
1883 pu.to_bytes(&mut b).unwrap();
1884
1885 let mut cursor = std::io::Cursor::new(d);
1886
1887 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1888 .unwrap();
1889
1890 parse_skip_frame(&mut stream, &mut cursor).unwrap();
1892
1893 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1895
1896 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
1899 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1900 let frame_ty = stream.try_consume_varint().unwrap();
1901 assert_eq!(frame_ty, PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID);
1902
1903 stream.set_frame_type(frame_ty).unwrap();
1904 assert_eq!(stream.state, State::FramePayloadLen);
1905
1906 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1908
1909 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
1912 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1913
1914 let frame_payload_len = stream.try_consume_varint().unwrap();
1915 assert_eq!(frame_payload_len, 1 + 16384);
1916
1917 stream.set_frame_payload_len(frame_payload_len).unwrap();
1918 assert_eq!(stream.state, State::FramePayload);
1919
1920 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1922
1923 assert_eq!(stream.try_consume_frame(), Ok((pu, 1 + 16384)));
1924 assert_eq!(stream.state, State::FrameType);
1925 }
1926
1927 #[test]
1928 fn large_priority_update_small_limit() {
1929 let settings = Frame::Settings {
1930 max_field_section_size: None,
1931 qpack_max_table_capacity: None,
1932 qpack_blocked_streams: None,
1933 connect_protocol_enabled: None,
1934 h3_datagram: None,
1935 grease: None,
1936 additional_settings: None,
1937 raw: Some(vec![]),
1938 };
1939
1940 let mut d = vec![42; 20000];
1941 let mut b = octets::OctetsMut::with_slice(&mut d);
1942
1943 let mut stream =
1946 <Stream>::new(2, false, SETTINGS_MAX_FIELD_SECTION_SIZE_DEFAULT, 123);
1947 b.put_varint(HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1948
1949 settings.to_bytes(&mut b).unwrap();
1950
1951 let priority_field_value = vec![0; 16384];
1952 let pu = Frame::PriorityUpdateRequest {
1953 prioritized_element_id: 0,
1954 priority_field_value,
1955 };
1956
1957 pu.to_bytes(&mut b).unwrap();
1958
1959 let mut cursor = std::io::Cursor::new(d);
1960
1961 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1962 .unwrap();
1963
1964 parse_skip_frame(&mut stream, &mut cursor).unwrap();
1966
1967 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1969
1970 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
1973 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1974 let frame_ty = stream.try_consume_varint().unwrap();
1975 assert_eq!(frame_ty, PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID);
1976
1977 stream.set_frame_type(frame_ty).unwrap();
1978 assert_eq!(stream.state, State::FramePayloadLen);
1979
1980 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1982
1983 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
1986 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1987
1988 let frame_payload_len = stream.try_consume_varint().unwrap();
1989 assert_eq!(frame_payload_len, 1 + 16384);
1990
1991 assert_eq!(
1992 stream.set_frame_payload_len(frame_payload_len),
1993 Err(Error::ExcessiveLoad)
1994 );
1995 }
1996
1997 #[test]
1998 fn finite_sized_frame_limits() {
1999 let settings = Frame::Settings {
2000 max_field_section_size: None,
2001 qpack_max_table_capacity: None,
2002 qpack_blocked_streams: None,
2003 connect_protocol_enabled: None,
2004 h3_datagram: None,
2005 grease: None,
2006 additional_settings: None,
2007 raw: Some(vec![]),
2008 };
2009
2010 for ty in [
2011 CANCEL_PUSH_FRAME_TYPE_ID,
2012 GOAWAY_FRAME_TYPE_ID,
2013 MAX_PUSH_FRAME_TYPE_ID,
2014 ] {
2015 for size in [0, 9] {
2017 let mut d = vec![42; 128];
2018 let mut b = octets::OctetsMut::with_slice(&mut d);
2019
2020 let mut stream =
2023 open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
2024 settings.to_bytes(&mut b).unwrap();
2025
2026 b.put_varint(ty).unwrap();
2028 b.put_varint(size).unwrap();
2029
2030 let mut cursor = std::io::Cursor::new(d);
2031
2032 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
2033 .unwrap();
2034
2035 parse_skip_frame(&mut stream, &mut cursor).unwrap();
2037
2038 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2040 let frame_ty = stream.try_consume_varint().unwrap();
2041 assert_eq!(frame_ty, ty);
2042
2043 stream.set_frame_type(frame_ty).unwrap();
2044 assert_eq!(stream.state, State::FramePayloadLen);
2045
2046 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2048 let frame_payload_len = stream.try_consume_varint().unwrap();
2049 assert_eq!(
2050 Err(Error::FrameError),
2051 stream.set_frame_payload_len(frame_payload_len)
2052 );
2053 }
2054 }
2055 }
2056
2057 #[test]
2058 fn zero_length_push_promise() {
2059 let mut d = vec![42; 128];
2060 let mut b = octets::OctetsMut::with_slice(&mut d);
2061
2062 let mut stream = open_remote_request_stream();
2063
2064 assert_eq!(stream.ty, Some(Type::Request));
2065 assert_eq!(stream.state, State::FrameType);
2066
2067 b.put_varint(PUSH_PROMISE_FRAME_TYPE_ID).unwrap();
2069 b.put_varint(0).unwrap();
2070
2071 let mut cursor = std::io::Cursor::new(d);
2072
2073 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2075 let frame_ty = stream.try_consume_varint().unwrap();
2076 assert_eq!(frame_ty, PUSH_PROMISE_FRAME_TYPE_ID);
2077
2078 stream.set_frame_type(frame_ty).unwrap();
2079 assert_eq!(stream.state, State::FramePayloadLen);
2080
2081 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2083 let frame_payload_len = stream.try_consume_varint().unwrap();
2084 assert_eq!(
2085 Err(Error::FrameError),
2086 stream.set_frame_payload_len(frame_payload_len)
2087 );
2088 }
2089
2090 #[test]
2091 fn large_state_buf_exact_spare_drip_feed() {
2094 const LARGE_HEADER_LEN: usize = 16384;
2095 let mut stream = Stream::new(
2096 0,
2097 false,
2098 LARGE_HEADER_LEN as u64,
2099 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
2100 );
2101
2102 let mut d = vec![42; 20000];
2103 let mut b = octets::OctetsMut::with_slice(&mut d);
2104
2105 let header_block = vec![0xAB; LARGE_HEADER_LEN];
2107 let hdrs = Frame::Headers {
2108 header_block: header_block.clone(),
2109 };
2110
2111 hdrs.to_bytes(&mut b).unwrap();
2112
2113 let mut cursor = std::io::Cursor::new(d);
2114
2115 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2117 let frame_ty = stream.try_consume_varint().unwrap();
2118 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
2119 stream.set_frame_type(frame_ty).unwrap();
2120
2121 let frame_payload_len =
2123 parse_multibyte_varint(&mut stream, &mut cursor).unwrap();
2124 assert_eq!(frame_payload_len, LARGE_HEADER_LEN as u64);
2125
2126 stream.set_frame_payload_len(frame_payload_len).unwrap();
2127 assert_eq!(stream.state, State::FramePayload);
2128
2129 assert_eq!(stream.state_buf.capacity(), MAX_STATE_BUF_ALLOC_SIZE);
2132 assert_eq!(stream.state_buf.len(), 0);
2133
2134 let full_data = cursor.into_inner();
2137 let pos = 5; let payload_data = &full_data[pos..pos + LARGE_HEADER_LEN];
2139
2140 let mut fed = 0;
2144 while fed + MAX_STATE_BUF_ALLOC_SIZE <= LARGE_HEADER_LEN {
2145 let chunk = &payload_data[fed..fed + MAX_STATE_BUF_ALLOC_SIZE];
2146 let mut chunk_cursor = std::io::Cursor::new(chunk.to_vec());
2147
2148 let result = stream.try_fill_buffer_for_tests(&mut chunk_cursor);
2149
2150 fed += MAX_STATE_BUF_ALLOC_SIZE;
2151
2152 if fed < LARGE_HEADER_LEN {
2153 assert_eq!(result, Err(Error::Done));
2154 assert_eq!(stream.state_off, fed);
2155 assert!(stream.state_buf.capacity() >= fed);
2158 } else {
2159 assert_eq!(result, Ok(()));
2160 assert_eq!(stream.state_off, LARGE_HEADER_LEN);
2161 }
2162 }
2163
2164 assert_eq!(
2165 stream.try_consume_frame(),
2166 Ok((hdrs, LARGE_HEADER_LEN as u64))
2167 );
2168 assert_eq!(stream.state, State::FrameType);
2169 }
2170
2171 #[test]
2172 fn large_state_buf_small_leftover_spare() {
2176 const LARGE_HEADER_LEN: usize = 260000;
2177 let mut stream = Stream::new(
2178 0,
2179 false,
2180 LARGE_HEADER_LEN as u64,
2181 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
2182 );
2183
2184 let mut d = vec![42; LARGE_HEADER_LEN + 10];
2185 let mut b = octets::OctetsMut::with_slice(&mut d);
2186
2187 let header_block = vec![0; LARGE_HEADER_LEN];
2188 let hdrs = Frame::Headers {
2189 header_block: header_block.clone(),
2190 };
2191
2192 hdrs.to_bytes(&mut b).unwrap();
2193
2194 let mut cursor = std::io::Cursor::new(d);
2195
2196 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2198 let frame_ty = stream.try_consume_varint().unwrap();
2199 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
2200 stream.set_frame_type(frame_ty).unwrap();
2201
2202 let frame_payload_len =
2204 parse_multibyte_varint(&mut stream, &mut cursor).unwrap();
2205 assert_eq!(frame_payload_len, LARGE_HEADER_LEN as u64);
2206
2207 stream.set_frame_payload_len(frame_payload_len).unwrap();
2208 assert_eq!(stream.state, State::FramePayload);
2209 assert_eq!(stream.state_buf.capacity(), MAX_STATE_BUF_ALLOC_SIZE);
2210
2211 let full_data = cursor.into_inner();
2212 let pos = 5; let payload_data = &full_data[pos..pos + LARGE_HEADER_LEN];
2214
2215 let chunk_size = 1000;
2219 let mut fed = 0;
2220 while fed < LARGE_HEADER_LEN {
2221 let end = std::cmp::min(fed + chunk_size, LARGE_HEADER_LEN);
2222 let chunk = &payload_data[fed..end];
2223 let mut chunk_cursor = std::io::Cursor::new(chunk.to_vec());
2224
2225 let result = stream.try_fill_buffer_for_tests(&mut chunk_cursor);
2226
2227 fed = end;
2228
2229 if fed < LARGE_HEADER_LEN {
2230 assert_eq!(result, Err(Error::Done));
2231 assert_eq!(stream.state_off, fed);
2232 assert!(stream.state_buf.capacity() >= stream.state_buf.len());
2235 assert!(
2241 stream.state_buf.capacity() <=
2242 (fed + MAX_STATE_BUF_ALLOC_SIZE) * 2,
2243 "capacity {} grew too far ahead of bytes read {} \
2244 (max alloc size {})",
2245 stream.state_buf.capacity(),
2246 fed,
2247 MAX_STATE_BUF_ALLOC_SIZE,
2248 );
2249 } else {
2250 assert_eq!(result, Ok(()));
2251 }
2252 }
2253
2254 assert_eq!(
2255 stream.try_consume_frame(),
2256 Ok((hdrs, LARGE_HEADER_LEN as u64))
2257 );
2258 assert_eq!(stream.state, State::FrameType);
2259 }
2260
2261 #[test]
2262 fn large_state_buf_allocation() {
2263 const LARGE_HEADER_LEN: usize = 260000;
2264 let mut stream = Stream::new(
2265 0,
2266 false,
2267 LARGE_HEADER_LEN as u64,
2268 PRIORITY_UPDATE_FRAME_PAYLOAD_MAX_SIZE_DEFAULT,
2269 );
2270 assert_eq!(stream.state_buf.capacity(), 16);
2271
2272 let mut d = vec![42; 5];
2273 let mut b = octets::OctetsMut::with_slice(&mut d);
2274
2275 b.put_varint(HEADERS_FRAME_TYPE_ID).unwrap();
2277 b.put_varint(LARGE_HEADER_LEN as u64).unwrap();
2278
2279 let mut cursor = std::io::Cursor::new(d);
2280
2281 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2283 assert_eq!(stream.state_buf.capacity(), 16);
2284
2285 let frame_ty = stream.try_consume_varint().unwrap();
2286 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
2287 assert_eq!(stream.state_buf.capacity(), 16);
2288
2289 stream.set_frame_type(frame_ty).unwrap();
2290 assert_eq!(stream.state_buf.capacity(), 16);
2291
2292 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2294 assert_eq!(stream.state_buf.capacity(), 16);
2295
2296 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
2299 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
2300 assert_eq!(stream.state_buf.capacity(), 16);
2301
2302 let frame_payload_len = stream.try_consume_varint().unwrap();
2303 assert_eq!(frame_payload_len, LARGE_HEADER_LEN as u64);
2304 assert_eq!(stream.state_buf.capacity(), 16);
2305
2306 stream.set_frame_payload_len(frame_payload_len).unwrap();
2307 assert_eq!(stream.state_buf.capacity(), MAX_STATE_BUF_ALLOC_SIZE);
2308
2309 fn assert_state_buf_props(
2312 stream: &Stream, len: usize, off: usize, capacity: usize,
2313 ) {
2314 assert_eq!(stream.state_len, len, "state_len");
2315 assert_eq!(stream.state_off, off, "state_off");
2316 assert_eq!(stream.state_buf.capacity(), capacity, "capacity");
2317 }
2318
2319 assert_eq!(
2322 stream.try_fill_buffer_for_tests(&mut cursor),
2323 Err(Error::Done)
2324 );
2325 assert_state_buf_props(
2326 &stream,
2327 LARGE_HEADER_LEN,
2328 0,
2329 MAX_STATE_BUF_ALLOC_SIZE,
2330 );
2331
2332 cursor.get_mut().extend_from_slice(&[123; 2048]);
2338 assert_eq!(
2339 stream.try_fill_buffer_for_tests(&mut cursor),
2340 Err(Error::Done)
2341 );
2342 assert_state_buf_props(
2343 &stream,
2344 LARGE_HEADER_LEN,
2345 2048,
2346 MAX_STATE_BUF_ALLOC_SIZE,
2347 );
2348
2349 cursor.get_mut().extend_from_slice(&[123; 1024]);
2351 assert_eq!(
2352 stream.try_fill_buffer_for_tests(&mut cursor),
2353 Err(Error::Done)
2354 );
2355 assert_state_buf_props(
2356 &stream,
2357 LARGE_HEADER_LEN,
2358 3072,
2359 MAX_STATE_BUF_ALLOC_SIZE,
2360 );
2361
2362 cursor.get_mut().extend_from_slice(&[123; 512]);
2366 assert_eq!(
2367 stream.try_fill_buffer_for_tests(&mut cursor),
2368 Err(Error::Done)
2369 );
2370 assert_state_buf_props(
2371 &stream,
2372 LARGE_HEADER_LEN,
2373 3584,
2374 MAX_STATE_BUF_ALLOC_SIZE,
2375 );
2376
2377 cursor.get_mut().extend_from_slice(&[123; 4096]);
2382 assert_eq!(
2383 stream.try_fill_buffer_for_tests(&mut cursor),
2384 Err(Error::Done)
2385 );
2386 assert_state_buf_props(
2387 &stream,
2388 LARGE_HEADER_LEN,
2389 7680,
2390 MAX_STATE_BUF_ALLOC_SIZE * 2,
2391 );
2392
2393 cursor.get_mut().extend_from_slice(&[123; 8192]);
2397 assert_eq!(
2398 stream.try_fill_buffer_for_tests(&mut cursor),
2399 Err(Error::Done)
2400 );
2401 assert_state_buf_props(
2402 &stream,
2403 LARGE_HEADER_LEN,
2404 15872,
2405 MAX_STATE_BUF_ALLOC_SIZE * 4,
2406 );
2407
2408 cursor.get_mut().extend_from_slice(&[123; 16384]);
2409 assert_eq!(
2410 stream.try_fill_buffer_for_tests(&mut cursor),
2411 Err(Error::Done)
2412 );
2413 assert_state_buf_props(
2414 &stream,
2415 LARGE_HEADER_LEN,
2416 32256,
2417 MAX_STATE_BUF_ALLOC_SIZE * 8,
2418 );
2419
2420 cursor.get_mut().extend_from_slice(&[123; 32768]);
2421 assert_eq!(
2422 stream.try_fill_buffer_for_tests(&mut cursor),
2423 Err(Error::Done)
2424 );
2425 assert_state_buf_props(
2426 &stream,
2427 LARGE_HEADER_LEN,
2428 65024,
2429 MAX_STATE_BUF_ALLOC_SIZE * 16,
2430 );
2431
2432 cursor.get_mut().extend_from_slice(&[123; 65536]);
2433 assert_eq!(
2434 stream.try_fill_buffer_for_tests(&mut cursor),
2435 Err(Error::Done)
2436 );
2437 assert_state_buf_props(
2438 &stream,
2439 LARGE_HEADER_LEN,
2440 130560,
2441 MAX_STATE_BUF_ALLOC_SIZE * 32,
2442 );
2443
2444 let remaining = LARGE_HEADER_LEN - 130560;
2446 cursor.get_mut().extend_from_slice(&vec![123; remaining]);
2447 assert_eq!(stream.try_fill_buffer_for_tests(&mut cursor), Ok(()));
2448 assert_state_buf_props(
2449 &stream,
2450 LARGE_HEADER_LEN,
2451 LARGE_HEADER_LEN,
2452 MAX_STATE_BUF_ALLOC_SIZE * 64,
2453 );
2454
2455 let header_block = vec![123; LARGE_HEADER_LEN];
2456 let hdrs = Frame::Headers {
2457 header_block: header_block.clone(),
2458 };
2459 assert_eq!(
2460 stream.try_consume_frame(),
2461 Ok((hdrs, LARGE_HEADER_LEN as u64))
2462 );
2463 assert_eq!(stream.state, State::FrameType);
2464
2465 assert_state_buf_props(&stream, 1, 0, MAX_STATE_BUF_ALLOC_SIZE * 64);
2466 }
2467}