From 60185948203b836271a662bab68919d8f154532d Mon Sep 17 00:00:00 2001 From: bxd <2216403312@qq.com> Date: Wed, 1 Nov 2023 11:14:09 +0800 Subject: [PATCH] close conn with proxy --- go.mod | 2 +- go.sum | 46 ++++--------------------- roundTripper.go | 91 ++++++++++++++++++++++++++++--------------------- 3 files changed, 60 insertions(+), 79 deletions(-) diff --git a/go.mod b/go.mod index c848d98..355de84 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/miekg/dns v1.1.56 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/quic-go/quic-go v0.39.3 // indirect + github.com/quic-go/quic-go v0.40.0 // indirect github.com/tidwall/gjson v1.17.0 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect diff --git a/go.sum b/go.sum index 2189885..aba550e 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,6 @@ github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsVi github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/caddyserver/certmagic v0.19.2 h1:HZd1AKLx4592MalEGQS39DKs2ZOAJCEM/xYPMQ2/ui0= github.com/caddyserver/certmagic v0.19.2/go.mod h1:fsL01NomQ6N+kE2j37ZCnig2MFosG+MIO4ztnmG/zz8= -github.com/cloudflare/circl v1.3.5 h1:g+wWynZqVALYAlpSQFAa7TscDnUK8mKYtrxMpw6AUKo= -github.com/cloudflare/circl v1.3.5/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.6 h1:/xbKIqSHbZXHwkhbrhrt2YOHIwYJlXH94E3tI/gDlUg= github.com/cloudflare/circl v1.3.6/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -27,56 +25,26 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ= github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/gospider007/bar v0.0.0-20231015040703-7d4e67e1741a h1:CK3MzqDX3TaT+WCoVTALF7ssj8fufZxtrzICK2/Wpu8= -github.com/gospider007/bar v0.0.0-20231015040703-7d4e67e1741a/go.mod h1:Yv0zw5KpG9gFwXVUs2dIauORHbUgzX+sR9UTVdgdWzo= github.com/gospider007/bar v0.0.0-20231024075629-3f50832a4cbf h1:ow0/zY4+dwhS6xMDEc/m0woLJ0XDO5Q5cttcprJ4hRs= github.com/gospider007/bar v0.0.0-20231024075629-3f50832a4cbf/go.mod h1:KC7Tt189vS0u4KB6ThC5ShzTRvDsU54KM6wvmJBvqfg= -github.com/gospider007/blog v0.0.0-20231015040505-4b08187c11ee h1:F+MircZJ9ysDFsq4Mea43+MbvbDcnHQFq/lOHLSO0IE= -github.com/gospider007/blog v0.0.0-20231015040505-4b08187c11ee/go.mod h1:y4zOnf7HvNA5TJst6YEQP3kJllg5PBjl6yMogqAMGq0= github.com/gospider007/blog v0.0.0-20231024075658-5da1a801a2c8 h1:rcbzO343eHoZ1yJygef05WYxCjPgqo03OMwG4Ql6ckE= github.com/gospider007/blog v0.0.0-20231024075658-5da1a801a2c8/go.mod h1:CCJ+hvQ0kxL+qB/Wfr1xt7xspsG4XiczhnAPVxG2m3M= -github.com/gospider007/bs4 v0.0.0-20231015041001-064efde5bd08 h1:1xP5y0hLlvRQJ1TW58hEx+oPlh2tKm88wMKtFHaQeHo= -github.com/gospider007/bs4 v0.0.0-20231015041001-064efde5bd08/go.mod h1:R4MKplqr25t6ewFY6LqzH4Oggur81IegmRNJEzuhwfw= github.com/gospider007/bs4 v0.0.0-20231024075735-6bbdac929d8b h1:S/lDIKvIwj7YyTm3QyouHBWmLrzLLLD0pm7NkgzwYA0= github.com/gospider007/bs4 v0.0.0-20231024075735-6bbdac929d8b/go.mod h1:n6GeaqU6PyhuPkKD74xSEC1+vITNpurtzhq/ikwBxcQ= -github.com/gospider007/gson v0.0.0-20231015042048-4fae1418931b h1:Gd5tOuEAlrs+5IWE/Q7WmJFmNmWA+tarN1MZe1G4oPw= -github.com/gospider007/gson v0.0.0-20231015042048-4fae1418931b/go.mod h1:frJXgZBXIUJlfsIB7LrEGEIU2SeQu7xP/1xs/Tphlwg= github.com/gospider007/gson v0.0.0-20231024092648-c97546a0287d h1:3+FOSLWmVEq3erpgqtInm+v1me0OIm9xxr18YczoFP0= github.com/gospider007/gson v0.0.0-20231024092648-c97546a0287d/go.mod h1:8CJ5eDQBzhCtArlT6iHA+1TromaaD/N7tag0FuDB1k0= -github.com/gospider007/gtls v0.0.0-20231015064159-7a2b27c0a8ef h1:lGPyThRy3XZTRX3+Z0WHhCByv3TAPd22UTNyVNApPVc= -github.com/gospider007/gtls v0.0.0-20231015064159-7a2b27c0a8ef/go.mod h1:HNrQHMSTsG73mweP5p010QAgXVaZ6RgcfxfJOdyieUY= github.com/gospider007/gtls v0.0.0-20231024092712-01193b9f0404 h1:Qp/o+l3KgWmviEsy0OXlFSjA0lbB8YtlcIOxN1xXyoI= github.com/gospider007/gtls v0.0.0-20231024092712-01193b9f0404/go.mod h1:fLcidMDKVv8b9NvLy0P/ZclltTaXJvTHANWiPCgDbSI= -github.com/gospider007/ja3 v0.0.0-20231018145748-a5a4695e5ec9 h1:HN0mL+XKJ9KWuoVfnNlNAlbdAZe0Xzcy+GAxyUSnfYU= -github.com/gospider007/ja3 v0.0.0-20231018145748-a5a4695e5ec9/go.mod h1:oWaiUYLnk/RcprmDyZjgch+PYA7y4X+sY3THS3r/Wb8= -github.com/gospider007/ja3 v0.0.0-20231024093217-2de3491f0fe3 h1:D1+cjymqnpi5lE0O/Rq+XR7Q7GIVtrlZyUDmYNEdCZE= -github.com/gospider007/ja3 v0.0.0-20231024093217-2de3491f0fe3/go.mod h1:dBFCulBJWzGEikp1LmEXUo6yOBDEqMcVQ9dfqVqFg3k= -github.com/gospider007/ja3 v0.0.0-20231026054255-377f28e5972e h1:9rNMGTpeOj9bj6q+f7SGs83mySVXuS5rs+rL0BfW/aI= -github.com/gospider007/ja3 v0.0.0-20231026054255-377f28e5972e/go.mod h1:SxgiJOCbj2WNv+2ZbQycNHrqX8dIryi/5CiiQl2eeVY= -github.com/gospider007/ja3 v0.0.0-20231028083903-3d094b565d7e h1:tYsL/6NdeLxdGwhnex3p04topQJ1qlA95PK0csiKIS0= -github.com/gospider007/ja3 v0.0.0-20231028083903-3d094b565d7e/go.mod h1:ur78/uhYDDULSy1ldA/pPpGhjk973Q1VsPnbktXGU/g= github.com/gospider007/ja3 v0.0.0-20231029025157-38fc2f8f2d91 h1:qQokihfTAX+/U8GIMvZauRtE4G+/1Jq8XIJx8xLr04A= github.com/gospider007/ja3 v0.0.0-20231029025157-38fc2f8f2d91/go.mod h1:ur78/uhYDDULSy1ldA/pPpGhjk973Q1VsPnbktXGU/g= -github.com/gospider007/kinds v0.0.0-20231015025159-69ab7d8d9b94 h1:K2XYy6B6M62o35KMabuzl9DmA4WQftanUgKomb2YYU4= -github.com/gospider007/kinds v0.0.0-20231015025159-69ab7d8d9b94/go.mod h1:5e4rIpZmhwqOLVVRZa0uZFAuMPH15dO0qqzKf1s3IgI= github.com/gospider007/kinds v0.0.0-20231024093643-7a4424f2d30e h1:lmX6IQKkrNDbXfHsvrv1Uz0MoG2v5+4VC6Gdh9irUNY= github.com/gospider007/kinds v0.0.0-20231024093643-7a4424f2d30e/go.mod h1:nB4OMmd8Ji92yEmgjbHcqLcBHTAhSSmlGNb2JpTYK9A= -github.com/gospider007/net v0.0.0-20231021032248-9d6039f6176a h1:44z2wdH7AyY2z1V96KlkygTOOfwtFcWlmKJOfF4Cnik= -github.com/gospider007/net v0.0.0-20231021032248-9d6039f6176a/go.mod h1:u2Eq/mZEtaEZMzh7EYAjKgJzsBP7SfzzLyprsDpksSU= -github.com/gospider007/net v0.0.0-20231024100002-ee7def48f1b3 h1:tAJfEF33TJ7P41QrKtMX2srUtHGNaOs9bZfw88dyGvI= -github.com/gospider007/net v0.0.0-20231024100002-ee7def48f1b3/go.mod h1:v4dboMBi+Qmelndx43EK2Kt4CYPpcUgHHfWjL7MH7NE= github.com/gospider007/net v0.0.0-20231028084010-313c148cf0a1 h1:tYOQEvELrV+USjKGsAroC1cvsLMHgGlUPQY1TKS/PDM= github.com/gospider007/net v0.0.0-20231028084010-313c148cf0a1/go.mod h1:3ggAwYdh0NB0OvtiX0l5AfHdBjgsIt9MGsXCQ3iCzQc= -github.com/gospider007/re v0.0.0-20231015023348-717c984874af h1:bYip5he4jUPslsEY3GtBndUUJppR84Ml9areZ/wG0Hk= -github.com/gospider007/re v0.0.0-20231015023348-717c984874af/go.mod h1:fOcqR9yJHQjUmpLerdxJSoMJ4pFyMfRirM12rTMEH38= github.com/gospider007/re v0.0.0-20231024115818-adfd03636256 h1:Z6kHRANoWB+/4rDzq51vBts0rIXilDrF8pdRNmbMJi4= github.com/gospider007/re v0.0.0-20231024115818-adfd03636256/go.mod h1:X58uk0/F3mVskuQOZng0ZKJiAt3ETn0wxuLN//rVZrE= -github.com/gospider007/tools v0.0.0-20231015122431-2acd695704d6 h1:0yKzCr0+F6RTKVppEP5o1PzmrSzy5OrtwDKVEW4uOx4= -github.com/gospider007/tools v0.0.0-20231015122431-2acd695704d6/go.mod h1:UAIsaldUoH2zZqg4i0es5Q6x/GS0BkgCeeQ/sLnnZJk= github.com/gospider007/tools v0.0.0-20231024115950-be51fa815fcd h1:UH2D7tgAmzr9gbtuC46L5bggrDw1/MXq/1YYdN2l+kA= github.com/gospider007/tools v0.0.0-20231024115950-be51fa815fcd/go.mod h1:U7MVsYWYQPXIOfXja0g/OK7rG67QIRypXfD+VPsQeiw= -github.com/gospider007/websocket v0.0.0-20231021032557-2e1e47d58b54 h1:sZlOxsZ11dO5WrcEKXbJCq1gBXKoh+iYyZu4IKAetxs= -github.com/gospider007/websocket v0.0.0-20231021032557-2e1e47d58b54/go.mod h1:BMsbalJZK1aQLLCZxgIciRDFEYd3hotv1ebRuT0Uj6M= github.com/gospider007/websocket v0.0.0-20231024120029-ac3d4bf72f42 h1:WeR+cv6ru53SkOt/+O7urqK5L/dLIEtTERoM9BqWjqs= github.com/gospider007/websocket v0.0.0-20231024120029-ac3d4bf72f42/go.mod h1:xkiuV/YXMM0ljUWU5ikm5u9e1ssmNia8mk2Fnzg6ux0= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -105,12 +73,8 @@ github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/quic-go/quic-go v0.39.1 h1:d/m3oaN/SD2c+f7/yEjZxe2zEVotXprnrCCJ2y/ZZFE= -github.com/quic-go/quic-go v0.39.1/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= -github.com/quic-go/quic-go v0.39.2 h1:hmwAf8zAHlvan0Y5PXxeeBFZEW17IW99sXLry8I2kjk= -github.com/quic-go/quic-go v0.39.2/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= -github.com/quic-go/quic-go v0.39.3 h1:o3YB6t2SR+HU/pgwF29kJ6g4jJIJEwEZ8CKia1h1TKg= -github.com/quic-go/quic-go v0.39.3/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q= +github.com/quic-go/quic-go v0.40.0 h1:GYd1iznlKm7dpHD7pOVpUvItgMPo/jrMgDWZhMCecqw= +github.com/quic-go/quic-go v0.40.0/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c= github.com/refraction-networking/utls v1.5.4 h1:9k6EO2b8TaOGsQ7Pl7p9w6PUhx18/ZCeT0WNTZ7Uw4o= github.com/refraction-networking/utls v1.5.4/go.mod h1:SPuDbBmgLGp8s+HLNc83FuavwZCFoMmExj+ltUHiHUw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -129,9 +93,11 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= @@ -167,6 +133,8 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -200,7 +168,5 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -nhooyr.io/websocket v1.8.9 h1:+U/9DCNIH1XnzrWKs7yZp4jO0e/m6mUEh2kRPKRQYeg= -nhooyr.io/websocket v1.8.9/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= diff --git a/roundTripper.go b/roundTripper.go index f9dcbca..28b4cbe 100644 --- a/roundTripper.go +++ b/roundTripper.go @@ -47,7 +47,7 @@ type connPool struct { deleteCnl context.CancelFunc closeCtx context.Context closeCnl context.CancelFunc - key poolKey + key connParams total atomic.Int64 tasks chan *reqTask rt *RoundTripper @@ -55,11 +55,11 @@ type connPool struct { func (obj *connPool) ForceClose() { obj.deleteCnl() - delete(obj.rt.connPools, obj.key) + delete(obj.rt.connPools, obj.key.connKey) } func (obj *connPool) Close() { obj.closeCnl() - delete(obj.rt.connPools, obj.key) + delete(obj.rt.connPools, obj.key.connKey) } func getAddr(uurl *url.URL) string { if uurl == nil { @@ -93,26 +93,39 @@ func getHost(req *http.Request) string { return host } -type poolKey struct { +type connParams struct { + connKey connKey + params connKey +} + +type connKey struct { proxy string addr string ja3 string h2Ja3 string } -func getKey(ctxData *reqCtxData, req *http.Request) poolKey { +func getKey(ctxData *reqCtxData, req *http.Request) connParams { var proxy string if ctxData.proxy != nil { proxy = ctxData.proxy.String() } - return poolKey{ - h2Ja3: ctxData.h2Ja3Spec.Fp(), - ja3: ctxData.ja3Spec.String(), - proxy: proxy, - addr: getAddr(req.URL), + return connParams{ + connKey: connKey{ + h2Ja3: ctxData.h2Ja3Spec.Fp(), + ja3: ctxData.ja3Spec.String(), + proxy: proxy, + addr: getAddr(req.URL), + }, + params: connKey{ + h2Ja3: ctxData.h2Ja3Spec.Fp(), + ja3: ctxData.ja3Spec.String(), + proxy: proxy, + addr: getAddr(req.URL), + }, } } -func (obj *RoundTripper) newConnPool(key poolKey, conn *Connecotr) *connPool { +func (obj *RoundTripper) newConnPool(key connParams, conn *Connecotr) *connPool { pool := new(connPool) pool.deleteCtx, pool.deleteCnl = context.WithCancel(obj.ctx) pool.closeCtx, pool.closeCnl = context.WithCancel(pool.deleteCtx) @@ -123,24 +136,24 @@ func (obj *RoundTripper) newConnPool(key poolKey, conn *Connecotr) *connPool { go pool.rwMain(conn) return pool } -func (obj *RoundTripper) getConnPool(key poolKey) *connPool { +func (obj *RoundTripper) getConnPool(key connParams) *connPool { obj.connsLock.Lock() defer obj.connsLock.Unlock() - return obj.connPools[key] + return obj.connPools[key.connKey] } -func (obj *RoundTripper) putConnPool(key poolKey, conn *Connecotr) { +func (obj *RoundTripper) putConnPool(key connParams, conn *Connecotr) { obj.connsLock.Lock() defer obj.connsLock.Unlock() conn.isPool = true if !conn.h2 { go conn.read() } - pool, ok := obj.connPools[key] + pool, ok := obj.connPools[key.connKey] if ok { pool.total.Add(1) go pool.rwMain(conn) } else { - obj.connPools[key] = obj.newConnPool(key, conn) + obj.connPools[key.connKey] = obj.newConnPool(key, conn) } } func (obj *RoundTripper) TlsConfig() *tls.Config { @@ -149,15 +162,14 @@ func (obj *RoundTripper) TlsConfig() *tls.Config { func (obj *RoundTripper) UtlsConfig() *utls.Config { return obj.utlsConfig.Clone() } -func (obj *RoundTripper) dial(ctxData *reqCtxData, key poolKey, req *http.Request) (conn *Connecotr, connKey poolKey, err error) { - connKey = key +func (obj *RoundTripper) dial(ctxData *reqCtxData, key *connKey, req *http.Request) (conn *Connecotr, err error) { if !ctxData.disProxy && ctxData.proxy == nil { if ctxData.proxy, err = obj.GetProxy(req.Context(), req.URL); err != nil { - return conn, connKey, err + return conn, err } } if ctxData.proxy != nil { - connKey.proxy = ctxData.proxy.String() + key.proxy = ctxData.proxy.String() } var netConn net.Conn host := getHost(req) @@ -167,7 +179,7 @@ func (obj *RoundTripper) dial(ctxData *reqCtxData, key poolKey, req *http.Reques netConn, err = obj.dialer.DialContextWithProxy(req.Context(), "tcp", req.URL.Scheme, key.addr, host, ctxData.proxy, obj.TlsConfig()) } if err != nil { - return conn, connKey, err + return conn, err } conne := new(Connecotr) conne.rn = make(chan int) @@ -183,14 +195,14 @@ func (obj *RoundTripper) dial(ctxData *reqCtxData, key poolKey, req *http.Reques } tlsConn, err := obj.dialer.AddJa3Tls(ctx, netConn, host, ctxData.isWs || ctxData.forceHttp1, ctxData.ja3Spec, tlsConfig) if err != nil { - return conne, connKey, tools.WrapError(err, "add tls error") + 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, ctxData.isWs || ctxData.forceHttp1, obj.TlsConfig()) if err != nil { - return conne, connKey, tools.WrapError(err, "add tls error") + return conne, tools.WrapError(err, "add tls error") } conne.h2 = tlsConn.ConnectionState().NegotiatedProtocol == "h2" netConn = tlsConn @@ -201,17 +213,17 @@ func (obj *RoundTripper) dial(ctxData *reqCtxData, key poolKey, req *http.Reques if conne.h2RawConn, err = http2.NewClientConn(func() { conne.closeCnl() }, netConn, ctxData.h2Ja3Spec); err != nil { - return conne, connKey, err + return conne, err } } else { conne.r = bufio.NewReader(conne) conne.w = bufio.NewWriter(conne) } - return conne, connKey, err + return conne, err } type Connecotr struct { - key poolKey + key connParams err error deleteCtx context.Context //force close deleteCnl context.CancelFunc @@ -339,13 +351,13 @@ func (obj *ReadWriteCloser) Close() (err error) { } func (obj *ReadWriteCloser) Proxy() string { - return obj.conn.key.proxy + return obj.conn.key.params.proxy } func (obj *ReadWriteCloser) Ja3() string { - return obj.conn.key.ja3 + return obj.conn.key.params.ja3 } func (obj *ReadWriteCloser) H2Ja3() string { - return obj.conn.key.h2Ja3 + return obj.conn.key.params.h2Ja3 } // safe close conn @@ -431,7 +443,7 @@ func httpWrite(t *reqTask, c *Connecotr) error { } } } - if _, err = io.WriteString(c.w, "\r\n"); err != nil { + if _, err = c.w.WriteString("\r\n"); err != nil { return err } if t.req.Body != nil { @@ -446,7 +458,9 @@ func (obj *Connecotr) http1Req(task *reqTask) { if task.orderHeaders != nil && len(task.orderHeaders) > 0 { task.err = httpWrite(task, obj) } else { - task.err = task.req.Write(obj) + if task.err = task.req.Write(obj); task.err == nil { + task.err = obj.w.Flush() + } } if task.err == nil { if task.res, task.err = http.ReadResponse(obj.r, task.req); task.res != nil && task.err == nil { @@ -544,7 +558,7 @@ func (obj *connPool) rwMain(conn *Connecotr) { type RoundTripper struct { ctx context.Context cnl context.CancelFunc - connPools map[poolKey]*connPool + connPools map[connKey]*connPool connsLock sync.Mutex dialer *DialClient tlsConfig *tls.Config @@ -604,7 +618,7 @@ func newRoundTripper(preCtx context.Context, option RoundTripperOption) *RoundTr utlsConfig: utlsConfig, ctx: ctx, cnl: cnl, - connPools: make(map[poolKey]*connPool), + connPools: make(map[connKey]*connPool), dialer: dialClient, getProxy: option.GetProxy, tlsHandshakeTimeout: option.TlsHandshakeTimeout, @@ -625,7 +639,7 @@ func (obj *RoundTripper) GetProxy(ctx context.Context, proxyUrl *url.URL) (*url. return gtls.VerifyProxy(proxy) } -func (obj *RoundTripper) poolRoundTrip(task *reqTask, key poolKey) (bool, error) { +func (obj *RoundTripper) poolRoundTrip(task *reqTask, key connParams) (bool, error) { pool := obj.getConnPool(key) if pool == nil { return false, nil @@ -655,6 +669,7 @@ func (obj *RoundTripper) CloseIdleConnections() { delete(obj.connPools, key) } } + func (obj *RoundTripper) CloseConnections() { obj.connsLock.Lock() defer obj.connsLock.Unlock() @@ -668,17 +683,18 @@ func (obj *RoundTripper) CloseIdleConnectionsWithProxy(proxy string) { obj.connsLock.Lock() defer obj.connsLock.Unlock() for key, pool := range obj.connPools { - if key.proxy == proxy { + if pool.key.params.proxy == proxy { pool.Close() delete(obj.connPools, key) } } } + func (obj *RoundTripper) CloseConnectionsWithProxy(proxy string) { obj.connsLock.Lock() defer obj.connsLock.Unlock() for key, pool := range obj.connPools { - if key.proxy == proxy { + if pool.key.params.proxy == proxy { pool.Close() delete(obj.connPools, key) } @@ -710,11 +726,10 @@ func (obj *RoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { } } newConn: - conn, connKey, err := obj.dial(ctxData, key, req) + conn, err := obj.dial(ctxData, &key.params, req) if err != nil { return nil, err } - conn.key = connKey if _, _, notice := conn.taskMain(task, nil, obj.responseHeaderTimeout); notice { goto newConn }