agent/pluginmanager/acspluginmanager/util.go (74 lines of code) (raw):

package acspluginmanager import ( "io" "io/fs" "net/http" "os" "path" "path/filepath" "runtime" "strings" . "github.com/aliyun/aliyun_assist_client/agent/pluginmanager" "github.com/aliyun/aliyun_assist_client/agent/util" ) type WinDir string // 针对windows的路径模式定义的FileSystem,参照net/http.Dir func (d WinDir) Open(name string) (http.File, error) { if len(name) > 0 && name[0] == '/' { name = name[1:] } fullName := filepath.FromSlash(path.Clean(name)) f, err := os.Open(fullName) if err != nil { return nil, mapDirOpenError(err, fullName) } return f, nil } func mapDirOpenError(originalErr error, name string) error { if os.IsNotExist(originalErr) || os.IsPermission(originalErr) { return originalErr } parts := strings.Split(name, string(filepath.Separator)) for i := range parts { if parts[i] == "" { continue } fi, err := os.Stat(strings.Join(parts[:i+1], string(filepath.Separator))) if err != nil { return originalErr } if !fi.IsDir() { return fs.ErrNotExist } } return originalErr } func FileProtocolDownload(url, filePath string) error { t := util.GetHTTPTransport() if runtime.GOOS == "windows" { t.RegisterProtocol("file", http.NewFileTransport(WinDir(""))) } else { t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/"))) } c := &http.Client{Transport: t} res, err := c.Get(url) if err != nil { return err } f, err := os.Create(filePath) defer f.Close() if err != nil { return err } _, err = io.Copy(f, res.Body) return err } // DeleteSlice 删除指定元素。 func DeletePluginInfoByIdx(pluginInfos []PluginInfo, idx int) []PluginInfo { j := 0 for i, p := range pluginInfos { if i != idx { pluginInfos[j] = p j++ } } return pluginInfos[:j] }