feat(offline_download): add simple http tool (close #4002)
This commit is contained in:
85
internal/offline_download/http/client.go
Normal file
85
internal/offline_download/http/client.go
Normal file
@ -0,0 +1,85 @@
|
||||
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
|
||||
// parse 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
|
||||
}
|
||||
// save to temp dir
|
||||
_ = 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{})
|
||||
}
|
Reference in New Issue
Block a user