From eb925808374e5ca90c83401a40d711dc08c0c0f6 Mon Sep 17 00:00:00 2001 From: Gary Burd Date: Tue, 6 Mar 2018 10:15:48 -0800 Subject: [PATCH] Use net.Buffers to write multiple slices to connection Closes #346. --- conn.go | 17 ++++++++--------- conn_write.go | 15 +++++++++++++++ conn_write_legacy.go | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 conn_write.go create mode 100644 conn_write_legacy.go diff --git a/conn.go b/conn.go index b051e95..5f46bf4 100644 --- a/conn.go +++ b/conn.go @@ -370,7 +370,7 @@ func (c *Conn) writeFatal(err error) error { return err } -func (c *Conn) write(frameType int, deadline time.Time, bufs ...[]byte) error { +func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error { <-c.mu defer func() { c.mu <- true }() @@ -382,15 +382,14 @@ func (c *Conn) write(frameType int, deadline time.Time, bufs ...[]byte) error { } c.conn.SetWriteDeadline(deadline) - for _, buf := range bufs { - if len(buf) > 0 { - _, err := c.conn.Write(buf) - if err != nil { - return c.writeFatal(err) - } - } + if len(buf1) == 0 { + _, err = c.conn.Write(buf0) + } else { + err = c.writeBufs(buf0, buf1) + } + if err != nil { + return c.writeFatal(err) } - if frameType == CloseMessage { c.writeFatal(ErrCloseSent) } diff --git a/conn_write.go b/conn_write.go new file mode 100644 index 0000000..a509a21 --- /dev/null +++ b/conn_write.go @@ -0,0 +1,15 @@ +// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.8 + +package websocket + +import "net" + +func (c *Conn) writeBufs(bufs ...[]byte) error { + b := net.Buffers(bufs) + _, err := b.WriteTo(c.conn) + return err +} diff --git a/conn_write_legacy.go b/conn_write_legacy.go new file mode 100644 index 0000000..37edaff --- /dev/null +++ b/conn_write_legacy.go @@ -0,0 +1,18 @@ +// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !go1.8 + +package websocket + +func (c *Conn) writeBufs(bufs ...[]byte) error { + for _, buf := range bufs { + if len(buf) > 0 { + if _, err := c.conn.Write(buf); err != nil { + return err + } + } + } + return nil +}