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)