git: return number of bytes accepted, not written

This commit is contained in:
Taylor Blau 2016-11-07 14:06:44 -07:00
parent e813409b81
commit df9514a138
2 changed files with 19 additions and 20 deletions

@ -45,9 +45,11 @@ func NewPacketWriter(w io.Writer, c int) *PacketWriter {
// the remaining data in the buffer, and write the terminating bytes to the
// underlying packet stream.
//
// Write returns the number of bytes in "p" actually written to the underlying
// protocol stream, not including the number of bytes written in those packets
// headers. If any error was encountered while either buffering or writing, that
// Write returns the number of bytes in "p" accepted into the writer, which
// _MAY_ be written to the underlying protocol stream, or may be written into
// the internal buffer.
//
// If any error was encountered while either buffering or writing, that
// error is returned, along with the number of bytes written to the underlying
// protocol stream, as described above.
func (w *PacketWriter) Write(p []byte) (int, error) {
@ -58,15 +60,12 @@ func (w *PacketWriter) Write(p []byte) (int, error) {
// stored in the buffer, and then write the a packet termination
// sequence.
flushed, err := w.flush()
if err != nil {
if _, err := w.flush(); err != nil {
return 0, err
}
n = n + flushed
if err = w.proto.writeFlush(); err != nil {
return n, err
if err := w.proto.writeFlush(); err != nil {
return 0, err
}
}
@ -83,16 +82,16 @@ func (w *PacketWriter) Write(p []byte) (int, error) {
// have in the internal buffer.
p = p[m:]
n = n + m
if len(w.buf) == MaxPacketLength {
// If we were able to grab an entire packet's worth of
// data, flush the buffer.
flushed, err := w.flush()
if err != nil {
if _, err := w.flush(); err != nil {
return n, err
}
n = n + flushed
}
}

@ -12,8 +12,8 @@ func TestPacketWriterWritesPacketsShorterThanMaxPacketSize(t *testing.T) {
var buf bytes.Buffer
w := NewPacketWriter(&buf, 0)
assertWriterWrite(t, w, []byte("Hello, world!"), 0)
assertWriterWrite(t, w, nil, len("Hello, world!"))
assertWriterWrite(t, w, []byte("Hello, world!"), 13)
assertWriterWrite(t, w, nil, 0)
proto := newProtocolRW(&buf, nil)
assertPacketRead(t, proto, []byte("Hello, world!"))
@ -45,9 +45,9 @@ func TestPacketWriterWritesMultiplePacketsLessThanMaxPacketLength(t *testing.T)
var buf bytes.Buffer
w := NewPacketWriter(&buf, 0)
assertWriterWrite(t, w, []byte("first\n"), 0)
assertWriterWrite(t, w, []byte("second"), 0)
assertWriterWrite(t, w, nil, len("first\nsecond"))
assertWriterWrite(t, w, []byte("first\n"), len("first\n"))
assertWriterWrite(t, w, []byte("second"), len("second"))
assertWriterWrite(t, w, nil, 0)
proto := newProtocolRW(&buf, nil)
assertPacketRead(t, proto, []byte("first\nsecond"))
@ -72,9 +72,9 @@ func TestPacketWriterWritesMultiplePacketsGreaterThanMaxPacketLength(t *testing.
copy(p2, b1)
w := NewPacketWriter(&buf, 0)
assertWriterWrite(t, w, p1, 0)
assertWriterWrite(t, w, p2, MaxPacketLength)
assertWriterWrite(t, w, nil, (len(b1)+len(b2))-MaxPacketLength)
assertWriterWrite(t, w, p1, len(p1))
assertWriterWrite(t, w, p2, len(p2))
assertWriterWrite(t, w, nil, 0)
// offs is how far into b2 we needed to buffer before writing an entire
// packet