提交 153bb681 作者: Steven Allen

implement an ipfs cat --length flag

fixes #4085

License: MIT
Signed-off-by: 's avatarSteven Allen <steven@stebalien.com>
上级 2ab6d3d6
...@@ -26,6 +26,7 @@ var CatCmd = &cmds.Command{ ...@@ -26,6 +26,7 @@ var CatCmd = &cmds.Command{
}, },
Options: []cmdkit.Option{ Options: []cmdkit.Option{
cmdkit.IntOption("offset", "o", "Byte offset to begin reading from."), cmdkit.IntOption("offset", "o", "Byte offset to begin reading from."),
cmdkit.IntOption("length", "l", "Maximum number of bytes to read."),
}, },
Run: func(req cmds.Request, res cmds.ResponseEmitter) { Run: func(req cmds.Request, res cmds.ResponseEmitter) {
node, err := req.InvocContext().GetNode() node, err := req.InvocContext().GetNode()
...@@ -50,7 +51,20 @@ var CatCmd = &cmds.Command{ ...@@ -50,7 +51,20 @@ var CatCmd = &cmds.Command{
return return
} }
readers, length, err := cat(req.Context(), node, req.Arguments(), int64(offset)) max, found, err := req.Option("length").Int()
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
}
if max < 0 {
res.SetError(fmt.Errorf("Cannot specify negative length."), cmdkit.ErrNormal)
return
}
if !found {
max = -1
}
readers, length, err := cat(req.Context(), node, req.Arguments(), int64(offset), int64(max))
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) res.SetError(err, cmdkit.ErrNormal)
return return
...@@ -116,9 +130,12 @@ var CatCmd = &cmds.Command{ ...@@ -116,9 +130,12 @@ var CatCmd = &cmds.Command{
}, },
} }
func cat(ctx context.Context, node *core.IpfsNode, paths []string, offset int64) ([]io.Reader, uint64, error) { func cat(ctx context.Context, node *core.IpfsNode, paths []string, offset int64, max int64) ([]io.Reader, uint64, error) {
readers := make([]io.Reader, 0, len(paths)) readers := make([]io.Reader, 0, len(paths))
length := uint64(0) length := uint64(0)
if max == 0 {
return nil, 0, nil
}
for _, fpath := range paths { for _, fpath := range paths {
read, err := coreunix.Cat(ctx, node, fpath) read, err := coreunix.Cat(ctx, node, fpath)
if err != nil { if err != nil {
...@@ -134,8 +151,18 @@ func cat(ctx context.Context, node *core.IpfsNode, paths []string, offset int64) ...@@ -134,8 +151,18 @@ func cat(ctx context.Context, node *core.IpfsNode, paths []string, offset int64)
} }
offset = 0 offset = 0
size := uint64(read.Size() - uint64(count))
length += size
if max > 0 && length >= uint64(max) {
var r io.Reader = read
if overshoot := int64(length - uint64(max)); overshoot != 0 {
r = io.LimitReader(read, int64(size)-overshoot)
length = uint64(max)
}
readers = append(readers, r)
break
}
readers = append(readers, read) readers = append(readers, read)
length += uint64(read.Size() - uint64(count))
} }
return readers, length, nil return readers, length, nil
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论