Unverified 提交 307d06b4 作者: Steven Allen 提交者: GitHub

Merge pull request #6277 from ipfs/fix/3124

work towards fixing dht commands
...@@ -2,6 +2,7 @@ package commands ...@@ -2,6 +2,7 @@ package commands
import ( import (
"context" "context"
"encoding/base64"
"errors" "errors"
"fmt" "fmt"
"io" "io"
...@@ -103,15 +104,15 @@ var queryDhtCmd = &cmds.Command{ ...@@ -103,15 +104,15 @@ var queryDhtCmd = &cmds.Command{
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
pfm := pfuncMap{ 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 { for _, p := range obj.Responses {
fmt.Fprintf(out, "%s\n", p.ID.Pretty()) fmt.Fprintf(out, "%s\n", p.ID.Pretty())
} }
return nil
}, },
} }
verbose, _ := req.Options[dhtVerboseOptionName].(bool) verbose, _ := req.Options[dhtVerboseOptionName].(bool)
printEvent(out, w, verbose, pfm) return printEvent(out, w, verbose, pfm)
return nil
}), }),
}, },
Type: notif.QueryEvent{}, Type: notif.QueryEvent{},
...@@ -181,12 +182,13 @@ var findProvidersDhtCmd = &cmds.Command{ ...@@ -181,12 +182,13 @@ var findProvidersDhtCmd = &cmds.Command{
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
pfm := pfuncMap{ 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 { if verbose {
fmt.Fprintf(out, "* closest peer %s\n", obj.ID) 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] prov := obj.Responses[0]
if verbose { if verbose {
fmt.Fprintf(out, "provider: ") fmt.Fprintf(out, "provider: ")
...@@ -197,13 +199,12 @@ var findProvidersDhtCmd = &cmds.Command{ ...@@ -197,13 +199,12 @@ var findProvidersDhtCmd = &cmds.Command{
fmt.Fprintf(out, "\t%s\n", a) fmt.Fprintf(out, "\t%s\n", a)
} }
} }
return nil
}, },
} }
verbose, _ := req.Options[dhtVerboseOptionName].(bool) verbose, _ := req.Options[dhtVerboseOptionName].(bool)
printEvent(out, w, verbose, pfm) return printEvent(out, w, verbose, pfm)
return nil
}), }),
}, },
Type: notif.QueryEvent{}, Type: notif.QueryEvent{},
...@@ -239,6 +240,13 @@ var provideRefDhtCmd = &cmds.Command{ ...@@ -239,6 +240,13 @@ var provideRefDhtCmd = &cmds.Command{
return errors.New("cannot provide, no connected peers") 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) rec, _ := req.Options[recursiveOptionName].(bool)
var cids []cid.Cid var cids []cid.Cid
...@@ -290,17 +298,16 @@ var provideRefDhtCmd = &cmds.Command{ ...@@ -290,17 +298,16 @@ var provideRefDhtCmd = &cmds.Command{
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
pfm := pfuncMap{ 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 { if verbose {
fmt.Fprintf(out, "sending provider record to peer %s\n", obj.ID) fmt.Fprintf(out, "sending provider record to peer %s\n", obj.ID)
} }
return nil
}, },
} }
verbose, _ := req.Options[dhtVerboseOptionName].(bool) verbose, _ := req.Options[dhtVerboseOptionName].(bool)
printEvent(out, w, verbose, pfm) return printEvent(out, w, verbose, pfm)
return nil
}), }),
}, },
Type: notif.QueryEvent{}, Type: notif.QueryEvent{},
...@@ -402,17 +409,17 @@ var findPeerDhtCmd = &cmds.Command{ ...@@ -402,17 +409,17 @@ var findPeerDhtCmd = &cmds.Command{
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
pfm := pfuncMap{ 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] pi := obj.Responses[0]
for _, a := range pi.Addrs { for _, a := range pi.Addrs {
fmt.Fprintf(out, "%s\n", a) fmt.Fprintf(out, "%s\n", a)
} }
return nil
}, },
} }
verbose, _ := req.Options[dhtVerboseOptionName].(bool) verbose, _ := req.Options[dhtVerboseOptionName].(bool)
printEvent(out, w, verbose, pfm) return printEvent(out, w, verbose, pfm)
return nil
}), }),
}, },
Type: notif.QueryEvent{}, Type: notif.QueryEvent{},
...@@ -469,7 +476,7 @@ Different key types can specify other 'best' rules. ...@@ -469,7 +476,7 @@ Different key types can specify other 'best' rules.
} else { } else {
notif.PublishQueryEvent(ctx, &notif.QueryEvent{ notif.PublishQueryEvent(ctx, &notif.QueryEvent{
Type: notif.Value, Type: notif.Value,
Extra: string(val), Extra: base64.StdEncoding.EncodeToString(val),
}) })
} }
}() }()
...@@ -485,19 +492,22 @@ Different key types can specify other 'best' rules. ...@@ -485,19 +492,22 @@ Different key types can specify other 'best' rules.
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
pfm := pfuncMap{ 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 { if verbose {
fmt.Fprintf(out, "got value: '%s'\n", obj.Extra) fmt.Fprintf(out, "got value: '%s'\n", obj.Extra)
} else { } else {
fmt.Fprintln(out, obj.Extra) res, err := base64.StdEncoding.DecodeString(obj.Extra)
if err != nil {
return err
}
out.Write(res)
} }
return nil
}, },
} }
verbose, _ := req.Options[dhtVerboseOptionName].(bool) verbose, _ := req.Options[dhtVerboseOptionName].(bool)
printEvent(out, w, verbose, pfm) return printEvent(out, w, verbose, pfm)
return nil
}), }),
}, },
Type: notif.QueryEvent{}, Type: notif.QueryEvent{},
...@@ -538,6 +548,12 @@ NOTE: A value may not exceed 2048 bytes. ...@@ -538,6 +548,12 @@ NOTE: A value may not exceed 2048 bytes.
return err return err
} }
// Needed to parse stdin args.
err = req.ParseBodyArgs()
if err != nil {
return err
}
if !nd.IsOnline { if !nd.IsOnline {
return ErrNotOnline return ErrNotOnline
} }
...@@ -575,38 +591,37 @@ NOTE: A value may not exceed 2048 bytes. ...@@ -575,38 +591,37 @@ NOTE: A value may not exceed 2048 bytes.
Encoders: cmds.EncoderMap{ Encoders: cmds.EncoderMap{
cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error { cmds.Text: cmds.MakeTypedEncoder(func(req *cmds.Request, w io.Writer, out *notif.QueryEvent) error {
pfm := pfuncMap{ 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 { if verbose {
fmt.Fprintf(out, "* closest peer %s\n", obj.ID) 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()) fmt.Fprintf(out, "%s\n", obj.ID.Pretty())
return nil
}, },
} }
verbose, _ := req.Options[dhtVerboseOptionName].(bool) verbose, _ := req.Options[dhtVerboseOptionName].(bool)
printEvent(out, w, verbose, pfm) return printEvent(out, w, verbose, pfm)
return nil
}), }),
}, },
Type: notif.QueryEvent{}, 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 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 { if verbose {
fmt.Fprintf(out, "%s: ", time.Now().Format("15:04:05.000")) fmt.Fprintf(out, "%s: ", time.Now().Format("15:04:05.000"))
} }
if override != nil { if override != nil {
if pf, ok := override[obj.Type]; ok { if pf, ok := override[obj.Type]; ok {
pf(obj, out, verbose) return pf(obj, out, verbose)
return
} }
} }
...@@ -647,6 +662,7 @@ func printEvent(obj *notif.QueryEvent, out io.Writer, verbose bool, override pfu ...@@ -647,6 +662,7 @@ func printEvent(obj *notif.QueryEvent, out io.Writer, verbose bool, override pfu
fmt.Fprintf(out, "unrecognized event type: %d\n", obj.Type) fmt.Fprintf(out, "unrecognized event type: %d\n", obj.Type)
} }
} }
return nil
} }
func escapeDhtKey(s string) (string, error) { func escapeDhtKey(s string) (string, error) {
......
...@@ -35,6 +35,12 @@ test_dht() { ...@@ -35,6 +35,12 @@ test_dht() {
[ -s putted ] || [ -s putted ] ||
test_fsh cat 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 <key> # ipfs dht get <key>
test_expect_success 'get with good keys' ' test_expect_success 'get with good keys' '
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论