@cryptotaxi247 / kubo / commits / 903a4851b

Add option to decode 'Data' field as base64

License: MIT Signed-off-by: slothbag@gmail.com <slothbag@gmail.com>

slothbag committed Apr 2, 2016 at 12:02 UTC 903a4851b70dc224221e1ae013810d3e0de20b2f
1 file changed +24 -7
core/commands/object/object.go
+24 -7
@@ -10,6 +10,7 @@ import (
10 "io/ioutil"
11 "strings"
12 "text/tabwriter"
13 + "encoding/base64"
14
15 mh "gx/ipfs/QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku/go-multihash"
16
@@ -224,7 +225,8 @@ This command outputs data in the following encodings:
225 Marshalers: cmds.MarshalerMap{
226 cmds.EncodingType("protobuf"): func(res cmds.Response) (io.Reader, error) {
227 node := res.Output().(*Node)
227 - object, err := deserializeNode(node)
228 + // deserialize the Data field as text as this was the standard behaviour
229 + object, err := deserializeNode(node, "text")
230 if err != nil {
231 return nil, err
232 }
@@ -342,6 +344,7 @@ And then run:
344 },
345 Options: []cmds.Option{
346 cmds.StringOption("inputenc", "Encoding type of input data, either \"protobuf\" or \"json\"."),
347 + cmds.StringOption("datafieldenc", "Encoding type of the data field, either \"text\" or \"base64\"."),
348 },
349 Run: func(req cmds.Request, res cmds.Response) {
350 n, err := req.InvocContext().GetNode()
@@ -365,7 +368,16 @@ And then run:
368 inputenc = "json"
369 }
370
368 - output, err := objectPut(n, input, inputenc)
371 + datafieldenc, found, err := req.Option("datafieldenc").String()
372 + if err != nil {
373 + res.SetError(err, cmds.ErrNormal)
374 + return
375 + }
376 + if !found {
377 + datafieldenc = "text"
378 + }
379 +
380 + output, err := objectPut(n, input, inputenc, datafieldenc)
381 if err != nil {
382 errType := cmds.ErrNormal
383 if err == ErrUnknownObjectEnc {
@@ -454,7 +466,7 @@ func nodeFromTemplate(template string) (*dag.Node, error) {
466 var ErrEmptyNode = errors.New("no data or links in this node")
467
468 // objectPut takes a format option, serializes bytes from stdin and updates the dag with that data
457 -func objectPut(n *core.IpfsNode, input io.Reader, encoding string) (*Object, error) {
469 +func objectPut(n *core.IpfsNode, input io.Reader, encoding string, dataFieldEncoding string) (*Object, error) {
470
471 data, err := ioutil.ReadAll(io.LimitReader(input, inputLimit+10))
472 if err != nil {
@@ -480,7 +492,7 @@ func objectPut(n *core.IpfsNode, input io.Reader, encoding string) (*Object, err
492 return nil, ErrEmptyNode
493 }
494
483 - dagnode, err = deserializeNode(node)
495 + dagnode, err = deserializeNode(node, dataFieldEncoding)
496 if err != nil {
497 return nil, err
498 }
@@ -501,7 +513,7 @@ func objectPut(n *core.IpfsNode, input io.Reader, encoding string) (*Object, err
513 return nil, ErrEmptyNode
514 }
515
504 - dagnode, err = deserializeNode(node)
516 + dagnode, err = deserializeNode(node, dataFieldEncoding)
517 if err != nil {
518 return nil, err
519 }
@@ -566,9 +578,14 @@ func getOutput(dagnode *dag.Node) (*Object, error) {
578 }
579
580 // converts the Node object into a real dag.Node
569 -func deserializeNode(node *Node) (*dag.Node, error) {
581 +func deserializeNode(node *Node, dataFieldEncoding string) (*dag.Node, error) {
582 dagnode := new(dag.Node)
571 - dagnode.Data = []byte(node.Data)
583 + if dataFieldEncoding == "text" {
584 + dagnode.Data = []byte(node.Data)
585 + } else {
586 + dagnode.Data, _ = base64.StdEncoding.DecodeString(node.Data)
587 + }
588 +
589 dagnode.Links = make([]*dag.Link, len(node.Links))
590 for i, link := range node.Links {
591 hash, err := mh.FromB58String(link.Hash)