Skip to content

Commit 105eb3b

Browse files
Add perIPTLSConn to support MaxConnsPerIP with tls connections
Otherwise calling RequestCtx.TLSConnectionState() will fail. Fixes #1770
1 parent a8fa9c0 commit 105eb3b

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

peripconn.go

+37-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package fasthttp
22

33
import (
4+
"crypto/tls"
45
"net"
56
"sync"
67
)
78

89
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
1214
}
1315

1416
func (cc *perIPConnCounter) Register(ip uint32) int {
@@ -43,8 +45,30 @@ type perIPConn struct {
4345
perIPConnCounter *perIPConnCounter
4446
}
4547

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()
4872
if v == nil {
4973
return &perIPConn{
5074
perIPConnCounter: counter,
@@ -58,15 +82,19 @@ func acquirePerIPConn(conn net.Conn, ip uint32, counter *perIPConnCounter) *perI
5882
return c
5983
}
6084

61-
func releasePerIPConn(c *perIPConn) {
85+
func (c *perIPConn) Close() error {
86+
err := c.Conn.Close()
87+
c.perIPConnCounter.Unregister(c.ip)
6288
c.Conn = nil
63-
c.perIPConnCounter.pool.Put(c)
89+
c.perIPConnCounter.perIPConnPool.Put(c)
90+
return err
6491
}
6592

66-
func (c *perIPConn) Close() error {
93+
func (c *perIPTLSConn) Close() error {
6794
err := c.Conn.Close()
6895
c.perIPConnCounter.Unregister(c.ip)
69-
releasePerIPConn(c)
96+
c.Conn = nil
97+
c.perIPConnCounter.perIPTLSConnPool.Put(c)
7098
return err
7199
}
72100

peripconn_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"testing"
55
)
66

7+
var _ connTLSer = &perIPTLSConn{}
8+
79
func TestIPxUint32(t *testing.T) {
810
t.Parallel()
911

0 commit comments

Comments
 (0)