Open tom-kuchler opened 2 months ago
Ummm yea, you're right. This seems busted. I'm working on a unit test case for this, and then see track down the cause. Thanks for reporting!
OK OK, I see what's going on. It's the Buf::chunks_vectored()
method.
[Chunk<MinimalBytes>, ChunkEnd]
.IoSlice
s to a do a single write.chunks_vectored()
currently works, that means it will end up with a list of ["5\r\nh\r\n", "0\r\n\r\n"]
chunks_vectored()
calls chunk()
, and assumes that's all of it, and then calls chunk()
on the next buffer.I need to think through the problem a bit more, but I'll likely need to take this as an issue to the bytes
repo.
Issue filed upstream: https://github.com/tokio-rs/bytes/issues/701
Alright, the I'll follow that, thanks a lot for the swift response.
Version hyper: 1.3.1 hyper-util 0.1.3 bytes: 1.6.0 tokio: 1.37,0
Platform Linux LAPTOP-CSN0P74T 5.15.146.1-microsoft-standard-WSL2
Summary For a project I'm building I wanted to provide serialization of some internal structures and send them out as responses. To do this I implemented a struct that implementes hyper::body::Body and implemented bytes::Buf for my internal structure. When sending the structure I found that parts of the Buf had been replaced by different data. Specifically I found that not all parts of the Buf were read and instead different data was inserted.
Minimal Viable Example Here is a minimal example that implements the Buf interface over a Vec but only returns single byte slices.
What I would expect to happen is a response that contains the test message. What happens instead is that after every byte of that message it inserts the 7 bytes
\r\n0\r\n\r\n
and then advances past 7 bytes in the actual buffer without every asking for those chunks. I have checked it with a few different steps sizes, and it always seems to insert these specific 7 bytes if a chunk is returned that is not equal to the total size of remaining. If the chunk length is equal to remaining then everything works.Let me know if there is some additional information I could provide or something I could easily look into to help fix this.