Skip to content

Commit 2f09f41

Browse files
committed
fix(api): multiaddr is now a slice, handle it in parsing as such
1 parent fc61c96 commit 2f09f41

File tree

4 files changed

+32
-37
lines changed

4 files changed

+32
-37
lines changed

pkg/api/peer.go

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,14 @@ func (s *Service) peerConnectHandler(w http.ResponseWriter, r *http.Request) {
2424

2525
mux.Vars(r)["multi-address"] = "/" + mux.Vars(r)["multi-address"]
2626
paths := struct {
27-
MultiAddress string `map:"multi-address" validate:"required"`
27+
MultiAddress multiaddr.Multiaddr `map:"multi-address" validate:"required"`
2828
}{}
2929
if response := s.mapStructure(mux.Vars(r), &paths); response != nil {
3030
response("invalid path params", logger, w)
3131
return
3232
}
3333

34-
mAddr, err := multiaddr.NewMultiaddr(paths.MultiAddress)
35-
if err != nil {
36-
logger.Debug("invalid multiaddress", "address", paths.MultiAddress, "error", err)
37-
jsonhttp.BadRequest(w, jsonhttp.StatusResponse{
38-
Code: http.StatusBadRequest,
39-
Message: "invalid path params",
40-
Reasons: []jsonhttp.Reason{
41-
{
42-
Field: "multi-address",
43-
Error: err.Error(),
44-
},
45-
},
46-
})
47-
return
48-
}
49-
50-
bzzAddr, err := s.p2p.Connect(r.Context(), []multiaddr.Multiaddr{mAddr})
34+
bzzAddr, err := s.p2p.Connect(r.Context(), []multiaddr.Multiaddr{paths.MultiAddress})
5135

5236
if err != nil {
5337
logger.Debug("p2p connect failed", "addresses", paths.MultiAddress, "error", err)

pkg/api/peer_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ func TestConnect(t *testing.T) {
6262
})
6363

6464
t.Run("ok", func(t *testing.T) {
65-
t.Parallel()
6665
jsonhttptest.Request(t, testServer, http.MethodPost, "/connect"+underlay, http.StatusOK,
6766
jsonhttptest.WithExpectedJSONResponse(api.PeerConnectResponse{
6867
Address: overlay.String(),
@@ -71,7 +70,6 @@ func TestConnect(t *testing.T) {
7170
})
7271

7372
t.Run("error", func(t *testing.T) {
74-
t.Parallel()
7573
jsonhttptest.Request(t, testServer, http.MethodPost, "/connect"+errorUnderlay, http.StatusInternalServerError,
7674
jsonhttptest.WithExpectedJSONResponse(jsonhttp.StatusResponse{
7775
Code: http.StatusInternalServerError,
@@ -81,7 +79,6 @@ func TestConnect(t *testing.T) {
8179
})
8280

8381
t.Run("error - add peer", func(t *testing.T) {
84-
t.Parallel()
8582
testServer, _, _, _ := newTestServer(t, testServerOptions{
8683
P2P: mock.New(mock.WithConnectFunc(func(ctx context.Context, addrs []ma.Multiaddr) (*bzz.Address, error) {
8784
for _, addr := range addrs {

pkg/api/util.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,23 @@ func mapStructure(input, output any, hooks map[string]func(v string) (string, er
210210
case reflect.String:
211211
field.SetString(value)
212212
case reflect.Slice:
213-
if value == "" {
214-
return nil // Nil slice.
215-
}
216-
val, err := hex.DecodeString(value)
217-
if err != nil {
218-
return err
213+
switch field.Type() {
214+
case reflect.TypeFor[multiaddr.Multiaddr]():
215+
val, err := multiaddr.NewMultiaddr(value)
216+
if err != nil {
217+
return err
218+
}
219+
field.Set(reflect.ValueOf(val))
220+
default:
221+
if value == "" {
222+
return nil // Nil slice.
223+
}
224+
val, err := hex.DecodeString(value)
225+
if err != nil {
226+
return err
227+
}
228+
field.SetBytes(val)
219229
}
220-
field.SetBytes(val)
221230
case reflect.Array:
222231
switch field.Interface().(type) {
223232
case common.Hash:
@@ -251,15 +260,6 @@ func mapStructure(input, output any, hooks map[string]func(v string) (string, er
251260
}
252261
field.Set(reflect.ValueOf(*val))
253262
}
254-
case reflect.Interface:
255-
switch field.Type() {
256-
case reflect.TypeFor[multiaddr.Multiaddr]():
257-
val, err := multiaddr.NewMultiaddr(value)
258-
if err != nil {
259-
return err
260-
}
261-
field.Set(reflect.ValueOf(val))
262-
}
263263
default:
264264
return fmt.Errorf("unsupported type %T", field.Interface())
265265
}

pkg/api/util_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/ethersphere/bee/v2/pkg/api"
1818
"github.com/ethersphere/bee/v2/pkg/swarm"
1919
"github.com/google/go-cmp/cmp"
20+
"github.com/multiformats/go-multiaddr"
2021
)
2122

2223
type (
@@ -95,11 +96,20 @@ type (
9596
mapSwarmAddressTest struct {
9697
SwarmAddressVal swarm.Address `map:"swarmAddressVal"`
9798
}
99+
100+
mapMultiaddrTest struct {
101+
MultiaddrVal multiaddr.Multiaddr `map:"multiaddrVal"`
102+
}
98103
)
99104

100105
func TestMapStructure(t *testing.T) {
101106
t.Parallel()
102107

108+
validMultiaddr, err := multiaddr.NewMultiaddr("/ip4/127.0.0.1/tcp/8080")
109+
if err != nil {
110+
t.Fatal(err)
111+
}
112+
103113
tests := []struct {
104114
name string
105115
src any
@@ -497,6 +507,10 @@ func TestMapStructure(t *testing.T) {
497507
name: "swarm.Address value",
498508
src: map[string]string{"swarmAddressVal": "1234567890abcdef"},
499509
want: &mapSwarmAddressTest{SwarmAddressVal: swarm.MustParseHexAddress("1234567890abcdef")},
510+
}, {
511+
name: "multiaddr.Multiaddr value",
512+
src: map[string]string{"multiaddrVal": "/ip4/127.0.0.1/tcp/8080"},
513+
want: &mapMultiaddrTest{MultiaddrVal: validMultiaddr},
500514
}}
501515
for _, tc := range tests {
502516
t.Run(tc.name, func(t *testing.T) {

0 commit comments

Comments
 (0)