| package http |
|
|
| import ( |
| "fmt" |
| "github.com/alist-org/alist/v3/internal/model" |
| "github.com/alist-org/alist/v3/internal/offline_download/tool" |
| "github.com/alist-org/alist/v3/pkg/utils" |
| "net/http" |
| "net/url" |
| "os" |
| "path" |
| "path/filepath" |
| ) |
|
|
| type SimpleHttp struct { |
| client http.Client |
| } |
|
|
| func (s SimpleHttp) Name() string { |
| return "SimpleHttp" |
| } |
|
|
| func (s SimpleHttp) Items() []model.SettingItem { |
| return nil |
| } |
|
|
| func (s SimpleHttp) Init() (string, error) { |
| return "ok", nil |
| } |
|
|
| func (s SimpleHttp) IsReady() bool { |
| return true |
| } |
|
|
| func (s SimpleHttp) AddURL(args *tool.AddUrlArgs) (string, error) { |
| panic("should not be called") |
| } |
|
|
| func (s SimpleHttp) Remove(task *tool.DownloadTask) error { |
| panic("should not be called") |
| } |
|
|
| func (s SimpleHttp) Status(task *tool.DownloadTask) (*tool.Status, error) { |
| panic("should not be called") |
| } |
|
|
| func (s SimpleHttp) Run(task *tool.DownloadTask) error { |
| u := task.Url |
| |
| _u, err := url.Parse(u) |
| if err != nil { |
| return err |
| } |
| req, err := http.NewRequestWithContext(task.Ctx(), http.MethodGet, u, nil) |
| if err != nil { |
| return err |
| } |
| resp, err := s.client.Do(req) |
| if err != nil { |
| return err |
| } |
| defer resp.Body.Close() |
| if resp.StatusCode >= 400 { |
| return fmt.Errorf("http status code %d", resp.StatusCode) |
| } |
| filename := path.Base(_u.Path) |
| if n, err := parseFilenameFromContentDisposition(resp.Header.Get("Content-Disposition")); err == nil { |
| filename = n |
| } |
| |
| _ = os.MkdirAll(task.TempDir, os.ModePerm) |
| filePath := filepath.Join(task.TempDir, filename) |
| file, err := os.Create(filePath) |
| if err != nil { |
| return err |
| } |
| defer file.Close() |
| fileSize := resp.ContentLength |
| err = utils.CopyWithCtx(task.Ctx(), file, resp.Body, fileSize, task.SetProgress) |
| return err |
| } |
|
|
| func init() { |
| tool.Tools.Add(&SimpleHttp{}) |
| } |
|
|