forked from goadesign/examples
/
resumable.go
85 lines (75 loc) · 2.45 KB
/
resumable.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
76
77
78
79
80
81
82
83
84
85
package tus
import (
"context"
"io"
"github.com/ikawaha/examples/tus/gen/tus"
)
// tusWrapper wraps the given TUS service instance and:
// - checks the value of the request Tus-Resumable header.
// - writes the response Tus-Resumable header.
type tusWrapper struct {
svc *tussvc
}
// TusResumable is the version of tus implemented by this service.
const TusResumable = "1.0.0"
// handleTUSResumable wraos the given upload service instance and adds
// Tus-Resumable request and response headers handling.
func handleTUSResumable(s *tussvc) tus.Service {
w := tusWrapper{s}
return &w
}
// Head checks and writes the Tus-Resumable header.
func (s *tusWrapper) Head(ctx context.Context, p *tus.HeadPayload) (res *tus.HeadResult, err error) {
if p.TusResumable != TusResumable {
return nil, &tus.ErrInvalidTUSResumable{TusVersion: TusResumable}
}
res, err = s.svc.Head(ctx, p)
if res != nil {
res.TusResumable = TusResumable
}
return
}
// Clients use the PATCH method to start or resume an tus.
func (s *tusWrapper) Patch(ctx context.Context, p *tus.PatchPayload, r io.ReadCloser) (res *tus.PatchResult, err error) {
if p.TusResumable != TusResumable {
return nil, &tus.ErrInvalidTUSResumable{TusVersion: TusResumable}
}
res, err = s.svc.Patch(ctx, p, r)
if res != nil {
res.TusResumable = TusResumable
}
return
}
// Clients use the OPTIONS method to gather information about the Server’s
// current configuration.
func (s *tusWrapper) Options(ctx context.Context) (res *tus.OptionsResult, err error) {
res, err = s.svc.Options(ctx)
if res != nil {
res.TusResumable = TusResumable
}
return
}
// Clients use the POST method against a known upload creation URL to request a
// new upload resource.
func (s *tusWrapper) Post(ctx context.Context, p *tus.PostPayload, r io.ReadCloser) (res *tus.PostResult, err error) {
if p.TusResumable != TusResumable {
return nil, &tus.ErrInvalidTUSResumable{TusVersion: TusResumable}
}
res, err = s.svc.Post(ctx, p, r)
if res != nil {
res.TusResumable = TusResumable
}
return
}
// Clients use the DELETE method to terminate completed and unfinished uploads
// allowing the Server to free up used resources.
func (s *tusWrapper) Delete(ctx context.Context, p *tus.DeletePayload) (res *tus.DeleteResult, err error) {
if p.TusResumable != TusResumable {
return nil, &tus.ErrInvalidTUSResumable{TusVersion: TusResumable}
}
res, err = s.svc.Delete(ctx, p)
if res != nil {
res.TusResumable = TusResumable
}
return
}