@@ -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