package http import ( "context" "io" "net/http" "time" "github.com/moby/buildkit/session" "github.com/moby/buildkit/session/upload" "github.com/pkg/errors" ) func newTransport(rt http.RoundTripper, sm *session.Manager, id string) http.RoundTripper { return &sessionHandler{rt: rt, sm: sm, id: id} } type sessionHandler struct { sm *session.Manager rt http.RoundTripper id string } func (h *sessionHandler) RoundTrip(req *http.Request) (*http.Response, error) { if req.URL.Host != "buildkit-session" { return h.rt.RoundTrip(req) } if req.Method != "GET" { return nil, errors.Errorf("invalid request") } timeoutCtx, cancel := context.WithTimeout(context.TODO(), 5*time.Second) defer cancel() caller, err := h.sm.Get(timeoutCtx, h.id) if err != nil { return nil, err } up, err := upload.New(context.TODO(), caller, req.URL) if err != nil { return nil, err } pr, pw := io.Pipe() go func() { _, err := up.WriteTo(pw) pw.CloseWithError(err) }() resp := &http.Response{ Status: "200 OK", StatusCode: 200, Body: pr, ContentLength: -1, } return resp, nil }