@@ -113,6 +113,8 @@ type Conn interface {
113113 PeekPipeline () []Command
114114 // NetConn returns the base net.Conn connection
115115 NetConn () net.Conn
116+ // WriteBulkFrom write bulk from io.Reader, size n
117+ WriteBulkFrom (n int64 , rb io.Reader )
116118}
117119
118120// NewServer returns a new Redcon server configured on "tcp" network net.
@@ -494,6 +496,9 @@ func (c *conn) PeekPipeline() []Command {
494496func (c * conn ) NetConn () net.Conn {
495497 return c .conn
496498}
499+ func (c * conn ) WriteBulkFrom (n int64 , rb io.Reader ) {
500+ c .wr .WriteBulkFrom (n , rb )
501+ }
497502
498503// BaseWriter returns the underlying connection writer, if any
499504func BaseWriter (c Conn ) * Writer {
@@ -589,13 +594,27 @@ type Writer struct {
589594 w io.Writer
590595 b []byte
591596 err error
597+
598+ // buff use io buffer write to w(io.Writer)
599+ // for io.Copy r(io.Reader) to w(io.Writer)
600+ buff * bufio.Writer
592601}
593602
594603// NewWriter creates a new RESP writer.
595604func NewWriter (wr io.Writer ) * Writer {
596605 return & Writer {
597- w : wr ,
606+ w : wr ,
607+ buff : bufio .NewWriter (wr ),
608+ }
609+ }
610+
611+ func (w * Writer ) WriteBulkFrom (n int64 , r io.Reader ) {
612+ if w != nil && w .err != nil {
613+ return
598614 }
615+ w .buff .Write (appendPrefix (w .b , '$' , n ))
616+ io .Copy (w .buff , r )
617+ w .buff .Write ([]byte {'\r' , '\n' })
599618}
600619
601620// WriteNull writes a null to the client
@@ -656,6 +675,10 @@ func (w *Writer) SetBuffer(raw []byte) {
656675
657676// Flush writes all unflushed Write* calls to the underlying writer.
658677func (w * Writer ) Flush () error {
678+ if w .buff != nil {
679+ w .buff .Flush ()
680+ }
681+
659682 if w .err != nil {
660683 return w .err
661684 }
0 commit comments