diff --git a/pkg/download/engine/inject/xhr/module.go b/pkg/download/engine/inject/xhr/module.go index 031f60a3..98b59567 100644 --- a/pkg/download/engine/inject/xhr/module.go +++ b/pkg/download/engine/inject/xhr/module.go @@ -131,6 +131,7 @@ type XMLHttpRequest struct { responseHeaders http.Header aborted bool client *req.Client + fingerprint string WithCredentials bool `json:"withCredentials"` Upload *XMLHttpRequestUpload `json:"upload"` @@ -164,7 +165,7 @@ func (xhr *XMLHttpRequest) SetRequestHeader(key, value string) { } func (xhr *XMLHttpRequest) Send(data goja.Value) { - setFingerprint(xhr.client) + setFingerprint(xhr.client, xhr.fingerprint) d := xhr.parseData(data) var ( @@ -381,7 +382,8 @@ func Enable(runtime *goja.Runtime, proxyHandler func(r *http.Request) (*url.URL, } instance := &XMLHttpRequest{ - client: client, + client: client, + fingerprint: util.SafeGet[string](runtime, FingerprintMagicKey), Upload: &XMLHttpRequestUpload{ EventProp: &EventProp{ eventListeners: make(map[string]func(event *ProgressEvent)), @@ -395,8 +397,8 @@ func Enable(runtime *goja.Runtime, proxyHandler func(r *http.Request) (*url.URL, instanceValue.SetPrototype(call.This.Prototype()) return instanceValue }) - runtime.Set("__gopeed_setFingerprint", func(fingerprint Fingerprint) { - currentFingerprint = fingerprint + runtime.Set("__gopeed_setFingerprint", func(fingerprint string) { + runtime.Set(FingerprintMagicKey, fingerprint) }) if err := runtime.Set("ProgressEvent", progressEvent); err != nil { return err diff --git a/pkg/download/engine/inject/xhr/tls_fingerprint.go b/pkg/download/engine/inject/xhr/tls_fingerprint.go index 4043bf3e..664ba462 100644 --- a/pkg/download/engine/inject/xhr/tls_fingerprint.go +++ b/pkg/download/engine/inject/xhr/tls_fingerprint.go @@ -1,21 +1,19 @@ package xhr -import ( - "github.com/imroc/req/v3" -) +import "github.com/imroc/req/v3" type Fingerprint string const ( - fingerprintChrome Fingerprint = "chrome" - fingerprintFirefox Fingerprint = "firefox" - fingerprintSafari Fingerprint = "safari" + FingerprintMagicKey = "__gopeed_xhr_fingerprint" + + fingerprintChrome = "chrome" + fingerprintFirefox = "firefox" + fingerprintSafari = "safari" ) -var currentFingerprint Fingerprint = "" - -func setFingerprint(client *req.Client) { - switch currentFingerprint { +func setFingerprint(client *req.Client, fingerprint string) { + switch fingerprint { case fingerprintChrome: client.ImpersonateChrome() case fingerprintFirefox: diff --git a/pkg/download/engine/util/util.go b/pkg/download/engine/util/util.go index c490c367..a75c331b 100644 --- a/pkg/download/engine/util/util.go +++ b/pkg/download/engine/util/util.go @@ -22,3 +22,16 @@ func AssertError[T error](err error) (t T, r bool) { } return } + +func SafeGet[T any](vm *goja.Runtime, name string) T { + v := vm.Get(name) + if v == nil { + var init T + return init + } + if e, ok := v.Export().(T); ok { + return e + } + var init T + return init +}