diff --git a/proxy/shadowsocks/ota.go b/proxy/shadowsocks/ota.go index 3f223863..0c8fbd26 100644 --- a/proxy/shadowsocks/ota.go +++ b/proxy/shadowsocks/ota.go @@ -123,19 +123,19 @@ func NewChunkWriter(writer io.Writer, auth *Authenticator) *ChunkWriter { func (w *ChunkWriter) Write(mb buf.MultiBuffer) error { defer mb.Release() - for _, b := range mb { - if err := w.writeInternal(b); err != nil { + for { + payloadLen, err := mb.Read(w.buffer[2+AuthSize:]) + if err != nil { return err } + serial.Uint16ToBytes(uint16(payloadLen), w.buffer[:0]) + w.auth.Authenticate(w.buffer[2+AuthSize : 2+AuthSize+payloadLen])(w.buffer[2:]) + if _, err := w.writer.Write(w.buffer[:2+AuthSize+payloadLen]); err != nil { + return err + } + if mb.IsEmpty() { + break + } } return nil } - -func (w *ChunkWriter) writeInternal(payload *buf.Buffer) error { - totalLength := payload.Len() - serial.Uint16ToBytes(uint16(totalLength), w.buffer[:0]) - w.auth.Authenticate(payload.Bytes())(w.buffer[2:]) - copy(w.buffer[2+AuthSize:], payload.Bytes()) - _, err := w.writer.Write(w.buffer[:2+AuthSize+payload.Len()]) - return err -}