| package upload |
| |
| import ( |
| "context" |
| io "io" |
| "net/url" |
| |
| "github.com/moby/buildkit/session" |
| "google.golang.org/grpc/metadata" |
| ) |
| |
| const ( |
| keyPath = "urlpath" |
| keyHost = "urlhost" |
| ) |
| |
| func New(ctx context.Context, c session.Caller, url *url.URL) (*Upload, error) { |
| opts := map[string][]string{ |
| keyPath: {url.Path}, |
| keyHost: {url.Host}, |
| } |
| |
| client := NewUploadClient(c.Conn()) |
| |
| ctx = metadata.NewOutgoingContext(ctx, opts) |
| |
| cc, err := client.Pull(ctx) |
| if err != nil { |
| return nil, err |
| } |
| |
| return &Upload{cc: cc}, nil |
| } |
| |
| type Upload struct { |
| cc Upload_PullClient |
| } |
| |
| func (u *Upload) WriteTo(w io.Writer) (int, error) { |
| n := 0 |
| for { |
| var bm BytesMessage |
| if err := u.cc.RecvMsg(&bm); err != nil { |
| if err == io.EOF { |
| return n, nil |
| } |
| return n, err |
| } |
| nn, err := w.Write(bm.Data) |
| n += nn |
| if err != nil { |
| return n, err |
| } |
| } |
| } |