Skip to content
This repository was archived by the owner on Jan 24, 2025. It is now read-only.

Commit

Permalink
Merge pull request #2 from FZambia/fix_address_parsing
Browse files Browse the repository at this point in the history
Fix non-ip address parsing
  • Loading branch information
FZambia authored Feb 23, 2021
2 parents 59e6a61 + 9d86212 commit 445a293
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 3 deletions.
5 changes: 5 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
v0.2.0
======

* Fix parsing connection address with non-ip host and without `tcp://` scheme, like `localhost:3301` - previously connecting with such an address resulted in configuration error

v0.1.1
======

Expand Down
11 changes: 8 additions & 3 deletions connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import (
"bytes"
"context"
"errors"
"fmt"
"io"
"net"
"net/url"
"runtime"
"strconv"
"strings"
"sync"
"sync/atomic"
"time"
Expand Down Expand Up @@ -400,15 +402,18 @@ func (conn *Connection) timeouts() {
}

func optsFromAddr(addr string, opts Opts) (Opts, error) {
u, err := url.Parse(addr)
if err != nil {
if _, _, err := net.SplitHostPort(addr); err == nil {
if !strings.HasPrefix(addr, "tcp://") && !strings.HasPrefix(addr, "unix://") {
if host, port, err := net.SplitHostPort(addr); err == nil && host != "" && port != "" {
opts.network = "tcp"
opts.address = addr
return opts, nil
}
return opts, errors.New("malformed connection address")
}
u, err := url.Parse(addr)
if err != nil {
return opts, fmt.Errorf("malformed connection address URL: %w", err)
}
switch u.Scheme {
case "tcp":
opts.network = "tcp"
Expand Down
70 changes: 70 additions & 0 deletions connection_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package tarantool

import (
"testing"
"time"

"github.com/stretchr/testify/require"
)

func TestRedisShard_OptsFromAddr(t *testing.T) {
opts, err := optsFromAddr("127.0.0.1:3301", Opts{})
require.NoError(t, err)
require.Equal(t, "tcp", opts.network)
require.Equal(t, "127.0.0.1:3301", opts.address)

opts, err = optsFromAddr("localhost:3301", Opts{})
require.NoError(t, err)
require.Equal(t, "tcp", opts.network)
require.Equal(t, "localhost:3301", opts.address)

_, err = optsFromAddr("localhost:", Opts{})
require.Error(t, err)

opts, err = optsFromAddr("tcp://localhost:3301", Opts{})
require.NoError(t, err)
require.Equal(t, "tcp", opts.network)
require.Equal(t, "localhost:3301", opts.address)

opts, err = optsFromAddr("tcp://user:pass@localhost:3301", Opts{})
require.NoError(t, err)
require.Equal(t, "tcp", opts.network)
require.Equal(t, "localhost:3301", opts.address)
require.Equal(t, "user", opts.User)
require.Equal(t, "pass", opts.Password)

opts, err = optsFromAddr("tcp://localhost:3301/rest", Opts{})
require.NoError(t, err)
require.Equal(t, "tcp", opts.network)
require.Equal(t, "localhost:3301", opts.address)
require.Equal(t, "", opts.Password)

opts, err = optsFromAddr("unix://user:pass@/var/run/tarantool/my_instance.sock", Opts{})
require.NoError(t, err)
require.Equal(t, "unix", opts.network)
require.Equal(t, "/var/run/tarantool/my_instance.sock", opts.address)
require.Equal(t, "pass", opts.Password)
require.Equal(t, "user", opts.User)

opts, err = optsFromAddr("tcp://[fe80::1]:3301", Opts{})
require.NoError(t, err)
require.Equal(t, "tcp", opts.network)
require.Equal(t, "[fe80::1]:3301", opts.address)

opts, err = optsFromAddr("redis://127.0.0.1:3301", Opts{})
require.Error(t, err)

opts, err = optsFromAddr("tcp://:pass@localhost:3301?connect_timeout=2s&read_timeout=3s&write_timeout=4s&request_timeout=5s&reconnect_delay=6s&max_reconnects=7&skip_schema=true", Opts{})
require.NoError(t, err)
require.Equal(t, "tcp", opts.network)
require.Equal(t, "localhost:3301", opts.address)
require.Equal(t, "pass", opts.Password)
require.Equal(t, "", opts.User)
require.Equal(t, 2*time.Second, opts.ConnectTimeout)
require.Equal(t, 3*time.Second, opts.ReadTimeout)
require.Equal(t, 4*time.Second, opts.WriteTimeout)
require.Equal(t, 5*time.Second, opts.RequestTimeout)
require.Equal(t, 6*time.Second, opts.ReconnectDelay)
require.Equal(t, uint64(7), opts.MaxReconnects)
require.True(t, opts.SkipSchema)
}

0 comments on commit 445a293

Please sign in to comment.