in agent/agentserver/server.go [133:163]
func (s *Server) downloadBlobHandler(w http.ResponseWriter, r *http.Request) error {
namespace, err := httputil.ParseParam(r, "namespace")
if err != nil {
return err
}
d, err := parseDigest(r)
if err != nil {
return err
}
f, err := s.cads.Cache().GetFileReader(d.Hex())
if err != nil {
if os.IsNotExist(err) || s.cads.InDownloadError(err) {
if err := s.sched.Download(namespace, d); err != nil {
if err == scheduler.ErrTorrentNotFound {
return handler.ErrorStatus(http.StatusNotFound)
}
return handler.Errorf("download torrent: %s", err)
}
f, err = s.cads.Cache().GetFileReader(d.Hex())
if err != nil {
return handler.Errorf("store: %s", err)
}
} else {
return handler.Errorf("store: %s", err)
}
}
if _, err := io.Copy(w, f); err != nil {
return fmt.Errorf("copy file: %s", err)
}
return nil
}