mirror of
https://github.com/gospider007/requests.git
synced 2025-12-24 13:57:52 +08:00
sync
This commit is contained in:
1
conn.go
1
conn.go
@@ -53,6 +53,7 @@ func (obj *connecotr) wrapBody(task *reqTask) {
|
||||
body.rawBody = rawBody
|
||||
body.conn = obj
|
||||
task.reqCtx.response.Body = body
|
||||
task.reqCtx.response.Request = task.reqCtx.request
|
||||
}
|
||||
|
||||
func (obj *connecotr) httpReq(task *reqTask, done chan struct{}) {
|
||||
|
||||
12
dial.go
12
dial.go
@@ -92,7 +92,7 @@ func newDialer(option DialOption) dialer {
|
||||
func (obj *Dialer) dialContext(ctx *Response, network string, addr Address, isProxy bool) (net.Conn, error) {
|
||||
var err error
|
||||
if addr.IP == nil {
|
||||
addr.IP, err = obj.loadHost(ctx.Context(), addr.Name, ctx.option.DialOption)
|
||||
addr.IP, err = obj.loadHost(ctx.Context(), addr.Host, ctx.option.DialOption)
|
||||
}
|
||||
if ctx.option != nil && ctx.option.Logger != nil {
|
||||
if isProxy {
|
||||
@@ -100,14 +100,14 @@ func (obj *Dialer) dialContext(ctx *Response, network string, addr Address, isPr
|
||||
Id: ctx.requestId,
|
||||
Time: time.Now(),
|
||||
Type: LogType_ProxyDNSLookup,
|
||||
Msg: addr.Name,
|
||||
Msg: addr.Host,
|
||||
})
|
||||
} else {
|
||||
ctx.option.Logger(Log{
|
||||
Id: ctx.requestId,
|
||||
Time: time.Now(),
|
||||
Type: LogType_DNSLookup,
|
||||
Msg: addr.Name,
|
||||
Msg: addr.Host,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -284,7 +284,7 @@ func readUdpAddr(r io.Reader) (Address, error) {
|
||||
if _, err := io.ReadFull(r, fqdn); err != nil {
|
||||
return UdpAddress, err
|
||||
}
|
||||
UdpAddress.Name = string(fqdn)
|
||||
UdpAddress.Host = string(fqdn)
|
||||
default:
|
||||
return UdpAddress, errors.New("invalid atyp")
|
||||
}
|
||||
@@ -300,8 +300,8 @@ func (obj *Dialer) ReadUdpAddr(ctx context.Context, r io.Reader, option DialOpti
|
||||
if err != nil {
|
||||
return udpAddress, err
|
||||
}
|
||||
if udpAddress.Name != "" {
|
||||
udpAddress.IP, err = obj.loadHost(ctx, udpAddress.Name, option)
|
||||
if udpAddress.Host != "" {
|
||||
udpAddress.IP, err = obj.loadHost(ctx, udpAddress.Host, option)
|
||||
}
|
||||
return udpAddress, err
|
||||
}
|
||||
|
||||
34
go.mod
34
go.mod
@@ -17,13 +17,13 @@ require (
|
||||
github.com/quic-go/quic-go v0.50.1
|
||||
github.com/refraction-networking/uquic v0.0.6
|
||||
github.com/refraction-networking/utls v1.6.7
|
||||
golang.org/x/net v0.38.0
|
||||
golang.org/x/net v0.39.0
|
||||
gopkg.in/errgo.v2 v2.1.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/PuerkitoBio/goquery v1.10.2 // indirect
|
||||
github.com/STARRY-S/zip v0.2.2 // indirect
|
||||
github.com/PuerkitoBio/goquery v1.10.3 // indirect
|
||||
github.com/STARRY-S/zip v0.2.3 // indirect
|
||||
github.com/andybalholm/brotli v1.1.1 // indirect
|
||||
github.com/andybalholm/cascadia v1.3.3 // indirect
|
||||
github.com/bodgit/plumbing v1.3.0 // indirect
|
||||
@@ -31,7 +31,7 @@ require (
|
||||
github.com/bodgit/windows v1.0.1 // indirect
|
||||
github.com/caddyserver/certmagic v0.22.2 // indirect
|
||||
github.com/caddyserver/zerossl v0.1.3 // indirect
|
||||
github.com/cloudflare/circl v1.6.0 // indirect
|
||||
github.com/cloudflare/circl v1.6.1 // indirect
|
||||
github.com/dsnet/compress v0.0.2-0.20230904184137-39efe44ab707 // indirect
|
||||
github.com/gaukas/clienthellod v0.4.2 // indirect
|
||||
github.com/gaukas/godicttls v0.0.4 // indirect
|
||||
@@ -40,7 +40,7 @@ require (
|
||||
github.com/gobwas/pool v0.2.1 // indirect
|
||||
github.com/gobwas/ws v1.4.0 // indirect
|
||||
github.com/google/gopacket v1.1.19 // indirect
|
||||
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e // indirect
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
|
||||
github.com/gospider007/blog v0.0.0-20250302134054-8afc12c2a9a7 // indirect
|
||||
github.com/gospider007/kinds v0.0.0-20250217075226-10f199f7215d // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
@@ -53,12 +53,13 @@ require (
|
||||
github.com/kr/pretty v0.3.1 // indirect
|
||||
github.com/libdns/libdns v0.2.3 // indirect
|
||||
github.com/mholt/acmez/v3 v3.1.1 // indirect
|
||||
github.com/mholt/archives v0.1.0 // indirect
|
||||
github.com/miekg/dns v1.1.64 // indirect
|
||||
github.com/mholt/archives v0.1.1 // indirect
|
||||
github.com/miekg/dns v1.1.65 // indirect
|
||||
github.com/minio/minlz v1.0.0 // indirect
|
||||
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.1.1 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.23.3 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.23.4 // indirect
|
||||
github.com/pierrec/lz4/v4 v4.1.22 // indirect
|
||||
github.com/quic-go/qpack v0.5.1 // indirect
|
||||
github.com/sorairolake/lzip-go v0.3.7 // indirect
|
||||
@@ -70,18 +71,19 @@ require (
|
||||
github.com/ulikunitz/xz v0.5.12 // indirect
|
||||
github.com/zeebo/blake3 v0.2.4 // indirect
|
||||
go.mongodb.org/mongo-driver v1.17.3 // indirect
|
||||
go.uber.org/mock v0.5.0 // indirect
|
||||
go.uber.org/automaxprocs v1.6.0 // indirect
|
||||
go.uber.org/mock v0.5.1 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
go.uber.org/zap/exp v0.3.0 // indirect
|
||||
go4.org v0.0.0-20230225012048-214862532bf5 // indirect
|
||||
golang.org/x/crypto v0.36.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect
|
||||
golang.org/x/image v0.25.0 // indirect
|
||||
golang.org/x/crypto v0.37.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect
|
||||
golang.org/x/image v0.26.0 // indirect
|
||||
golang.org/x/mod v0.24.0 // indirect
|
||||
golang.org/x/sync v0.12.0 // indirect
|
||||
golang.org/x/sys v0.31.0 // indirect
|
||||
golang.org/x/text v0.23.0 // indirect
|
||||
golang.org/x/sync v0.13.0 // indirect
|
||||
golang.org/x/sys v0.32.0 // indirect
|
||||
golang.org/x/text v0.24.0 // indirect
|
||||
golang.org/x/time v0.9.0 // indirect
|
||||
golang.org/x/tools v0.31.0 // indirect
|
||||
golang.org/x/tools v0.32.0 // indirect
|
||||
)
|
||||
|
||||
78
go.sum
78
go.sum
@@ -17,10 +17,10 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/PuerkitoBio/goquery v1.10.2 h1:7fh2BdHcG6VFZsK7toXBT/Bh1z5Wmy8Q9MV9HqT2AM8=
|
||||
github.com/PuerkitoBio/goquery v1.10.2/go.mod h1:0guWGjcLu9AYC7C1GHnpysHy056u9aEkUHwhdnePMCU=
|
||||
github.com/STARRY-S/zip v0.2.2 h1:8QeCbIi1Z9U5MgoDARJR1ClbBo9RD46SmVy+dl0woCk=
|
||||
github.com/STARRY-S/zip v0.2.2/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk=
|
||||
github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo=
|
||||
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
|
||||
github.com/STARRY-S/zip v0.2.3 h1:luE4dMvRPDOWQdeDdUxUoZkzUIpTccdKdhHHsQJ1fm4=
|
||||
github.com/STARRY-S/zip v0.2.3/go.mod h1:lqJ9JdeRipyOQJrYSOtpNAiaesFO6zVDsE8GIGFaoSk=
|
||||
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.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
|
||||
@@ -40,8 +40,8 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk=
|
||||
github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
|
||||
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@@ -87,8 +87,9 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||
@@ -96,8 +97,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
|
||||
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
@@ -161,10 +162,12 @@ github.com/libdns/libdns v0.2.3 h1:ba30K4ObwMGB/QTmqUxf3H4/GmUrCAIkMWejeGl12v8=
|
||||
github.com/libdns/libdns v0.2.3/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
|
||||
github.com/mholt/acmez/v3 v3.1.1 h1:Jh+9uKHkPxUJdxM16q5mOr+G2V0aqkuFtNA28ihCxhQ=
|
||||
github.com/mholt/acmez/v3 v3.1.1/go.mod h1:L1wOU06KKvq7tswuMDwKdcHeKpFFgkppZy/y0DFxagQ=
|
||||
github.com/mholt/archives v0.1.0 h1:FacgJyrjiuyomTuNA92X5GyRBRZjE43Y/lrzKIlF35Q=
|
||||
github.com/mholt/archives v0.1.0/go.mod h1:j/Ire/jm42GN7h90F5kzj6hf6ZFzEH66de+hmjEKu+I=
|
||||
github.com/miekg/dns v1.1.64 h1:wuZgD9wwCE6XMT05UU/mlSko71eRSXEAm2EbjQXLKnQ=
|
||||
github.com/miekg/dns v1.1.64/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
|
||||
github.com/mholt/archives v0.1.1 h1:c7J3qXN1FB54y0qiUXiq9Bxk4eCUc8pdXWwOhZdRzeY=
|
||||
github.com/mholt/archives v0.1.1/go.mod h1:FQVz01Q2uXKB/35CXeW/QFO23xT+hSCGZHVtha78U4I=
|
||||
github.com/miekg/dns v1.1.65 h1:0+tIPHzUW0GCge7IiK3guGP57VAw7hoPDfApjkMD1Fc=
|
||||
github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck=
|
||||
github.com/minio/minlz v1.0.0 h1:Kj7aJZ1//LlTP1DM8Jm7lNKvvJS2m74gyyXXn3+uJWQ=
|
||||
github.com/minio/minlz v1.0.0/go.mod h1:qT0aEB35q79LLornSzeDH75LBf3aH1MV+jB5w9Wasec=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
@@ -172,16 +175,18 @@ 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.1.1 h1:OJaYalXdliBUXPmC8CZGQ7oZDxzX1/5mQmgn0/GASew=
|
||||
github.com/nwaples/rardecode/v2 v2.1.1/go.mod h1:7uz379lSxPe6j9nvzxUZ+n7mnJNgjsRNb6IbvGVHRmw=
|
||||
github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0=
|
||||
github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM=
|
||||
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
|
||||
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
|
||||
github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
|
||||
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
|
||||
github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
|
||||
github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
|
||||
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/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
|
||||
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
|
||||
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
|
||||
@@ -238,10 +243,12 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
|
||||
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
|
||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
|
||||
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
|
||||
go.uber.org/mock v0.5.1 h1:ASgazW/qBmR+A32MYFDB6E2POoTgOwT509VP0CT/fjs=
|
||||
go.uber.org/mock v0.5.1/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
|
||||
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.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
|
||||
@@ -259,8 +266,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
|
||||
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/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
|
||||
golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34=
|
||||
golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc=
|
||||
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
|
||||
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||
@@ -269,12 +276,12 @@ 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-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw=
|
||||
golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM=
|
||||
golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8=
|
||||
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.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
|
||||
golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs=
|
||||
golang.org/x/image v0.26.0 h1:4XjIFEZWQmCZi6Wv8BoxsDhRU3RVnLX04dToTDAEPlY=
|
||||
golang.org/x/image v0.26.0/go.mod h1:lcxbMFAovzpnJxzXS3nyL83K27tmqtKzIJpctK8YO5c=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
@@ -320,8 +327,8 @@ 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/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
|
||||
golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8=
|
||||
golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
|
||||
golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
|
||||
golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
|
||||
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=
|
||||
@@ -339,8 +346,8 @@ 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/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw=
|
||||
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
|
||||
golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
@@ -364,8 +371,8 @@ 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/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik=
|
||||
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
|
||||
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
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=
|
||||
@@ -387,11 +394,12 @@ 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/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
|
||||
golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY=
|
||||
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
|
||||
golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
|
||||
golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
|
||||
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
@@ -420,8 +428,8 @@ 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.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
|
||||
golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
|
||||
golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
|
||||
golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
153
http.go
153
http.go
@@ -14,14 +14,14 @@ import (
|
||||
"golang.org/x/net/http/httpguts"
|
||||
)
|
||||
|
||||
type httpTask struct {
|
||||
req *http.Request
|
||||
res *http.Response
|
||||
orderHeaders []interface {
|
||||
Key() string
|
||||
Val() any
|
||||
}
|
||||
err error
|
||||
type reqReadWriteCtx struct {
|
||||
// req *http.Request
|
||||
// res *http.Response
|
||||
// orderHeaders []interface {
|
||||
// Key() string
|
||||
// Val() any
|
||||
// }
|
||||
// err error
|
||||
|
||||
writeCtx context.Context
|
||||
writeCnl context.CancelFunc
|
||||
@@ -30,13 +30,13 @@ type httpTask struct {
|
||||
readCnl context.CancelCauseFunc
|
||||
}
|
||||
type clientConn struct {
|
||||
err error
|
||||
task *httpTask
|
||||
conn net.Conn
|
||||
r *bufio.Reader
|
||||
w *bufio.Writer
|
||||
closeFunc func(error)
|
||||
ctx context.Context
|
||||
err error
|
||||
readWriteCtx *reqReadWriteCtx
|
||||
conn net.Conn
|
||||
r *bufio.Reader
|
||||
w *bufio.Writer
|
||||
closeFunc func(error)
|
||||
ctx context.Context
|
||||
|
||||
closeCtx context.Context
|
||||
closeCnl context.CancelCauseFunc
|
||||
@@ -64,27 +64,33 @@ func newClientConn(ctx context.Context, con net.Conn, closeFunc func(error)) *cl
|
||||
|
||||
var errLastTaskRuning = errors.New("last task is running")
|
||||
|
||||
func (obj *clientConn) send() {
|
||||
go obj.httpWrite(obj.task, obj.task.req.Header.Clone())
|
||||
obj.task.res, obj.task.err = http.ReadResponse(obj.r, obj.task.req)
|
||||
if obj.task.res == nil || obj.task.err != nil || obj.task.res.Body == nil {
|
||||
obj.task.readCnl(nil)
|
||||
func (obj *clientConn) send(req *http.Request, orderHeaders []interface {
|
||||
Key() string
|
||||
Val() any
|
||||
}) (res *http.Response, err error) {
|
||||
go obj.httpWrite(req, req.Header.Clone(), orderHeaders)
|
||||
res, err = http.ReadResponse(obj.r, req)
|
||||
if err == nil && res == nil {
|
||||
err = errors.New("response is nil")
|
||||
}
|
||||
if err != nil {
|
||||
obj.readWriteCtx.readCnl(nil)
|
||||
return
|
||||
}
|
||||
rawBody := obj.task.res.Body
|
||||
rawBody := res.Body
|
||||
pr, pw := io.Pipe()
|
||||
go func() {
|
||||
var readErr error
|
||||
defer func() {
|
||||
obj.task.readCnl(readErr)
|
||||
obj.readWriteCtx.readCnl(readErr)
|
||||
}()
|
||||
noBody := obj.task.res.ContentLength == -1 && len(obj.task.res.TransferEncoding) == 0
|
||||
noBody := res.Body == nil || (res.ContentLength == -1 && len(res.TransferEncoding) == 0)
|
||||
if !noBody {
|
||||
_, readErr = io.Copy(pw, rawBody)
|
||||
}
|
||||
pw.CloseWithError(readErr)
|
||||
if readErr != nil && readErr != io.EOF && readErr != io.ErrUnexpectedEOF {
|
||||
obj.task.err = tools.WrapError(readErr, "failed to read response body")
|
||||
err = tools.WrapError(readErr, "failed to read response body")
|
||||
} else {
|
||||
readErr = nil
|
||||
}
|
||||
@@ -92,8 +98,8 @@ func (obj *clientConn) send() {
|
||||
obj.CloseWithError(readErr)
|
||||
} else {
|
||||
select {
|
||||
case <-obj.task.writeCtx.Done():
|
||||
if obj.task.res.StatusCode == 101 || strings.Contains(obj.task.res.Header.Get("Content-Type"), "text/event-stream") {
|
||||
case <-obj.readWriteCtx.writeCtx.Done():
|
||||
if res.StatusCode == 101 || strings.Contains(res.Header.Get("Content-Type"), "text/event-stream") {
|
||||
select {
|
||||
case <-obj.ctx.Done():
|
||||
return
|
||||
@@ -102,14 +108,13 @@ func (obj *clientConn) send() {
|
||||
}
|
||||
}
|
||||
default:
|
||||
readErr = tools.WrapError(errLastTaskRuning, "last task not write done with read done")
|
||||
obj.task.err = readErr
|
||||
obj.CloseWithError(readErr)
|
||||
obj.CloseWithError(tools.WrapError(errLastTaskRuning, "last task not write done with read done"))
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
obj.task.res.Body = pr
|
||||
res.Body = pr
|
||||
return
|
||||
}
|
||||
|
||||
func (obj *clientConn) CloseCtx() context.Context {
|
||||
@@ -131,43 +136,38 @@ func (obj *clientConn) CloseWithError(err error) error {
|
||||
}
|
||||
return obj.conn.Close()
|
||||
}
|
||||
func (obj *clientConn) initTask(req *http.Request, orderHeaders []interface {
|
||||
Key() string
|
||||
Val() any
|
||||
}) {
|
||||
func (obj *clientConn) initTask() {
|
||||
readCtx, readCnl := context.WithCancelCause(obj.closeCtx)
|
||||
writeCtx, writeCnl := context.WithCancel(obj.closeCtx)
|
||||
obj.task = &httpTask{
|
||||
readCtx: readCtx,
|
||||
readCnl: readCnl,
|
||||
writeCtx: writeCtx,
|
||||
writeCnl: writeCnl,
|
||||
req: req,
|
||||
orderHeaders: orderHeaders,
|
||||
obj.readWriteCtx = &reqReadWriteCtx{
|
||||
readCtx: readCtx,
|
||||
readCnl: readCnl,
|
||||
writeCtx: writeCtx,
|
||||
writeCnl: writeCnl,
|
||||
}
|
||||
}
|
||||
func (obj *clientConn) DoRequest(req *http.Request, orderHeaders []interface {
|
||||
Key() string
|
||||
Val() any
|
||||
}) (*http.Response, context.Context, error) {
|
||||
if obj.task != nil {
|
||||
if obj.readWriteCtx != nil {
|
||||
select {
|
||||
case <-obj.task.writeCtx.Done():
|
||||
case <-obj.readWriteCtx.writeCtx.Done():
|
||||
case <-obj.ctx.Done():
|
||||
return nil, nil, obj.ctx.Err()
|
||||
case <-obj.closeCtx.Done():
|
||||
return nil, nil, obj.closeCtx.Err()
|
||||
default:
|
||||
return nil, obj.task.readCtx, errLastTaskRuning
|
||||
return nil, obj.readWriteCtx.readCtx, errLastTaskRuning
|
||||
}
|
||||
select {
|
||||
case <-obj.task.readCtx.Done():
|
||||
case <-obj.readWriteCtx.readCtx.Done():
|
||||
case <-obj.ctx.Done():
|
||||
return nil, nil, obj.ctx.Err()
|
||||
case <-obj.closeCtx.Done():
|
||||
return nil, nil, obj.closeCtx.Err()
|
||||
default:
|
||||
return nil, obj.task.readCtx, errLastTaskRuning
|
||||
return nil, obj.readWriteCtx.readCtx, errLastTaskRuning
|
||||
}
|
||||
} else {
|
||||
select {
|
||||
@@ -178,12 +178,13 @@ func (obj *clientConn) DoRequest(req *http.Request, orderHeaders []interface {
|
||||
default:
|
||||
}
|
||||
}
|
||||
obj.initTask(req, orderHeaders)
|
||||
obj.send()
|
||||
if obj.task.err != nil {
|
||||
obj.CloseWithError(obj.task.err)
|
||||
obj.initTask()
|
||||
res, err := obj.send(req, orderHeaders)
|
||||
if err != nil {
|
||||
obj.CloseWithError(err)
|
||||
return nil, nil, err
|
||||
}
|
||||
return obj.task.res, obj.task.readCtx, obj.task.err
|
||||
return res, obj.readWriteCtx.readCtx, err
|
||||
}
|
||||
|
||||
type websocketConn struct {
|
||||
@@ -213,68 +214,72 @@ func (obj *clientConn) Stream() io.ReadWriteCloser {
|
||||
w: obj.conn,
|
||||
}
|
||||
}
|
||||
func (obj *clientConn) httpWrite(task *httpTask, rawHeaders http.Header) {
|
||||
func (obj *clientConn) httpWrite(req *http.Request, rawHeaders http.Header, orderHeaders []interface {
|
||||
Key() string
|
||||
Val() any
|
||||
}) {
|
||||
var err error
|
||||
defer func() {
|
||||
if task.err != nil {
|
||||
obj.CloseWithError(tools.WrapError(task.err, "failed to send request body"))
|
||||
if err != nil {
|
||||
obj.CloseWithError(tools.WrapError(err, "failed to send request body"))
|
||||
}
|
||||
task.writeCnl()
|
||||
obj.readWriteCtx.writeCnl()
|
||||
}()
|
||||
host := task.req.Host
|
||||
host := req.Host
|
||||
if host == "" {
|
||||
host = task.req.URL.Host
|
||||
host = req.URL.Host
|
||||
}
|
||||
host, task.err = httpguts.PunycodeHostPort(host)
|
||||
if task.err != nil {
|
||||
host, err = httpguts.PunycodeHostPort(host)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
host = removeZone(host)
|
||||
if rawHeaders.Get("Host") == "" {
|
||||
rawHeaders.Set("Host", host)
|
||||
}
|
||||
contentL, chunked := tools.GetContentLength(task.req)
|
||||
contentL, chunked := tools.GetContentLength(req)
|
||||
if contentL >= 0 {
|
||||
rawHeaders.Set("Content-Length", fmt.Sprint(contentL))
|
||||
} else if chunked {
|
||||
rawHeaders.Set("Transfer-Encoding", "chunked")
|
||||
}
|
||||
ruri := task.req.URL.RequestURI()
|
||||
if task.req.Method == "CONNECT" && task.req.URL.Path == "" {
|
||||
if task.req.URL.Opaque != "" {
|
||||
ruri = task.req.URL.Opaque
|
||||
ruri := req.URL.RequestURI()
|
||||
if req.Method == "CONNECT" && req.URL.Path == "" {
|
||||
if req.URL.Opaque != "" {
|
||||
ruri = req.URL.Opaque
|
||||
} else {
|
||||
ruri = host
|
||||
}
|
||||
}
|
||||
if _, task.err = obj.w.WriteString(fmt.Sprintf("%s %s %s\r\n", task.req.Method, ruri, task.req.Proto)); task.err != nil {
|
||||
if _, err = obj.w.WriteString(fmt.Sprintf("%s %s %s\r\n", req.Method, ruri, req.Proto)); err != nil {
|
||||
return
|
||||
}
|
||||
for _, kv := range tools.NewHeadersWithH1(task.orderHeaders, rawHeaders) {
|
||||
if _, task.err = obj.w.WriteString(fmt.Sprintf("%s: %s\r\n", kv[0], kv[1])); task.err != nil {
|
||||
for _, kv := range tools.NewHeadersWithH1(orderHeaders, rawHeaders) {
|
||||
if _, err = obj.w.WriteString(fmt.Sprintf("%s: %s\r\n", kv[0], kv[1])); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if _, task.err = obj.w.WriteString("\r\n"); task.err != nil {
|
||||
if _, err = obj.w.WriteString("\r\n"); err != nil {
|
||||
return
|
||||
}
|
||||
if task.req.Body == nil {
|
||||
task.err = obj.w.Flush()
|
||||
if req.Body == nil {
|
||||
err = obj.w.Flush()
|
||||
return
|
||||
}
|
||||
if chunked {
|
||||
chunkedWriter := newChunkedWriter(obj.w)
|
||||
if _, task.err = io.Copy(chunkedWriter, task.req.Body); task.err != nil {
|
||||
if _, err = io.Copy(chunkedWriter, req.Body); err != nil {
|
||||
return
|
||||
}
|
||||
if task.err = chunkedWriter.Close(); task.err != nil {
|
||||
if err = chunkedWriter.Close(); err != nil {
|
||||
return
|
||||
}
|
||||
} else {
|
||||
if _, task.err = io.Copy(obj.w, task.req.Body); task.err != nil {
|
||||
if _, err = io.Copy(obj.w, req.Body); err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
task.err = obj.w.Flush()
|
||||
err = obj.w.Flush()
|
||||
}
|
||||
|
||||
func newChunkedWriter(w *bufio.Writer) io.WriteCloser {
|
||||
|
||||
@@ -47,13 +47,21 @@ func (obj *reqTask) suppertRetry() bool {
|
||||
}
|
||||
return false
|
||||
}
|
||||
func getKey(ctx *Response) (key string) {
|
||||
func getKey(ctx *Response) (string, error) {
|
||||
adds := []string{}
|
||||
for _, p := range ctx.proxys {
|
||||
adds = append(adds, getAddr(p))
|
||||
pd, err := GetAddressWithUrl(p)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
adds = append(adds, pd.String())
|
||||
}
|
||||
adds = append(adds, getAddr(ctx.Request().URL))
|
||||
return strings.Join(adds, "@")
|
||||
pd, err := GetAddressWithUrl(ctx.Request().URL)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
adds = append(adds, pd.String())
|
||||
return strings.Join(adds, "@"), nil
|
||||
}
|
||||
|
||||
type roundTripper struct {
|
||||
@@ -126,7 +134,7 @@ func (obj *roundTripper) ghttp3Dial(ctx *Response, remoteAddress Address, proxyA
|
||||
tlsConfig.NextProtos = []string{http3.NextProtoH3}
|
||||
tlsConfig.ServerName = remoteAddress.Host
|
||||
if remoteAddress.IP == nil && len(proxyAddress) == 0 {
|
||||
remoteAddress.IP, err = obj.dialer.loadHost(ctx.Context(), remoteAddress.Name, ctx.option.DialOption)
|
||||
remoteAddress.IP, err = obj.dialer.loadHost(ctx.Context(), remoteAddress.Host, ctx.option.DialOption)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -161,7 +169,7 @@ func (obj *roundTripper) uhttp3Dial(ctx *Response, spec uquic.QUICSpec, remoteAd
|
||||
tlsConfig.NextProtos = []string{http3.NextProtoH3}
|
||||
tlsConfig.ServerName = remoteAddress.Host
|
||||
if remoteAddress.IP == nil && len(proxyAddress) == 0 {
|
||||
remoteAddress.IP, err = obj.dialer.loadHost(ctx.Context(), remoteAddress.Name, ctx.option.DialOption)
|
||||
remoteAddress.IP, err = obj.dialer.loadHost(ctx.Context(), remoteAddress.Host, ctx.option.DialOption)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -366,15 +374,19 @@ func (obj *roundTripper) closeConns() {
|
||||
}
|
||||
}
|
||||
|
||||
func (obj *roundTripper) newReqTask(ctx *Response) *reqTask {
|
||||
func (obj *roundTripper) newReqTask(ctx *Response) (*reqTask, error) {
|
||||
if ctx.option.ResponseHeaderTimeout == 0 {
|
||||
ctx.option.ResponseHeaderTimeout = time.Second * 300
|
||||
}
|
||||
task := new(reqTask)
|
||||
task.reqCtx = ctx
|
||||
task.reqCtx.response = nil
|
||||
task.key = getKey(ctx) //pool key
|
||||
return task
|
||||
key, err := getKey(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
task.key = key
|
||||
return task, nil
|
||||
}
|
||||
func (obj *roundTripper) RoundTrip(ctx *Response) (err error) {
|
||||
if ctx.option.RequestCallBack != nil {
|
||||
@@ -397,7 +409,10 @@ func (obj *roundTripper) RoundTrip(ctx *Response) (err error) {
|
||||
return context.Cause(ctx.Context())
|
||||
default:
|
||||
}
|
||||
task = obj.newReqTask(ctx)
|
||||
task, err = obj.newReqTask(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
obj.poolRoundTrip(task)
|
||||
if task.err == nil || !task.suppertRetry() {
|
||||
break
|
||||
|
||||
@@ -42,15 +42,15 @@ func WriteUdpAddr(w io.Writer, addr Address) error {
|
||||
_, err := w.Write(con)
|
||||
return err
|
||||
}
|
||||
} else if addr.Name != "" {
|
||||
l := len(addr.Name)
|
||||
} else if addr.Host != "" {
|
||||
l := len(addr.Host)
|
||||
if l > 255 {
|
||||
return errors.New("errStringTooLong")
|
||||
}
|
||||
con := make([]byte, 2+l+2)
|
||||
con[0] = fqdnAddress
|
||||
con[1] = byte(l)
|
||||
copy(con[2:], []byte(addr.Name))
|
||||
copy(con[2:], []byte(addr.Host))
|
||||
binary.BigEndian.PutUint16(con[2+l:], uint16(addr.Port))
|
||||
_, err := w.Write(con)
|
||||
return err
|
||||
@@ -67,7 +67,6 @@ func WriteUdpAddr(w io.Writer, addr Address) error {
|
||||
type Address struct {
|
||||
User string
|
||||
Password string
|
||||
Name string
|
||||
Host string
|
||||
NetWork string
|
||||
Scheme string
|
||||
@@ -80,7 +79,7 @@ func (a Address) String() string {
|
||||
if len(a.IP) != 0 {
|
||||
return net.JoinHostPort(a.IP.String(), port)
|
||||
}
|
||||
return net.JoinHostPort(a.Name, port)
|
||||
return net.JoinHostPort(a.Host, port)
|
||||
}
|
||||
func (a Address) Network() string {
|
||||
return a.NetWork
|
||||
|
||||
@@ -38,7 +38,7 @@ func TestHttp3Proxy(t *testing.T) {
|
||||
// return
|
||||
// }
|
||||
// go server.ListenAndServe(nil)
|
||||
proxyC, err := proxy.NewClient(nil, proxy.ClientOption{Addr: proxyAddress, DisVerify: true})
|
||||
proxyC, err := proxy.NewClient(nil, proxy.ClientOption{Addr: proxyAddress})
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
|
||||
@@ -10,9 +10,7 @@ import (
|
||||
)
|
||||
|
||||
func TestProxy2(t *testing.T) {
|
||||
proCliPre, err := proxy.NewClient(nil, proxy.ClientOption{
|
||||
DisVerify: true,
|
||||
})
|
||||
proCliPre, err := proxy.NewClient(nil, proxy.ClientOption{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -20,9 +18,7 @@ func TestProxy2(t *testing.T) {
|
||||
go proCliPre.Run()
|
||||
proIp := "http://" + proCliPre.Addr()
|
||||
|
||||
proCli, err := proxy.NewClient(nil, proxy.ClientOption{
|
||||
DisVerify: true,
|
||||
})
|
||||
proCli, err := proxy.NewClient(nil, proxy.ClientOption{})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
@@ -101,9 +101,8 @@ func server() {
|
||||
}
|
||||
func proxyServer(addr string) {
|
||||
c, err := proxy.NewClient(nil, proxy.ClientOption{
|
||||
Addr: addr,
|
||||
Debug: true,
|
||||
DisVerify: true,
|
||||
Addr: addr,
|
||||
Debug: true,
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
||||
69
tools.go
69
tools.go
@@ -33,28 +33,12 @@ func getHost(req *http.Request) string {
|
||||
return host
|
||||
}
|
||||
|
||||
func getAddr(uurl *url.URL) (addr string) {
|
||||
if uurl == nil {
|
||||
return ""
|
||||
}
|
||||
_, port, _ := net.SplitHostPort(uurl.Host)
|
||||
if port == "" {
|
||||
if uurl.Scheme == "https" {
|
||||
port = "443"
|
||||
} else {
|
||||
port = "80"
|
||||
}
|
||||
return fmt.Sprintf("%s:%s", uurl.Host, port)
|
||||
}
|
||||
return uurl.Host
|
||||
}
|
||||
func GetAddressWithUrl(uurl *url.URL) (addr Address, err error) {
|
||||
if uurl == nil {
|
||||
return Address{}, errors.New("url is nil")
|
||||
}
|
||||
addr = Address{
|
||||
Name: uurl.Hostname(),
|
||||
Host: uurl.Host,
|
||||
Host: uurl.Hostname(),
|
||||
}
|
||||
portStr := uurl.Port()
|
||||
addr.Scheme = uurl.Scheme
|
||||
@@ -70,10 +54,7 @@ func GetAddressWithUrl(uurl *url.URL) (addr Address, err error) {
|
||||
return Address{}, errors.New("unknown scheme")
|
||||
}
|
||||
} else {
|
||||
addr.Port, err = strconv.Atoi(portStr)
|
||||
if err != nil {
|
||||
return Address{}, err
|
||||
}
|
||||
addr.Port, _ = strconv.Atoi(portStr)
|
||||
}
|
||||
addr.IP, _ = gtls.ParseHost(uurl.Hostname())
|
||||
if uurl.User != nil {
|
||||
@@ -82,21 +63,53 @@ func GetAddressWithUrl(uurl *url.URL) (addr Address, err error) {
|
||||
}
|
||||
return
|
||||
}
|
||||
func GetAddressWithReq(req *http.Request) (addr Address, err error) {
|
||||
if req == nil {
|
||||
return Address{}, errors.New("req is nil")
|
||||
}
|
||||
host, port, _ := net.SplitHostPort(req.Host)
|
||||
if host == "" {
|
||||
host = req.URL.Hostname()
|
||||
}
|
||||
if port == "" {
|
||||
port = req.URL.Port()
|
||||
}
|
||||
portI, _ := strconv.Atoi(port)
|
||||
addr = Address{
|
||||
Host: host,
|
||||
Scheme: req.URL.Scheme,
|
||||
Port: portI,
|
||||
}
|
||||
if addr.Port == 0 {
|
||||
switch addr.Scheme {
|
||||
case "http":
|
||||
addr.Port = 80
|
||||
case "https":
|
||||
addr.Port = 443
|
||||
case "socks5":
|
||||
addr.Port = 1080
|
||||
default:
|
||||
return Address{}, errors.New("unknown scheme")
|
||||
}
|
||||
}
|
||||
addr.IP, _ = gtls.ParseHost(addr.Host)
|
||||
if req.URL.User != nil {
|
||||
addr.User = req.URL.User.Username()
|
||||
addr.Password, _ = req.URL.User.Password()
|
||||
}
|
||||
return
|
||||
}
|
||||
func GetAddressWithAddr(addrS string) (addr Address, err error) {
|
||||
host, port, err := net.SplitHostPort(addrS)
|
||||
if err != nil {
|
||||
return Address{}, err
|
||||
}
|
||||
ip, _ := gtls.ParseHost(host)
|
||||
portInt, err := strconv.Atoi(port)
|
||||
if err != nil {
|
||||
return Address{}, err
|
||||
}
|
||||
portInt, _ := strconv.Atoi(port)
|
||||
addr = Address{
|
||||
Name: host,
|
||||
IP: ip,
|
||||
Host: addrS,
|
||||
Host: host,
|
||||
Port: portInt,
|
||||
IP: ip,
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user