1use std::io;
19use std::borrow::Cow;
20use std::borrow::Borrow;
21
22use http::{
23 Header,
24 StreamId,
25 HttpError,
26 HttpResult,
27 HttpScheme,
28};
29use http::priority::DataPrioritizer;
30use http::session::Session;
31use http::transport::TransportStream;
32use http::frame::{
33 Frame,
34 RawFrame,
35 DataFrame,
36 DataFlag,
37 HeadersFrame,
38 HeadersFlag,
39 SettingsFrame,
40 unpack_header,
41};
42use hpack;
43
44#[derive(PartialEq)]
49#[derive(Debug)]
50#[derive(Clone)]
51pub enum HttpFrame {
52 DataFrame(DataFrame),
53 HeadersFrame(HeadersFrame),
54 SettingsFrame(SettingsFrame),
55 UnknownFrame(RawFrame),
56}
57
58impl HttpFrame {
59 pub fn from_raw(raw_frame: RawFrame) -> HttpResult<HttpFrame> {
60 let frame = match raw_frame.header().1 {
61 0x0 => HttpFrame::DataFrame(try!(HttpFrame::parse_frame(raw_frame))),
62 0x1 => HttpFrame::HeadersFrame(try!(HttpFrame::parse_frame(raw_frame))),
63 0x4 => HttpFrame::SettingsFrame(try!(HttpFrame::parse_frame(raw_frame))),
64 _ => HttpFrame::UnknownFrame(raw_frame),
65 };
66
67 Ok(frame)
68 }
69
70 #[inline]
78 fn parse_frame<F: Frame>(raw_frame: RawFrame) -> HttpResult<F> {
79 Frame::from_raw(raw_frame).ok_or(HttpError::InvalidFrame)
83 }
84}
85
86#[derive(Clone, Copy, PartialEq, Debug)]
89pub enum SendStatus {
90 Sent,
92 Nothing,
96}
97
98pub struct HttpConnection<S, R> where S: SendFrame, R: ReceiveFrame {
110 pub receiver: R,
112 pub sender: S,
114 decoder: hpack::Decoder<'static>,
116 encoder: hpack::Encoder<'static>,
118 pub scheme: HttpScheme,
120}
121
122pub trait SendFrame {
125 fn send_raw_frame(&mut self, frame: RawFrame) -> HttpResult<()>;
127 fn send_frame<F: Frame>(&mut self, frame: F) -> HttpResult<()> {
131 self.send_raw_frame(RawFrame::from(frame.serialize()))
132 }
133}
134
135impl<W> SendFrame for W where W: io::Write {
138 #[inline]
139 fn send_frame<F: Frame>(&mut self, frame: F) -> HttpResult<()> {
140 try!(self.write_all(&frame.serialize()));
141 Ok(())
142 }
143
144 #[inline]
145 fn send_raw_frame(&mut self, frame: RawFrame) -> HttpResult<()> {
146 let serialized: Vec<u8> = frame.into();
147 try!(self.write_all(&serialized));
148 Ok(())
149 }
150}
151
152pub trait ReceiveFrame {
155 fn recv_frame(&mut self) -> HttpResult<HttpFrame>;
158}
159
160impl<TS> ReceiveFrame for TS where TS: TransportStream {
162 fn recv_frame(&mut self) -> HttpResult<HttpFrame> {
163 let read_header_bytes = |stream: &mut TS| -> HttpResult<[u8; 9]> {
166 let mut buf = [0; 9];
167 try!(TransportStream::read_exact(stream, &mut buf));
168
169 Ok(buf)
170 };
171 let read_payload = |stream: &mut TS, len: u32| -> HttpResult<Vec<u8>> {
174 debug!("Trying to read {} bytes of frame payload", len);
175 let length = len as usize;
176 let mut buf: Vec<u8> = Vec::with_capacity(length);
177 unsafe { buf.set_len(length); }
180 try!(TransportStream::read_exact(stream, &mut buf));
181
182 Ok(buf)
183 };
184
185 let header = unpack_header(&try!(read_header_bytes(self)));
186 debug!("Received frame header {:?}", header);
187
188 let payload = try!(read_payload(self, header.0));
189 let raw_frame = RawFrame::with_payload(header, payload);
190
191 let frame = try!(HttpFrame::from_raw(raw_frame));
195 Ok(frame)
196 }
197}
198
199pub struct DataChunk<'a> {
201 pub data: Cow<'a, [u8]>,
203 pub stream_id: StreamId,
205 pub end_stream: EndStream,
207}
208
209impl<'a> DataChunk<'a> {
210 pub fn new(data: Cow<'a, [u8]>, stream_id: StreamId, end_stream: EndStream) -> DataChunk<'a> {
216 DataChunk {
217 data: data,
218 stream_id: stream_id,
219 end_stream: end_stream,
220 }
221 }
222
223 pub fn new_borrowed<D: Borrow<&'a [u8]>>(data: D, stream_id: StreamId, end_stream: EndStream)
226 -> DataChunk<'a> {
227 DataChunk {
228 data: Cow::Borrowed(data.borrow()),
229 stream_id: stream_id,
230 end_stream: end_stream,
231 }
232 }
233}
234
235#[derive(Clone, Copy, PartialEq, Debug)]
237pub enum EndStream {
238 Yes,
240 No,
242}
243
244impl<S, R> HttpConnection<S, R> where S: SendFrame, R: ReceiveFrame {
245 pub fn new(sender: S, receiver: R, scheme: HttpScheme) -> HttpConnection<S, R> {
248 HttpConnection {
249 receiver: receiver,
250 sender: sender,
251 scheme: scheme,
252 decoder: hpack::Decoder::new(),
253 encoder: hpack::Encoder::new(),
254 }
255 }
256
257 pub fn with_stream<TS>(stream: TS, scheme: HttpScheme) -> HttpConnection<TS, TS>
265 where TS: TransportStream {
266 let sender = stream.try_split().unwrap();
267 let receiver = stream;
268 HttpConnection::new(sender, receiver, scheme)
269 }
270
271 #[inline]
280 fn send_frame<F: Frame>(&mut self, frame: F) -> HttpResult<()> {
281 debug!("Sending frame ... {:?}", frame.get_header());
282 self.sender.send_frame(frame)
283 }
284
285 #[inline]
304 fn recv_frame(&mut self) -> HttpResult<HttpFrame> {
305 self.receiver.recv_frame()
306 }
307
308 pub fn send_headers<H: Into<Vec<Header>>>(&mut self,
322 headers: H,
323 stream_id: StreamId,
324 end_stream: EndStream) -> HttpResult<()> {
325 self.send_headers_inner(headers.into(), stream_id, end_stream)
326 }
327
328 fn send_headers_inner(&mut self,
330 headers: Vec<Header>,
331 stream_id: StreamId,
332 end_stream: EndStream) -> HttpResult<()> {
333 let headers_fragment = self.encoder.encode(&headers);
334 let mut frame = HeadersFrame::new(headers_fragment, stream_id);
338 frame.set_flag(HeadersFlag::EndHeaders);
339
340 if end_stream == EndStream::Yes {
341 frame.set_flag(HeadersFlag::EndStream);
342 }
343
344 self.send_frame(frame)
345 }
346
347 pub fn send_data<'a>(&mut self,
360 chunk: DataChunk<'a>) -> HttpResult<()> {
361 let DataChunk { data, stream_id, end_stream } = chunk;
362 self.send_data_inner(data.into_owned(), stream_id, end_stream)
363 }
364
365 fn send_data_inner(&mut self, data: Vec<u8>, stream_id: StreamId, end_stream: EndStream)
367 -> HttpResult<()>{
368 let mut frame = DataFrame::new(stream_id);
371 frame.data.extend(data);
372 if end_stream == EndStream::Yes {
373 frame.set_flag(DataFlag::EndStream);
374 }
375
376 self.send_frame(frame)
377 }
378
379 pub fn send_next_data<P: DataPrioritizer>(&mut self, prioritizer: &mut P)
387 -> HttpResult<SendStatus> {
388 let chunk = try!(prioritizer.get_next_chunk());
389 match chunk {
390 None => Ok(SendStatus::Nothing),
391 Some(chunk) => {
392 try!(self.send_data(chunk));
393 Ok(SendStatus::Sent)
394 },
395 }
396 }
397 pub fn expect_settings<Sess: Session>(&mut self, session: &mut Sess) -> HttpResult<()> {
406 let frame = self.recv_frame();
407 match frame {
408 Ok(HttpFrame::SettingsFrame(ref settings)) if !settings.is_ack() => {
409 debug!("Correctly received a SETTINGS frame from the server");
410 },
411 Ok(_) => return Err(HttpError::UnableToConnect),
413 Err(e) => return Err(e),
415 };
416 try!(self.handle_frame(frame.unwrap(), session));
417 Ok(())
418 }
419
420 pub fn handle_next_frame<Sess: Session>(&mut self, session: &mut Sess) -> HttpResult<()> {
430 debug!("Waiting for frame...");
431 let frame = match self.recv_frame() {
432 Ok(frame) => frame,
433 Err(e) => {
434 debug!("Encountered an HTTP/2 error, stopping.");
435 return Err(e);
436 },
437 };
438
439 self.handle_frame(frame, session)
440 }
441
442 fn handle_frame<Sess: Session>(&mut self, frame: HttpFrame, session: &mut Sess)
444 -> HttpResult<()> {
445 match frame {
446 HttpFrame::DataFrame(frame) => {
447 debug!("Data frame received");
448 self.handle_data_frame(frame, session)
449 },
450 HttpFrame::HeadersFrame(frame) => {
451 debug!("Headers frame received");
452 self.handle_headers_frame(frame, session)
453 },
454 HttpFrame::SettingsFrame(frame) => {
455 debug!("Settings frame received");
456 self.handle_settings_frame::<Sess>(frame, session)
457 },
458 HttpFrame::UnknownFrame(_) => {
459 debug!("Unknown frame received");
460 Ok(())
464 },
465 }
466 }
467
468 fn handle_data_frame<Sess: Session>(&mut self, frame: DataFrame, session: &mut Sess)
470 -> HttpResult<()> {
471 session.new_data_chunk(frame.get_stream_id(), &frame.data);
472
473 if frame.is_set(DataFlag::EndStream) {
474 debug!("End of stream {}", frame.get_stream_id());
475 session.end_of_stream(frame.get_stream_id())
476 }
477
478 Ok(())
479 }
480
481 fn handle_headers_frame<Sess: Session>(&mut self, frame: HeadersFrame, session: &mut Sess)
483 -> HttpResult<()> {
484 let headers = try!(self.decoder.decode(&frame.header_fragment)
485 .map_err(|e| HttpError::CompressionError(e)));
486 session.new_headers(frame.get_stream_id(), headers);
487
488 if frame.is_end_of_stream() {
489 debug!("End of stream {}", frame.get_stream_id());
490 session.end_of_stream(frame.get_stream_id());
491 }
492
493 Ok(())
494 }
495
496 fn handle_settings_frame<Sess: Session>(&mut self, frame: SettingsFrame, _session: &mut Session)
498 -> HttpResult<()> {
499 if !frame.is_ack() {
500 debug!("Sending a SETTINGS ack");
503 try!(self.send_frame(SettingsFrame::new_ack()));
504 }
505
506 Ok(())
507 }
508}
509
510#[cfg(test)]
511mod tests {
512 use std::borrow::Cow;
513
514 use super::{
515 HttpConnection,
516 HttpFrame,
517 SendFrame, ReceiveFrame,
518 EndStream,
519 DataChunk,
520 SendStatus,
521 };
522
523 use http::tests::common::{
524 build_mock_http_conn,
525 build_stub_from_frames,
526 StubTransportStream,
527 StubDataPrioritizer,
528 TestSession,
529 };
530 use http::frame::{
531 Frame, DataFrame, HeadersFrame,
532 SettingsFrame,
533 pack_header,
534 RawFrame,
535 };
536 use http::transport::TransportStream;
537 use http::{HttpError, HttpResult};
538 use hpack;
539
540 fn send_frame<S: SendFrame, R: ReceiveFrame>(conn: &mut HttpConnection<S, R>, frame: HttpFrame)
547 -> HttpResult<()> {
548 match frame {
549 HttpFrame::DataFrame(frame) => conn.send_frame(frame),
550 HttpFrame::SettingsFrame(frame) => conn.send_frame(frame),
551 HttpFrame::HeadersFrame(frame) => conn.send_frame(frame),
552 HttpFrame::UnknownFrame(_) => Ok(()),
553 }
554 }
555
556 #[test]
559 fn test_send_frame_for_io_write_individual() {
560 let frames: Vec<HttpFrame> = vec![
561 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
562 HttpFrame::DataFrame(DataFrame::new(1)),
563 HttpFrame::DataFrame(DataFrame::new(3)),
564 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 3)),
565 HttpFrame::UnknownFrame(RawFrame::from(vec![1, 2, 3, 4])),
566 ];
567 for frame in frames.into_iter() {
568 let mut writeable = Vec::new();
569 let frame_serialized = match frame {
570 HttpFrame::DataFrame(frame) => {
571 let ret = frame.serialize();
572 writeable.send_frame(frame).unwrap();
573 ret
574 },
575 HttpFrame::HeadersFrame(frame) => {
576 let ret = frame.serialize();
577 writeable.send_frame(frame).unwrap();
578 ret
579 },
580 HttpFrame::SettingsFrame(frame) => {
581 let ret = frame.serialize();
582 writeable.send_frame(frame).unwrap();
583 ret
584 },
585 HttpFrame::UnknownFrame(frame) => {
586 let ret = frame.serialize();
587 writeable.send_raw_frame(frame).unwrap();
588 ret
589 },
590 };
591 assert_eq!(writeable, frame_serialized);
592 }
593 }
594
595 #[test]
598 fn test_send_frame_for_io_write_multiple() {
599 let frames: Vec<HttpFrame> = vec![
600 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
601 HttpFrame::DataFrame(DataFrame::new(1)),
602 HttpFrame::DataFrame(DataFrame::new(3)),
603 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 3)),
604 HttpFrame::UnknownFrame(RawFrame::from(vec![1, 2, 3, 4])),
605 ];
606 let mut writeable = Vec::new();
607 let mut previous = 0;
608 for frame in frames.into_iter() {
609 let frame_serialized = match frame {
610 HttpFrame::DataFrame(frame) => {
611 let ret = frame.serialize();
612 writeable.send_frame(frame).unwrap();
613 ret
614 },
615 HttpFrame::HeadersFrame(frame) => {
616 let ret = frame.serialize();
617 writeable.send_frame(frame).unwrap();
618 ret
619 },
620 HttpFrame::SettingsFrame(frame) => {
621 let ret = frame.serialize();
622 writeable.send_frame(frame).unwrap();
623 ret
624 },
625 HttpFrame::UnknownFrame(frame) => {
626 let ret = frame.serialize();
627 writeable.send_raw_frame(frame).unwrap();
628 ret
629 },
630 };
631 assert_eq!(&writeable[previous..], &frame_serialized[..]);
632 previous = writeable.len();
633 }
634 }
635
636 #[test]
639 fn test_send_frame_closed_stream() {
640 let mut stream = StubTransportStream::with_stub_content(&vec![]);
641 stream.close().unwrap();
642
643 let res = stream.send_frame(HeadersFrame::new(vec![], 1));
644
645 assert!(res.is_err());
646 }
647
648 #[test]
651 fn test_recv_frame_for_transport_stream() {
652 let unknown_frame = RawFrame::from_buf(&{
653 let mut buf: Vec<u8> = Vec::new();
654 let header = (1u32, 10u8, 0u8, 1u32);
656 buf.extend(pack_header(&header).to_vec().into_iter());
657 buf.push(1);
658 buf
659 }).unwrap();
660 let frames: Vec<HttpFrame> = vec![
661 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
662 HttpFrame::DataFrame(DataFrame::new(1)),
663 HttpFrame::DataFrame(DataFrame::new(3)),
664 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 3)),
665 HttpFrame::UnknownFrame(unknown_frame),
666 ];
667 let mut stream = StubTransportStream::with_stub_content(&build_stub_from_frames(&frames));
668
669 for frame in frames.into_iter() {
670 assert_eq!(frame, stream.recv_frame().unwrap());
671 }
672 assert!(stream.recv_frame().is_err());
674 }
675
676 #[test]
679 fn test_recv_frame_for_transport_stream_incomplete_frame() {
680 let frame = {
681 let mut frame = DataFrame::new(1);
682 frame.data = vec![1, 2, 3];
683 frame
684 };
685 let serialized: Vec<u8> = frame.serialize();
686
687 {
688 let mut stream = StubTransportStream::with_stub_content(&serialized[..5]);
690
691 assert!(stream.recv_frame().is_err());
692 }
693 {
694 let mut stream = StubTransportStream::with_stub_content(&serialized[..10]);
696
697 assert!(stream.recv_frame().is_err());
698 }
699 }
700
701 #[test]
704 fn test_recv_frame_invalid() {
705 let serialized = HeadersFrame::new(vec![], 0).serialize();
707 let mut stream = StubTransportStream::with_stub_content(&serialized);
708
709 assert_eq!(stream.recv_frame().err().unwrap(), HttpError::InvalidFrame);
710 }
711
712 #[test]
715 fn test_http_frame_from_raw() {
716 fn to_raw<F: Frame>(frame: F) -> RawFrame {
717 RawFrame::from_buf(&frame.serialize()).unwrap()
718 }
719
720 assert!(match HttpFrame::from_raw(to_raw(DataFrame::new(1))) {
721 Ok(HttpFrame::DataFrame(_)) => true,
722 _ => false,
723 });
724
725 assert!(match HttpFrame::from_raw(to_raw(HeadersFrame::new(vec![], 1))) {
726 Ok(HttpFrame::HeadersFrame(_)) => true,
727 _ => false,
728 });
729
730 assert!(match HttpFrame::from_raw(to_raw(SettingsFrame::new())) {
731 Ok(HttpFrame::SettingsFrame(_)) => true,
732 _ => false,
733 });
734
735 let unknown_frame = RawFrame::from_buf(&{
736 let mut buf: Vec<u8> = Vec::new();
737 let header = (1u32, 10u8, 0u8, 1u32);
739 buf.extend(pack_header(&header).to_vec().into_iter());
740 buf.push(1);
741 buf
742 }).unwrap();
743 assert!(match HttpFrame::from_raw(unknown_frame) {
744 Ok(HttpFrame::UnknownFrame(_)) => true,
745 _ => false,
746 });
747
748 let invalid_frame = HeadersFrame::new(vec![], 0);
750 assert!(HttpFrame::from_raw(to_raw(invalid_frame)).is_err());
751 }
752
753 #[test]
755 fn test_read_single_frame() {
756 let frames: Vec<HttpFrame> = vec![
757 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
758 ];
759 let mut conn = build_mock_http_conn(frames.clone());
760
761 let actual: Vec<_> = (0..frames.len()).map(|_| conn.recv_frame().ok().unwrap())
762 .collect();
763
764 assert_eq!(actual, frames);
765 }
766
767 #[test]
769 fn test_read_multiple_frames() {
770 let frames: Vec<HttpFrame> = vec![
771 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
772 HttpFrame::DataFrame(DataFrame::new(1)),
773 HttpFrame::DataFrame(DataFrame::new(3)),
774 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 3)),
775 ];
776 let mut conn = build_mock_http_conn(frames.clone());
777
778 let actual: Vec<_> = (0..frames.len()).map(|_| conn.recv_frame().ok().unwrap())
779 .collect();
780
781 assert_eq!(actual, frames);
782 }
783
784 #[test]
787 fn test_read_no_data() {
788 let mut conn = build_mock_http_conn(vec![]);
789
790 let res = conn.recv_frame();
791
792 assert!(match res.err().unwrap() {
793 HttpError::IoError(_) => true,
794 _ => false,
795 });
796 }
797
798 #[test]
800 fn test_read_past_eof() {
801 let frames: Vec<HttpFrame> = vec![
802 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
803 ];
804 let mut conn = build_mock_http_conn(frames.clone());
805
806 let _: Vec<_> = (0..frames.len()).map(|_| conn.recv_frame().ok().unwrap())
807 .collect();
808 let res = conn.recv_frame();
809
810 assert!(match res.err().unwrap() {
811 HttpError::IoError(_) => true,
812 _ => false,
813 });
814 }
815
816 #[test]
819 fn test_read_unknown_frame() {
820 let unknown_frame = RawFrame::from_buf(&{
821 let mut buf: Vec<u8> = Vec::new();
822 let header = (1u32, 10u8, 0u8, 1u32);
824 buf.extend(pack_header(&header).to_vec().into_iter());
825 buf.push(1);
826 buf
827 }).unwrap();
828 let mut conn = build_mock_http_conn(vec![HttpFrame::UnknownFrame(unknown_frame)]);
829
830 assert!(match conn.recv_frame() {
832 Ok(HttpFrame::UnknownFrame(_)) => true,
833 _ => false,
834 });
835 }
836
837 #[test]
839 fn test_write_single_frame() {
840 let frames: Vec<HttpFrame> = vec![
841 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
842 ];
843 let expected = frames.clone();
844 let mut conn = build_mock_http_conn(vec![]);
845
846 for frame in frames.into_iter() {
847 send_frame(&mut conn, frame).unwrap();
848 }
849
850 assert_eq!(expected, conn.sender.sent);
851 }
852
853 #[test]
854 fn test_send_next_data() {
855 fn expect_chunk(expected: &[u8], frame: &HttpFrame) {
856 let frame = match frame {
857 &HttpFrame::DataFrame(ref frame) => frame,
858 _ => panic!("Expected a data frame"),
859 };
860 assert_eq!(expected, &frame.data[..]);
861 }
862 let mut conn = build_mock_http_conn(vec![]);
863 let chunks = vec![
864 vec![1, 2, 3, 4],
865 vec![5, 6],
866 vec![7],
867 vec![],
868 ];
869 let mut prioritizer = StubDataPrioritizer::new(chunks.clone());
870
871 for chunk in chunks.iter() {
873 assert_eq!(SendStatus::Sent, conn.send_next_data(&mut prioritizer).unwrap());
874 expect_chunk(&chunk, conn.sender.sent.last().unwrap());
875 }
876 assert_eq!(SendStatus::Nothing, conn.send_next_data(&mut prioritizer).unwrap());
878 }
879
880 #[test]
882 fn test_write_multiple_frames() {
883 let frames: Vec<HttpFrame> = vec![
884 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
885 HttpFrame::DataFrame(DataFrame::new(1)),
886 HttpFrame::DataFrame(DataFrame::new(3)),
887 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 3)),
888 ];
889 let expected = frames.clone();
890 let mut conn = build_mock_http_conn(vec![]);
891
892 for frame in frames.into_iter() {
893 send_frame(&mut conn, frame).unwrap();
894 }
895
896 assert_eq!(expected, conn.sender.sent);
897 }
898
899 #[test]
902 fn test_send_headers_single_frame() {
903 fn assert_correct_headers(headers: &[(Vec<u8>, Vec<u8>)], frame: &HeadersFrame) {
904 let buf = &frame.header_fragment;
905 let frame_headers = hpack::Decoder::new().decode(buf).unwrap();
906 assert_eq!(headers, &frame_headers[..]);
907 }
908 let headers: Vec<(Vec<u8>, Vec<u8>)> = vec![
909 (b":method".to_vec(), b"GET".to_vec()),
910 (b":scheme".to_vec(), b"http".to_vec()),
911 ];
912 {
913 let mut conn = build_mock_http_conn(vec![]);
914
915 conn.send_headers(&headers[..], 1, EndStream::Yes).unwrap();
917
918 assert_eq!(conn.sender.sent.len(), 1);
920 let frame = match conn.sender.sent.remove(0) {
922 HttpFrame::HeadersFrame(frame) => frame,
923 _ => panic!("Headers frame not sent"),
924 };
925 assert!(frame.is_headers_end());
927 assert!(frame.is_end_of_stream());
928 assert_correct_headers(&headers, &frame);
930 }
931 {
932 let mut conn = build_mock_http_conn(vec![]);
933
934 conn.send_headers(&headers[..], 1, EndStream::No).unwrap();
936
937 assert_eq!(conn.sender.sent.len(), 1);
939 let frame = match conn.sender.sent.remove(0) {
941 HttpFrame::HeadersFrame(frame) => frame,
942 _ => panic!("Headers frame not sent"),
943 };
944 assert!(frame.is_headers_end());
945 assert!(!frame.is_end_of_stream());
947 assert_correct_headers(&headers, &frame);
948 }
949 {
950 let mut conn = build_mock_http_conn(vec![]);
951
952 conn.send_headers(headers.clone(), 1, EndStream::Yes).unwrap();
954
955 assert_eq!(conn.sender.sent.len(), 1);
957 let frame = match conn.sender.sent.remove(0) {
959 HttpFrame::HeadersFrame(frame) => frame,
960 _ => panic!("Headers frame not sent"),
961 };
962 assert!(frame.is_headers_end());
964 assert!(frame.is_end_of_stream());
965 assert_correct_headers(&headers, &frame);
967 }
968 }
969
970 #[test]
973 fn test_send_data_single_frame() {
974 {
975 let mut conn = build_mock_http_conn(vec![]);
977 let data: &[u8] = b"1234";
978
979 conn.send_data(DataChunk::new_borrowed(data, 1, EndStream::No)).unwrap();
980
981 assert_eq!(conn.sender.sent.len(), 1);
983 let frame = match conn.sender.sent.remove(0) {
985 HttpFrame::DataFrame(frame) => frame,
986 _ => panic!("Data frame not sent"),
987 };
988 assert_eq!(&frame.data[..], data);
989 assert!(!frame.is_end_of_stream());
990 }
991 {
992 let mut conn = build_mock_http_conn(vec![]);
994 let data: &[u8] = b"1234";
995
996 conn.send_data(DataChunk::new_borrowed(data, 1, EndStream::Yes)).unwrap();
997
998 assert_eq!(conn.sender.sent.len(), 1);
1000 let frame = match conn.sender.sent.remove(0) {
1002 HttpFrame::DataFrame(frame) => frame,
1003 _ => panic!("Data frame not sent"),
1004 };
1005 assert_eq!(&frame.data[..], data);
1006 assert!(frame.is_end_of_stream());
1007 }
1008 {
1009 let mut conn = build_mock_http_conn(vec![]);
1011 let data: &[u8] = b"1234";
1012 let chunk = DataChunk {
1013 data: Cow::Owned(data.to_vec()),
1014 stream_id: 1,
1015 end_stream: EndStream::Yes,
1016 };
1017
1018 conn.send_data(chunk).unwrap();
1019
1020 assert_eq!(conn.sender.sent.len(), 1);
1022 let frame = match conn.sender.sent.remove(0) {
1024 HttpFrame::DataFrame(frame) => frame,
1025 _ => panic!("Data frame not sent"),
1026 };
1027 assert_eq!(&frame.data[..], data);
1028 assert!(frame.is_end_of_stream());
1029 }
1030 }
1031
1032 #[test]
1035 fn test_http_conn_notifies_session_header() {
1036 let frames: Vec<HttpFrame> = vec![
1037 HttpFrame::HeadersFrame(HeadersFrame::new(vec![], 1)),
1038 ];
1039 let mut conn = build_mock_http_conn(frames);
1040 let mut session = TestSession::new();
1041
1042 conn.handle_next_frame(&mut session).unwrap();
1043
1044 assert_eq!(session.curr_header, 1);
1047 assert_eq!(session.curr_chunk, 0);
1049 }
1050
1051 #[test]
1054 fn test_http_conn_notifies_session_data() {
1055 let frames: Vec<HttpFrame> = vec![
1056 HttpFrame::DataFrame(DataFrame::new(1)),
1057 ];
1058 let mut conn = build_mock_http_conn(frames);
1059 let mut session = TestSession::new();
1060
1061 conn.handle_next_frame(&mut session).unwrap();
1062
1063 assert_eq!(session.curr_header, 0);
1066 assert_eq!(session.curr_chunk, 1);
1068 }
1069
1070 #[test]
1073 fn test_http_conn_session_gets_headers_data_values() {
1074 let headers = vec![(b":method".to_vec(), b"GET".to_vec())];
1075 let frames: Vec<HttpFrame> = vec![
1076 HttpFrame::HeadersFrame(HeadersFrame::new(
1077 hpack::Encoder::new().encode(&headers),
1078 1)),
1079 HttpFrame::DataFrame(DataFrame::new(1)), {
1080 let mut frame = DataFrame::new(1);
1081 frame.data = b"1234".to_vec();
1082 HttpFrame::DataFrame(frame)
1083 },
1084 ];
1085 let mut conn = build_mock_http_conn(frames);
1086 let mut session = TestSession::new_verify(
1087 vec![headers],
1088 vec![b"".to_vec(), b"1234".to_vec()]);
1089
1090 conn.handle_next_frame(&mut session).unwrap();
1091 conn.handle_next_frame(&mut session).unwrap();
1092 conn.handle_next_frame(&mut session).unwrap();
1093
1094 assert_eq!(session.curr_chunk, 2);
1096 assert_eq!(session.curr_header, 1);
1097 }
1098
1099 #[test]
1101 fn test_http_conn_expect_settings() {
1102 {
1103 let frames = vec![HttpFrame::SettingsFrame(SettingsFrame::new())];
1105 let mut conn = build_mock_http_conn(frames);
1106 assert!(conn.expect_settings(&mut TestSession::new()).is_ok());
1107 }
1108 {
1109 let frames = vec![HttpFrame::DataFrame(DataFrame::new(1))];
1111 let mut conn = build_mock_http_conn(frames);
1112 assert!(conn.expect_settings(&mut TestSession::new()).is_err());
1113 }
1114 {
1115 let frames = vec![HttpFrame::SettingsFrame(SettingsFrame::new_ack())];
1117 let mut conn = build_mock_http_conn(frames);
1118 assert!(conn.expect_settings(&mut TestSession::new()).is_err());
1119 }
1120 }
1121}