mirror of
https://github.com/datarhei/core.git
synced 2025-10-05 07:57:13 +08:00
109 lines
2.3 KiB
Go
109 lines
2.3 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
"net/url"
|
|
"path/filepath"
|
|
"strconv"
|
|
|
|
"github.com/datarhei/core/v16/encoding/json"
|
|
"github.com/datarhei/core/v16/http/api"
|
|
)
|
|
|
|
const (
|
|
SORT_DEFAULT = "none"
|
|
SORT_NONE = "none"
|
|
SORT_NAME = "name"
|
|
SORT_SIZE = "size"
|
|
SORT_LASTMOD = "lastmod"
|
|
ORDER_DEFAULT = "asc"
|
|
ORDER_ASC = "asc"
|
|
ORDER_DESC = "desc"
|
|
)
|
|
|
|
func (r *restclient) FilesystemList(storage, pattern, sort, order string) ([]api.FileInfo, error) {
|
|
var files []api.FileInfo
|
|
|
|
query := &url.Values{}
|
|
query.Set("glob", pattern)
|
|
query.Set("sort", sort)
|
|
query.Set("order", order)
|
|
|
|
data, err := r.call("GET", "/v3/fs/"+url.PathEscape(storage), query, nil, "", nil)
|
|
if err != nil {
|
|
return files, err
|
|
}
|
|
|
|
err = json.Unmarshal(data, &files)
|
|
|
|
return files, err
|
|
}
|
|
|
|
func (r *restclient) FilesystemHasFile(name, path string) bool {
|
|
if !filepath.IsAbs(path) {
|
|
path = "/" + path
|
|
}
|
|
|
|
_, err := r.call("HEAD", "/v3/fs/"+url.PathEscape(name)+path, nil, nil, "", nil)
|
|
|
|
return err == nil
|
|
}
|
|
|
|
func (r *restclient) FilesystemGetFile(storage, path string) (io.ReadCloser, error) {
|
|
return r.FilesystemGetFileOffset(storage, path, 0)
|
|
}
|
|
|
|
type ContextReadCloser struct {
|
|
io.ReadCloser
|
|
cancel context.CancelFunc
|
|
}
|
|
|
|
func NewContextReadCloser(r io.ReadCloser, cancel context.CancelFunc) *ContextReadCloser {
|
|
return &ContextReadCloser{
|
|
ReadCloser: r,
|
|
cancel: cancel,
|
|
}
|
|
}
|
|
|
|
func (r *ContextReadCloser) Close() error {
|
|
r.cancel()
|
|
return r.ReadCloser.Close()
|
|
}
|
|
|
|
func (r *restclient) FilesystemGetFileOffset(storage, path string, offset int64) (io.ReadCloser, error) {
|
|
if !filepath.IsAbs(path) {
|
|
path = "/" + path
|
|
}
|
|
|
|
var header http.Header = nil
|
|
|
|
if offset > 0 {
|
|
header = make(http.Header)
|
|
header.Set("Range", "bytes="+strconv.FormatInt(offset, 10)+"-")
|
|
}
|
|
|
|
return r.stream(context.Background(), "GET", "/v3/fs/"+url.PathEscape(storage)+path, nil, header, "", nil)
|
|
}
|
|
|
|
func (r *restclient) FilesystemDeleteFile(storage, path string) error {
|
|
if !filepath.IsAbs(path) {
|
|
path = "/" + path
|
|
}
|
|
|
|
_, err := r.call("DELETE", "/v3/fs/"+url.PathEscape(storage)+path, nil, nil, "", nil)
|
|
|
|
return err
|
|
}
|
|
|
|
func (r *restclient) FilesystemAddFile(storage, path string, data io.Reader) error {
|
|
if !filepath.IsAbs(path) {
|
|
path = "/" + path
|
|
}
|
|
|
|
_, err := r.call("PUT", "/v3/fs/"+url.PathEscape(storage)+path, nil, nil, "application/data", data)
|
|
|
|
return err
|
|
}
|