优化代码

This commit is contained in:
bxd
2023-09-19 10:24:48 +08:00
parent 24f5a7a650
commit e6a7bdbfa7
5 changed files with 94 additions and 76 deletions

View File

@@ -2,13 +2,11 @@ package requests
import (
"context"
"errors"
"net"
"net/url"
"time"
"net/http"
"net/http/cookiejar"
"gitee.com/baixudong/ja3"
"gitee.com/baixudong/tools"
@@ -51,6 +49,7 @@ type ClientOption struct {
ResponseCallBack func(context.Context, *http.Request, *http.Response) error
}
type Client struct {
jar *Jar
redirectNum int //重定向次数
disDecode bool //关闭自动编码
disUnZip bool //变比自动解压
@@ -102,9 +101,9 @@ func NewClient(preCtx context.Context, options ...ClientOption) (*Client, error)
option.TlsHandshakeTimeout = time.Second * 5
}
//创建cookiesjar
var jar *cookiejar.Jar
var jar *Jar
if !option.DisCookie {
jar = newJar()
jar = NewJar()
}
// var http3Transport *http3.RoundTripper
// if option.Http3 {
@@ -130,7 +129,7 @@ func NewClient(preCtx context.Context, options ...ClientOption) (*Client, error)
GetProxy: option.GetProxy,
})
client := &http.Client{
Jar: jar,
Jar: jar.jar,
Transport: transport,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
ctxData := req.Context().Value(keyPrincipalID).(*reqCtxData)
@@ -148,6 +147,7 @@ func NewClient(preCtx context.Context, options ...ClientOption) (*Client, error)
}
}
result := &Client{
jar: jar,
ctx: ctx,
cnl: cnl,
client: client,
@@ -203,72 +203,6 @@ func (obj *Client) Close() {
obj.cnl()
}
// 返回url 的cookies,也可以设置url 的cookies
func (obj *Client) GetCookies(href string) (Cookies, error) {
return getCookies(obj.client.Jar, href)
}
func (obj *Client) SetCookies(href string, cookies ...any) error {
return setCookies(obj.client.Jar, href, cookies...)
}
type Jar struct {
jar *cookiejar.Jar
}
func newJar() *cookiejar.Jar {
jar, _ := cookiejar.New(nil)
return jar
}
func NewJar() *Jar {
return &Jar{
jar: newJar(),
}
}
func (obj *Jar) GetCookies(href string, cookies ...any) (Cookies, error) {
return getCookies(obj.jar, href)
}
func (obj *Jar) SetCookies(href string, cookies ...any) error {
return setCookies(obj.jar, href, cookies...)
}
func (obj *Jar) ClearCookies() {
*obj.jar = *newJar()
}
func getCookies(jar http.CookieJar, href string) (Cookies, error) {
if jar == nil {
return nil, errors.New("jar is nil")
}
u, err := url.Parse(href)
if err != nil {
return nil, err
}
return jar.Cookies(u), nil
}
func setCookies(jar http.CookieJar, href string, cookies ...any) error {
if jar == nil {
return errors.New("jar is nil")
}
u, err := url.Parse(href)
if err != nil {
return err
}
for _, cookie := range cookies {
cooks, err := ReadCookies(cookie)
if err != nil {
return err
}
jar.SetCookies(u, cooks)
}
return nil
}
// 清除cookies
func (obj *Client) ClearCookies() {
if obj.client.Jar != nil {
*obj.client.Jar.(*cookiejar.Jar) = *newJar()
}
}
func (obj *Client) getClient(option RequestOption) *http.Client {
if option.DisCookie && obj.noJarClient != nil {
return obj.noJarClient

8
go.mod
View File

@@ -5,13 +5,14 @@ go 1.21.0
require (
gitee.com/baixudong/bar v0.0.0-20230814072341-e111c30a1386
gitee.com/baixudong/bs4 v0.0.0-20230814072447-945ab1fd97ed
gitee.com/baixudong/ja3 v0.0.0-20230913080728-e3b7c48ce24d
gitee.com/baixudong/ja3 v0.0.0-20230919022351-7da22e9672be
gitee.com/baixudong/net v0.0.0-20230905022950-d3a73f7bf4cc
gitee.com/baixudong/re v0.0.0-20230809033040-360c1d945e59
gitee.com/baixudong/tools v0.0.0-20230905085451-d080a77e3eb5
gitee.com/baixudong/websocket v0.0.0-20230821075043-d36a43fd76a3
github.com/refraction-networking/utls v1.5.3
github.com/tidwall/gjson v1.16.0
golang.org/x/net v0.15.0
)
require (
@@ -28,7 +29,7 @@ require (
github.com/goccy/go-json v0.10.2 // indirect
github.com/google/uuid v1.3.1 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/klauspost/compress v1.17.0 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
@@ -39,11 +40,10 @@ require (
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.25.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/crypto v0.13.0 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
golang.org/x/image v0.12.0 // indirect
golang.org/x/net v0.15.0 // indirect
golang.org/x/sys v0.12.0 // indirect
golang.org/x/text v0.13.0 // indirect
nhooyr.io/websocket v1.8.7 // indirect

6
go.sum
View File

@@ -8,6 +8,8 @@ gitee.com/baixudong/ja3 v0.0.0-20230905022841-a30a5742bdb7 h1:Tz7PmFK9l7aLQ7y3zA
gitee.com/baixudong/ja3 v0.0.0-20230905022841-a30a5742bdb7/go.mod h1:jebK1zBD90X4lMLQm8sBU0rdtLEcd6DLbjG+Xqj46kI=
gitee.com/baixudong/ja3 v0.0.0-20230913080728-e3b7c48ce24d h1:G9MkZ+D2Li23JotMkMk10dpPk176k3qXG/OUl3zTpUY=
gitee.com/baixudong/ja3 v0.0.0-20230913080728-e3b7c48ce24d/go.mod h1:neyT68wQeB6PfjN93oxITdMsmhBCfTaC0SgQD8WV+MM=
gitee.com/baixudong/ja3 v0.0.0-20230919022351-7da22e9672be h1:FvP4TL3WLhXerdnq3EievZgNPeseBqBeIinMbumHAPU=
gitee.com/baixudong/ja3 v0.0.0-20230919022351-7da22e9672be/go.mod h1:J1e4XO7nU4Uicz0Dn9JvyOL01LRHHUzGvNssj1p4rg8=
gitee.com/baixudong/kinds v0.0.0-20230809033013-c3d6d3479f8c h1:MZewpjU0+82TcA+nHrcAbbgZhTCqVH2I5zwYBWJ4v54=
gitee.com/baixudong/kinds v0.0.0-20230809033013-c3d6d3479f8c/go.mod h1:J3r4FWnZOMgk7/1EWEEDaPQnx5uH4OLCRzpTOyKg5cA=
gitee.com/baixudong/net v0.0.0-20230905022950-d3a73f7bf4cc h1:Nsjpx5ivraXr9Vcg6XuuRq015RyXXD30CAaDOVmHfow=
@@ -90,6 +92,8 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM=
github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
@@ -149,6 +153,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.25.0 h1:4Hvk6GtkucQ790dqmj7l1eEnRdKm3k3ZUrUMS2d5+5c=
go.uber.org/zap v1.25.0/go.mod h1:JIAUzQIH94IC4fOJQm7gMmBJP5k7wQfdcnYdPoEXJYk=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc=
golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=

78
jar.go Normal file
View File

@@ -0,0 +1,78 @@
package requests
import (
"errors"
"net/http/cookiejar"
"net/url"
"golang.org/x/net/publicsuffix"
)
type Jar struct {
jar *cookiejar.Jar
}
func NewJar() *Jar {
jar, _ := cookiejar.New(nil)
return &Jar{
jar: jar,
}
}
// 返回url 的cookies,也可以设置url 的cookies
func (obj *Client) GetCookies(href string) (Cookies, error) {
return obj.jar.GetCookies(href)
}
func (obj *Client) SetCookies(href string, cookies ...any) error {
return obj.jar.SetCookies(href, cookies...)
}
// 清除cookies
func (obj *Client) ClearCookies() {
if obj.client.Jar != nil {
obj.jar.ClearCookies()
obj.client.Jar = obj.jar.jar
}
}
func (obj *Jar) GetCookies(href string) (Cookies, error) {
if obj.jar == nil {
return nil, errors.New("jar is nil")
}
u, err := url.Parse(href)
if err != nil {
return nil, err
}
return obj.jar.Cookies(u), nil
}
func (obj *Jar) SetCookies(href string, cookies ...any) error {
if obj.jar == nil {
return errors.New("jar is nil")
}
u, err := url.Parse(href)
if err != nil {
return err
}
for _, cookie := range cookies {
cooks, err := ReadCookies(cookie)
if err != nil {
return err
}
for _, cook := range cooks {
if cook.Path == "" {
cook.Path = "/"
}
if cook.Domain == "" {
cook.Domain, err = publicsuffix.EffectiveTLDPlusOne(u.Hostname())
if err != nil {
return err
}
}
}
obj.jar.SetCookies(u, cooks)
}
return nil
}
func (obj *Jar) ClearCookies() {
jar, _ := cookiejar.New(nil)
obj.jar = jar
}

View File

@@ -429,7 +429,7 @@ func (obj *Client) request(preCtx context.Context, option RequestOption) (respon
} else if reqs.Header.Get("Host") != "" {
reqs.Host = reqs.Header.Get("Host")
}
//添加cookies
//添加 cookies
if option.Cookies != nil {
cooks, cookOk := option.Cookies.(Cookies)
if !cookOk {