Skip to content

Commit

Permalink
add tcpv4 support
Browse files Browse the repository at this point in the history
  • Loading branch information
3Xpl0it3r committed Jun 16, 2021
1 parent f267601 commit c44eeb0
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 3 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@
.pkg
/common-build/.src
vendor
server/certs/*.key
server/certs/*.crt
server/certs/*.csr
server/certs/*.srl
17 changes: 15 additions & 2 deletions server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,15 @@ import (
"github.com/weaveworks/common/signals"
)

// Listen on the named network
const (
// DefaultNetwork the host resolves to multiple IP addresses,
// Dial will try each IP address in order until one succeeds
DefaultNetwork = "tcp"
// NetworkTCPV4 for IPV4 only
NetworkTCPV4 = "tcp4"
)

// SignalHandler used by Server.
type SignalHandler interface {
// Starts the signals handler. This method is blocking, and returns only after signal is received,
Expand All @@ -44,9 +53,11 @@ type SignalHandler interface {
// Config for a Server
type Config struct {
MetricsNamespace string `yaml:"-"`
HTTPListenNetwork string `yaml:"http_listen_network"`
HTTPListenAddress string `yaml:"http_listen_address"`
HTTPListenPort int `yaml:"http_listen_port"`
HTTPConnLimit int `yaml:"http_listen_conn_limit"`
GRPCListenNetwork string `yaml:"grpc_listen_network"`
GRPCListenAddress string `yaml:"grpc_listen_address"`
GRPCListenPort int `yaml:"grpc_listen_port"`
GRPCConnLimit int `yaml:"grpc_listen_conn_limit"`
Expand Down Expand Up @@ -98,6 +109,7 @@ var infinty = time.Duration(math.MaxInt64)
// RegisterFlags adds the flags required to config this to the given FlagSet
func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
f.StringVar(&cfg.HTTPListenAddress, "server.http-listen-address", "", "HTTP server listen address.")
f.StringVar(&cfg.HTTPListenNetwork, "server.http-listen-network", DefaultNetwork, "HTTP server listen network, default tcp")
f.StringVar(&cfg.HTTPTLSConfig.TLSCertPath, "server.http-tls-cert-path", "", "HTTP server cert path.")
f.StringVar(&cfg.HTTPTLSConfig.TLSKeyPath, "server.http-tls-key-path", "", "HTTP server key path.")
f.StringVar(&cfg.HTTPTLSConfig.ClientAuth, "server.http-tls-client-auth", "", "HTTP TLS Client Auth type.")
Expand All @@ -108,6 +120,7 @@ func (cfg *Config) RegisterFlags(f *flag.FlagSet) {
f.StringVar(&cfg.GRPCTLSConfig.ClientCAs, "server.grpc-tls-ca-path", "", "GRPC TLS Client CA path.")
f.IntVar(&cfg.HTTPListenPort, "server.http-listen-port", 80, "HTTP server listen port.")
f.IntVar(&cfg.HTTPConnLimit, "server.http-conn-limit", 0, "Maximum number of simultaneous http connections, <=0 to disable")
f.StringVar(&cfg.GRPCListenNetwork, "server.grpc-listen-network", DefaultNetwork, "gRPC server listen network")
f.StringVar(&cfg.GRPCListenAddress, "server.grpc-listen-address", "", "gRPC server listen address.")
f.IntVar(&cfg.GRPCListenPort, "server.grpc-listen-port", 9095, "gRPC server listen port.")
f.IntVar(&cfg.GRPCConnLimit, "server.grpc-conn-limit", 0, "Maximum number of simultaneous grpc connections, <=0 to disable")
Expand Down Expand Up @@ -159,7 +172,7 @@ func New(cfg Config) (*Server, error) {
prometheus.MustRegister(tcpConnections)

// Setup listeners first, so we can fail early if the port is in use.
httpListener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.HTTPListenAddress, cfg.HTTPListenPort))
httpListener, err := net.Listen(cfg.HTTPListenNetwork, fmt.Sprintf("%s:%d", cfg.HTTPListenAddress, cfg.HTTPListenPort))
if err != nil {
return nil, err
}
Expand All @@ -169,7 +182,7 @@ func New(cfg Config) (*Server, error) {
httpListener = netutil.LimitListener(httpListener, cfg.HTTPConnLimit)
}

grpcListener, err := net.Listen("tcp", fmt.Sprintf("%s:%d", cfg.GRPCListenAddress, cfg.GRPCListenPort))
grpcListener, err := net.Listen(cfg.HTTPListenNetwork, fmt.Sprintf("%s:%d", cfg.GRPCListenAddress, cfg.GRPCListenPort))
if err != nil {
return nil, err
}
Expand Down
53 changes: 52 additions & 1 deletion server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,47 @@ func cancelableSleep(ctx context.Context, sleep time.Duration) error {
return ctx.Err()
}

func TestTCPv4Network(t *testing.T) {
cfg := Config{
HTTPListenNetwork: NetworkTCPV4,
HTTPListenAddress: "localhost",
HTTPListenPort: 9290,
GRPCListenNetwork: NetworkTCPV4,
GRPCListenAddress: "localhost",
GRPCListenPort: 9291,
}
t.Run("http", func(t *testing.T) {
cfg.MetricsNamespace = "testing_http_tcp4"
srv, err := New(cfg)
require.NoError(t, err)

errChan := make(chan error, 1)
go func() {
errChan <- srv.Run()
}()

require.NoError(t, srv.httpListener.Close())
require.NotNil(t, <-errChan)

// So that address is freed for further tests.
srv.GRPC.Stop()
})

t.Run("grpc", func(t *testing.T) {
cfg.MetricsNamespace = "testing_grpc_tcp4"
srv, err := New(cfg)
require.NoError(t, err)

errChan := make(chan error, 1)
go func() {
errChan <- srv.Run()
}()

require.NoError(t, srv.grpcListener.Close())
require.NotNil(t, <-errChan)
})
}

// Ensure that http and grpc servers work with no overrides to config
// (except http port because an ordinary user can't bind to default port 80)
func TestDefaultAddresses(t *testing.T) {
Expand Down Expand Up @@ -399,8 +440,10 @@ func TestHTTPInstrumentationMetrics(t *testing.T) {

func TestRunReturnsError(t *testing.T) {
cfg := Config{
HTTPListenNetwork: DefaultNetwork,
HTTPListenAddress: "localhost",
HTTPListenPort: 9190,
HTTPListenPort: 9090,
GRPCListenNetwork: DefaultNetwork,
GRPCListenAddress: "localhost",
GRPCListenPort: 9191,
}
Expand Down Expand Up @@ -441,8 +484,10 @@ func TestMiddlewareLogging(t *testing.T) {
var level logging.Level
level.Set("info")
cfg := Config{
HTTPListenNetwork: DefaultNetwork,
HTTPListenAddress: "localhost",
HTTPListenPort: 9192,
GRPCListenNetwork: DefaultNetwork,
GRPCListenAddress: "localhost",
HTTPMiddleware: []middleware.Interface{middleware.Logging},
MetricsNamespace: "testing_logging",
Expand Down Expand Up @@ -474,6 +519,7 @@ func TestTLSServer(t *testing.T) {
require.NoError(t, err)

cfg := Config{
HTTPListenNetwork: DefaultNetwork,
HTTPListenAddress: "localhost",
HTTPListenPort: 9193,
HTTPTLSConfig: node_https.TLSStruct{
Expand All @@ -489,6 +535,7 @@ func TestTLSServer(t *testing.T) {
ClientCAs: "certs/root.crt",
},
MetricsNamespace: "testing_tls",
GRPCListenNetwork: DefaultNetwork,
GRPCListenAddress: "localhost",
GRPCListenPort: 9194,
}
Expand Down Expand Up @@ -579,8 +626,10 @@ func TestLogSourceIPs(t *testing.T) {
level.Set("debug")
fake := FakeLogger{}
cfg := Config{
HTTPListenNetwork: DefaultNetwork,
HTTPListenAddress: "localhost",
HTTPListenPort: 9195,
GRPCListenNetwork: DefaultNetwork,
GRPCListenAddress: "localhost",
HTTPMiddleware: []middleware.Interface{middleware.Logging},
MetricsNamespace: "testing_mux",
Expand Down Expand Up @@ -609,8 +658,10 @@ func TestLogSourceIPs(t *testing.T) {

func TestStopWithDisabledSignalHandling(t *testing.T) {
cfg := Config{
HTTPListenNetwork: DefaultNetwork,
HTTPListenAddress: "localhost",
HTTPListenPort: 9198,
GRPCListenNetwork: DefaultNetwork,
GRPCListenAddress: "localhost",
GRPCListenPort: 9199,
}
Expand Down

0 comments on commit c44eeb0

Please sign in to comment.