1
1
package fasthttp
2
2
3
3
import (
4
+ "crypto/tls"
4
5
"net"
5
6
"sync"
6
7
)
7
8
8
9
type perIPConnCounter struct {
9
- pool sync.Pool
10
- lock sync.Mutex
11
- m map [uint32 ]int
10
+ perIPConnPool sync.Pool
11
+ perIPTLSConnPool sync.Pool
12
+ lock sync.Mutex
13
+ m map [uint32 ]int
12
14
}
13
15
14
16
func (cc * perIPConnCounter ) Register (ip uint32 ) int {
@@ -43,8 +45,30 @@ type perIPConn struct {
43
45
perIPConnCounter * perIPConnCounter
44
46
}
45
47
46
- func acquirePerIPConn (conn net.Conn , ip uint32 , counter * perIPConnCounter ) * perIPConn {
47
- v := counter .pool .Get ()
48
+ type perIPTLSConn struct {
49
+ * tls.Conn
50
+
51
+ ip uint32
52
+ perIPConnCounter * perIPConnCounter
53
+ }
54
+
55
+ func acquirePerIPConn (conn net.Conn , ip uint32 , counter * perIPConnCounter ) net.Conn {
56
+ if tlcConn , ok := conn .(* tls.Conn ); ok {
57
+ v := counter .perIPTLSConnPool .Get ()
58
+ if v == nil {
59
+ return & perIPTLSConn {
60
+ perIPConnCounter : counter ,
61
+ Conn : tlcConn ,
62
+ ip : ip ,
63
+ }
64
+ }
65
+ c := v .(* perIPConn )
66
+ c .Conn = conn
67
+ c .ip = ip
68
+ return c
69
+ }
70
+
71
+ v := counter .perIPConnPool .Get ()
48
72
if v == nil {
49
73
return & perIPConn {
50
74
perIPConnCounter : counter ,
@@ -58,15 +82,19 @@ func acquirePerIPConn(conn net.Conn, ip uint32, counter *perIPConnCounter) *perI
58
82
return c
59
83
}
60
84
61
- func releasePerIPConn (c * perIPConn ) {
85
+ func (c * perIPConn ) Close () error {
86
+ err := c .Conn .Close ()
87
+ c .perIPConnCounter .Unregister (c .ip )
62
88
c .Conn = nil
63
- c .perIPConnCounter .pool .Put (c )
89
+ c .perIPConnCounter .perIPConnPool .Put (c )
90
+ return err
64
91
}
65
92
66
- func (c * perIPConn ) Close () error {
93
+ func (c * perIPTLSConn ) Close () error {
67
94
err := c .Conn .Close ()
68
95
c .perIPConnCounter .Unregister (c .ip )
69
- releasePerIPConn (c )
96
+ c .Conn = nil
97
+ c .perIPConnCounter .perIPTLSConnPool .Put (c )
70
98
return err
71
99
}
72
100
0 commit comments