(ctx interface{}, t *Transfer, cb ProgressCallback, authOkFunc func())
| 29 | } |
| 30 | |
| 31 | func (a *tusUploadAdapter) DoTransfer(ctx interface{}, t *Transfer, cb ProgressCallback, authOkFunc func()) error { |
| 32 | rel, err := t.Rel("upload") |
| 33 | if err != nil { |
| 34 | return err |
| 35 | } |
| 36 | if rel == nil { |
| 37 | return errors.New(tr.Tr.Get("No upload action for object: %s", t.Oid)) |
| 38 | } |
| 39 | |
| 40 | // Note not supporting the Creation extension since the batch API generates URLs |
| 41 | // Also not supporting Concatenation to support parallel uploads of chunks; forward only |
| 42 | |
| 43 | // 1. Send HEAD request to determine upload start point |
| 44 | // Request must include Tus-Resumable header (version) |
| 45 | a.Trace("xfer: sending tus.io HEAD request for %q", t.Oid) |
| 46 | req, err := a.newHTTPRequest("HEAD", rel) |
| 47 | if err != nil { |
| 48 | return err |
| 49 | } |
| 50 | |
| 51 | req.Header.Set("Tus-Resumable", TusVersion) |
| 52 | |
| 53 | res, err := a.doHTTP(t, req) |
| 54 | if err != nil { |
| 55 | return errors.NewRetriableError(err) |
| 56 | } |
| 57 | |
| 58 | // Response will contain Upload-Offset if supported |
| 59 | offHdr := res.Header.Get("Upload-Offset") |
| 60 | if len(offHdr) == 0 { |
| 61 | return errors.New(tr.Tr.Get("missing Upload-Offset header from tus.io HEAD response at %q, contact server admin", rel.Href)) |
| 62 | } |
| 63 | offset, err := strconv.ParseInt(offHdr, 10, 64) |
| 64 | if err != nil || offset < 0 { |
| 65 | return errors.New(tr.Tr.Get("invalid Upload-Offset value %q in response from tus.io HEAD at %q, contact server admin", offHdr, rel.Href)) |
| 66 | } |
| 67 | // Upload-Offset=size means already completed (skip) |
| 68 | // Batch API will probably already detect this, but handle just in case |
| 69 | if offset >= t.Size { |
| 70 | a.Trace("xfer: tus.io HEAD offset %d indicates %q is already fully uploaded, skipping", offset, t.Oid) |
| 71 | advanceCallbackProgress(cb, t, t.Size) |
| 72 | return nil |
| 73 | } |
| 74 | |
| 75 | // Open file for uploading |
| 76 | f, err := os.OpenFile(t.Path, os.O_RDONLY, 0644) |
| 77 | if err != nil { |
| 78 | return errors.Wrap(err, tr.Tr.Get("tus.io upload")) |
| 79 | } |
| 80 | defer f.Close() |
| 81 | |
| 82 | // Upload-Offset=0 means start from scratch, but still send PATCH |
| 83 | if offset == 0 { |
| 84 | a.Trace("xfer: tus.io uploading %q from start", t.Oid) |
| 85 | } else { |
| 86 | a.Trace("xfer: tus.io resuming upload %q from %d", t.Oid, offset) |
| 87 | advanceCallbackProgress(cb, t, offset) |
| 88 | } |
nothing calls this directly
no test coverage detected