Skip to content

Commit 37ccfe1

Browse files
authored
Merge pull request #3 from Revolyssup/fixpanic
fix: panic on failed upstream connection
2 parents 163a911 + 20000ea commit 37ccfe1

2 files changed

Lines changed: 19 additions & 11 deletions

File tree

pkg/proxy/reverseproxy.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616

1717
const bufferSize = 32 * 1024
1818

19-
// Service remains the same
19+
// Service holds resources shared across multiple reverse proxy instances
2020
type Service struct {
2121
buf *utils.Pool[[]byte]
2222
log *logger.Logger
@@ -33,48 +33,51 @@ func NewService(log *logger.Logger) *Service {
3333

3434
type UpgradeHandler func(http.ResponseWriter, *http.Request, net.Conn, *http.Response)
3535

36-
type ConnPool struct {
36+
type connPool struct {
3737
target *url.URL
3838
pool *utils.Pool[net.Conn]
3939
logger *logger.Logger
4040
}
4141

42-
func NewConnPool(target *url.URL, logger *logger.Logger) *ConnPool {
43-
return &ConnPool{
42+
func newconnPool(target *url.URL, logger *logger.Logger) *connPool {
43+
return &connPool{
4444
target: target,
4545
pool: utils.NewPool(func() net.Conn {
46-
//TODO: Is it a good idea to ignore error here?
47-
conn, _ := net.Dial("tcp", target.Host)
46+
conn, err := net.Dial("tcp", target.Host)
47+
if err != nil {
48+
logger.Errorf("Failed to create connection to %s: %v", target.Host, err)
49+
return nil
50+
}
4851
return conn
4952
}),
5053
logger: logger.WithComponent("conn_pool"),
5154
}
5255
}
5356

54-
func (p *ConnPool) Get() (net.Conn, error) {
57+
func (p *connPool) Get() (net.Conn, error) {
5558
conn := p.pool.Get()
5659
if conn == nil {
5760
return nil, fmt.Errorf("failed to create connection to %s", p.target.Host)
5861
}
5962
return conn, nil
6063
}
6164

62-
func (p *ConnPool) Put(conn net.Conn) {
65+
func (p *connPool) Put(conn net.Conn) {
6366
p.pool.Put(conn)
6467
}
6568

6669
type ReverseProxy struct {
6770
logger *logger.Logger
6871
service *Service
69-
connPool *ConnPool
72+
connPool *connPool
7073
targetURL *url.URL
7174
}
7275

7376
func NewReverseProxy(logger *logger.Logger, service *Service, targetURL *url.URL) *ReverseProxy {
7477
return &ReverseProxy{
7578
logger: logger.WithComponent("reverse_proxy"),
7679
service: service,
77-
connPool: NewConnPool(targetURL, logger),
80+
connPool: newconnPool(targetURL, logger),
7881
targetURL: targetURL,
7982
}
8083
}

pkg/utils/utils.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ func NewPool[T any](newFunc func() T) *Pool[T] {
1919
func (p *Pool[T]) Get() T {
2020
item := p.pool.Get()
2121
if item == nil {
22-
item = p.pool.New().(T)
22+
it := p.pool.New()
23+
if it == nil {
24+
var zero T
25+
return zero
26+
}
27+
item = it.(T)
2328
}
2429
return item.(T)
2530
}

0 commit comments

Comments
 (0)