When sending payloads of unknown length over a Stream
and expecting the server to read it to completion before
emitting a response (such as forwarding a byte stream),
one difficulty with yamux is communicating that the byte
stream's end has been reached.
One approach is to introduce a higher-level protocol,
but when the byte stream is of unknown size this requires
essentially reimplementing large parts of yamux's framing
protocol.
A simpler solution is to communicate that EOF has been reached.
Yamux provides this capability through (*Stream).Close,
but it closes both the read and the write ends, which then
prevents the client from reading the response from the server.
This change introduces a new method, (*Stream).CloseWrite,
which only closes the write end of the stream. When encountered
on the other end, it sets a flag that the remote's write end has been
closed and begins returning EOF from any reads after the receive
buffer has been exhausted.
When sending payloads of unknown length over a Stream and expecting the server to read it to completion before emitting a response (such as forwarding a byte stream), one difficulty with yamux is communicating that the byte stream's end has been reached.
One approach is to introduce a higher-level protocol, but when the byte stream is of unknown size this requires essentially reimplementing large parts of yamux's framing protocol.
A simpler solution is to communicate that EOF has been reached. Yamux provides this capability through (*Stream).Close, but it closes both the read and the write ends, which then prevents the client from reading the response from the server.
This change introduces a new method, (*Stream).CloseWrite, which only closes the write end of the stream. When encountered on the other end, it sets a flag that the remote's write end has been closed and begins returning EOF from any reads after the receive buffer has been exhausted.