Exposing the write capacity
Background
I am working on an application, where I have a small-ish number of bytes to send (they usually fit in one UDP packet), and all of those bytes should go in one fresh stream that is marked fin immediately. Due to the way the application is structured, it is very inconvenient to deal with partial writes, so I would like to check beforehand that Quiche can accept the entire write.
Problem
- We can check whether a new stream can be opened with
peer_streams_left_uni, but that is no guarantee that we can write all bytes. - There is
stream_capacity, but it only works for existing streams, not new streams. - I suppose I could try to do a zero-length
stream_sendfirst to ensure the stream exists, and then check its capacity, but this is wasteful because there is a lot of logic instream_sendthat would be executed twice.
Ideas
Looking through the implementation of stream_capacity, there is tx_cap, which looks like exactly what I need. Are there any caveats to exposing it?
The amount of stream data that can be buffered is determined by both flow control and congestion control. stream_capacity() returns the minimum of these. Returning either in isolation risks confusing apps about what will subsequently happen.
Possibly one solution is to have a reserve_stream() function. However, it would need to take care to initialize all the relevant internal data structures
Maybe stream_capacity could do the logic for streams that don’t yet exist, and treat them as what their capacity would be after they are created?
That would risk breaking existing apps