Get large body writes working

This commit is contained in:
Carl Lerche
2017-08-12 11:02:50 -07:00
parent 570962353b
commit 150c3160be
5 changed files with 30 additions and 18 deletions

View File

@@ -196,7 +196,7 @@ impl<T, B> Sink for FramedWrite<T, B>
while !self.is_empty() { while !self.is_empty() {
match self.next { match self.next {
Some(Next::Data(ref mut frame)) => { Some(Next::Data(ref mut frame)) => {
let mut buf = self.buf.by_ref().chain(frame.payload_mut()); let mut buf = Buf::by_ref(&mut self.buf).chain(frame.payload_mut());
try_ready!(self.inner.write_buf(&mut buf)); try_ready!(self.inner.write_buf(&mut buf));
} }
_ => { _ => {

View File

@@ -2,7 +2,7 @@ use super::*;
use bytes::buf::Take; use bytes::buf::Take;
use std::cmp; use std::{fmt, cmp};
#[derive(Debug)] #[derive(Debug)]
pub(super) struct Prioritize<B> { pub(super) struct Prioritize<B> {
@@ -26,7 +26,6 @@ pub(super) struct Prioritize<B> {
conn_task: Option<task::Task>, conn_task: Option<task::Task>,
} }
#[derive(Debug)]
pub(crate) struct Prioritized<B> { pub(crate) struct Prioritized<B> {
// The buffer // The buffer
inner: Take<B>, inner: Take<B>,
@@ -253,18 +252,23 @@ impl<B> Prioritize<B>
store: &mut Store<B>, store: &mut Store<B>,
dst: &mut Codec<T, Prioritized<B>>) -> bool dst: &mut Codec<T, Prioritized<B>>) -> bool
{ {
trace!("try reclaim frame");
// First check if there are any data chunks to take back // First check if there are any data chunks to take back
if let Some(frame) = dst.take_last_data_frame() { if let Some(frame) = dst.take_last_data_frame() {
trace!(" -> reclaimed; frame={:?}", frame);
let mut eos = false;
let key = frame.payload().stream;
let mut frame = frame.map(|prioritized| {
// TODO: Ensure fully written
eos = prioritized.end_of_stream;
prioritized.inner.into_inner()
});
if frame.payload().has_remaining() { if frame.payload().has_remaining() {
let mut stream = store.resolve(frame.payload().stream); let mut stream = store.resolve(key);
let mut eos = false;
let mut frame = frame.map(|prioritized| {
// TODO: Ensure fully written
eos = prioritized.end_of_stream;
prioritized.inner.into_inner()
});
if eos { if eos {
frame.set_end_stream(); frame.set_end_stream();
@@ -312,3 +316,13 @@ impl<B> Buf for Prioritized<B>
self.inner.advance(cnt) self.inner.advance(cnt)
} }
} }
impl<B: Buf> fmt::Debug for Prioritized<B> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.debug_struct("Prioritized")
.field("remaining", &self.inner.get_ref().remaining())
.field("end_of_stream", &self.end_of_stream)
.field("stream", &self.stream)
.finish()
}
}

View File

@@ -48,7 +48,7 @@ fn recv_invalid_server_stream_id() {
.body(()).unwrap(); .body(()).unwrap();
info!("sending request"); info!("sending request");
let mut stream = h2.request(request, true).unwrap(); let stream = h2.request(request, true).unwrap();
// The connection errors // The connection errors
assert_proto_err!(h2.wait().unwrap_err(), ProtocolError); assert_proto_err!(h2.wait().unwrap_err(), ProtocolError);

View File

@@ -1,16 +1,14 @@
pub mod support; pub mod support;
use support::*; use support::*;
use h2::Frame;
#[test] #[test]
#[ignore] #[ignore]
fn recv_single_ping() { fn recv_single_ping() {
/*
let _ = ::env_logger::init(); let _ = ::env_logger::init();
let mock = mock_io::Builder::new() let mock = mock_io::Builder::new()
.handshake() .handshake()
/*
.write(&[ .write(&[
// POST / // POST /
0, 0, 16, 1, 4, 0, 0, 0, 1, 131, 135, 65, 139, 157, 41, 0, 0, 16, 1, 4, 0, 0, 0, 1, 131, 135, 65, 139, 157, 41,
@@ -28,9 +26,9 @@ fn recv_single_ping() {
// DATA // DATA
0, 0, 5, 0, 1, 0, 0, 0, 1, 119, 111, 114, 108, 100 0, 0, 5, 0, 1, 0, 0, 0, 1, 119, 111, 114, 108, 100
]) ])
*/
.build(); .build();
*/
/* /*
let h2 = client::handshake(mock) let h2 = client::handshake(mock)
.wait().unwrap(); .wait().unwrap();

View File

@@ -62,12 +62,12 @@ fn single_stream_send_extra_large_body_multi_frames() {
0, 64, 0, 0, 0, 0, 0, 0, 1, 0, 64, 0, 0, 0, 0, 0, 0, 1,
]) ])
.write(&payload[0..16_384]) .write(&payload[0..16_384])
.write(frames::SETTINGS_ACK)
.write(&[ .write(&[
// DATA // DATA
0, 64, 0, 0, 1, 0, 0, 0, 1, 0, 64, 0, 0, 1, 0, 0, 0, 1,
]) ])
.write(&payload[16_384..]) .write(&payload[16_384..])
.write(frames::SETTINGS_ACK)
// Read response // Read response
.read(&[0, 0, 1, 1, 5, 0, 0, 0, 1, 0x89]) .read(&[0, 0, 1, 1, 5, 0, 0, 0, 1, 0x89])
.build(); .build();