mirror of
https://github.com/gospider007/requests.git
synced 2025-12-24 13:57:52 +08:00
close conn with proxy
This commit is contained in:
2
go.mod
2
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
|
||||
|
||||
46
go.sum
46
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=
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user