Skip to content

Commit f3dfae6

Browse files
committed
custom TLS for HTTP client
1 parent bc02113 commit f3dfae6

File tree

9 files changed

+55
-11
lines changed

9 files changed

+55
-11
lines changed

internal/configtypes/tls.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ func (c TLSConfig) ToGoTLSConfig(logTraceEntity string) (*tls.Config, error) {
3737
}
3838
logger := log.With().Str("entity", logTraceEntity).Logger()
3939
logger.Debug().Msg("TLS enabled")
40-
return makeTLSConfig(c, logger, os.ReadFile, os.Stat)
40+
tlsConfig, err := makeTLSConfig(c, logger, os.ReadFile, os.Stat)
41+
if err != nil {
42+
return nil, fmt.Errorf("error make TLS config (for %s): %w", logTraceEntity, err)
43+
}
44+
return tlsConfig, nil
4145
}
4246

4347
// ReadFileFunc is like os.ReadFile but helps in testing.

internal/configtypes/types.go

+1
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ func (d *HttpStatusToCodeTransforms) Decode(value string) error {
526526
}
527527

528528
type ProxyCommonHTTP struct {
529+
TLS TLSConfig `mapstructure:"tls" json:"tls" envconfig:"tls" yaml:"tls" toml:"tls"`
529530
// StaticHeaders is a static set of key/value pairs to attach to HTTP proxy request as
530531
// headers. Headers received from HTTP client request or metadata from GRPC client request
531532
// both have priority over values set in StaticHttpHeaders map.

internal/proxy/connect_http.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package proxy
22

33
import (
44
"context"
5+
"fmt"
56

67
"github.com/centrifugal/centrifugo/v5/internal/proxyproto"
78
)
@@ -16,9 +17,13 @@ var _ ConnectProxy = (*HTTPConnectProxy)(nil)
1617

1718
// NewHTTPConnectProxy ...
1819
func NewHTTPConnectProxy(p Config) (*HTTPConnectProxy, error) {
20+
httpClient, err := proxyHTTPClient(p, "connect_proxy")
21+
if err != nil {
22+
return nil, fmt.Errorf("error creating HTTP client: %w", err)
23+
}
1924
return &HTTPConnectProxy{
2025
config: p,
21-
httpCaller: NewHTTPCaller(proxyHTTPClient(p.Timeout.ToDuration())),
26+
httpCaller: NewHTTPCaller(httpClient),
2227
}, nil
2328
}
2429

internal/proxy/http.go

+13-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package proxy
33
import (
44
"bytes"
55
"context"
6+
"crypto/tls"
67
"errors"
78
"fmt"
89
"io"
910
"net/http"
1011
"slices"
1112
"strings"
12-
"time"
1313

1414
"github.com/centrifugal/centrifugo/v5/internal/configtypes"
1515
"github.com/centrifugal/centrifugo/v5/internal/proxyproto"
@@ -45,13 +45,22 @@ func NewHTTPCaller(httpClient *http.Client) HTTPCaller {
4545
}
4646
}
4747

48-
func proxyHTTPClient(timeout time.Duration) *http.Client {
48+
func proxyHTTPClient(p configtypes.Proxy, logTraceEntity string) (*http.Client, error) {
49+
var tlsConfig *tls.Config
50+
if p.HTTP.TLS.Enabled {
51+
var err error
52+
tlsConfig, err = p.HTTP.TLS.ToGoTLSConfig(logTraceEntity)
53+
if err != nil {
54+
return nil, fmt.Errorf("error creating TLS config: %w", err)
55+
}
56+
}
4957
return &http.Client{
5058
Transport: &http.Transport{
5159
MaxIdleConnsPerHost: DefaultMaxIdleConnsPerHost,
60+
TLSClientConfig: tlsConfig,
5261
},
53-
Timeout: timeout,
54-
}
62+
Timeout: p.Timeout.ToDuration(),
63+
}, nil
5564
}
5665

5766
type statusCodeError struct {

internal/proxy/publish_http.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package proxy
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
67

78
"github.com/centrifugal/centrifugo/v5/internal/proxyproto"
89
)
@@ -29,8 +30,12 @@ var _ PublishProxy = (*HTTPPublishProxy)(nil)
2930

3031
// NewHTTPPublishProxy ...
3132
func NewHTTPPublishProxy(p Config) (*HTTPPublishProxy, error) {
33+
httpClient, err := proxyHTTPClient(p, "publish_proxy")
34+
if err != nil {
35+
return nil, fmt.Errorf("error creating HTTP client: %w", err)
36+
}
3237
return &HTTPPublishProxy{
33-
httpCaller: NewHTTPCaller(proxyHTTPClient(p.Timeout.ToDuration())),
38+
httpCaller: NewHTTPCaller(httpClient),
3439
config: p,
3540
}, nil
3641
}

internal/proxy/refresh_http.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package proxy
22

33
import (
44
"context"
5+
"fmt"
56

67
"github.com/centrifugal/centrifugo/v5/internal/proxyproto"
78
)
@@ -23,9 +24,13 @@ var _ RefreshProxy = (*HTTPRefreshProxy)(nil)
2324

2425
// NewHTTPRefreshProxy ...
2526
func NewHTTPRefreshProxy(p Config) (*HTTPRefreshProxy, error) {
27+
httpClient, err := proxyHTTPClient(p, "refresh_proxy")
28+
if err != nil {
29+
return nil, fmt.Errorf("error creating HTTP client: %w", err)
30+
}
2631
return &HTTPRefreshProxy{
2732
config: p,
28-
httpCaller: NewHTTPCaller(proxyHTTPClient(p.Timeout.ToDuration())),
33+
httpCaller: NewHTTPCaller(httpClient),
2934
}, nil
3035
}
3136

internal/proxy/rpc_http.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package proxy
22

33
import (
44
"context"
5+
"fmt"
56

67
"github.com/centrifugal/centrifugo/v5/internal/proxyproto"
78
)
@@ -16,9 +17,13 @@ var _ RPCProxy = (*HTTPRPCProxy)(nil)
1617

1718
// NewHTTPRPCProxy ...
1819
func NewHTTPRPCProxy(p Config) (*HTTPRPCProxy, error) {
20+
httpClient, err := proxyHTTPClient(p, "rpc_proxy")
21+
if err != nil {
22+
return nil, fmt.Errorf("error creating HTTP client: %w", err)
23+
}
1924
return &HTTPRPCProxy{
2025
config: p,
21-
httpCaller: NewHTTPCaller(proxyHTTPClient(p.Timeout.ToDuration())),
26+
httpCaller: NewHTTPCaller(httpClient),
2227
}, nil
2328
}
2429

internal/proxy/sub_refresh_http.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package proxy
22

33
import (
44
"context"
5+
"fmt"
56

67
"github.com/centrifugal/centrifugo/v5/internal/proxyproto"
78
)
@@ -24,9 +25,13 @@ var _ SubRefreshProxy = (*HTTPSubRefreshProxy)(nil)
2425

2526
// NewHTTPSubRefreshProxy ...
2627
func NewHTTPSubRefreshProxy(p Config) (*HTTPSubRefreshProxy, error) {
28+
httpClient, err := proxyHTTPClient(p, "sub_refresh_proxy")
29+
if err != nil {
30+
return nil, fmt.Errorf("error creating HTTP client: %w", err)
31+
}
2732
return &HTTPSubRefreshProxy{
2833
config: p,
29-
httpCaller: NewHTTPCaller(proxyHTTPClient(p.Timeout.ToDuration())),
34+
httpCaller: NewHTTPCaller(httpClient),
3035
}, nil
3136
}
3237

internal/proxy/subscribe_http.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package proxy
22

33
import (
44
"context"
5+
"fmt"
56

67
"github.com/centrifugal/centrifugo/v5/internal/proxyproto"
78
)
@@ -16,9 +17,13 @@ var _ SubscribeProxy = (*HTTPSubscribeProxy)(nil)
1617

1718
// NewHTTPSubscribeProxy ...
1819
func NewHTTPSubscribeProxy(p Config) (*HTTPSubscribeProxy, error) {
20+
httpClient, err := proxyHTTPClient(p, "subscribe_proxy")
21+
if err != nil {
22+
return nil, fmt.Errorf("error creating HTTP client: %w", err)
23+
}
1924
return &HTTPSubscribeProxy{
2025
config: p,
21-
httpCaller: NewHTTPCaller(proxyHTTPClient(p.Timeout.ToDuration())),
26+
httpCaller: NewHTTPCaller(httpClient),
2227
}, nil
2328
}
2429

0 commit comments

Comments
 (0)