Open seanmonstar opened 4 months ago
Yeah, this seems like a problem.
Turns out this was already discovered by #474
How about removing the guarantee about chunks_vectored
being complete, and adding a new method chunks_vectored_is_complete
that returns a boolean describing whether this type provides the guarantee that chunks_vectored
always provides all slices.
The design of
Buf::chunks_vectored()
does not account for an implementation that returns a partial slice inchunk()
and doesn't overridechunks_vectored()
to be the full thing. It's assumed that if you have a composite buf, such asChain
, that you can just fill theIoSlice
s with both.First reported in https://github.com/hyperium/hyper/issues/3650
Example
Interestingly, the documentation for
chunks_vectored
even declares a guarantee that likely cannot be upheld:Solutions
With the way the function signature is designed, I don't see a cheap way to check after a call if it really represents all of the
buf
.An expensive solution would be to provide a helper function that compares
remaining()
with what was placed in the&mut [IoSlice]
, and only if true, pass the rest of the slices to the next buffer in the list.Another option I can think of is to design a whole new function,
chunks_vectored_done_right()
, with arguments/return types that prevent making that mistake, deprecating the existing method, and probably changing the default to use the expensive solution anyways.