From 76dc6f5662fec7bff66f6e43dae5670a145d9499 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Apr 2019 00:56:31 -0700 Subject: [PATCH 1/4] commands(dht): make it possible to return errors from printEvent License: MIT Signed-off-by: Steven Allen --- core/commands/dht.go | 54 +++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/core/commands/dht.go b/core/commands/dht.go index c5011abcd..89799555f 100644 --- a/core/commands/dht.go +++ b/core/commands/dht.go @@ -104,15 +104,15 @@ var queryDhtCmd = &cmds.Command{ Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { pfm := pfuncMap{ - notif.PeerResponse: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.PeerResponse: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { for _, p := range obj.Responses { fmt.Fprintf(out, "%s\n", p.ID.Pretty()) } + return nil }, } verbose, _ := req.Options[dhtVerboseOptionName].(bool) - printEvent(out, w, verbose, pfm) - return nil + return printEvent(out, w, verbose, pfm) }), }, Type: notif.QueryEvent{}, @@ -182,12 +182,13 @@ var findProvidersDhtCmd = &cmds.Command{ Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { pfm := pfuncMap{ - notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { if verbose { fmt.Fprintf(out, "* closest peer %s\n", obj.ID) } + return nil }, - notif.Provider: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.Provider: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { prov := obj.Responses[0] if verbose { fmt.Fprintf(out, "provider: ") @@ -198,13 +199,12 @@ var findProvidersDhtCmd = &cmds.Command{ fmt.Fprintf(out, "\t%s\n", a) } } + return nil }, } verbose, _ := req.Options[dhtVerboseOptionName].(bool) - printEvent(out, w, verbose, pfm) - - return nil + return printEvent(out, w, verbose, pfm) }), }, Type: notif.QueryEvent{}, @@ -291,17 +291,16 @@ var provideRefDhtCmd = &cmds.Command{ Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { pfm := pfuncMap{ - notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { if verbose { fmt.Fprintf(out, "sending provider record to peer %s\n", obj.ID) } + return nil }, } verbose, _ := req.Options[dhtVerboseOptionName].(bool) - printEvent(out, w, verbose, pfm) - - return nil + return printEvent(out, w, verbose, pfm) }), }, Type: notif.QueryEvent{}, @@ -403,17 +402,17 @@ var findPeerDhtCmd = &cmds.Command{ Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { pfm := pfuncMap{ - notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { pi := obj.Responses[0] for _, a := range pi.Addrs { fmt.Fprintf(out, "%s\n", a) } + return nil }, } verbose, _ := req.Options[dhtVerboseOptionName].(bool) - printEvent(out, w, verbose, pfm) - return nil + return printEvent(out, w, verbose, pfm) }), }, Type: notif.QueryEvent{}, @@ -486,19 +485,18 @@ Different key types can specify other 'best' rules. Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { pfm := pfuncMap{ - notif.Value: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.Value: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { if verbose { fmt.Fprintf(out, "got value: '%s'\n", obj.Extra) } else { fmt.Fprintln(out, obj.Extra) } + return nil }, } verbose, _ := req.Options[dhtVerboseOptionName].(bool) - printEvent(out, w, verbose, pfm) - - return nil + return printEvent(out, w, verbose, pfm) }), }, Type: notif.QueryEvent{}, @@ -576,38 +574,37 @@ NOTE: A value may not exceed 2048 bytes. Encoders: cmds.EncoderMap{ cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { pfm := pfuncMap{ - notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.FinalPeer: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { if verbose { fmt.Fprintf(out, "* closest peer %s\n", obj.ID) } + return nil }, - notif.Value: func(obj *notif.QueryEvent, out io.Writer, verbose bool) { + notif.Value: func(obj *notif.QueryEvent, out io.Writer, verbose bool) error { fmt.Fprintf(out, "%s\n", obj.ID.Pretty()) + return nil }, } verbose, _ := req.Options[dhtVerboseOptionName].(bool) - printEvent(out, w, verbose, pfm) - - return nil + return printEvent(out, w, verbose, pfm) }), }, Type: notif.QueryEvent{}, } -type printFunc func(obj *notif.QueryEvent, out io.Writer, verbose bool) +type printFunc func(obj *notif.QueryEvent, out io.Writer, verbose bool) error type pfuncMap map[notif.QueryEventType]printFunc -func printEvent(obj *notif.QueryEvent, out io.Writer, verbose bool, override pfuncMap) { +func printEvent(obj *notif.QueryEvent, out io.Writer, verbose bool, override pfuncMap) error { if verbose { fmt.Fprintf(out, "%s: ", time.Now().Format("15:04:05.000")) } if override != nil { if pf, ok := override[obj.Type]; ok { - pf(obj, out, verbose) - return + return pf(obj, out, verbose) } } @@ -648,6 +645,7 @@ func printEvent(obj *notif.QueryEvent, out io.Writer, verbose bool, override pfu fmt.Fprintf(out, "unrecognized event type: %d\n", obj.Type) } } + return nil } func escapeDhtKey(s string) (string, error) { From 9027eaa426a42ac8e9a73c85f5fee5df84af71df Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Apr 2019 00:59:00 -0700 Subject: [PATCH 2/4] commands(dht): base64 encode value in get Otherwise, it seems that something is treating this as UTF8 and normalizing it? fix half of #3124 License: MIT Signed-off-by: Steven Allen --- core/commands/dht.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/commands/dht.go b/core/commands/dht.go index 89799555f..03f19ec4a 100644 --- a/core/commands/dht.go +++ b/core/commands/dht.go @@ -2,6 +2,7 @@ package commands import ( "context" + "encoding/base64" "errors" "fmt" "io" @@ -469,7 +470,7 @@ Different key types can specify other 'best' rules. } else { notif.PublishQueryEvent(ctx, ¬if.QueryEvent{ Type: notif.Value, - Extra: string(val), + Extra: base64.StdEncoding.EncodeToString(val), }) } }() @@ -489,7 +490,11 @@ Different key types can specify other 'best' rules. if verbose { fmt.Fprintf(out, "got value: '%s'\n", obj.Extra) } else { - fmt.Fprintln(out, obj.Extra) + res, err := base64.StdEncoding.DecodeString(obj.Extra) + if err != nil { + return err + } + out.Write(res) } return nil }, From cc2ab147abddd9c74256eae653f32aba5b21110a Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Apr 2019 01:06:10 -0700 Subject: [PATCH 3/4] commands(dht): load arguments from request body License: MIT Signed-off-by: Steven Allen --- core/commands/dht.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/commands/dht.go b/core/commands/dht.go index 03f19ec4a..2711389c7 100644 --- a/core/commands/dht.go +++ b/core/commands/dht.go @@ -241,6 +241,13 @@ var provideRefDhtCmd = &cmds.Command{ return errors.New("cannot provide, no connected peers") } + // Needed to parse stdin args. + // TODO: Lazy Load + err = req.ParseBodyArgs() + if err != nil { + return err + } + rec, _ := req.Options[recursiveOptionName].(bool) var cids []cid.Cid @@ -542,6 +549,12 @@ NOTE: A value may not exceed 2048 bytes. return err } + // Needed to parse stdin args. + err = req.ParseBodyArgs() + if err != nil { + return err + } + if !nd.IsOnline { return ErrNotOnline } From a8fa9dd05a9616657aafa24963c225d6090ac5d2 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Tue, 30 Apr 2019 17:05:20 -0700 Subject: [PATCH 4/4] test: dht put/get round trips License: MIT Signed-off-by: Steven Allen --- test/sharness/t0170-dht.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/sharness/t0170-dht.sh b/test/sharness/t0170-dht.sh index 01a2238fe..d2956fea1 100755 --- a/test/sharness/t0170-dht.sh +++ b/test/sharness/t0170-dht.sh @@ -35,6 +35,12 @@ test_dht() { [ -s putted ] || test_fsh cat putted ' + + test_expect_success 'put round trips' ' + echo -n "$TEST_DHT_VALUE" >expected && + ipfsi 0 dht get "$TEST_DHT_PATH" >actual && + test_cmp actual expected + ' # ipfs dht get test_expect_success 'get with good keys' '