diff --git a/conn.go b/conn.go index 0e267f0..df3fe8b 100644 --- a/conn.go +++ b/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{}) { diff --git a/dial.go b/dial.go index d61fea2..50f52f2 100644 --- a/dial.go +++ b/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 } diff --git a/go.mod b/go.mod index 9f44b29..160e219 100644 --- a/go.mod +++ b/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 ) diff --git a/go.sum b/go.sum index ffaf0ad..38aab1e 100644 --- a/go.sum +++ b/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= diff --git a/http.go b/http.go index 80ad17c..a4e81a2 100644 --- a/http.go +++ b/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 { diff --git a/roundTripper.go b/roundTripper.go index dfaf612..2c35c2b 100644 --- a/roundTripper.go +++ b/roundTripper.go @@ -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 diff --git a/socks5.go b/socks5.go index 328663b..c16b21b 100644 --- a/socks5.go +++ b/socks5.go @@ -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 diff --git a/test/protocol/http3_test.go b/test/protocol/http3_test.go index 9d5f68c..d799f02 100644 --- a/test/protocol/http3_test.go +++ b/test/protocol/http3_test.go @@ -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 diff --git a/test/proxy/chain_proxy_test.go b/test/proxy/chain_proxy_test.go index ef0866a..dc57bfa 100644 --- a/test/proxy/chain_proxy_test.go +++ b/test/proxy/chain_proxy_test.go @@ -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) } diff --git a/test/proxy/http3_proxy_test.go b/test/proxy/http3_proxy_test.go index 7518d0e..9761583 100644 --- a/test/proxy/http3_proxy_test.go +++ b/test/proxy/http3_proxy_test.go @@ -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) diff --git a/tools.go b/tools.go index 3b7ed37..b38da04 100644 --- a/tools.go +++ b/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 }