THRIFT-2278 Buffered transport doesn't support writes > buffer size
authorJens Geyer <jensg@apache.org>
Tue, 3 Dec 2013 21:57:59 +0000 (22:57 +0100)
committerJens Geyer <jensg@apache.org>
Tue, 3 Dec 2013 21:57:59 +0000 (22:57 +0100)
Patch: Matt Jones

lib/go/thrift/buffered_transport.go
lib/go/thrift/framed_transport.go

index e3546a5..b92261c 100644 (file)
@@ -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
 }
 
index 3a59e7b..d1af028 100644 (file)
@@ -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)
                }
        }