optimize code

This commit is contained in:
bxd
2023-10-25 21:10:35 +08:00
parent 3161c99f8c
commit d897de3acb
4 changed files with 45 additions and 30 deletions

View File

@@ -13,6 +13,7 @@ import (
)
type ClientOption struct {
ForceHttp1 bool //force use http1 send requests
OrderHeaders []string //order headers with http1
Ja3 bool //enable ja3 fingerprint
Ja3Spec ja3.Ja3Spec //custom ja3Spec,use ja3.CreateSpecWithStr or ja3.CreateSpecWithId create
@@ -43,6 +44,7 @@ type ClientOption struct {
Dns net.IP //dns
}
type Client struct {
forceHttp1 bool
orderHeaders []string
jar *Jar
@@ -155,21 +157,21 @@ func NewClient(preCtx context.Context, options ...ClientOption) (*Client, error)
client: client,
transport: transport,
noJarClient: noJarClient,
forceHttp1: option.ForceHttp1,
requestCallBack: option.RequestCallBack,
orderHeaders: option.OrderHeaders,
disCookie: option.DisCookie,
redirectNum: option.RedirectNum,
disDecode: option.DisDecode,
disUnZip: option.DisUnZip,
disAlive: option.DisAlive,
tryNum: option.TryNum,
optionCallBack: option.OptionCallBack,
resultCallBack: option.ResultCallBack,
errCallBack: option.ErrCallBack,
timeout: option.Timeout,
headers: option.Headers,
bar: option.Bar,
orderHeaders: option.OrderHeaders,
disCookie: option.DisCookie,
redirectNum: option.RedirectNum,
disDecode: option.DisDecode,
disUnZip: option.DisUnZip,
disAlive: option.DisAlive,
tryNum: option.TryNum,
optionCallBack: option.OptionCallBack,
resultCallBack: option.ResultCallBack,
errCallBack: option.ErrCallBack,
timeout: option.Timeout,
headers: option.Headers,
bar: option.Bar,
}
var err error
if option.Proxy != "" {

View File

@@ -17,6 +17,7 @@ import (
)
type RequestOption struct {
ForceHttp1 bool //force use http1 send requests
OrderHeaders []string //order headers with http1
Ja3 bool //enable ja3 fingerprint
Ja3Spec ja3.Ja3Spec //custom ja3Spec,use ja3.CreateSpecWithStr or ja3.CreateSpecWithId create
@@ -219,6 +220,10 @@ func (obj *Client) newRequestOption(option RequestOption) RequestOption {
option.DisUnZip = obj.disUnZip
}
if !option.ForceHttp1 {
option.ForceHttp1 = obj.forceHttp1
}
if !option.DisAlive {
option.DisAlive = obj.disAlive
}

View File

@@ -136,6 +136,7 @@ var (
)
type reqCtxData struct {
forceHttp1 bool
redirectNum int
proxy *url.URL
disProxy bool
@@ -337,6 +338,7 @@ func (obj *Client) request(preCtx context.Context, option RequestOption) (respon
var reqs *http.Request
//init ctxData
ctxData := new(reqCtxData)
ctxData.forceHttp1 = option.ForceHttp1
ctxData.disAlive = option.DisAlive
ctxData.requestCallBack = option.RequestCallBack
ctxData.orderHeaders = option.OrderHeaders

View File

@@ -145,19 +145,25 @@ func (obj *RoundTripper) dial(ctxData *reqCtxData, addr string, key string, req
conne.rn = make(chan int)
conne.rc = make(chan []byte)
conne.WithCancel(obj.ctx)
isWebSocket := req.URL.Scheme == "wss"
if req.URL.Scheme == "https" || isWebSocket {
if isWssWebSocket := req.URL.Scheme == "wss"; isWssWebSocket || req.URL.Scheme == "https" {
if !isWssWebSocket {
isWssWebSocket = ctxData.forceHttp1
}
ctx, cnl := context.WithTimeout(req.Context(), obj.tlsHandshakeTimeout)
defer cnl()
if ctxData.ja3Spec.IsSet() {
tlsConn, err := obj.dialer.AddJa3Tls(ctx, netConn, host, isWebSocket, ctxData.ja3Spec, obj.UtlsConfig())
tlsConfig := obj.UtlsConfig()
if ctxData.forceHttp1 {
tlsConfig.NextProtos = []string{"http/1.1"}
}
tlsConn, err := obj.dialer.AddJa3Tls(ctx, netConn, host, isWssWebSocket, ctxData.ja3Spec, tlsConfig)
if err != nil {
return conne, tools.WrapError(err, "add tls error")
}
conne.h2 = tlsConn.ConnectionState().NegotiatedProtocol == "h2"
netConn = tlsConn
} else {
tlsConn, err := obj.dialer.AddTls(ctx, netConn, host, isWebSocket, obj.TlsConfig())
tlsConn, err := obj.dialer.AddTls(ctx, netConn, host, isWssWebSocket, obj.TlsConfig())
if err != nil {
return conne, tools.WrapError(err, "add tls error")
}
@@ -222,15 +228,15 @@ func (obj *Connecotr) read() {
b := con[:i]
for once := true; once || len(b) > 0; once = false {
select {
case <-obj.deleteCtx.Done():
return
case obj.rc <- b:
select {
case <-obj.deleteCtx.Done():
return
case nw := <-obj.rn:
b = b[nw:]
case <-obj.deleteCtx.Done():
return
}
case <-obj.deleteCtx.Done():
return
}
}
}
@@ -240,21 +246,21 @@ func (obj *Connecotr) Read(b []byte) (i int, err error) {
return obj.rawConn.Read(b)
}
select {
case <-obj.deleteCtx.Done():
if err = obj.err; err == nil {
err = tools.WrapError(obj.deleteCtx.Err(), "connecotr close")
}
case con := <-obj.rc:
i, err = copy(b, con), obj.err
select {
case <-obj.deleteCtx.Done():
if err = obj.err; err == nil {
err = tools.WrapError(obj.deleteCtx.Err(), "connecotr close")
}
case obj.rn <- i:
if i < len(con) {
err = nil
}
case <-obj.deleteCtx.Done():
if err = obj.err; err == nil {
err = tools.WrapError(obj.deleteCtx.Err(), "connecotr close")
}
}
case <-obj.deleteCtx.Done():
if err = obj.err; err == nil {
err = tools.WrapError(obj.deleteCtx.Err(), "connecotr close")
}
}
return