-
Notifications
You must be signed in to change notification settings - Fork 0
/
urlwriter.go
75 lines (67 loc) · 1.54 KB
/
urlwriter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package iokit
import (
"go4ml.xyz/errstr"
"io"
"os"
"strings"
)
type urlwriter struct {
Whole
iourl IoUrl
}
func (iourl IoUrl) createUrlWriter() (wh Whole, err error) {
var f Whole
if iourl.Cache.Exists() {
if err = iourl.Cache.Remove(); err != nil {
return nil, errstr.Wrap(err, "can't delete existing cache file")
}
}
if iourl.Cache.Defined() {
f, err = File(iourl.Cache.Path() + "~").Create()
} else {
f, err = Tempfile("url-noncached-*")
}
wh = &urlwriter{f, iourl}
return
}
func (uw *urlwriter) Commit() (err error) {
var rd io.ReadCloser
if err = uw.Whole.Commit(); err != nil {
return
}
if uw.iourl.Cache.Defined() {
// file was closed in Commit call
if err = os.Rename(uw.iourl.Cache.Path()+"~", uw.iourl.Cache.Path()); err != nil {
return
}
if rd, err = File(uw.iourl.Cache.Path()).Open(); err != nil {
return
}
} else {
rd = uw.Whole.(io.ReadCloser)
if _, err = rd.(io.Seeker).Seek(0, 0); err != nil {
return
}
}
defer rd.Close()
uw.Whole = nil
err = uw.iourl.Upload(rd)
return
}
func (uw *urlwriter) End() {
if uw.Whole != nil {
uw.Whole.End()
}
}
var UrlWriterFactory = map[string]func(string)interface{Upload(rd io.Reader,metadata ...map[string]string) error}{}
func Upload(url string, reader io.Reader) error {
j := strings.Index(url, "://")
proto := strings.ToLower(url[:j])
if f, ok := UrlWriterFactory[proto]; ok {
return f(url).Upload(reader)
}
return errstr.New("can't read from url `" + url + "`")
}
func (iourl IoUrl) Upload(rd io.Reader) error {
return Upload(iourl.Url, rd)
}