Explorar el Código

Get rid of unrequired buffering for tls records

tags/v2.0.0-rc1
9seconds hace 5 años
padre
commit
841a4d2227

+ 5
- 22
mtglib/internal/faketls/record/pools.go Ver fichero

1
 package record
1
 package record
2
 
2
 
3
 import (
3
 import (
4
-	"bytes"
5
 	"sync"
4
 	"sync"
6
 )
5
 )
7
 
6
 
8
-var (
9
-	recordPool = sync.Pool{
10
-		New: func() interface{} {
11
-			return &Record{}
12
-		},
13
-	}
14
-	bytesBufferPool = sync.Pool{
15
-		New: func() interface{} {
16
-			return &bytes.Buffer{}
17
-		},
18
-	}
19
-)
7
+var recordPool = sync.Pool{
8
+	New: func() interface{} {
9
+		return &Record{}
10
+	},
11
+}
20
 
12
 
21
 func AcquireRecord() *Record {
13
 func AcquireRecord() *Record {
22
 	return recordPool.Get().(*Record)
14
 	return recordPool.Get().(*Record)
26
 	r.Reset()
18
 	r.Reset()
27
 	recordPool.Put(r)
19
 	recordPool.Put(r)
28
 }
20
 }
29
-
30
-func acquireBytesBuffer() *bytes.Buffer {
31
-	return bytesBufferPool.Get().(*bytes.Buffer)
32
-}
33
-
34
-func releaseBytesBuffer(buf *bytes.Buffer) {
35
-	buf.Reset()
36
-	bytesBufferPool.Put(buf)
37
-}

+ 13
- 10
mtglib/internal/faketls/record/record.go Ver fichero

61
 }
61
 }
62
 
62
 
63
 func (r *Record) Dump(writer io.Writer) error {
63
 func (r *Record) Dump(writer io.Writer) error {
64
-	buf := acquireBytesBuffer()
65
-	defer releaseBytesBuffer(buf)
64
+	buf := [2]byte{byte(r.Type), 0}
65
+	if _, err := writer.Write(buf[:1]); err != nil {
66
+		return fmt.Errorf("cannot dump record type: %w", err)
67
+	}
66
 
68
 
67
-	bufSlice := [2]byte{byte(r.Type), 0}
68
-	buf.Write(bufSlice[:1])
69
+	binary.BigEndian.PutUint16(buf[:], uint16(r.Version))
69
 
70
 
70
-	binary.BigEndian.PutUint16(bufSlice[:], uint16(r.Version))
71
-	buf.Write(bufSlice[:])
71
+	if _, err := writer.Write(buf[:]); err != nil {
72
+		return fmt.Errorf("cannot dump version: %w", err)
73
+	}
72
 
74
 
73
-	binary.BigEndian.PutUint16(bufSlice[:], uint16(r.Payload.Len()))
74
-	buf.Write(bufSlice[:])
75
+	binary.BigEndian.PutUint16(buf[:], uint16(r.Payload.Len()))
75
 
76
 
76
-	buf.Write(r.Payload.Bytes())
77
+	if _, err := writer.Write(buf[:]); err != nil {
78
+		return fmt.Errorf("cannot dump payload length: %w", err)
79
+	}
77
 
80
 
78
-	if _, err := buf.WriteTo(writer); err != nil {
81
+	if _, err := writer.Write(r.Payload.Bytes()); err != nil {
79
 		return fmt.Errorf("cannot dump record: %w", err)
82
 		return fmt.Errorf("cannot dump record: %w", err)
80
 	}
83
 	}
81
 
84
 

+ 1
- 3
mtglib/internal/obfuscated2/conn.go Ver fichero

32
 	payload := buf.Bytes()
32
 	payload := buf.Bytes()
33
 	c.Encryptor.XORKeyStream(payload, payload)
33
 	c.Encryptor.XORKeyStream(payload, payload)
34
 
34
 
35
-	n, err := buf.WriteTo(c.Conn)
36
-
37
-	return int(n), err // nolint: wrapcheck
35
+	return c.Conn.Write(payload)
38
 }
36
 }

Loading…
Cancelar
Guardar