THRIFT-2278 Buffered transport doesn't support writes > buffer size
Patch: Matt Jones
diff --git a/lib/go/thrift/buffered_transport.go b/lib/go/thrift/buffered_transport.go
index e3546a5..b92261c 100644
--- a/lib/go/thrift/buffered_transport.go
+++ b/lib/go/thrift/buffered_transport.go
@@ -77,12 +77,21 @@
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 3a59e7b..d1af028 100644
--- a/lib/go/thrift/framed_transport.go
+++ b/lib/go/thrift/framed_transport.go
@@ -95,7 +95,7 @@
}
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)
}
}