|
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{}) |
|
} |
|
|