mirror of
https://github.com/gospider007/requests.git
synced 2025-12-24 13:57:52 +08:00
sync
This commit is contained in:
@@ -35,7 +35,7 @@ func NewClient(preCtx context.Context, options ...ClientOption) (*Client, error)
|
||||
}
|
||||
result := new(Client)
|
||||
result.ctx, result.cnl = context.WithCancel(preCtx)
|
||||
result.transport = newRoundTripper(result.ctx, option)
|
||||
result.transport = newRoundTripper(result.ctx)
|
||||
result.option = option
|
||||
if result.option.TlsConfig == nil {
|
||||
result.option.TlsConfig = &tls.Config{
|
||||
|
||||
2
conn.go
2
conn.go
@@ -166,6 +166,8 @@ func (obj *connecotr) taskMain(task *reqTask) (retry bool) {
|
||||
case <-obj.bodyCtx.Done(): //wait body close
|
||||
if task.err = context.Cause(obj.bodyCtx); !errors.Is(task.err, errGospiderBodyClose) {
|
||||
task.err = tools.WrapError(task.err, "bodyCtx close")
|
||||
} else {
|
||||
task.err = nil
|
||||
}
|
||||
case <-task.req.Context().Done(): //wait request close
|
||||
task.err = tools.WrapError(context.Cause(task.req.Context()), "requestCtx close")
|
||||
|
||||
138
dial.go
138
dial.go
@@ -20,12 +20,6 @@ import (
|
||||
utls "github.com/refraction-networking/utls"
|
||||
)
|
||||
|
||||
type DialClient struct {
|
||||
dialer *net.Dialer
|
||||
dnsIpData sync.Map
|
||||
dns *net.UDPAddr
|
||||
getAddrType func(host string) gtls.AddrType
|
||||
}
|
||||
type msgClient struct {
|
||||
time time.Time
|
||||
host string
|
||||
@@ -38,16 +32,38 @@ type DialOption struct {
|
||||
AddrType gtls.AddrType //first ip type
|
||||
Dns *net.UDPAddr
|
||||
GetAddrType func(host string) gtls.AddrType
|
||||
// EnableNetPoll bool
|
||||
}
|
||||
|
||||
func NewDialer(option DialOption) *net.Dialer {
|
||||
type dialer interface {
|
||||
DialContext(ctx context.Context, network string, address string) (net.Conn, error)
|
||||
LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error)
|
||||
}
|
||||
|
||||
// 自定义dialer
|
||||
type Dialer struct {
|
||||
dnsIpData sync.Map
|
||||
// dialer dialer
|
||||
}
|
||||
type myDialer struct {
|
||||
dialer *net.Dialer
|
||||
}
|
||||
|
||||
func (d *myDialer) DialContext(ctx context.Context, network string, address string) (net.Conn, error) {
|
||||
return d.dialer.DialContext(ctx, network, address)
|
||||
}
|
||||
func (d *myDialer) LookupIPAddr(ctx context.Context, host string) ([]net.IPAddr, error) {
|
||||
return d.dialer.Resolver.LookupIPAddr(ctx, host)
|
||||
}
|
||||
func newDialer(option DialOption) dialer {
|
||||
if option.KeepAlive == 0 {
|
||||
option.KeepAlive = time.Second * 5
|
||||
}
|
||||
if option.DialTimeout == 0 {
|
||||
option.DialTimeout = time.Second * 5
|
||||
}
|
||||
dialer := &net.Dialer{
|
||||
var dialer myDialer
|
||||
dialer.dialer = &net.Dialer{
|
||||
Timeout: option.DialTimeout,
|
||||
KeepAlive: option.KeepAlive,
|
||||
LocalAddr: option.LocalAddr,
|
||||
@@ -60,10 +76,10 @@ func NewDialer(option DialOption) *net.Dialer {
|
||||
},
|
||||
}
|
||||
if option.LocalAddr != nil {
|
||||
dialer.LocalAddr = option.LocalAddr
|
||||
dialer.dialer.LocalAddr = option.LocalAddr
|
||||
}
|
||||
if option.Dns != nil {
|
||||
dialer.Resolver = &net.Resolver{
|
||||
dialer.dialer.Resolver = &net.Resolver{
|
||||
PreferGo: true,
|
||||
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
return (&net.Dialer{
|
||||
@@ -73,17 +89,10 @@ func NewDialer(option DialOption) *net.Dialer {
|
||||
},
|
||||
}
|
||||
}
|
||||
dialer.SetMultipathTCP(true)
|
||||
return dialer
|
||||
dialer.dialer.SetMultipathTCP(true)
|
||||
return &dialer
|
||||
}
|
||||
func NewDail(option DialOption) *DialClient {
|
||||
return &DialClient{
|
||||
dialer: NewDialer(option),
|
||||
dns: option.Dns,
|
||||
getAddrType: option.GetAddrType,
|
||||
}
|
||||
}
|
||||
func (obj *DialClient) dialContext(ctx context.Context, option *RequestOption, network string, addr string, isProxy bool) (net.Conn, error) {
|
||||
func (obj *Dialer) dialContext(ctx context.Context, option *RequestOption, network string, addr string, isProxy bool) (net.Conn, error) {
|
||||
if option == nil {
|
||||
option = &RequestOption{}
|
||||
}
|
||||
@@ -91,18 +100,17 @@ func (obj *DialClient) dialContext(ctx context.Context, option *RequestOption, n
|
||||
if err != nil {
|
||||
return nil, tools.WrapError(err, "addrToIp error,SplitHostPort")
|
||||
}
|
||||
var dialer *net.Dialer
|
||||
dialer := newDialer(option.DialOption)
|
||||
if _, ipInt := gtls.ParseHost(host); ipInt == 0 { //domain
|
||||
host, ok := obj.loadHost(host)
|
||||
if !ok { //dns parse
|
||||
dialer = obj.getDialer(option, true)
|
||||
var addrType gtls.AddrType
|
||||
if option.AddrType != 0 {
|
||||
addrType = option.AddrType
|
||||
} else if obj.getAddrType != nil {
|
||||
addrType = obj.getAddrType(host)
|
||||
if option.DialOption.AddrType != 0 {
|
||||
addrType = option.DialOption.AddrType
|
||||
} else if option.DialOption.GetAddrType != nil {
|
||||
addrType = option.DialOption.GetAddrType(host)
|
||||
}
|
||||
ips, err := dialer.Resolver.LookupIPAddr(ctx, host)
|
||||
ips, err := dialer.LookupIPAddr(ctx, host)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -129,9 +137,6 @@ func (obj *DialClient) dialContext(ctx context.Context, option *RequestOption, n
|
||||
addr = net.JoinHostPort(host, port)
|
||||
}
|
||||
}
|
||||
if dialer == nil {
|
||||
dialer = obj.getDialer(option, false)
|
||||
}
|
||||
con, err := dialer.DialContext(ctx, network, addr)
|
||||
if option.Logger != nil {
|
||||
if isProxy {
|
||||
@@ -152,14 +157,14 @@ func (obj *DialClient) dialContext(ctx context.Context, option *RequestOption, n
|
||||
}
|
||||
return con, err
|
||||
}
|
||||
func (obj *DialClient) DialContext(ctx context.Context, ctxData *RequestOption, network string, addr string) (net.Conn, error) {
|
||||
func (obj *Dialer) DialContext(ctx context.Context, ctxData *RequestOption, network string, addr string) (net.Conn, error) {
|
||||
return obj.dialContext(ctx, ctxData, network, addr, false)
|
||||
}
|
||||
func (obj *DialClient) ProxyDialContext(ctx context.Context, ctxData *RequestOption, network string, addr string) (net.Conn, error) {
|
||||
func (obj *Dialer) ProxyDialContext(ctx context.Context, ctxData *RequestOption, network string, addr string) (net.Conn, error) {
|
||||
return obj.dialContext(ctx, ctxData, network, addr, true)
|
||||
}
|
||||
|
||||
func (obj *DialClient) DialProxyContext(ctx context.Context, ctxData *RequestOption, network string, proxyTlsConfig *tls.Config, proxyUrls ...*url.URL) (net.Conn, error) {
|
||||
func (obj *Dialer) DialProxyContext(ctx context.Context, ctxData *RequestOption, network string, proxyTlsConfig *tls.Config, proxyUrls ...*url.URL) (net.Conn, error) {
|
||||
proxyLen := len(proxyUrls)
|
||||
if proxyLen < 2 {
|
||||
return nil, errors.New("proxyUrls is nil")
|
||||
@@ -196,7 +201,7 @@ func getProxyAddr(proxyUrl *url.URL) (addr string, err error) {
|
||||
}
|
||||
return
|
||||
}
|
||||
func (obj *DialClient) dialProxyContext(ctx context.Context, ctxData *RequestOption, network string, proxyUrl *url.URL) (net.Conn, error) {
|
||||
func (obj *Dialer) dialProxyContext(ctx context.Context, ctxData *RequestOption, network string, proxyUrl *url.URL) (net.Conn, error) {
|
||||
if proxyUrl == nil {
|
||||
return nil, errors.New("proxyUrl is nil")
|
||||
}
|
||||
@@ -210,7 +215,7 @@ func (obj *DialClient) dialProxyContext(ctx context.Context, ctxData *RequestOpt
|
||||
return obj.ProxyDialContext(ctx, ctxData, network, addr)
|
||||
}
|
||||
|
||||
func (obj *DialClient) verifyProxyToRemote(ctx context.Context, option *RequestOption, conn net.Conn, proxyTlsConfig *tls.Config, proxyUrl *url.URL, remoteUrl *url.URL) (net.Conn, error) {
|
||||
func (obj *Dialer) verifyProxyToRemote(ctx context.Context, option *RequestOption, conn net.Conn, proxyTlsConfig *tls.Config, proxyUrl *url.URL, remoteUrl *url.URL) (net.Conn, error) {
|
||||
var err error
|
||||
if proxyUrl.Scheme == "https" {
|
||||
if conn, err = obj.addTls(ctx, conn, proxyUrl.Host, true, proxyTlsConfig); err != nil {
|
||||
@@ -258,7 +263,7 @@ func (obj *DialClient) verifyProxyToRemote(ctx context.Context, option *RequestO
|
||||
return conn, err
|
||||
}
|
||||
}
|
||||
func (obj *DialClient) loadHost(host string) (string, bool) {
|
||||
func (obj *Dialer) loadHost(host string) (string, bool) {
|
||||
msgDataAny, ok := obj.dnsIpData.Load(host)
|
||||
if ok {
|
||||
msgdata := msgDataAny.(msgClient)
|
||||
@@ -268,7 +273,7 @@ func (obj *DialClient) loadHost(host string) (string, bool) {
|
||||
}
|
||||
return host, false
|
||||
}
|
||||
func (obj *DialClient) addrToIp(host string, ips []net.IPAddr, addrType gtls.AddrType) (string, error) {
|
||||
func (obj *Dialer) addrToIp(host string, ips []net.IPAddr, addrType gtls.AddrType) (string, error) {
|
||||
ip, err := obj.lookupIPAddr(ips, addrType)
|
||||
if err != nil {
|
||||
return host, tools.WrapError(err, "addrToIp error,lookupIPAddr")
|
||||
@@ -276,7 +281,7 @@ func (obj *DialClient) addrToIp(host string, ips []net.IPAddr, addrType gtls.Add
|
||||
obj.dnsIpData.Store(host, msgClient{time: time.Now(), host: ip.String()})
|
||||
return ip.String(), nil
|
||||
}
|
||||
func (obj *DialClient) clientVerifySocks5(conn net.Conn, proxyUrl *url.URL, remoteUrl *url.URL) (err error) {
|
||||
func (obj *Dialer) clientVerifySocks5(conn net.Conn, proxyUrl *url.URL, remoteUrl *url.URL) (err error) {
|
||||
if _, err = conn.Write([]byte{5, 2, 0, 2}); err != nil {
|
||||
return
|
||||
}
|
||||
@@ -409,7 +414,7 @@ func (obj *DialClient) clientVerifySocks5(conn net.Conn, proxyUrl *url.URL, remo
|
||||
_, err = io.ReadFull(conn, readCon[:2])
|
||||
return
|
||||
}
|
||||
func (obj *DialClient) lookupIPAddr(ips []net.IPAddr, addrType gtls.AddrType) (net.IP, error) {
|
||||
func (obj *Dialer) lookupIPAddr(ips []net.IPAddr, addrType gtls.AddrType) (net.IP, error) {
|
||||
for _, ipAddr := range ips {
|
||||
ip := ipAddr.IP
|
||||
if ipType := gtls.ParseIp(ip); ipType == 4 || ipType == 6 {
|
||||
@@ -426,52 +431,11 @@ func (obj *DialClient) lookupIPAddr(ips []net.IPAddr, addrType gtls.AddrType) (n
|
||||
}
|
||||
return nil, errors.New("dns parse host error")
|
||||
}
|
||||
func (obj *DialClient) getDialer(option *RequestOption, parseDns bool) *net.Dialer {
|
||||
var dialOption DialOption
|
||||
var isNew bool
|
||||
if option.DialTimeout == 0 {
|
||||
dialOption.DialTimeout = obj.dialer.Timeout
|
||||
} else {
|
||||
dialOption.DialTimeout = option.DialTimeout
|
||||
if option.DialTimeout != obj.dialer.Timeout {
|
||||
isNew = true
|
||||
}
|
||||
}
|
||||
|
||||
if option.KeepAlive == 0 {
|
||||
dialOption.KeepAlive = obj.dialer.KeepAlive
|
||||
} else {
|
||||
dialOption.KeepAlive = option.KeepAlive
|
||||
if option.KeepAlive != obj.dialer.KeepAlive {
|
||||
isNew = true
|
||||
}
|
||||
}
|
||||
|
||||
if option.LocalAddr == nil {
|
||||
if obj.dialer.LocalAddr != nil {
|
||||
dialOption.LocalAddr = obj.dialer.LocalAddr.(*net.TCPAddr)
|
||||
}
|
||||
} else {
|
||||
dialOption.LocalAddr = option.LocalAddr
|
||||
if option.LocalAddr.String() != obj.dialer.LocalAddr.String() {
|
||||
isNew = true
|
||||
}
|
||||
}
|
||||
if option.Dns == nil {
|
||||
dialOption.Dns = obj.dns
|
||||
} else {
|
||||
dialOption.Dns = option.Dns
|
||||
if parseDns && option.Dns.String() != obj.dns.String() {
|
||||
isNew = true
|
||||
}
|
||||
}
|
||||
if isNew {
|
||||
return NewDialer(dialOption)
|
||||
} else {
|
||||
return obj.dialer
|
||||
}
|
||||
}
|
||||
func (obj *DialClient) addTls(ctx context.Context, conn net.Conn, host string, forceHttp1 bool, tlsConfig *tls.Config) (*tls.Conn, error) {
|
||||
// func (obj *Dialer) getDialer(option *RequestOption) *net.Dialer {
|
||||
// return newDialer(option.DialOption)
|
||||
// }
|
||||
func (obj *Dialer) addTls(ctx context.Context, conn net.Conn, host string, forceHttp1 bool, tlsConfig *tls.Config) (*tls.Conn, error) {
|
||||
var tlsConn *tls.Conn
|
||||
tlsConfig.ServerName = gtls.GetServerName(host)
|
||||
if forceHttp1 {
|
||||
@@ -482,7 +446,7 @@ func (obj *DialClient) addTls(ctx context.Context, conn net.Conn, host string, f
|
||||
tlsConn = tls.Client(conn, tlsConfig)
|
||||
return tlsConn, tlsConn.HandshakeContext(ctx)
|
||||
}
|
||||
func (obj *DialClient) addJa3Tls(ctx context.Context, conn net.Conn, host string, forceHttp1 bool, ja3Spec ja3.Ja3Spec, tlsConfig *utls.Config) (*utls.UConn, error) {
|
||||
func (obj *Dialer) addJa3Tls(ctx context.Context, conn net.Conn, host string, forceHttp1 bool, ja3Spec ja3.Ja3Spec, tlsConfig *utls.Config) (*utls.UConn, error) {
|
||||
tlsConfig.ServerName = gtls.GetServerName(host)
|
||||
if forceHttp1 {
|
||||
tlsConfig.NextProtos = []string{"http/1.1"}
|
||||
@@ -491,7 +455,7 @@ func (obj *DialClient) addJa3Tls(ctx context.Context, conn net.Conn, host string
|
||||
}
|
||||
return ja3.NewClient(ctx, conn, ja3Spec, forceHttp1, tlsConfig)
|
||||
}
|
||||
func (obj *DialClient) Socks5Proxy(ctx context.Context, ctxData *RequestOption, network string, proxyUrl *url.URL, remoteUrl *url.URL) (conn net.Conn, err error) {
|
||||
func (obj *Dialer) Socks5Proxy(ctx context.Context, ctxData *RequestOption, network string, proxyUrl *url.URL, remoteUrl *url.URL) (conn net.Conn, err error) {
|
||||
if conn, err = obj.DialContext(ctx, ctxData, network, net.JoinHostPort(proxyUrl.Hostname(), proxyUrl.Port())); err != nil {
|
||||
return
|
||||
}
|
||||
@@ -512,7 +476,7 @@ func (obj *DialClient) Socks5Proxy(ctx context.Context, ctxData *RequestOption,
|
||||
return
|
||||
}
|
||||
}
|
||||
func (obj *DialClient) clientVerifyHttps(ctx context.Context, conn net.Conn, proxyUrl *url.URL, remoteUrl *url.URL) (err error) {
|
||||
func (obj *Dialer) clientVerifyHttps(ctx context.Context, conn net.Conn, proxyUrl *url.URL, remoteUrl *url.URL) (err error) {
|
||||
hdr := make(http.Header)
|
||||
hdr.Set("User-Agent", tools.UserAgent)
|
||||
if proxyUrl.User != nil {
|
||||
|
||||
10
go.mod
10
go.mod
@@ -7,22 +7,22 @@ require (
|
||||
github.com/gospider007/bs4 v0.0.0-20241216122612-aa3f29179e6f
|
||||
github.com/gospider007/gson v0.0.0-20241216122450-fb66d0ba2a07
|
||||
github.com/gospider007/gtls v0.0.0-20241216053748-dc1a232bb017
|
||||
github.com/gospider007/http2 v0.0.0-20241216122734-aa1047df028c
|
||||
github.com/gospider007/http2 v0.0.0-20241222151842-034aa1d46e9d
|
||||
github.com/gospider007/http3 v0.0.0-20241215120136-980caa047c47
|
||||
github.com/gospider007/ja3 v0.0.0-20241216123149-83352be79439
|
||||
github.com/gospider007/re v0.0.0-20241216142712-efbef8d55ea2
|
||||
github.com/gospider007/tools v0.0.0-20241216141313-4a832f55a843
|
||||
github.com/gospider007/websocket v0.0.0-20241216130619-89829336d9a6
|
||||
github.com/refraction-networking/utls v1.6.7
|
||||
golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e
|
||||
golang.org/x/net v0.32.0
|
||||
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67
|
||||
golang.org/x/net v0.33.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/PuerkitoBio/goquery v1.10.0 // indirect
|
||||
github.com/STARRY-S/zip v0.2.1 // indirect
|
||||
github.com/andybalholm/brotli v1.1.1 // indirect
|
||||
github.com/andybalholm/cascadia v1.3.2 // indirect
|
||||
github.com/andybalholm/cascadia v1.3.3 // indirect
|
||||
github.com/bodgit/plumbing v1.3.0 // indirect
|
||||
github.com/bodgit/sevenzip v1.6.0 // indirect
|
||||
github.com/bodgit/windows v1.0.1 // indirect
|
||||
@@ -51,7 +51,7 @@ require (
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/nwaples/rardecode/v2 v2.0.1 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.22.0 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.22.1 // indirect
|
||||
github.com/pierrec/lz4/v4 v4.1.22 // indirect
|
||||
github.com/quic-go/qpack v0.5.1 // indirect
|
||||
github.com/quic-go/quic-go v0.48.2 // indirect
|
||||
|
||||
59
go.sum
59
go.sum
@@ -23,8 +23,8 @@ github.com/STARRY-S/zip v0.2.1 h1:pWBd4tuSGm3wtpoqRZZ2EAwOmcHK6XFf7bU9qcJXyFg=
|
||||
github.com/STARRY-S/zip v0.2.1/go.mod h1:xNvshLODWtC4EJ702g7cTYn13G53o1+X9BWnPFpcWV4=
|
||||
github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
|
||||
github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
|
||||
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
|
||||
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
|
||||
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
|
||||
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
|
||||
github.com/bodgit/plumbing v1.3.0 h1:pf9Itz1JOQgn7vEOE7v7nlEfBykYqvUYioC61TwWCFU=
|
||||
github.com/bodgit/plumbing v1.3.0/go.mod h1:JOTb4XiRu5xfnmdnDJo6GmSbSbtSyufrsyZFByMtKEs=
|
||||
github.com/bodgit/sevenzip v1.6.0 h1:a4R0Wu6/P1o1pP/3VV++aEOcyeBxeO/xE2Y9NSTrr6A=
|
||||
@@ -105,8 +105,8 @@ github.com/gospider007/gson v0.0.0-20241216122450-fb66d0ba2a07 h1:cqsuxxIKxbRG/x
|
||||
github.com/gospider007/gson v0.0.0-20241216122450-fb66d0ba2a07/go.mod h1:XcFiXq3t2+b1x9zezQV/FbuB5Y1rdUrtvpJRbxZXef4=
|
||||
github.com/gospider007/gtls v0.0.0-20241216053748-dc1a232bb017 h1:4lCqtxoQS+PO6YlcoYO8w7p1bi5LzPkzIaIuveouoYk=
|
||||
github.com/gospider007/gtls v0.0.0-20241216053748-dc1a232bb017/go.mod h1:jtwtOHFTKJPLANLr06DtUmkCuoEoQjfKuMrB6sIhIh8=
|
||||
github.com/gospider007/http2 v0.0.0-20241216122734-aa1047df028c h1:xymNUHM1ozqBhptmxpugyfb4+Bl7LoCXt7/wycvpNV4=
|
||||
github.com/gospider007/http2 v0.0.0-20241216122734-aa1047df028c/go.mod h1:b8VbmpEUTyGR8B8h4MGY2E/5klXqs/WziEgTZx5kU3I=
|
||||
github.com/gospider007/http2 v0.0.0-20241222151842-034aa1d46e9d h1:HJv2HOsvZ+7yf+6cxqGL/DWPQx//6hyLOmoECsh0OBk=
|
||||
github.com/gospider007/http2 v0.0.0-20241222151842-034aa1d46e9d/go.mod h1:b8VbmpEUTyGR8B8h4MGY2E/5klXqs/WziEgTZx5kU3I=
|
||||
github.com/gospider007/http3 v0.0.0-20241215120136-980caa047c47 h1:HYYKcKHPFqpjFjEjwceE8hi2lxQ+EZtMLFJG4KEr9NY=
|
||||
github.com/gospider007/http3 v0.0.0-20241215120136-980caa047c47/go.mod h1:dCygjc5CZHjrAOYZkdGcwHTZV8w4DbTQkbuTEIl7jMg=
|
||||
github.com/gospider007/ja3 v0.0.0-20241216123149-83352be79439 h1:zDuskJWFKk7JMs7XkX22XSrcbEDLe0rHs1baHSYCH3c=
|
||||
@@ -160,10 +160,10 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/nwaples/rardecode/v2 v2.0.1 h1:3MN6/R+Y4c7e+21U3yhWuUcf72sYmcmr6jtiuAVSH1A=
|
||||
github.com/nwaples/rardecode/v2 v2.0.1/go.mod h1:yntwv/HfMc/Hbvtq9I19D1n58te3h6KsqCf3GxyfBGY=
|
||||
github.com/onsi/ginkgo/v2 v2.22.0 h1:Yed107/8DjTr0lKCNt7Dn8yQ6ybuDRQoMGrNFKzMfHg=
|
||||
github.com/onsi/ginkgo/v2 v2.22.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
|
||||
github.com/onsi/gomega v1.34.2 h1:pNCwDkzrsv7MS9kpaQvVb1aVLahQXyJ/Tv5oAZMI3i8=
|
||||
github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc=
|
||||
github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM=
|
||||
github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM=
|
||||
github.com/onsi/gomega v1.36.1 h1:bJDPBO7ibjxcbHMgSCoo4Yj18UWbKDlLwX1x9sybDcw=
|
||||
github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
|
||||
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
|
||||
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
@@ -236,6 +236,9 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
|
||||
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
|
||||
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
|
||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
@@ -246,8 +249,8 @@ golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE
|
||||
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e h1:4qufH0hlUYs6AO6XmZC3GqfDPGSXHVXUFR6OND+iJX4=
|
||||
golang.org/x/exp v0.0.0-20241215155358-4a5509556b9e/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
|
||||
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 h1:1UoZQm6f0P/ZO0w1Ri+f+ifG/gXhegadRdwBIXEFWDo=
|
||||
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/image v0.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68=
|
||||
@@ -270,6 +273,9 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
|
||||
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -289,9 +295,12 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
|
||||
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
|
||||
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
|
||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
@@ -305,6 +314,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
|
||||
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
|
||||
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -324,13 +336,21 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
|
||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
|
||||
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
|
||||
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
@@ -339,6 +359,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
|
||||
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
@@ -371,6 +394,8 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK
|
||||
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/tools v0.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
|
||||
golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
@@ -409,8 +434,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac
|
||||
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
|
||||
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
|
||||
75
option.go
75
option.go
@@ -4,12 +4,10 @@ import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"io"
|
||||
"net"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
"github.com/gospider007/gtls"
|
||||
"github.com/gospider007/ja3"
|
||||
"github.com/gospider007/websocket"
|
||||
utls "github.com/refraction-networking/utls"
|
||||
@@ -72,19 +70,13 @@ type ClientOption struct {
|
||||
TlsHandshakeTimeout time.Duration //tls timeout,default:15
|
||||
UserAgent string //headers User-Agent value
|
||||
//other option
|
||||
GetProxy func(ctx context.Context, url *url.URL) (string, error) //proxy callback:support https,http,socks5 proxy
|
||||
GetProxys func(ctx context.Context, url *url.URL) ([]string, error) //proxys callback:support https,http,socks5 proxy
|
||||
GetAddrType func(host string) gtls.AddrType
|
||||
GetProxy func(ctx context.Context, url *url.URL) (string, error) //proxy callback:support https,http,socks5 proxy
|
||||
GetProxys func(ctx context.Context, url *url.URL) ([]string, error) //proxys callback:support https,http,socks5 proxy
|
||||
DialOption DialOption
|
||||
|
||||
//network card ip
|
||||
DialTimeout time.Duration //dial tcp timeout,default:15
|
||||
KeepAlive time.Duration //keepalive,default:30
|
||||
LocalAddr *net.TCPAddr
|
||||
Dns *net.UDPAddr //dns
|
||||
AddrType gtls.AddrType //dns parse addr type
|
||||
Jar Jar //custom cookies
|
||||
TlsConfig *tls.Config
|
||||
UtlsConfig *utls.Config
|
||||
Jar Jar //custom cookies
|
||||
TlsConfig *tls.Config
|
||||
UtlsConfig *utls.Config
|
||||
}
|
||||
|
||||
// Options for sending requests
|
||||
@@ -115,19 +107,14 @@ type RequestOption struct {
|
||||
TlsHandshakeTimeout time.Duration
|
||||
UserAgent string //headers User-Agent value
|
||||
|
||||
GetProxy func(ctx context.Context, url *url.URL) (string, error) //proxy callback:support https,http,socks5 proxy
|
||||
GetProxys func(ctx context.Context, url *url.URL) ([]string, error) //proxys callback:support https,http,socks5 proxy
|
||||
GetAddrType func(host string) gtls.AddrType
|
||||
|
||||
GetProxy func(ctx context.Context, url *url.URL) (string, error) //proxy callback:support https,http,socks5 proxy
|
||||
GetProxys func(ctx context.Context, url *url.URL) ([]string, error) //proxys callback:support https,http,socks5 proxy
|
||||
DialOption DialOption
|
||||
//network card ip
|
||||
DialTimeout time.Duration //dial tcp timeout,default:15
|
||||
KeepAlive time.Duration //keepalive,default:30
|
||||
LocalAddr *net.TCPAddr
|
||||
Dns *net.UDPAddr //dns
|
||||
AddrType gtls.AddrType //dns parse addr type //tls timeout,default:15
|
||||
Jar Jar //custom cookies
|
||||
TlsConfig *tls.Config
|
||||
UtlsConfig *utls.Config
|
||||
|
||||
Jar Jar //custom cookies
|
||||
TlsConfig *tls.Config
|
||||
UtlsConfig *utls.Config
|
||||
|
||||
// other option
|
||||
Method string //method
|
||||
@@ -313,15 +300,6 @@ func (obj *Client) newRequestOption(option RequestOption) RequestOption {
|
||||
if option.TlsHandshakeTimeout == 0 {
|
||||
option.TlsHandshakeTimeout = obj.option.TlsHandshakeTimeout
|
||||
}
|
||||
if option.DialTimeout == 0 {
|
||||
option.DialTimeout = obj.option.DialTimeout
|
||||
}
|
||||
if option.KeepAlive == 0 {
|
||||
option.KeepAlive = obj.option.KeepAlive
|
||||
}
|
||||
if option.LocalAddr == nil {
|
||||
option.LocalAddr = obj.option.LocalAddr
|
||||
}
|
||||
if option.TlsConfig == nil {
|
||||
option.TlsConfig = obj.option.TlsConfig
|
||||
}
|
||||
@@ -361,20 +339,23 @@ func (obj *Client) newRequestOption(option RequestOption) RequestOption {
|
||||
if option.TlsHandshakeTimeout == 0 {
|
||||
option.TlsHandshakeTimeout = obj.option.TlsHandshakeTimeout
|
||||
}
|
||||
if option.DialTimeout == 0 {
|
||||
option.DialTimeout = obj.option.DialTimeout
|
||||
if option.DialOption.DialTimeout == 0 {
|
||||
option.DialOption.DialTimeout = obj.option.DialOption.DialTimeout
|
||||
}
|
||||
if option.KeepAlive == 0 {
|
||||
option.KeepAlive = obj.option.KeepAlive
|
||||
if option.DialOption.KeepAlive == 0 {
|
||||
option.DialOption.KeepAlive = obj.option.DialOption.KeepAlive
|
||||
}
|
||||
if option.LocalAddr == nil {
|
||||
option.LocalAddr = obj.option.LocalAddr
|
||||
if option.DialOption.LocalAddr == nil {
|
||||
option.DialOption.LocalAddr = obj.option.DialOption.LocalAddr
|
||||
}
|
||||
if option.Dns == nil {
|
||||
option.Dns = obj.option.Dns
|
||||
if option.DialOption.AddrType == 0 {
|
||||
option.DialOption.AddrType = obj.option.DialOption.AddrType
|
||||
}
|
||||
if option.AddrType == 0 {
|
||||
option.AddrType = obj.option.AddrType
|
||||
if option.DialOption.Dns == nil {
|
||||
option.DialOption.Dns = obj.option.DialOption.Dns
|
||||
}
|
||||
if option.DialOption.GetAddrType == nil {
|
||||
option.DialOption.GetAddrType = obj.option.DialOption.GetAddrType
|
||||
}
|
||||
if option.Jar == nil {
|
||||
option.Jar = obj.option.Jar
|
||||
@@ -401,8 +382,6 @@ func (obj *Client) newRequestOption(option RequestOption) RequestOption {
|
||||
if option.GetProxys == nil {
|
||||
option.GetProxys = obj.option.GetProxys
|
||||
}
|
||||
if option.GetAddrType == nil {
|
||||
option.GetAddrType = obj.option.GetAddrType
|
||||
}
|
||||
|
||||
return option
|
||||
}
|
||||
|
||||
@@ -45,26 +45,18 @@ type roundTripper struct {
|
||||
ctx context.Context
|
||||
cnl context.CancelFunc
|
||||
connPools *connPools
|
||||
dialer *DialClient
|
||||
dialer *Dialer
|
||||
}
|
||||
|
||||
func newRoundTripper(preCtx context.Context, option ClientOption) *roundTripper {
|
||||
func newRoundTripper(preCtx context.Context) *roundTripper {
|
||||
if preCtx == nil {
|
||||
preCtx = context.TODO()
|
||||
}
|
||||
ctx, cnl := context.WithCancel(preCtx)
|
||||
dialClient := NewDail(DialOption{
|
||||
DialTimeout: option.DialTimeout,
|
||||
Dns: option.Dns,
|
||||
KeepAlive: option.KeepAlive,
|
||||
LocalAddr: option.LocalAddr,
|
||||
AddrType: option.AddrType,
|
||||
GetAddrType: option.GetAddrType,
|
||||
})
|
||||
return &roundTripper{
|
||||
ctx: ctx,
|
||||
cnl: cnl,
|
||||
dialer: dialClient,
|
||||
dialer: &Dialer{},
|
||||
connPools: newConnPools(),
|
||||
}
|
||||
}
|
||||
@@ -161,7 +153,7 @@ func (obj *roundTripper) dial(option *RequestOption, req *http.Request) (conn *c
|
||||
Id: option.requestId,
|
||||
Time: time.Now(),
|
||||
Type: LogType_TLSHandshake,
|
||||
Msg: getHost(req),
|
||||
Msg: fmt.Sprintf("host:%s, h2:%t", getHost(req), h2),
|
||||
})
|
||||
}
|
||||
if err != nil {
|
||||
|
||||
@@ -9,7 +9,9 @@ import (
|
||||
|
||||
func TestAddType(t *testing.T) {
|
||||
session, _ := requests.NewClient(nil, requests.ClientOption{
|
||||
AddrType: gtls.Ipv4, // Prioritize parsing IPv4 addresses
|
||||
DialOption: requests.DialOption{
|
||||
AddrType: gtls.Ipv4,
|
||||
},
|
||||
})
|
||||
resp, err := session.Get(nil, "https://test.ipw.cn")
|
||||
if err != nil {
|
||||
|
||||
@@ -9,9 +9,11 @@ import (
|
||||
|
||||
func TestDns(t *testing.T) {
|
||||
resp, err := requests.Get(nil, "https://httpbin.org/anything", requests.RequestOption{
|
||||
Dns: &net.UDPAddr{ //set dns server
|
||||
IP: net.ParseIP("223.5.5.5"),
|
||||
Port: 53,
|
||||
DialOption: requests.DialOption{
|
||||
Dns: &net.UDPAddr{ //set dns server
|
||||
IP: net.ParseIP("223.5.5.5"),
|
||||
Port: 53,
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
@@ -9,8 +9,10 @@ import (
|
||||
|
||||
func TestLocalAddr(t *testing.T) {
|
||||
resp, err := requests.Get(nil, "https://httpbin.org/anything", requests.RequestOption{
|
||||
LocalAddr: &net.TCPAddr{ //set dns server
|
||||
IP: net.ParseIP("192.168.1.239"),
|
||||
DialOption: requests.DialOption{
|
||||
LocalAddr: &net.TCPAddr{ //set dns server
|
||||
IP: net.ParseIP("192.168.1.239"),
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"testing"
|
||||
|
||||
"github.com/gospider007/requests"
|
||||
@@ -9,10 +10,50 @@ import (
|
||||
func TestSession(t *testing.T) {
|
||||
session, _ := requests.NewClient(nil)
|
||||
for i := 0; i < 2; i++ {
|
||||
resp, err := session.Get(nil, "https://httpbin.org/anything")
|
||||
resp, err := session.Get(nil, "https://www.baidu.com")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
log.Print(resp.Proto(), resp.IsNewConn())
|
||||
if i == 0 {
|
||||
if !resp.IsNewConn() { //return is NewConn
|
||||
t.Error("new conn error: ", i)
|
||||
}
|
||||
} else {
|
||||
if resp.IsNewConn() {
|
||||
t.Error("new conn error: ", i)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestSession2(t *testing.T) {
|
||||
session, _ := requests.NewClient(nil)
|
||||
for i := 0; i < 2; i++ {
|
||||
resp, err := session.Get(nil, "https://httpbin.org/anything")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
log.Print(resp.Proto(), resp.IsNewConn())
|
||||
if i == 0 {
|
||||
if !resp.IsNewConn() { //return is NewConn
|
||||
t.Error("new conn error: ", i)
|
||||
}
|
||||
} else {
|
||||
if resp.IsNewConn() {
|
||||
t.Error("new conn error: ", i)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
func TestSession3(t *testing.T) {
|
||||
session, _ := requests.NewClient(nil)
|
||||
for i := 0; i < 2; i++ {
|
||||
resp, err := session.Get(nil, "https://cloudflare-quic.com/", requests.RequestOption{H3: true})
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
log.Print(resp.Proto(), resp.IsNewConn())
|
||||
if i == 0 {
|
||||
if !resp.IsNewConn() { //return is NewConn
|
||||
t.Error("new conn error: ", i)
|
||||
|
||||
Reference in New Issue
Block a user