From d31f376555b7bc87935926ce456aeb15f609c0de Mon Sep 17 00:00:00 2001 From: Marco Munizaga Date: Wed, 12 Jun 2024 16:37:38 -0700 Subject: [PATCH] PR comments --- multiaddr_test.go | 19 ++++++++++++++++++- transcoders.go | 12 ++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/multiaddr_test.go b/multiaddr_test.go index 8686cd9..6d160b4 100644 --- a/multiaddr_test.go +++ b/multiaddr_test.go @@ -192,6 +192,11 @@ var good = []string{ "/ip4/127.0.0.1/tcp/127/wss", "/ip4/127.0.0.1/tcp/127/webrtc-direct", "/ip4/127.0.0.1/tcp/127/webrtc", + "/http-path/tmp%2Fbar", + "/http-path/tmp%2Fbar%2Fbaz", + "/http-path/foo", + "/ip4/127.0.0.1/tcp/0/p2p/12D3KooWCryG7Mon9orvQxcS1rYZjotPgpwoJNHHKcLLfE4Hf5mV/http-path/foo", + "/ip4/127.0.0.1/tcp/443/tls/sni/example.com/http/http-path/foo", } func TestConstructSucceeds(t *testing.T) { @@ -927,16 +932,28 @@ func TestDNS(t *testing.T) { func TestHTTPPath(t *testing.T) { t.Run("bad addr", func(t *testing.T) { - badAddr := "/http-path/thisIsMissingAfullBytes%f" + badAddr := "/http-path/thisIsMissingAfullByte%f" _, err := NewMultiaddr(badAddr) require.Error(t, err) }) + t.Run("only reads the http-path part", func(t *testing.T) { + addr := "/http-path/tmp%2Fbar/p2p-circuit" // The http-path only reference the part immediately after it. It does not include the rest of the multiaddr (like the /path component sometimes does) + m, err := NewMultiaddr(addr) + require.NoError(t, err) + m.ValueForProtocol(P_HTTP_PATH) + v, err := m.ValueForProtocol(P_HTTP_PATH) + require.NoError(t, err) + require.Equal(t, "tmp%2Fbar", v) + }) + t.Run("round trip", func(t *testing.T) { cases := []string{ "/http-path/tmp%2Fbar", "/http-path/tmp%2Fbar%2Fbaz", "/http-path/foo", + "/ip4/127.0.0.1/tcp/0/p2p/12D3KooWCryG7Mon9orvQxcS1rYZjotPgpwoJNHHKcLLfE4Hf5mV/http-path/foo", + "/ip4/127.0.0.1/tcp/443/tls/sni/example.com/http/http-path/foo", } for _, c := range cases { m, err := NewMultiaddr(c) diff --git a/transcoders.go b/transcoders.go index 18d7a5a..0d0327e 100644 --- a/transcoders.go +++ b/transcoders.go @@ -460,13 +460,25 @@ var TranscoderHTTPPath = NewTranscoderFromFunctions(httpPathStB, httpPathBtS, va func httpPathStB(s string) ([]byte, error) { unescaped, err := url.QueryUnescape(s) + if err != nil { + return nil, err + } + if len(unescaped) == 0 { + return nil, fmt.Errorf("empty http path is not allowed") + } return []byte(unescaped), err } func httpPathBtS(b []byte) (string, error) { + if len(b) == 0 { + return "", fmt.Errorf("empty http path is not allowed") + } return url.QueryEscape(string(b)), nil } func validateHTTPPath(b []byte) error { + if len(b) == 0 { + return fmt.Errorf("empty http path is not allowed") + } return nil // We can represent any byte slice when we escape it. }