mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 12:54:01 +03:00
Get rid of unrequired buffering for tls records
This commit is contained in:
@@ -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)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user