Get rid of unrequired buffering for tls records

This commit is contained in:
9seconds
2021-03-29 18:56:08 +03:00
parent 3cacd74e12
commit 841a4d2227
3 changed files with 19 additions and 35 deletions
+2 -19
View File
@@ -1,22 +1,14 @@
package record package record
import ( import (
"bytes"
"sync" "sync"
) )
var ( var recordPool = sync.Pool{
recordPool = sync.Pool{
New: func() interface{} { New: func() interface{} {
return &Record{} return &Record{}
}, },
} }
bytesBufferPool = sync.Pool{
New: func() interface{} {
return &bytes.Buffer{}
},
}
)
func AcquireRecord() *Record { func AcquireRecord() *Record {
return recordPool.Get().(*Record) return recordPool.Get().(*Record)
@@ -26,12 +18,3 @@ func ReleaseRecord(r *Record) {
r.Reset() r.Reset()
recordPool.Put(r) recordPool.Put(r)
} }
func acquireBytesBuffer() *bytes.Buffer {
return bytesBufferPool.Get().(*bytes.Buffer)
}
func releaseBytesBuffer(buf *bytes.Buffer) {
buf.Reset()
bytesBufferPool.Put(buf)
}
+13 -10
View File
@@ -61,21 +61,24 @@ func (r *Record) Read(reader io.Reader) error {
} }
func (r *Record) Dump(writer io.Writer) error { func (r *Record) Dump(writer io.Writer) error {
buf := acquireBytesBuffer() buf := [2]byte{byte(r.Type), 0}
defer releaseBytesBuffer(buf) if _, err := writer.Write(buf[:1]); err != nil {
return fmt.Errorf("cannot dump record type: %w", err)
}
bufSlice := [2]byte{byte(r.Type), 0} binary.BigEndian.PutUint16(buf[:], uint16(r.Version))
buf.Write(bufSlice[:1])
binary.BigEndian.PutUint16(bufSlice[:], uint16(r.Version)) if _, err := writer.Write(buf[:]); err != nil {
buf.Write(bufSlice[:]) return fmt.Errorf("cannot dump version: %w", err)
}
binary.BigEndian.PutUint16(bufSlice[:], uint16(r.Payload.Len())) binary.BigEndian.PutUint16(buf[:], uint16(r.Payload.Len()))
buf.Write(bufSlice[:])
buf.Write(r.Payload.Bytes()) if _, err := writer.Write(buf[:]); err != nil {
return fmt.Errorf("cannot dump payload length: %w", err)
}
if _, err := buf.WriteTo(writer); err != nil { if _, err := writer.Write(r.Payload.Bytes()); err != nil {
return fmt.Errorf("cannot dump record: %w", err) return fmt.Errorf("cannot dump record: %w", err)
} }
+1 -3
View File
@@ -32,7 +32,5 @@ func (c Conn) Write(p []byte) (int, error) {
payload := buf.Bytes() payload := buf.Bytes()
c.Encryptor.XORKeyStream(payload, payload) c.Encryptor.XORKeyStream(payload, payload)
n, err := buf.WriteTo(c.Conn) return c.Conn.Write(payload)
return int(n), err // nolint: wrapcheck
} }