diff --git a/cookies.go b/cookies.go index a12e7c2..f52385a 100644 --- a/cookies.go +++ b/cookies.go @@ -91,26 +91,6 @@ func ReadCookies(val any) (Cookies, error) { return any2Cookies(cook) } } - -// read set cookies or parse set cookies,support json,map,[]string,http.Header,string -// -// func ReadSetCookies(val any) (Cookies, error) { -// switch cook := val.(type) { -// case Cookies: -// return cook, nil -// case []*http.Cookie: -// return Cookies(cook), nil -// case string: -// http.ParseCookie() -// return http.ParseSetCookie(cook) -// case http.Header: -// return readSetCookies(cook), nil -// case []string: -// return readSetCookies(http.Header{"Set-Cookie": cook}), nil -// default: -// return any2Cookies(cook) -// } -// } func any2Cookies(val any) (Cookies, error) { switch cooks := val.(type) { case map[string]string: diff --git a/jar.go b/jar.go index 4bc0613..f1efdfa 100644 --- a/jar.go +++ b/jar.go @@ -8,15 +8,21 @@ import ( "golang.org/x/net/publicsuffix" ) +type Jar interface { // size=8 + ClearCookies() + GetCookies(u *url.URL) Cookies + SetCookies(*url.URL, Cookies) +} + // cookies jar -type Jar struct { +type jar struct { jar *cookiejar.Jar } // new cookies jar -func NewJar() *Jar { +func NewJar() *jar { j, _ := cookiejar.New(nil) - return &Jar{ + return &jar{ jar: j, } } @@ -34,7 +40,12 @@ func (obj *Client) SetCookies(href *url.URL, cookies ...any) error { if obj.option.Jar == nil { return nil } - return obj.option.Jar.SetCookies(href, cookies...) + cooks, err := any2cookies(href, cookies...) + if err != nil { + return err + } + obj.option.Jar.SetCookies(href, cooks) + return nil } // clear cookies @@ -46,7 +57,7 @@ func (obj *Client) ClearCookies() { } // Get cookies -func (obj *Jar) GetCookies(u *url.URL) Cookies { +func (obj *jar) GetCookies(u *url.URL) Cookies { return obj.jar.Cookies(u) } func getDomain(u *url.URL) string { @@ -58,14 +69,13 @@ func getDomain(u *url.URL) string { } return domain } - -// Set cookies -func (obj *Jar) SetCookies(u *url.URL, cookies ...any) error { +func any2cookies(u *url.URL, cookies ...any) (Cookies, error) { domain := getDomain(u) + var result Cookies for _, cookie := range cookies { cooks, err := ReadCookies(cookie) if err != nil { - return err + return cooks, err } for _, cook := range cooks { if cook.Path == "" { @@ -75,13 +85,18 @@ func (obj *Jar) SetCookies(u *url.URL, cookies ...any) error { cook.Domain = domain } } - obj.jar.SetCookies(u, cooks) + result = append(result, cooks...) } - return nil + return result, nil +} + +// Set cookies +func (obj *jar) SetCookies(u *url.URL, cookies Cookies) { + obj.jar.SetCookies(u, cookies) } // Clear cookies -func (obj *Jar) ClearCookies() { +func (obj *jar) ClearCookies() { jar, _ := cookiejar.New(nil) obj.jar = jar } diff --git a/option.go b/option.go index 4b4453a..4cbc2bb 100644 --- a/option.go +++ b/option.go @@ -76,11 +76,12 @@ type ClientOption struct { LocalAddr *net.TCPAddr Dns *net.UDPAddr //dns AddrType gtls.AddrType //dns parse addr type - Jar *Jar //custom cookies + Jar Jar //custom cookies TlsConfig *tls.Config UtlsConfig *utls.Config //other option + UserAgent string //headers User-Agent value GetProxy func(ctx context.Context, url *url.URL) (string, error) //proxy callback:support https,http,socks5 proxy GetAddrType func(host string) gtls.AddrType } @@ -118,7 +119,7 @@ type RequestOption struct { LocalAddr *net.TCPAddr Dns *net.UDPAddr //dns AddrType gtls.AddrType //dns parse addr type //tls timeout,default:15 - Jar *Jar //custom cookies + Jar Jar //custom cookies TlsConfig *tls.Config UtlsConfig *utls.Config @@ -128,6 +129,7 @@ type RequestOption struct { Host string Referer string //set headers referer value ContentType string //headers Content-Type value + UserAgent string //headers User-Agent value Cookies any // cookies,support :json,map,str,http.Header Params any //url params,join url query,json,map