Sfoglia il codice sorgente

optimize ota writer

Darien Raymond 8 anni fa
parent
commit
47ba054ad5
1 ha cambiato i file con 11 aggiunte e 11 eliminazioni
  1. 11 11
      proxy/shadowsocks/ota.go

+ 11 - 11
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
-}