From a5960383273432d5249c113f6413bbe39c13df50 Mon Sep 17 00:00:00 2001 From: Jens Geyer Date: Tue, 3 Dec 2013 22:57:59 +0100 Subject: [PATCH] THRIFT-2278 Buffered transport doesn't support writes > buffer size Patch: Matt Jones --- lib/go/thrift/buffered_transport.go | 19 ++++++++++++++----- lib/go/thrift/framed_transport.go | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/go/thrift/buffered_transport.go b/lib/go/thrift/buffered_transport.go index e3546a51..b92261c5 100644 --- a/lib/go/thrift/buffered_transport.go +++ b/lib/go/thrift/buffered_transport.go @@ -77,12 +77,21 @@ func (p *TBufferedTransport) Read(buf []byte) (n int, err error) { func (p *TBufferedTransport) Write(buf []byte) (n int, err error) { wbuf := p.wbuf - size := len(buf) - if wbuf.pos+size > wbuf.limit { // buffer is full, flush buffer - p.Flush() + remaining := len(buf) + + for remaining > 0 { + if wbuf.pos+remaining > wbuf.limit { // buffer is full, flush buffer + if err := p.Flush(); err != nil { + return n, err + } + } + copied := copy(wbuf.buffer[wbuf.pos:], buf[n:]) + + wbuf.pos += copied + n += copied + remaining -= copied } - n = copy(wbuf.buffer[wbuf.pos:], buf) - wbuf.pos += n + return n, nil } diff --git a/lib/go/thrift/framed_transport.go b/lib/go/thrift/framed_transport.go index 3a59e7b9..d1af0287 100644 --- a/lib/go/thrift/framed_transport.go +++ b/lib/go/thrift/framed_transport.go @@ -95,7 +95,7 @@ func (p *TFramedTransport) Flush() error { } if size > 0 { if n, err := p.writeBuffer.WriteTo(p.transport); err != nil { - print("Error while flushing write buffer of size ", size, " to transport, only wrote ", n, " bytes: ", err, "\n") + print("Error while flushing write buffer of size ", size, " to transport, only wrote ", n, " bytes: ", err.Error(), "\n") return NewTTransportExceptionFromError(err) } } -- 2.17.1