From bd8ba9ed77db175e7eb9dde8b844707837e9c422 Mon Sep 17 00:00:00 2001 From: jayt106 Date: Fri, 28 May 2021 14:55:30 -0400 Subject: [PATCH 1/5] Fix RPC client doesn't handle url's without ports --- rpc/jsonrpc/client/http_json_client.go | 14 ++++++++++++++ rpc/jsonrpc/client/http_json_client_test.go | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/rpc/jsonrpc/client/http_json_client.go b/rpc/jsonrpc/client/http_json_client.go index 67cc79e6eaf..7f98638eaec 100644 --- a/rpc/jsonrpc/client/http_json_client.go +++ b/rpc/jsonrpc/client/http_json_client.go @@ -10,6 +10,7 @@ import ( "net/http" "net/url" "strings" + "time" tmsync "github.com/tendermint/tendermint/internal/libs/sync" types "github.com/tendermint/tendermint/rpc/jsonrpc/types" @@ -370,6 +371,7 @@ func makeHTTPDialer(remoteAddr string) (func(string, string) (net.Conn, error), } protocol := u.Scheme + var padding = u.Scheme // accept http(s) as an alias for tcp switch protocol { @@ -378,6 +380,18 @@ func makeHTTPDialer(remoteAddr string) (func(string, string) (net.Conn, error), } dialFn := func(proto, addr string) (net.Conn, error) { + if !u.isUnixSocket && strings.LastIndex(u.Host, ":") == -1 { + var timeout = 10 * time.Second + var host = u.Host + u.Host = fmt.Sprintf("%s:%s", host, padding) + c, e := net.DialTimeout(protocol, u.GetDialAddress(), timeout) + if e == nil { + return c, nil + } + + return nil, err + } + return net.Dial(protocol, u.GetDialAddress()) } diff --git a/rpc/jsonrpc/client/http_json_client_test.go b/rpc/jsonrpc/client/http_json_client_test.go index 4b82ff1eb4d..9a7bdf6b669 100644 --- a/rpc/jsonrpc/client/http_json_client_test.go +++ b/rpc/jsonrpc/client/http_json_client_test.go @@ -84,3 +84,18 @@ func Test_parsedURL(t *testing.T) { }) } } + +func TestMakeHTTPDialerURL(t *testing.T) { + remotes := []string{"https://foo-bar.com", "http://foo-bar.com"} + + for _, remote := range remotes { + u, err := newParsedURL(remote) + require.NoError(t, err) + dialFn, err := makeHTTPDialer(remote) + require.Nil(t, err) + + addr, err := dialFn(u.Scheme, u.GetHostWithPath()) + require.NoError(t, err) + require.NotNil(t, addr) + } +} From dc26fe60522407fc04943e6df4b3d93200d8740f Mon Sep 17 00:00:00 2001 From: jayt106 Date: Fri, 28 May 2021 15:04:15 -0400 Subject: [PATCH 2/5] update pending changelog --- CHANGELOG_PENDING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG_PENDING.md b/CHANGELOG_PENDING.md index 7d699e63a20..5ca4f708e08 100644 --- a/CHANGELOG_PENDING.md +++ b/CHANGELOG_PENDING.md @@ -105,3 +105,4 @@ Friendly reminder: We have a [bug bounty program](https://hackerone.com/tendermi - [blockchain/v1] [\#5701](https://github.com/tendermint/tendermint/pull/5701) Handle peers without blocks (@melekes) - [blockchain/v1] \#5711 Fix deadlock (@melekes) - [evidence] \#6375 Fix bug with inconsistent LightClientAttackEvidence hashing (cmwaters) +- [rpc] \#6507 fix RPC client doesn't handle url's without ports (@JayT106) From fa4366e533d396ca7134508876f39540c72e4796 Mon Sep 17 00:00:00 2001 From: jayt106 Date: Fri, 28 May 2021 15:23:52 -0400 Subject: [PATCH 3/5] nix --- rpc/jsonrpc/client/http_json_client.go | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/rpc/jsonrpc/client/http_json_client.go b/rpc/jsonrpc/client/http_json_client.go index 7f98638eaec..d6550829c99 100644 --- a/rpc/jsonrpc/client/http_json_client.go +++ b/rpc/jsonrpc/client/http_json_client.go @@ -380,19 +380,13 @@ func makeHTTPDialer(remoteAddr string) (func(string, string) (net.Conn, error), } dialFn := func(proto, addr string) (net.Conn, error) { + var timeout = 10 * time.Second if !u.isUnixSocket && strings.LastIndex(u.Host, ":") == -1 { - var timeout = 10 * time.Second - var host = u.Host - u.Host = fmt.Sprintf("%s:%s", host, padding) - c, e := net.DialTimeout(protocol, u.GetDialAddress(), timeout) - if e == nil { - return c, nil - } - - return nil, err + u.Host = fmt.Sprintf("%s:%s", u.Host, padding) + return net.DialTimeout(protocol, u.GetDialAddress(), timeout) } - return net.Dial(protocol, u.GetDialAddress()) + return net.DialTimeout(protocol, u.GetDialAddress(), timeout) } return dialFn, nil From 30608d0811386fdd4942d0bd3850d4a99159d3a9 Mon Sep 17 00:00:00 2001 From: jayt106 Date: Tue, 1 Jun 2021 14:01:23 -0400 Subject: [PATCH 4/5] consistency variable assign --- rpc/jsonrpc/client/http_json_client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc/jsonrpc/client/http_json_client.go b/rpc/jsonrpc/client/http_json_client.go index d6550829c99..71c00137bff 100644 --- a/rpc/jsonrpc/client/http_json_client.go +++ b/rpc/jsonrpc/client/http_json_client.go @@ -371,7 +371,7 @@ func makeHTTPDialer(remoteAddr string) (func(string, string) (net.Conn, error), } protocol := u.Scheme - var padding = u.Scheme + padding := u.Scheme // accept http(s) as an alias for tcp switch protocol { From ce351d97c2304fc0c9a4be6729e6980fae2dd53c Mon Sep 17 00:00:00 2001 From: jayt106 Date: Tue, 1 Jun 2021 14:08:11 -0400 Subject: [PATCH 5/5] add error url tests --- rpc/jsonrpc/client/http_json_client_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/rpc/jsonrpc/client/http_json_client_test.go b/rpc/jsonrpc/client/http_json_client_test.go index 9a7bdf6b669..5a03af51253 100644 --- a/rpc/jsonrpc/client/http_json_client_test.go +++ b/rpc/jsonrpc/client/http_json_client_test.go @@ -98,4 +98,17 @@ func TestMakeHTTPDialerURL(t *testing.T) { require.NoError(t, err) require.NotNil(t, addr) } + + errorURLs := []string{"tcp://foo-bar.com", "ftp://foo-bar.com"} + + for _, errorURL := range errorURLs { + u, err := newParsedURL(errorURL) + require.NoError(t, err) + dialFn, err := makeHTTPDialer(errorURL) + require.Nil(t, err) + + addr, err := dialFn(u.Scheme, u.GetHostWithPath()) + require.Error(t, err) + require.Nil(t, addr) + } }