mirror of
https://github.com/gospider007/requests.git
synced 2025-12-24 13:57:52 +08:00
optimize code
This commit is contained in:
30
client.go
30
client.go
@@ -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 != "" {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user