add ReadStream & WriteStream

This commit is contained in:
Christoph Polcin 2014-10-27 15:17:54 +01:00
parent e4fac5eebf
commit 05b47fd0dc
2 changed files with 39 additions and 16 deletions

View File

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/base64" "encoding/base64"
"encoding/xml" "encoding/xml"
"io"
"net/http" "net/http"
"os" "os"
"strings" "strings"
@ -185,14 +186,22 @@ func (c *Client) Copy(oldpath string, newpath string, overwrite bool) error {
} }
func (c *Client) Read(path string) ([]byte, error) { func (c *Client) Read(path string) ([]byte, error) {
if stream, err := c.ReadStream(path); err == nil {
defer stream.Close()
buf := new(bytes.Buffer)
buf.ReadFrom(stream)
return buf.Bytes(), nil
} else {
return nil, err
}
}
func (c *Client) ReadStream(path string) (io.ReadCloser, error) {
rs, err := c.reqDo("GET", path, nil) rs, err := c.reqDo("GET", path, nil)
if err != nil { if err != nil {
return nil, newPathErrorErr("Read", path, err) return nil, newPathErrorErr("ReadStream", path, err)
} }
defer rs.Body.Close() return rs.Body, nil
buf := new(bytes.Buffer)
buf.ReadFrom(rs.Body)
return buf.Bytes(), nil
} }
func (c *Client) Write(path string, data []byte, _ os.FileMode) error { func (c *Client) Write(path string, data []byte, _ os.FileMode) error {
@ -217,3 +226,15 @@ func (c *Client) Write(path string, data []byte, _ os.FileMode) error {
} }
return newPathError("Write", path, s) return newPathError("Write", path, s)
} }
func (c *Client) WriteStream(path string, stream io.Reader, _ os.FileMode) error {
// TODO check if parent collection exists
s := c.put(path, stream)
switch s {
case 200, 201:
return nil
default:
return newPathError("WriteStream", path, s)
}
}

View File

@ -1,7 +1,6 @@
package main package main
import ( import (
"bytes"
"errors" "errors"
"flag" "flag"
"fmt" "fmt"
@ -132,11 +131,11 @@ func main() {
} }
case "PUT", "PUSH", "WRITE": case "PUT", "PUSH", "WRITE":
bytes, err := getBytes(a1) stream, err := getStream(a1)
if err != nil { if err != nil {
Fail(err) Fail(err)
} }
if err := c.Write(a0, bytes, 0644); err != nil { if err := c.WriteStream(a0, stream, 0644); err != nil {
fmt.Println(err) fmt.Println(err)
} else { } else {
fmt.Println(fmt.Sprintf("Written: '%s' -> %s", a1, a0)) fmt.Println(fmt.Sprintf("Written: '%s' -> %s", a1, a0))
@ -150,7 +149,7 @@ func main() {
} }
} }
func getBytes(pathOrString string) ([]byte, error) { func getStream(pathOrString string) (io.ReadCloser, error) {
fi, err := os.Stat(pathOrString) fi, err := os.Stat(pathOrString)
if err == nil { if err == nil {
if fi.IsDir() { if fi.IsDir() {
@ -158,15 +157,18 @@ func getBytes(pathOrString string) ([]byte, error) {
} }
f, err := os.Open(pathOrString) f, err := os.Open(pathOrString)
if err == nil { if err == nil {
defer f.Close() return f, nil
buf := bytes.NewBuffer(nil)
_, err := io.Copy(buf, f)
if err == nil {
return buf.Bytes(), nil
}
} }
return nil, &os.PathError{"Open", pathOrString, err} return nil, &os.PathError{"Open", pathOrString, err}
} else { } else {
return []byte(pathOrString), nil return nopCloser{strings.NewReader(pathOrString)}, nil
} }
} }
type nopCloser struct {
io.Reader
}
func (nopCloser) Close() error {
return nil
}