diff --git a/fluent/fluent.go b/fluent/fluent.go index c414f97..9959d60 100644 --- a/fluent/fluent.go +++ b/fluent/fluent.go @@ -458,31 +458,40 @@ func (f *Fluent) close() { // connect establishes a new connection using the specified transport. Caller should // take care of locking muconn first. func (f *Fluent) connect(ctx context.Context) (err error) { + var conn net.Conn + switch f.Config.FluentNetwork { case "tcp": - f.conn, err = f.dialer.DialContext(ctx, + conn, err = f.dialer.DialContext(ctx, f.Config.FluentNetwork, f.Config.FluentHost+":"+strconv.Itoa(f.Config.FluentPort)) case "tls": tlsConfig := &tls.Config{InsecureSkipVerify: f.Config.TlsInsecureSkipVerify} - f.conn, err = tls.DialWithDialer( + var tlsConn *tls.Conn + tlsConn, err = tls.DialWithDialer( &net.Dialer{Timeout: f.Config.Timeout}, "tcp", f.Config.FluentHost+":"+strconv.Itoa(f.Config.FluentPort), tlsConfig, ) + if err == nil { + conn = tlsConn + } case "unix": - f.conn, err = f.dialer.DialContext(ctx, + conn, err = f.dialer.DialContext(ctx, f.Config.FluentNetwork, f.Config.FluentSocketPath) default: err = NewErrUnknownNetwork(f.Config.FluentNetwork) } - if err == nil { - f.latestReconnectTime = time.Now() + if err != nil { + return err } - return err + f.conn = conn + f.latestReconnectTime = time.Now() + + return nil } var errIsClosing = errors.New("fluent logger is closing") diff --git a/fluent/fluent_test.go b/fluent/fluent_test.go index 26c1cea..ed41dde 100644 --- a/fluent/fluent_test.go +++ b/fluent/fluent_test.go @@ -683,6 +683,34 @@ func TestNoPanicOnAsyncMultipleClose(t *testing.T) { f.Close() } +func TestNoPanicOnFailingTLSConnect(t *testing.T) { + l, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + port := l.Addr().(*net.TCPAddr).Port + l.Close() + + f, _ := New(Config{ + FluentNetwork: "tls", + FluentHost: "127.0.0.1", + FluentPort: port, + Timeout: 50 * time.Millisecond, + RetryWait: 1, + MaxRetry: 1, + }) + if f == nil { + t.Fatal("Expected a logger instance") + } + defer f.Close() + + for i := 0; i < 2; i++ { + if err := f.Post("tag", map[string]string{"log": "msg"}); err == nil { + t.Error("Expected an error posting to an unreachable TLS endpoint") + } + } +} + func TestCloseOnFailingAsyncReconnect(t *testing.T) { testcases := map[string]Config{ "with RequestAck": {