mirror of
https://github.com/gospider007/requests.git
synced 2025-12-24 13:57:52 +08:00
优化代码
This commit is contained in:
76
client.go
76
client.go
@@ -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
8
go.mod
@@ -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
6
go.sum
@@ -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
78
jar.go
Normal 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
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user