diff --git a/redcon.go b/redcon.go index 8dd29b4..cbf0f20 100644 --- a/redcon.go +++ b/redcon.go @@ -113,6 +113,8 @@ type Conn interface { PeekPipeline() []Command // NetConn returns the base net.Conn connection NetConn() net.Conn + // WriteBulkFrom write bulk from io.Reader, size n + WriteBulkFrom(n int64, rb io.Reader) } // NewServer returns a new Redcon server configured on "tcp" network net. @@ -494,6 +496,9 @@ func (c *conn) PeekPipeline() []Command { func (c *conn) NetConn() net.Conn { return c.conn } +func (c *conn) WriteBulkFrom(n int64, rb io.Reader) { + c.wr.WriteBulkFrom(n, rb) +} // BaseWriter returns the underlying connection writer, if any func BaseWriter(c Conn) *Writer { @@ -589,13 +594,30 @@ type Writer struct { w io.Writer b []byte err error + + // use golang buff io + buff *bufio.Writer } // NewWriter creates a new RESP writer. func NewWriter(wr io.Writer) *Writer { return &Writer{ - w: wr, + w: wr, + buff: bufio.NewWriterSize(wr, maxBufferCap), + } +} + +func (w *Writer) WriteBulkFrom(n int64, rb io.Reader) { + if w != nil && w.err != nil { + return } + AppendBulkFrom(w, n, rb) +} + +func AppendBulkFrom(writer *Writer, n int64, rb io.Reader) { + writer.buff.Write(appendPrefix([]byte{}, '$', n)) + io.Copy(writer.w, rb) + writer.buff.Write([]byte{'\r', '\n'}) } // WriteNull writes a null to the client