package http import ( "net/url" "path" "github.com/GopeedLab/gopeed/internal/fetcher" "github.com/GopeedLab/gopeed/pkg/base" fhttp "github.com/GopeedLab/gopeed/pkg/protocol/http" ) // ============================================================================ // Fetcher Data (for Store/Restore) // ============================================================================ type fetcherData struct { Connections []*connection RedirectURL string // Saved redirect URL for resume } // ============================================================================ // Fetcher Manager // ============================================================================ type FetcherManager struct { } func (fm *FetcherManager) Name() string { return "http" } func (fm *FetcherManager) Filters() []*fetcher.SchemeFilter { return []*fetcher.SchemeFilter{ { Type: fetcher.FilterTypeUrl, Pattern: "HTTP", }, { Type: fetcher.FilterTypeUrl, Pattern: "HTTPS", }, } } func (fm *FetcherManager) Build() fetcher.Fetcher { return &Fetcher{} } func (fm *FetcherManager) ParseName(u string) string { var name string url, err := url.Parse(u) if err != nil { return "" } name = path.Base(url.Path) if name == "" || name == "/" || name == "." { name = url.Hostname() } return name } func (fm *FetcherManager) AutoRename() bool { return true } func (fm *FetcherManager) DefaultConfig() any { return &config{ UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", Connections: 16, } } func (fm *FetcherManager) Store(f fetcher.Fetcher) (data any, err error) { _f := f.(*Fetcher) _f.redirectLock.Lock() redirectURL := _f.redirectURL _f.redirectLock.Unlock() return &fetcherData{ Connections: _f.connections, RedirectURL: redirectURL, }, nil } func (fm *FetcherManager) Restore() (v any, f func(meta *fetcher.FetcherMeta, v any) fetcher.Fetcher) { return &fetcherData{}, func(meta *fetcher.FetcherMeta, v any) fetcher.Fetcher { fd := v.(*fetcherData) fb := &FetcherManager{} fetcher := fb.Build().(*Fetcher) fetcher.meta = meta base.ParseReqExtra[fhttp.ReqExtra](fetcher.meta.Req) base.ParseOptExtra[fhttp.OptsExtra](fetcher.meta.Opts) if len(fd.Connections) > 0 { fetcher.connections = fd.Connections } // Restore redirect URL for resume if fd.RedirectURL != "" { fetcher.redirectURL = fd.RedirectURL } return fetcher } } func (fm *FetcherManager) Close() error { return nil }