mirror of
https://github.com/GopeedLab/gopeed.git
synced 2026-11-04 15:49:49 +00:00
106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
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
|
|
}
|