1use crate::buffers::BufFactory;
28
29use super::Error;
30use super::Result;
31
32use super::frame;
33
34pub const HTTP3_CONTROL_STREAM_TYPE_ID: u64 = 0x0;
35pub const HTTP3_PUSH_STREAM_TYPE_ID: u64 = 0x1;
36pub const QPACK_ENCODER_STREAM_TYPE_ID: u64 = 0x2;
37pub const QPACK_DECODER_STREAM_TYPE_ID: u64 = 0x3;
38
39const MAX_STATE_BUF_SIZE: usize = (1 << 24) - 1;
40
41#[derive(Clone, Copy, Debug, PartialEq, Eq)]
42pub enum Type {
43 Control,
44 Request,
45 Push,
46 QpackEncoder,
47 QpackDecoder,
48 Unknown,
49}
50
51impl Type {
52 #[cfg(feature = "qlog")]
53 pub fn to_qlog(self) -> qlog::events::http3::StreamType {
54 match self {
55 Type::Control => qlog::events::http3::StreamType::Control,
56 Type::Request => qlog::events::http3::StreamType::Request,
57 Type::Push => qlog::events::http3::StreamType::Push,
58 Type::QpackEncoder => qlog::events::http3::StreamType::QpackEncode,
59 Type::QpackDecoder => qlog::events::http3::StreamType::QpackDecode,
60 Type::Unknown => qlog::events::http3::StreamType::Unknown,
61 }
62 }
63}
64
65#[derive(Clone, Copy, Debug, PartialEq, Eq)]
66pub enum State {
67 StreamType,
69
70 FrameType,
72
73 FramePayloadLen,
75
76 FramePayload,
78
79 Data,
81
82 PushId,
84
85 QpackInstruction,
87
88 Drain,
90
91 Finished,
93}
94
95impl Type {
96 pub fn deserialize(v: u64) -> Result<Type> {
97 match v {
98 HTTP3_CONTROL_STREAM_TYPE_ID => Ok(Type::Control),
99 HTTP3_PUSH_STREAM_TYPE_ID => Ok(Type::Push),
100 QPACK_ENCODER_STREAM_TYPE_ID => Ok(Type::QpackEncoder),
101 QPACK_DECODER_STREAM_TYPE_ID => Ok(Type::QpackDecoder),
102
103 _ => Ok(Type::Unknown),
104 }
105 }
106}
107
108#[derive(Debug)]
123pub struct Stream {
124 id: u64,
126
127 ty: Option<Type>,
129
130 state: State,
132
133 state_buf: Vec<u8>,
135
136 state_len: usize,
138
139 state_off: usize,
143
144 frame_type: Option<u64>,
146
147 is_local: bool,
149
150 remote_initialized: bool,
152
153 local_initialized: bool,
155
156 local_finished: bool,
158
159 data_event_triggered: bool,
161
162 last_priority_update: Option<Vec<u8>>,
164
165 headers_received_count: usize,
167
168 data_received: bool,
170
171 trailers_sent: bool,
173
174 trailers_received: bool,
176}
177
178impl Stream {
179 pub fn new(id: u64, is_local: bool) -> Stream {
184 let (ty, state) = if crate::stream::is_bidi(id) {
185 (Some(Type::Request), State::FrameType)
188 } else {
189 (None, State::StreamType)
191 };
192
193 Stream {
194 id,
195 ty,
196
197 state,
198
199 state_buf: vec![0; 16],
201
202 state_len: 1,
205 state_off: 0,
206
207 frame_type: None,
208
209 is_local,
210
211 remote_initialized: false,
212
213 local_initialized: false,
214 local_finished: false,
215
216 data_event_triggered: false,
217
218 last_priority_update: None,
219
220 headers_received_count: 0,
221
222 data_received: false,
223
224 trailers_sent: false,
225 trailers_received: false,
226 }
227 }
228
229 pub fn ty(&self) -> Option<Type> {
230 self.ty
231 }
232
233 pub fn state(&self) -> State {
234 self.state
235 }
236
237 pub fn set_ty(&mut self, ty: Type) -> Result<()> {
239 assert_eq!(self.state, State::StreamType);
240
241 self.ty = Some(ty);
242
243 let state = match ty {
244 Type::Control | Type::Request => State::FrameType,
245
246 Type::Push => State::PushId,
247
248 Type::QpackEncoder | Type::QpackDecoder => {
249 self.remote_initialized = true;
250
251 State::QpackInstruction
252 },
253
254 Type::Unknown => State::Drain,
255 };
256
257 self.state_transition(state, 1, true)?;
258
259 Ok(())
260 }
261
262 pub fn set_push_id(&mut self, _id: u64) -> Result<()> {
264 assert_eq!(self.state, State::PushId);
265
266 self.state_transition(State::FrameType, 1, true)?;
269
270 Ok(())
271 }
272
273 pub fn set_frame_type(&mut self, ty: u64) -> Result<()> {
275 assert_eq!(self.state, State::FrameType);
276
277 match self.ty {
279 Some(Type::Control) => {
280 match (ty, self.remote_initialized) {
284 (frame::SETTINGS_FRAME_TYPE_ID, false) =>
286 self.remote_initialized = true,
287
288 (_, false) => return Err(Error::MissingSettings),
291
292 (frame::SETTINGS_FRAME_TYPE_ID, true) =>
294 return Err(Error::FrameUnexpected),
295
296 (frame::DATA_FRAME_TYPE_ID, true) =>
299 return Err(Error::FrameUnexpected),
300
301 (frame::HEADERS_FRAME_TYPE_ID, true) =>
302 return Err(Error::FrameUnexpected),
303
304 (frame::PUSH_PROMISE_FRAME_TYPE_ID, true) =>
305 return Err(Error::FrameUnexpected),
306
307 (_, true) => (),
309 }
310 },
311
312 Some(Type::Request) => {
313 self.validate_request_frame_type(ty)?;
314 },
315
316 Some(Type::Push) => {
317 match ty {
318 frame::CANCEL_PUSH_FRAME_TYPE_ID =>
320 return Err(Error::FrameUnexpected),
321
322 frame::SETTINGS_FRAME_TYPE_ID =>
323 return Err(Error::FrameUnexpected),
324
325 frame::PUSH_PROMISE_FRAME_TYPE_ID =>
326 return Err(Error::FrameUnexpected),
327
328 frame::GOAWAY_FRAME_TYPE_ID =>
329 return Err(Error::FrameUnexpected),
330
331 frame::MAX_PUSH_FRAME_TYPE_ID =>
332 return Err(Error::FrameUnexpected),
333
334 _ => (),
335 }
336 },
337
338 _ => return Err(Error::FrameUnexpected),
339 }
340
341 self.frame_type = Some(ty);
342
343 self.state_transition(State::FramePayloadLen, 1, true)?;
344
345 Ok(())
346 }
347
348 fn validate_request_frame_type(&mut self, ty: u64) -> Result<()> {
361 if matches!(
364 ty,
365 frame::CANCEL_PUSH_FRAME_TYPE_ID |
366 frame::SETTINGS_FRAME_TYPE_ID |
367 frame::GOAWAY_FRAME_TYPE_ID |
368 frame::MAX_PUSH_FRAME_TYPE_ID |
369 frame::PRIORITY_UPDATE_FRAME_REQUEST_TYPE_ID |
370 frame::PRIORITY_UPDATE_FRAME_PUSH_TYPE_ID
371 ) {
372 return Err(Error::FrameUnexpected);
373 }
374
375 if self.is_local {
378 return Ok(());
379 }
380
381 match (ty, self.remote_initialized) {
382 (frame::HEADERS_FRAME_TYPE_ID, false) => {
383 self.remote_initialized = true;
384 },
385
386 (frame::DATA_FRAME_TYPE_ID, false) =>
387 return Err(Error::FrameUnexpected),
388
389 (frame::HEADERS_FRAME_TYPE_ID, true) => {
390 if self.trailers_received {
391 return Err(Error::FrameUnexpected);
392 }
393
394 if self.data_received {
395 self.trailers_received = true;
396 }
397 },
398
399 (frame::DATA_FRAME_TYPE_ID, true) => {
400 if self.trailers_received {
401 return Err(Error::FrameUnexpected);
402 }
403
404 self.data_received = true;
405 },
406
407 _ => (),
409 }
410
411 Ok(())
412 }
413
414 pub fn frame_type(&self) -> Option<u64> {
416 self.frame_type
417 }
418
419 pub fn set_frame_payload_len(&mut self, len: u64) -> Result<()> {
421 assert_eq!(self.state, State::FramePayloadLen);
422
423 if matches!(self.ty, Some(Type::Control | Type::Request | Type::Push)) {
425 let (state, resize) = match self.frame_type {
426 Some(frame::DATA_FRAME_TYPE_ID) => (State::Data, false),
427
428 Some(
431 frame::GOAWAY_FRAME_TYPE_ID |
432 frame::PUSH_PROMISE_FRAME_TYPE_ID |
433 frame::CANCEL_PUSH_FRAME_TYPE_ID |
434 frame::MAX_PUSH_FRAME_TYPE_ID,
435 ) => {
436 if len == 0 {
437 return Err(Error::FrameError);
438 }
439
440 (State::FramePayload, true)
441 },
442
443 _ => (State::FramePayload, true),
444 };
445
446 self.state_transition(state, len as usize, resize)?;
447
448 return Ok(());
449 }
450
451 Err(Error::InternalError)
452 }
453
454 pub fn try_fill_buffer<F: BufFactory>(
460 &mut self, conn: &mut crate::Connection<F>,
461 ) -> Result<()> {
462 if self.state_buffer_complete() {
464 return Ok(());
465 }
466
467 let buf = &mut self.state_buf[self.state_off..self.state_len];
468
469 let read = match conn.stream_recv(self.id, buf) {
470 Ok((len, fin)) => {
471 if fin &&
473 matches!(
474 self.ty,
475 Some(Type::Control) |
476 Some(Type::QpackEncoder) |
477 Some(Type::QpackDecoder)
478 )
479 {
480 super::close_conn_critical_stream(conn)?;
481 }
482
483 len
484 },
485
486 Err(e @ crate::Error::StreamReset(_)) => {
487 if matches!(
489 self.ty,
490 Some(Type::Control) |
491 Some(Type::QpackEncoder) |
492 Some(Type::QpackDecoder)
493 ) {
494 super::close_conn_critical_stream(conn)?;
495 }
496
497 return Err(e.into());
498 },
499
500 Err(e) => {
501 if e == crate::Error::Done {
503 self.reset_data_event();
504 }
505
506 return Err(e.into());
507 },
508 };
509
510 trace!(
511 "{} read {} bytes on stream {}",
512 conn.trace_id(),
513 read,
514 self.id,
515 );
516
517 self.state_off += read;
518
519 if !self.state_buffer_complete() {
520 self.reset_data_event();
521
522 return Err(Error::Done);
523 }
524
525 Ok(())
526 }
527
528 pub fn initialize_local(&mut self) {
530 self.local_initialized = true
531 }
532
533 pub fn local_initialized(&self) -> bool {
535 self.local_initialized
536 }
537
538 pub fn finish_local(&mut self) {
540 self.local_finished = true
541 }
542
543 pub fn local_finished(&self) -> bool {
545 self.local_finished
546 }
547
548 pub fn increment_headers_received(&mut self) {
549 self.headers_received_count =
550 self.headers_received_count.saturating_add(1);
551 }
552
553 pub fn headers_received_count(&self) -> usize {
554 self.headers_received_count
555 }
556
557 pub fn mark_trailers_sent(&mut self) {
558 self.trailers_sent = true;
559 }
560
561 pub fn trailers_sent(&self) -> bool {
562 self.trailers_sent
563 }
564
565 #[cfg(test)]
570 fn try_fill_buffer_for_tests(
571 &mut self, stream: &mut std::io::Cursor<Vec<u8>>,
572 ) -> Result<()> {
573 if self.state_buffer_complete() {
575 return Ok(());
576 }
577
578 let buf = &mut self.state_buf[self.state_off..self.state_len];
579
580 let read = std::io::Read::read(stream, buf).unwrap();
581
582 self.state_off += read;
583
584 if !self.state_buffer_complete() {
585 return Err(Error::Done);
586 }
587
588 Ok(())
589 }
590
591 pub fn try_consume_varint(&mut self) -> Result<u64> {
593 if self.state_off == 1 {
594 self.state_len = octets::varint_parse_len(self.state_buf[0]);
595 self.state_buf.resize(self.state_len, 0);
596 }
597
598 if !self.state_buffer_complete() {
601 return Err(Error::Done);
602 }
603
604 let varint = octets::Octets::with_slice(&self.state_buf).get_varint()?;
605
606 Ok(varint)
607 }
608
609 pub fn try_consume_frame(&mut self) -> Result<(frame::Frame, u64)> {
613 debug_assert_eq!(self.state, State::FramePayload);
614 self.reset_data_event();
616
617 let payload_len = self.state_len as u64;
618
619 let frame = frame::Frame::from_bytes(
621 self.frame_type.unwrap(),
622 payload_len,
623 &self.state_buf,
624 )?;
625
626 self.state_transition(State::FrameType, 1, true)?;
627
628 Ok((frame, payload_len))
629 }
630
631 pub fn try_consume_data<F: BufFactory, OUT: bytes::BufMut>(
633 &mut self, conn: &mut crate::Connection<F>, out: OUT,
634 ) -> Result<(usize, bool)> {
635 debug_assert_eq!(self.state, State::Data);
636 let out = out.limit(self.state_len - self.state_off);
637
638 let (len, fin) = match conn.stream_recv_buf(self.id, out) {
639 Ok(v) => v,
640
641 Err(e) => {
642 if e == crate::Error::Done {
644 self.reset_data_event();
645 }
646
647 return Err(e.into());
648 },
649 };
650
651 self.state_off += len;
652 debug_assert!(self.state_len >= self.state_off);
653
654 if !conn.stream_readable(self.id) {
656 self.reset_data_event();
657 }
658
659 if self.state_buffer_complete() {
660 self.state_transition(State::FrameType, 1, true)?;
661 }
662
663 Ok((len, fin))
664 }
665
666 pub fn finished(&mut self) {
668 let _ = self.state_transition(State::Finished, 0, false);
669 }
670
671 #[cfg(test)]
676 fn try_consume_data_for_tests(
677 &mut self, stream: &mut std::io::Cursor<Vec<u8>>, out: &mut [u8],
678 ) -> Result<usize> {
679 let left = std::cmp::min(out.len(), self.state_len - self.state_off);
680
681 let len = std::io::Read::read(stream, &mut out[..left]).unwrap();
682
683 self.state_off += len;
684
685 if self.state_buffer_complete() {
686 self.state_transition(State::FrameType, 1, true)?;
687 }
688
689 Ok(len)
690 }
691
692 pub fn try_trigger_data_event(&mut self) -> bool {
697 if self.data_event_triggered {
698 return false;
699 }
700
701 self.data_event_triggered = true;
702
703 true
704 }
705
706 fn reset_data_event(&mut self) {
708 self.data_event_triggered = false;
709 }
710
711 pub fn set_last_priority_update(&mut self, priority_update: Option<Vec<u8>>) {
713 self.last_priority_update = priority_update;
714 }
715
716 pub fn take_last_priority_update(&mut self) -> Option<Vec<u8>> {
718 self.last_priority_update.take()
719 }
720
721 pub fn has_last_priority_update(&self) -> bool {
723 self.last_priority_update.is_some()
724 }
725
726 fn state_buffer_complete(&self) -> bool {
728 self.state_off == self.state_len
729 }
730
731 fn state_transition(
734 &mut self, new_state: State, expected_len: usize, resize: bool,
735 ) -> Result<()> {
736 if resize {
739 if expected_len > MAX_STATE_BUF_SIZE {
743 return Err(Error::ExcessiveLoad);
744 }
745
746 self.state_buf.resize(expected_len, 0);
747 }
748
749 self.state = new_state;
750 self.state_off = 0;
751 self.state_len = expected_len;
752
753 Ok(())
754 }
755}
756
757#[cfg(test)]
758mod tests {
759 use crate::h3::frame::*;
760
761 use super::*;
762
763 fn open_uni(b: &mut octets::OctetsMut, ty: u64) -> Result<Stream> {
764 let stream = <Stream>::new(2, false);
765 assert_eq!(stream.state, State::StreamType);
766
767 b.put_varint(ty)?;
768
769 Ok(stream)
770 }
771
772 fn parse_uni(
773 stream: &mut Stream, ty: u64, cursor: &mut std::io::Cursor<Vec<u8>>,
774 ) -> Result<()> {
775 stream.try_fill_buffer_for_tests(cursor)?;
776
777 let stream_ty = stream.try_consume_varint()?;
778 assert_eq!(stream_ty, ty);
779 stream.set_ty(Type::deserialize(stream_ty).unwrap())?;
780
781 Ok(())
782 }
783
784 fn parse_skip_frame(
785 stream: &mut Stream, cursor: &mut std::io::Cursor<Vec<u8>>,
786 ) -> Result<()> {
787 stream.try_fill_buffer_for_tests(cursor)?;
789
790 let frame_ty = stream.try_consume_varint()?;
791
792 stream.set_frame_type(frame_ty)?;
793 assert_eq!(stream.state, State::FramePayloadLen);
794
795 stream.try_fill_buffer_for_tests(cursor)?;
797
798 let frame_payload_len = stream.try_consume_varint()?;
799 stream.set_frame_payload_len(frame_payload_len)?;
800 assert_eq!(stream.state, State::FramePayload);
801
802 stream.try_fill_buffer_for_tests(cursor)?;
804
805 stream.try_consume_frame()?;
806 assert_eq!(stream.state, State::FrameType);
807
808 Ok(())
809 }
810
811 #[test]
812 fn control_good() {
814 let mut d = vec![42; 40];
815 let mut b = octets::OctetsMut::with_slice(&mut d);
816
817 let raw_settings = vec![
818 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
819 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
820 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
821 ];
822
823 let frame = Frame::Settings {
824 max_field_section_size: Some(0),
825 qpack_max_table_capacity: Some(0),
826 qpack_blocked_streams: Some(0),
827 connect_protocol_enabled: None,
828 h3_datagram: None,
829 grease: None,
830 additional_settings: None,
831 raw: Some(raw_settings),
832 };
833
834 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
835 frame.to_bytes(&mut b).unwrap();
836
837 let mut cursor = std::io::Cursor::new(d);
838
839 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
840 .unwrap();
841 assert_eq!(stream.state, State::FrameType);
842
843 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
845
846 let frame_ty = stream.try_consume_varint().unwrap();
847 assert_eq!(frame_ty, SETTINGS_FRAME_TYPE_ID);
848
849 stream.set_frame_type(frame_ty).unwrap();
850 assert_eq!(stream.state, State::FramePayloadLen);
851
852 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
854
855 let frame_payload_len = stream.try_consume_varint().unwrap();
856 assert_eq!(frame_payload_len, 6);
857 stream.set_frame_payload_len(frame_payload_len).unwrap();
858 assert_eq!(stream.state, State::FramePayload);
859
860 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
862
863 assert_eq!(stream.try_consume_frame(), Ok((frame, 6)));
864 assert_eq!(stream.state, State::FrameType);
865 }
866
867 #[test]
868 fn control_empty_settings() {
870 let mut d = vec![42; 40];
871 let mut b = octets::OctetsMut::with_slice(&mut d);
872
873 let frame = Frame::Settings {
874 max_field_section_size: None,
875 qpack_max_table_capacity: None,
876 qpack_blocked_streams: None,
877 connect_protocol_enabled: None,
878 h3_datagram: None,
879 grease: None,
880 additional_settings: None,
881 raw: Some(vec![]),
882 };
883
884 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
885 frame.to_bytes(&mut b).unwrap();
886
887 let mut cursor = std::io::Cursor::new(d);
888
889 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
890 .unwrap();
891 assert_eq!(stream.state, State::FrameType);
892
893 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
895
896 let frame_ty = stream.try_consume_varint().unwrap();
897 assert_eq!(frame_ty, SETTINGS_FRAME_TYPE_ID);
898
899 stream.set_frame_type(frame_ty).unwrap();
900 assert_eq!(stream.state, State::FramePayloadLen);
901
902 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
904
905 let frame_payload_len = stream.try_consume_varint().unwrap();
906 assert_eq!(frame_payload_len, 0);
907 stream.set_frame_payload_len(frame_payload_len).unwrap();
908 assert_eq!(stream.state, State::FramePayload);
909
910 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
912
913 assert_eq!(stream.try_consume_frame(), Ok((frame, 0)));
914 assert_eq!(stream.state, State::FrameType);
915 }
916
917 #[test]
918 fn control_bad_multiple_settings() {
920 let mut d = vec![42; 40];
921 let mut b = octets::OctetsMut::with_slice(&mut d);
922
923 let raw_settings = vec![
924 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
925 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
926 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
927 ];
928
929 let frame = Frame::Settings {
930 max_field_section_size: Some(0),
931 qpack_max_table_capacity: Some(0),
932 qpack_blocked_streams: Some(0),
933 connect_protocol_enabled: None,
934 h3_datagram: None,
935 grease: None,
936 additional_settings: None,
937 raw: Some(raw_settings),
938 };
939
940 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
941 frame.to_bytes(&mut b).unwrap();
942 frame.to_bytes(&mut b).unwrap();
943
944 let mut cursor = std::io::Cursor::new(d);
945
946 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
947 .unwrap();
948 assert_eq!(stream.state, State::FrameType);
949
950 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
952
953 let frame_ty = stream.try_consume_varint().unwrap();
954 assert_eq!(frame_ty, SETTINGS_FRAME_TYPE_ID);
955
956 stream.set_frame_type(frame_ty).unwrap();
957 assert_eq!(stream.state, State::FramePayloadLen);
958
959 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
961
962 let frame_payload_len = stream.try_consume_varint().unwrap();
963 assert_eq!(frame_payload_len, 6);
964 stream.set_frame_payload_len(frame_payload_len).unwrap();
965 assert_eq!(stream.state, State::FramePayload);
966
967 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
969
970 assert_eq!(stream.try_consume_frame(), Ok((frame, 6)));
971 assert_eq!(stream.state, State::FrameType);
972
973 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
975
976 let frame_ty = stream.try_consume_varint().unwrap();
977 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::FrameUnexpected));
978 }
979
980 #[test]
981 fn control_bad_late_settings() {
983 let mut d = vec![42; 40];
984 let mut b = octets::OctetsMut::with_slice(&mut d);
985
986 let goaway = Frame::GoAway { id: 0 };
987
988 let raw_settings = vec![
989 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
990 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
991 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
992 ];
993
994 let settings = Frame::Settings {
995 max_field_section_size: Some(0),
996 qpack_max_table_capacity: Some(0),
997 qpack_blocked_streams: Some(0),
998 connect_protocol_enabled: None,
999 h3_datagram: None,
1000 grease: None,
1001 additional_settings: None,
1002 raw: Some(raw_settings),
1003 };
1004
1005 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1006 goaway.to_bytes(&mut b).unwrap();
1007 settings.to_bytes(&mut b).unwrap();
1008
1009 let mut cursor = std::io::Cursor::new(d);
1010
1011 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1012 .unwrap();
1013 assert_eq!(stream.state, State::FrameType);
1014
1015 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1017
1018 let frame_ty = stream.try_consume_varint().unwrap();
1019 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::MissingSettings));
1020 }
1021
1022 #[test]
1023 fn control_bad_frame() {
1025 let mut d = vec![42; 40];
1026 let mut b = octets::OctetsMut::with_slice(&mut d);
1027
1028 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1029 let hdrs = Frame::Headers { header_block };
1030
1031 let raw_settings = vec![
1032 (SETTINGS_MAX_FIELD_SECTION_SIZE, 0),
1033 (SETTINGS_QPACK_MAX_TABLE_CAPACITY, 0),
1034 (SETTINGS_QPACK_BLOCKED_STREAMS, 0),
1035 (33, 33),
1036 ];
1037
1038 let settings = Frame::Settings {
1039 max_field_section_size: Some(0),
1040 qpack_max_table_capacity: Some(0),
1041 qpack_blocked_streams: Some(0),
1042 connect_protocol_enabled: None,
1043 h3_datagram: None,
1044 grease: None,
1045 additional_settings: None,
1046 raw: Some(raw_settings),
1047 };
1048
1049 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1050 settings.to_bytes(&mut b).unwrap();
1051 hdrs.to_bytes(&mut b).unwrap();
1052
1053 let mut cursor = std::io::Cursor::new(d);
1054
1055 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1056 .unwrap();
1057 assert_eq!(stream.state, State::FrameType);
1058
1059 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1061
1062 let frame_ty = stream.try_consume_varint().unwrap();
1063 stream.set_frame_type(frame_ty).unwrap();
1064
1065 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1066
1067 let frame_payload_len = stream.try_consume_varint().unwrap();
1068 stream.set_frame_payload_len(frame_payload_len).unwrap();
1069
1070 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1071
1072 assert!(stream.try_consume_frame().is_ok());
1073
1074 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1076
1077 let frame_ty = stream.try_consume_varint().unwrap();
1078 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::FrameUnexpected));
1079 }
1080
1081 #[test]
1082 fn request_no_data() {
1083 let mut stream = <Stream>::new(0, false);
1084
1085 assert_eq!(stream.ty, Some(Type::Request));
1086 assert_eq!(stream.state, State::FrameType);
1087
1088 assert_eq!(stream.try_consume_varint(), Err(Error::Done));
1089 }
1090
1091 #[test]
1092 fn request_good() {
1093 let mut stream = <Stream>::new(0, false);
1094
1095 let mut d = vec![42; 128];
1096 let mut b = octets::OctetsMut::with_slice(&mut d);
1097
1098 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1099 let payload = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1100 let hdrs = Frame::Headers { header_block };
1101 let data = Frame::Data {
1102 payload: payload.clone(),
1103 };
1104
1105 hdrs.to_bytes(&mut b).unwrap();
1106 data.to_bytes(&mut b).unwrap();
1107
1108 let mut cursor = std::io::Cursor::new(d);
1109
1110 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1112
1113 let frame_ty = stream.try_consume_varint().unwrap();
1114 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1115
1116 stream.set_frame_type(frame_ty).unwrap();
1117 assert_eq!(stream.state, State::FramePayloadLen);
1118
1119 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1121
1122 let frame_payload_len = stream.try_consume_varint().unwrap();
1123 assert_eq!(frame_payload_len, 12);
1124
1125 stream.set_frame_payload_len(frame_payload_len).unwrap();
1126 assert_eq!(stream.state, State::FramePayload);
1127
1128 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1130
1131 assert_eq!(stream.try_consume_frame(), Ok((hdrs, 12)));
1132 assert_eq!(stream.state, State::FrameType);
1133
1134 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1136
1137 let frame_ty = stream.try_consume_varint().unwrap();
1138 assert_eq!(frame_ty, DATA_FRAME_TYPE_ID);
1139
1140 stream.set_frame_type(frame_ty).unwrap();
1141 assert_eq!(stream.state, State::FramePayloadLen);
1142
1143 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1145
1146 let frame_payload_len = stream.try_consume_varint().unwrap();
1147 assert_eq!(frame_payload_len, 12);
1148
1149 stream.set_frame_payload_len(frame_payload_len).unwrap();
1150 assert_eq!(stream.state, State::Data);
1151
1152 let mut recv_buf = vec![0; payload.len()];
1154 assert_eq!(
1155 stream.try_consume_data_for_tests(&mut cursor, &mut recv_buf),
1156 Ok(payload.len())
1157 );
1158 assert_eq!(payload, recv_buf);
1159
1160 assert_eq!(stream.state, State::FrameType);
1161 }
1162
1163 #[test]
1164 fn push_good() {
1165 let mut d = vec![42; 128];
1166 let mut b = octets::OctetsMut::with_slice(&mut d);
1167
1168 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1169 let payload = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1170 let hdrs = Frame::Headers { header_block };
1171 let data = Frame::Data {
1172 payload: payload.clone(),
1173 };
1174
1175 let mut stream = open_uni(&mut b, HTTP3_PUSH_STREAM_TYPE_ID).unwrap();
1176 b.put_varint(1).unwrap();
1177 hdrs.to_bytes(&mut b).unwrap();
1178 data.to_bytes(&mut b).unwrap();
1179
1180 let mut cursor = std::io::Cursor::new(d);
1181
1182 parse_uni(&mut stream, HTTP3_PUSH_STREAM_TYPE_ID, &mut cursor).unwrap();
1183 assert_eq!(stream.state, State::PushId);
1184
1185 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1187
1188 let push_id = stream.try_consume_varint().unwrap();
1189 assert_eq!(push_id, 1);
1190
1191 stream.set_push_id(push_id).unwrap();
1192 assert_eq!(stream.state, State::FrameType);
1193
1194 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1196
1197 let frame_ty = stream.try_consume_varint().unwrap();
1198 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1199
1200 stream.set_frame_type(frame_ty).unwrap();
1201 assert_eq!(stream.state, State::FramePayloadLen);
1202
1203 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1205
1206 let frame_payload_len = stream.try_consume_varint().unwrap();
1207 assert_eq!(frame_payload_len, 12);
1208
1209 stream.set_frame_payload_len(frame_payload_len).unwrap();
1210 assert_eq!(stream.state, State::FramePayload);
1211
1212 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1214
1215 assert_eq!(stream.try_consume_frame(), Ok((hdrs, 12)));
1216 assert_eq!(stream.state, State::FrameType);
1217
1218 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1220
1221 let frame_ty = stream.try_consume_varint().unwrap();
1222 assert_eq!(frame_ty, DATA_FRAME_TYPE_ID);
1223
1224 stream.set_frame_type(frame_ty).unwrap();
1225 assert_eq!(stream.state, State::FramePayloadLen);
1226
1227 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1229
1230 let frame_payload_len = stream.try_consume_varint().unwrap();
1231 assert_eq!(frame_payload_len, 12);
1232
1233 stream.set_frame_payload_len(frame_payload_len).unwrap();
1234 assert_eq!(stream.state, State::Data);
1235
1236 let mut recv_buf = vec![0; payload.len()];
1238 assert_eq!(
1239 stream.try_consume_data_for_tests(&mut cursor, &mut recv_buf),
1240 Ok(payload.len())
1241 );
1242 assert_eq!(payload, recv_buf);
1243
1244 assert_eq!(stream.state, State::FrameType);
1245 }
1246
1247 #[test]
1248 fn grease() {
1249 let mut d = vec![42; 20];
1250 let mut b = octets::OctetsMut::with_slice(&mut d);
1251
1252 let mut stream = open_uni(&mut b, 33).unwrap();
1253
1254 let mut cursor = std::io::Cursor::new(d);
1255
1256 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1258
1259 let stream_ty = stream.try_consume_varint().unwrap();
1260 assert_eq!(stream_ty, 33);
1261 stream
1262 .set_ty(Type::deserialize(stream_ty).unwrap())
1263 .unwrap();
1264 assert_eq!(stream.state, State::Drain);
1265 }
1266
1267 #[test]
1268 fn data_before_headers() {
1269 let mut stream = <Stream>::new(0, false);
1270
1271 let mut d = vec![42; 128];
1272 let mut b = octets::OctetsMut::with_slice(&mut d);
1273
1274 let data = Frame::Data {
1275 payload: vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
1276 };
1277
1278 data.to_bytes(&mut b).unwrap();
1279
1280 let mut cursor = std::io::Cursor::new(d);
1281
1282 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1284
1285 let frame_ty = stream.try_consume_varint().unwrap();
1286 assert_eq!(frame_ty, DATA_FRAME_TYPE_ID);
1287
1288 assert_eq!(stream.set_frame_type(frame_ty), Err(Error::FrameUnexpected));
1289 }
1290
1291 #[test]
1292 fn additional_headers() {
1293 let mut stream = Stream::new(0, false);
1294
1295 let mut d = vec![42; 128];
1296 let mut b = octets::OctetsMut::with_slice(&mut d);
1297
1298 let header_block = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1299 let payload = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
1300 let info_hdrs = Frame::Headers {
1301 header_block: header_block.clone(),
1302 };
1303 let non_info_hdrs = Frame::Headers {
1304 header_block: header_block.clone(),
1305 };
1306 let trailers = Frame::Headers { header_block };
1307 let data = Frame::Data {
1308 payload: payload.clone(),
1309 };
1310
1311 info_hdrs.to_bytes(&mut b).unwrap();
1312 non_info_hdrs.to_bytes(&mut b).unwrap();
1313 data.to_bytes(&mut b).unwrap();
1314 trailers.to_bytes(&mut b).unwrap();
1315
1316 let mut cursor = std::io::Cursor::new(d);
1317
1318 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1320
1321 let frame_ty = stream.try_consume_varint().unwrap();
1322 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1323
1324 stream.set_frame_type(frame_ty).unwrap();
1325 assert_eq!(stream.state, State::FramePayloadLen);
1326
1327 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1329
1330 let frame_payload_len = stream.try_consume_varint().unwrap();
1331 assert_eq!(frame_payload_len, 12);
1332
1333 stream.set_frame_payload_len(frame_payload_len).unwrap();
1334 assert_eq!(stream.state, State::FramePayload);
1335
1336 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1338
1339 assert_eq!(stream.try_consume_frame(), Ok((info_hdrs, 12)));
1340 assert_eq!(stream.state, State::FrameType);
1341
1342 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1344
1345 let frame_ty = stream.try_consume_varint().unwrap();
1346 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1347
1348 stream.set_frame_type(frame_ty).unwrap();
1349 assert_eq!(stream.state, State::FramePayloadLen);
1350
1351 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1353
1354 let frame_payload_len = stream.try_consume_varint().unwrap();
1355 assert_eq!(frame_payload_len, 12);
1356
1357 stream.set_frame_payload_len(frame_payload_len).unwrap();
1358 assert_eq!(stream.state, State::FramePayload);
1359
1360 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1362
1363 assert_eq!(stream.try_consume_frame(), Ok((non_info_hdrs, 12)));
1364 assert_eq!(stream.state, State::FrameType);
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, DATA_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::Data);
1383
1384 let mut recv_buf = vec![0; payload.len()];
1386 assert_eq!(
1387 stream.try_consume_data_for_tests(&mut cursor, &mut recv_buf),
1388 Ok(payload.len())
1389 );
1390 assert_eq!(payload, recv_buf);
1391
1392 assert_eq!(stream.state, State::FrameType);
1393
1394 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1396
1397 let frame_ty = stream.try_consume_varint().unwrap();
1398 assert_eq!(frame_ty, HEADERS_FRAME_TYPE_ID);
1399
1400 stream.set_frame_type(frame_ty).unwrap();
1401 assert_eq!(stream.state, State::FramePayloadLen);
1402
1403 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1405
1406 let frame_payload_len = stream.try_consume_varint().unwrap();
1407 assert_eq!(frame_payload_len, 12);
1408
1409 stream.set_frame_payload_len(frame_payload_len).unwrap();
1410 assert_eq!(stream.state, State::FramePayload);
1411
1412 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1414
1415 assert_eq!(stream.try_consume_frame(), Ok((trailers, 12)));
1416 assert_eq!(stream.state, State::FrameType);
1417 }
1418
1419 #[test]
1420 fn zero_length_goaway() {
1421 let mut d = vec![42; 128];
1422 let mut b = octets::OctetsMut::with_slice(&mut d);
1423
1424 let frame = Frame::Settings {
1425 max_field_section_size: None,
1426 qpack_max_table_capacity: None,
1427 qpack_blocked_streams: None,
1428 connect_protocol_enabled: None,
1429 h3_datagram: None,
1430 grease: None,
1431 additional_settings: None,
1432 raw: Some(vec![]),
1433 };
1434
1435 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1436 frame.to_bytes(&mut b).unwrap();
1437
1438 b.put_varint(GOAWAY_FRAME_TYPE_ID).unwrap();
1440 b.put_varint(0).unwrap();
1441
1442 let mut cursor = std::io::Cursor::new(d);
1443
1444 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1445 .unwrap();
1446
1447 parse_skip_frame(&mut stream, &mut cursor).unwrap();
1449
1450 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1452 let frame_ty = stream.try_consume_varint().unwrap();
1453 assert_eq!(frame_ty, GOAWAY_FRAME_TYPE_ID);
1454
1455 stream.set_frame_type(frame_ty).unwrap();
1456 assert_eq!(stream.state, State::FramePayloadLen);
1457
1458 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1460 let frame_payload_len = stream.try_consume_varint().unwrap();
1461 assert_eq!(
1462 Err(Error::FrameError),
1463 stream.set_frame_payload_len(frame_payload_len)
1464 );
1465 }
1466
1467 #[test]
1468 fn zero_length_push_promise() {
1469 let mut d = vec![42; 128];
1470 let mut b = octets::OctetsMut::with_slice(&mut d);
1471
1472 let mut stream = <Stream>::new(0, false);
1473
1474 assert_eq!(stream.ty, Some(Type::Request));
1475 assert_eq!(stream.state, State::FrameType);
1476
1477 b.put_varint(PUSH_PROMISE_FRAME_TYPE_ID).unwrap();
1479 b.put_varint(0).unwrap();
1480
1481 let mut cursor = std::io::Cursor::new(d);
1482
1483 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1485 let frame_ty = stream.try_consume_varint().unwrap();
1486 assert_eq!(frame_ty, PUSH_PROMISE_FRAME_TYPE_ID);
1487
1488 stream.set_frame_type(frame_ty).unwrap();
1489 assert_eq!(stream.state, State::FramePayloadLen);
1490
1491 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1493 let frame_payload_len = stream.try_consume_varint().unwrap();
1494 assert_eq!(
1495 Err(Error::FrameError),
1496 stream.set_frame_payload_len(frame_payload_len)
1497 );
1498 }
1499
1500 #[test]
1501 fn zero_length_cancel_push() {
1502 let mut d = vec![42; 128];
1503 let mut b = octets::OctetsMut::with_slice(&mut d);
1504
1505 let frame = Frame::Settings {
1506 max_field_section_size: None,
1507 qpack_max_table_capacity: None,
1508 qpack_blocked_streams: None,
1509 connect_protocol_enabled: None,
1510 h3_datagram: None,
1511 grease: None,
1512 additional_settings: None,
1513 raw: Some(vec![]),
1514 };
1515
1516 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1517 frame.to_bytes(&mut b).unwrap();
1518
1519 b.put_varint(CANCEL_PUSH_FRAME_TYPE_ID).unwrap();
1521 b.put_varint(0).unwrap();
1522
1523 let mut cursor = std::io::Cursor::new(d);
1524
1525 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1526 .unwrap();
1527
1528 parse_skip_frame(&mut stream, &mut cursor).unwrap();
1530
1531 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1533 let frame_ty = stream.try_consume_varint().unwrap();
1534 assert_eq!(frame_ty, CANCEL_PUSH_FRAME_TYPE_ID);
1535
1536 stream.set_frame_type(frame_ty).unwrap();
1537 assert_eq!(stream.state, State::FramePayloadLen);
1538
1539 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1541 let frame_payload_len = stream.try_consume_varint().unwrap();
1542 assert_eq!(
1543 Err(Error::FrameError),
1544 stream.set_frame_payload_len(frame_payload_len)
1545 );
1546 }
1547
1548 #[test]
1549 fn zero_length_max_push_id() {
1550 let mut d = vec![42; 128];
1551 let mut b = octets::OctetsMut::with_slice(&mut d);
1552
1553 let frame = Frame::Settings {
1554 max_field_section_size: None,
1555 qpack_max_table_capacity: None,
1556 qpack_blocked_streams: None,
1557 connect_protocol_enabled: None,
1558 h3_datagram: None,
1559 grease: None,
1560 additional_settings: None,
1561 raw: Some(vec![]),
1562 };
1563
1564 let mut stream = open_uni(&mut b, HTTP3_CONTROL_STREAM_TYPE_ID).unwrap();
1565 frame.to_bytes(&mut b).unwrap();
1566
1567 b.put_varint(MAX_PUSH_FRAME_TYPE_ID).unwrap();
1569 b.put_varint(0).unwrap();
1570
1571 let mut cursor = std::io::Cursor::new(d);
1572
1573 parse_uni(&mut stream, HTTP3_CONTROL_STREAM_TYPE_ID, &mut cursor)
1574 .unwrap();
1575
1576 parse_skip_frame(&mut stream, &mut cursor).unwrap();
1578
1579 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1581 let frame_ty = stream.try_consume_varint().unwrap();
1582 assert_eq!(frame_ty, MAX_PUSH_FRAME_TYPE_ID);
1583
1584 stream.set_frame_type(frame_ty).unwrap();
1585 assert_eq!(stream.state, State::FramePayloadLen);
1586
1587 stream.try_fill_buffer_for_tests(&mut cursor).unwrap();
1589 let frame_payload_len = stream.try_consume_varint().unwrap();
1590 assert_eq!(
1591 Err(Error::FrameError),
1592 stream.set_frame_payload_len(frame_payload_len)
1593 );
1594 }
1595}