Skip to content

Commit 0167337

Browse files
committed
h3: add test for fin mid DATA
1 parent 09a709d commit 0167337

1 file changed

Lines changed: 67 additions & 0 deletions

File tree

quiche/src/h3/mod.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7249,6 +7249,73 @@ mod tests {
72497249
assert_eq!(s.poll_client(), Err(Error::Done));
72507250
}
72517251

7252+
#[test]
7253+
fn fin_mid_data_frame() {
7254+
let mut s = Session::new().unwrap();
7255+
s.handshake().unwrap();
7256+
7257+
// Client sends request.
7258+
let (stream, req) = s.send_request(false).unwrap();
7259+
7260+
let ev_headers = Event::Headers {
7261+
list: req,
7262+
more_frames: true,
7263+
};
7264+
7265+
// Server sends response
7266+
assert_eq!(s.poll_server(), Ok((stream, ev_headers)));
7267+
assert_eq!(s.poll_server(), Err(Error::Done));
7268+
7269+
let resp = s.send_response(stream, false).unwrap();
7270+
7271+
let ev_headers = Event::Headers {
7272+
list: resp,
7273+
more_frames: true,
7274+
};
7275+
7276+
assert_eq!(s.poll_client(), Ok((stream, ev_headers)));
7277+
assert_eq!(s.poll_client(), Err(Error::Done));
7278+
7279+
// We want to indicate a larger DATA frame than we will send, so
7280+
// sidestep quiche's h3 API and write H3 frame bytes directly to QUIC
7281+
// stream. Imagine a response body of 200 bytes, that would be sent
7282+
// across two DATA frames of 100 bytes, but quiche's stream write is
7283+
// limited to only emitting 95 bytes of the DATA frame before the stream
7284+
// is Fin'd.
7285+
let mut d = [42; 10];
7286+
let mut b = octets::OctetsMut::with_slice(&mut d);
7287+
b.put_varint(frame::DATA_FRAME_TYPE_ID).unwrap();
7288+
b.put_varint(100).unwrap();
7289+
let off = b.off();
7290+
s.pipe.server.stream_send(0, &d[..off], false).unwrap();
7291+
let body = [42; 200];
7292+
let written = s.pipe.server.stream_send(0, &body[..200], false).unwrap();
7293+
7294+
assert_eq!(written, 95);
7295+
7296+
s.advance().ok();
7297+
7298+
assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
7299+
assert_eq!(s.poll_client(), Err(Error::Done));
7300+
7301+
let mut read_buf = [0; 65535];
7302+
let read = s
7303+
.client
7304+
.recv_body(&mut s.pipe.client, 0, &mut read_buf)
7305+
.unwrap();
7306+
assert_eq!(read, 95);
7307+
7308+
let written = s.pipe.server.stream_send(0, &[], true).unwrap();
7309+
7310+
assert_eq!(written, 0);
7311+
7312+
s.advance().ok();
7313+
7314+
assert_eq!(s.poll_client(), Ok((stream, Event::Data)));
7315+
assert_eq!(s.poll_client(), Ok((stream, Event::Finished)));
7316+
assert_eq!(s.poll_client(), Err(Error::Done));
7317+
}
7318+
72527319
/// The client shuts down the stream's write direction, the server
72537320
/// shuts down its side with fin
72547321
#[test]

0 commit comments

Comments
 (0)