This commit is contained in:
lulin 2024-11-19 16:44:08 +08:00
parent 46e5fdb7dc
commit 71857ebbce
11 changed files with 2479 additions and 722 deletions

3
.cargo/config.toml Normal file
View File

@ -0,0 +1,3 @@
[target.x86_64-unknown-linux-gnu.env]
OPENSSL_LIB_DIR="/usr/lib/x86_64-linux-gnu"
OPENSSL_DIR="/usr"

505
Cargo.lock generated
View File

@ -17,18 +17,71 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "anyhow"
version = "1.0.86"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
[[package]]
name = "as-any"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b8a30a44e99a1c83ccb2a6298c563c888952a1c9134953db26876528f84c93a"
[[package]]
name = "async-trait"
version = "0.1.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "aws-lc-rs"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ae74d9bd0a7530e8afd1770739ad34b36838829d6ad61818f9230f683f5ad77"
dependencies = [
"aws-lc-sys",
"mirai-annotations",
"paste",
"zeroize",
]
[[package]]
name = "aws-lc-sys"
version = "0.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f0e249228c6ad2d240c2dc94b714d711629d52bad946075d8e9b2f5391f0703"
dependencies = [
"bindgen",
"cc",
"cmake",
"dunce",
"fs_extra",
"libc",
"paste",
]
[[package]]
name = "backtrace"
version = "0.3.69"
@ -50,6 +103,29 @@ version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53"
[[package]]
name = "bindgen"
version = "0.69.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0"
dependencies = [
"bitflags 2.4.0",
"cexpr",
"clang-sys",
"itertools",
"lazy_static",
"lazycell",
"log",
"prettyplease",
"proc-macro2",
"quote",
"regex",
"rustc-hash",
"shlex",
"syn",
"which",
]
[[package]]
name = "bitflags"
version = "1.3.2"
@ -68,6 +144,12 @@ version = "3.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
[[package]]
name = "byteorder"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
version = "1.4.0"
@ -80,15 +162,45 @@ version = "1.0.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
dependencies = [
"jobserver",
"libc",
]
[[package]]
name = "cexpr"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
dependencies = [
"nom",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "clang-sys"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
dependencies = [
"glob",
"libc",
"libloading",
]
[[package]]
name = "cmake"
version = "0.1.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130"
dependencies = [
"cc",
]
[[package]]
name = "core-foundation"
version = "0.9.3"
@ -105,6 +217,12 @@ version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
[[package]]
name = "dunce"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b"
[[package]]
name = "either"
version = "1.9.0"
@ -128,7 +246,7 @@ checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
dependencies = [
"errno-dragonfly",
"libc",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
@ -178,46 +296,93 @@ dependencies = [
]
[[package]]
name = "futures-channel"
version = "0.3.28"
name = "fs_extra"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
[[package]]
name = "futures"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
dependencies = [
"futures-channel",
"futures-core",
"futures-executor",
"futures-io",
"futures-sink",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-channel"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
dependencies = [
"futures-core",
"futures-sink",
]
[[package]]
name = "futures-core"
version = "0.3.28"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
[[package]]
name = "futures-executor"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
dependencies = [
"futures-core",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-io"
version = "0.3.28"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
[[package]]
name = "futures-macro"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "futures-sink"
version = "0.3.28"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
[[package]]
name = "futures-task"
version = "0.3.28"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-util"
version = "0.3.28"
version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-macro",
"futures-sink",
"futures-task",
"memchr",
"pin-project-lite",
@ -225,12 +390,29 @@ dependencies = [
"slab",
]
[[package]]
name = "getrandom"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "gimli"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0"
[[package]]
name = "glob"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
[[package]]
name = "h2"
version = "0.3.21"
@ -262,6 +444,15 @@ version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b"
[[package]]
name = "home"
version = "0.5.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
dependencies = [
"windows-sys 0.52.0",
]
[[package]]
name = "http"
version = "0.2.9"
@ -359,12 +550,30 @@ version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6"
[[package]]
name = "itertools"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
[[package]]
name = "jobserver"
version = "0.1.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0"
dependencies = [
"libc",
]
[[package]]
name = "js-sys"
version = "0.3.64"
@ -381,10 +590,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.147"
name = "lazycell"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]]
name = "libloading"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4"
dependencies = [
"cfg-if",
"windows-targets 0.52.6",
]
[[package]]
name = "linux-raw-sys"
@ -404,9 +629,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.20"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
[[package]]
name = "memchr"
@ -420,6 +645,12 @@ version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "minimal-lexical"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
version = "0.7.1"
@ -437,9 +668,15 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2"
dependencies = [
"libc",
"wasi",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
name = "mirai-annotations"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1"
[[package]]
name = "native-tls"
version = "0.2.11"
@ -458,6 +695,16 @@ dependencies = [
"tempfile",
]
[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
dependencies = [
"memchr",
"minimal-lexical",
]
[[package]]
name = "num_cpus"
version = "1.16.0"
@ -550,6 +797,12 @@ dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "paste"
version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "percent-encoding"
version = "2.3.0"
@ -574,6 +827,16 @@ version = "0.3.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
[[package]]
name = "prettyplease"
version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e"
dependencies = [
"proc-macro2",
"syn",
]
[[package]]
name = "proc-macro2"
version = "1.0.86"
@ -610,6 +873,35 @@ dependencies = [
"bitflags 2.4.0",
]
[[package]]
name = "regex"
version = "1.10.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b"
[[package]]
name = "reqwest"
version = "0.11.20"
@ -648,12 +940,33 @@ dependencies = [
"winreg",
]
[[package]]
name = "ring"
version = "0.17.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d"
dependencies = [
"cc",
"cfg-if",
"getrandom",
"libc",
"spin",
"untrusted",
"windows-sys 0.52.0",
]
[[package]]
name = "rustc-demangle"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustix"
version = "0.38.11"
@ -664,7 +977,40 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
name = "rustls"
version = "0.23.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c58f8c84392efc0a126acce10fa59ff7b3d2ac06ab451a33f2741989b806b044"
dependencies = [
"aws-lc-rs",
"log",
"once_cell",
"rustls-pki-types",
"rustls-webpki",
"subtle",
"zeroize",
]
[[package]]
name = "rustls-pki-types"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d"
[[package]]
name = "rustls-webpki"
version = "0.102.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e6b52d4fda176fd835fdc55a835d4a89b8499cad995885a21149d5ad62f852e"
dependencies = [
"aws-lc-rs",
"ring",
"rustls-pki-types",
"untrusted",
]
[[package]]
@ -679,7 +1025,7 @@ version = "0.1.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88"
dependencies = [
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
@ -755,6 +1101,12 @@ dependencies = [
"serde",
]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook-registry"
version = "1.4.2"
@ -796,9 +1148,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877"
dependencies = [
"libc",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
name = "socks5-impl"
version = "0.5.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "922f9d794c286fb5821e900f0cc73cd38d74049508dbe4f17c758b10d387a2bc"
dependencies = [
"as-any",
"async-trait",
"byteorder",
"bytes",
"percent-encoding",
"serde",
"thiserror",
"tokio",
]
[[package]]
name = "spin"
version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
version = "2.0.72"
@ -820,7 +1200,7 @@ dependencies = [
"fastrand",
"redox_syscall 0.3.5",
"rustix",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
@ -874,7 +1254,7 @@ dependencies = [
"signal-hook-registry",
"socket2 0.5.3",
"tokio-macros",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
@ -898,6 +1278,17 @@ dependencies = [
"tokio",
]
[[package]]
name = "tokio-rustls"
version = "0.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4"
dependencies = [
"rustls",
"rustls-pki-types",
"tokio",
]
[[package]]
name = "tokio-socks"
version = "0.5.1"
@ -977,6 +1368,12 @@ dependencies = [
"tinyvec",
]
[[package]]
name = "untrusted"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
[[package]]
name = "url"
version = "2.4.1"
@ -1090,10 +1487,37 @@ name = "web_test"
version = "0.1.0"
dependencies = [
"anyhow",
"futures",
"log",
"reqwest",
"rustls-pki-types",
"serde",
"serde_json",
"socks5-impl",
"tokio",
"tokio-rustls",
"webpki-roots",
]
[[package]]
name = "webpki-roots"
version = "0.26.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd"
dependencies = [
"rustls-pki-types",
]
[[package]]
name = "which"
version = "4.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
dependencies = [
"either",
"home",
"once_cell",
"rustix",
]
[[package]]
@ -1127,6 +1551,15 @@ dependencies = [
"windows-targets 0.48.5",
]
[[package]]
name = "windows-sys"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-targets"
version = "0.48.5"
@ -1255,5 +1688,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
dependencies = [
"cfg-if",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
name = "zeroize"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
dependencies = [
"zeroize_derive",
]
[[package]]
name = "zeroize_derive"
version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
"syn",
]

View File

@ -11,3 +11,9 @@ reqwest = { version = "0.11", features = ["blocking", "json", "socks"] }
anyhow = "1"
serde = {version = "1.0.204", features = ["derive"]}
serde_json = "1.0.121"
socks5-impl = "0"
rustls-pki-types = "1.7.0"
tokio-rustls = "0.26.0"
webpki-roots = "0.26.3"
log = "0.4.22"
futures = "0.3"

5
Cross.toml Normal file
View File

@ -0,0 +1,5 @@
[target.x86_64-unknown-linux-musl]
pre-build = [
"apt update",
"apt install --assume-yes -y pkg-config libssl-dev",
]

View File

@ -608,5 +608,10 @@
"name": "coal_zx.json",
"bind": "127.0.0.1:9503",
"file": "coal_zx.json"
},
{
"name": "dmit-vpc-kr",
"bind": "192.168.4.4:29365",
"file": "dmit-vpc-kr"
}
]

902
output-home.json Normal file
View File

@ -0,0 +1,902 @@
[
[
"yxvm-hk-vol-5d",
{
"name": "yxvm-hk-vol-5d",
"latency": 93.4,
"variance": 13.64,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm-hk-vol-5d.json",
{
"name": "yxvm-hk-vol-5d.json",
"latency": 95.60000000000001,
"variance": 35.24000000000005,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm_hk_hybird_5d",
{
"name": "yxvm_hk_hybird_5d",
"latency": 99.39999999999999,
"variance": 16.84,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-0.json",
{
"name": "28kvm-hk-0.json",
"latency": 101.6,
"variance": 31.240000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-0",
{
"name": "28kvm-hk-0",
"latency": 102.6,
"variance": 21.84000000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm_hk_vol",
{
"name": "yxvm_hk_vol",
"latency": 102.60000000000001,
"variance": 50.44,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm_hk_hybird_5d.json",
{
"name": "yxvm_hk_hybird_5d.json",
"latency": 103.4,
"variance": 130.84000000000003,
"success_count": 10,
"failure_count": 0
}
],
[
"ggy-gg-old",
{
"name": "ggy-gg-old",
"latency": 103.7,
"variance": 27.610000000000007,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm_hk_vol.json",
{
"name": "yxvm_hk_vol.json",
"latency": 103.79999999999998,
"variance": 33.959999999999994,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm-hybird-10d",
{
"name": "yxvm-hybird-10d",
"latency": 104.3,
"variance": 43.41000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"ak-gz-nat-iepl.json",
{
"name": "ak-gz-nat-iepl.json",
"latency": 105.10000000000001,
"variance": 32.89,
"success_count": 10,
"failure_count": 0
}
],
[
"ak-szhk",
{
"name": "ak-szhk",
"latency": 105.8,
"variance": 48.96000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"ggy-gg",
{
"name": "ggy-gg",
"latency": 106.4,
"variance": 16.44,
"success_count": 10,
"failure_count": 0
}
],
[
"ipraft-hk-pnac",
{
"name": "ipraft-hk-pnac",
"latency": 106.5,
"variance": 26.249999999999993,
"success_count": 10,
"failure_count": 0
}
],
[
"pnac-333",
{
"name": "pnac-333",
"latency": 106.5,
"variance": 7.25,
"success_count": 10,
"failure_count": 0
}
],
[
"ipraft_hk_pnac.json",
{
"name": "ipraft_hk_pnac.json",
"latency": 107.6,
"variance": 31.439999999999987,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm-hybird.json",
{
"name": "yxvm-hybird.json",
"latency": 107.8,
"variance": 79.56000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"pnac333.json",
{
"name": "pnac333.json",
"latency": 108.30000000000001,
"variance": 16.210000000000004,
"success_count": 10,
"failure_count": 0
}
],
[
"coal_hk_pro_year",
{
"name": "coal_hk_pro_year",
"latency": 108.5,
"variance": 1010.65,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-1.json",
{
"name": "28kvm-hk-1.json",
"latency": 109.3,
"variance": 113.21,
"success_count": 10,
"failure_count": 0
}
],
[
"pnac-800",
{
"name": "pnac-800",
"latency": 110.89999999999999,
"variance": 21.289999999999967,
"success_count": 10,
"failure_count": 0
}
],
[
"bestvm_hk_pnac.json",
{
"name": "bestvm_hk_pnac.json",
"latency": 111.6,
"variance": 48.24000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"coal_hk_pro_year.json",
{
"name": "coal_hk_pro_year.json",
"latency": 112.8,
"variance": 1036.9599999999998,
"success_count": 10,
"failure_count": 0
}
],
[
"pnac800.json",
{
"name": "pnac800.json",
"latency": 113.0,
"variance": 23.4,
"success_count": 10,
"failure_count": 0
}
],
[
"coal-iplc-hk1.json",
{
"name": "coal-iplc-hk1.json",
"latency": 119.2,
"variance": 12.359999999999989,
"success_count": 10,
"failure_count": 0
}
],
[
"coal-iplc-hk2.json",
{
"name": "coal-iplc-hk2.json",
"latency": 119.3,
"variance": 43.41000000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"bestvm_hk_pnac",
{
"name": "bestvm_hk_pnac",
"latency": 122.1,
"variance": 454.09000000000003,
"success_count": 10,
"failure_count": 0
}
],
[
"coal-iplc-hk2",
{
"name": "coal-iplc-hk2",
"latency": 122.1,
"variance": 69.49,
"success_count": 10,
"failure_count": 0
}
],
[
"coal-iplc-hk1",
{
"name": "coal-iplc-hk1",
"latency": 122.39999999999999,
"variance": 10.840000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-1_cd",
{
"name": "28kvm-hk-1_cd",
"latency": 125.4,
"variance": 41.64,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-1_cd.json",
{
"name": "28kvm-hk-1_cd.json",
"latency": 125.5,
"variance": 27.050000000000004,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-0_cd.json",
{
"name": "28kvm-hk-0_cd.json",
"latency": 127.6,
"variance": 178.04000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-1",
{
"name": "28kvm-hk-1",
"latency": 129.4,
"variance": 4999.84,
"success_count": 10,
"failure_count": 0
}
],
[
"vmshell_hk_36",
{
"name": "vmshell_hk_36",
"latency": 131.1,
"variance": 36.29000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"bage-hk.json",
{
"name": "bage-hk.json",
"latency": 134.10000000000002,
"variance": 68.89000000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"bage-hk",
{
"name": "bage-hk",
"latency": 134.89999999999998,
"variance": 58.09000000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"dog-hk-300",
{
"name": "dog-hk-300",
"latency": 136.1,
"variance": 5.490000000000009,
"success_count": 10,
"failure_count": 0
}
],
[
"peng_eb_big.json",
{
"name": "peng_eb_big.json",
"latency": 138.8,
"variance": 133.35999999999999,
"success_count": 10,
"failure_count": 0
}
],
[
"dv-hk-plus.json",
{
"name": "dv-hk-plus.json",
"latency": 140.39999999999998,
"variance": 1616.24,
"success_count": 10,
"failure_count": 0
}
],
[
"hostyun-hk",
{
"name": "hostyun-hk",
"latency": 141.89999999999998,
"variance": 38.890000000000015,
"success_count": 10,
"failure_count": 0
}
],
[
"dv_273.json",
{
"name": "dv_273.json",
"latency": 142.4,
"variance": 223.84000000000006,
"success_count": 10,
"failure_count": 0
}
],
[
"dv-hk-plus",
{
"name": "dv-hk-plus",
"latency": 143.2,
"variance": 1478.7599999999998,
"success_count": 10,
"failure_count": 0
}
],
[
"miao-hk-br",
{
"name": "miao-hk-br",
"latency": 143.7,
"variance": 539.01,
"success_count": 10,
"failure_count": 0
}
],
[
"miao_hk.json",
{
"name": "miao_hk.json",
"latency": 145.60000000000002,
"variance": 211.8400000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"wawo-hk-one",
{
"name": "wawo-hk-one",
"latency": 145.9,
"variance": 234.08999999999992,
"success_count": 10,
"failure_count": 0
}
],
[
"gcp-hk",
{
"name": "gcp-hk",
"latency": 149.8,
"variance": 2060.1600000000003,
"success_count": 10,
"failure_count": 0
}
],
[
"happy-eb",
{
"name": "happy-eb",
"latency": 157.9,
"variance": 2038.6900000000005,
"success_count": 10,
"failure_count": 0
}
],
[
"28kvm-hk-0_cd",
{
"name": "28kvm-hk-0_cd",
"latency": 158.00000000000003,
"variance": 6111.199999999999,
"success_count": 10,
"failure_count": 0
}
],
[
"gcp-hk.json",
{
"name": "gcp-hk.json",
"latency": 162.3,
"variance": 2169.4100000000003,
"success_count": 10,
"failure_count": 0
}
],
[
"hostyun-hk.json",
{
"name": "hostyun-hk.json",
"latency": 164.4,
"variance": 2728.44,
"success_count": 10,
"failure_count": 0
}
],
[
"vmshell_hk_36.json",
{
"name": "vmshell_hk_36.json",
"latency": 166.2,
"variance": 3099.7599999999993,
"success_count": 10,
"failure_count": 0
}
],
[
"dog-hk-300.json",
{
"name": "dog-hk-300.json",
"latency": 170.3,
"variance": 3079.0099999999998,
"success_count": 10,
"failure_count": 0
}
],
[
"ggy-gg-old-cd",
{
"name": "ggy-gg-old-cd",
"latency": 172.49999999999997,
"variance": 770.8500000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"bage-jp",
{
"name": "bage-jp",
"latency": 181.3,
"variance": 2947.6100000000006,
"success_count": 10,
"failure_count": 0
}
],
[
"wawo-hk-one.json",
{
"name": "wawo-hk-one.json",
"latency": 183.5,
"variance": 2686.05,
"success_count": 10,
"failure_count": 0
}
],
[
"sharon-jp-1.json",
{
"name": "sharon-jp-1.json",
"latency": 190.60000000000002,
"variance": 34.84,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm_vol.json",
{
"name": "yxvm_vol.json",
"latency": 197.4,
"variance": 66.43999999999997,
"success_count": 10,
"failure_count": 0
}
],
[
"lisa-sg-hk-vol-3\u5200",
{
"name": "lisa-sg-hk-vol-3\u5200",
"latency": 198.9,
"variance": 3212.8900000000003,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm-sg-hybird.json",
{
"name": "yxvm-sg-hybird.json",
"latency": 206.7,
"variance": 187.60999999999996,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm-sg-hybird",
{
"name": "yxvm-sg-hybird",
"latency": 208.79999999999998,
"variance": 25.759999999999952,
"success_count": 10,
"failure_count": 0
}
],
[
"sharon-jp-1",
{
"name": "sharon-jp-1",
"latency": 223.5,
"variance": 4306.450000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm-sg-vol",
{
"name": "yxvm-sg-vol",
"latency": 227.79999999999995,
"variance": 5668.36,
"success_count": 10,
"failure_count": 0
}
],
[
"miao-sg-v6",
{
"name": "miao-sg-v6",
"latency": 228.2,
"variance": 21121.96,
"success_count": 10,
"failure_count": 0
}
],
[
"bv-kr-12.json",
{
"name": "bv-kr-12.json",
"latency": 234.4,
"variance": 5773.840000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"bv-sg-opt",
{
"name": "bv-sg-opt",
"latency": 242.5,
"variance": 29974.25,
"success_count": 10,
"failure_count": 0
}
],
[
"bv-kr-24.json",
{
"name": "bv-kr-24.json",
"latency": 244.39999999999998,
"variance": 5697.040000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"yxvm-jp-5d",
{
"name": "yxvm-jp-5d",
"latency": 286.79999999999995,
"variance": 9122.56,
"success_count": 10,
"failure_count": 0
}
],
[
"bigchick_long.json",
{
"name": "bigchick_long.json",
"latency": 291.9,
"variance": 3207.2899999999995,
"success_count": 10,
"failure_count": 0
}
],
[
"wepc-jp.json",
{
"name": "wepc-jp.json",
"latency": 311.9,
"variance": 10490.689999999999,
"success_count": 10,
"failure_count": 0
}
],
[
"pqs_hinet_static.json",
{
"name": "pqs_hinet_static.json",
"latency": 327.1,
"variance": 23719.489999999998,
"success_count": 10,
"failure_count": 0
}
],
[
"pqs_hinet_55.json",
{
"name": "pqs_hinet_55.json",
"latency": 342.9,
"variance": 30642.690000000002,
"success_count": 10,
"failure_count": 0
}
],
[
"ak-mo.json",
{
"name": "ak-mo.json",
"latency": 351.2,
"variance": 44675.159999999996,
"success_count": 10,
"failure_count": 0
}
],
[
"coal_gz_nat.json",
{
"name": "coal_gz_nat.json",
"latency": 378.40000000000003,
"variance": 11217.84,
"success_count": 10,
"failure_count": 0
}
],
[
"coal_sz_v6.json",
{
"name": "coal_sz_v6.json",
"latency": 402.7,
"variance": 45515.810000000005,
"success_count": 10,
"failure_count": 0
}
],
[
"bigchick_228.json",
{
"name": "bigchick_228.json",
"latency": 406.0,
"variance": 96063.8,
"success_count": 10,
"failure_count": 0
}
],
[
"\u70ad\u4e91-\u5e7f\u5ddenat",
{
"name": "\u70ad\u4e91-\u5e7f\u5ddenat",
"latency": 408.29999999999995,
"variance": 33196.21000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"coal_sz_v6_60.json",
{
"name": "coal_sz_v6_60.json",
"latency": 475.3999999999999,
"variance": 18641.23999999999,
"success_count": 10,
"failure_count": 0
}
],
[
"\u70ad\u4e91-\u6df1\u5733nat-60",
{
"name": "\u70ad\u4e91-\u6df1\u5733nat-60",
"latency": 477.0,
"variance": 95082.6,
"success_count": 10,
"failure_count": 0
}
],
[
"bwg-us-36.json",
{
"name": "bwg-us-36.json",
"latency": 486.7,
"variance": 21920.209999999992,
"success_count": 10,
"failure_count": 0
}
],
[
"\u70ad\u4e91-\u6df1\u5733nat",
{
"name": "\u70ad\u4e91-\u6df1\u5733nat",
"latency": 514.5,
"variance": 58734.45,
"success_count": 10,
"failure_count": 0
}
],
[
"\u70ad\u4e91-\u5e7f\u5dde\u72ec\u7acb",
{
"name": "\u70ad\u4e91-\u5e7f\u5dde\u72ec\u7acb",
"latency": 516.8,
"variance": 102093.16,
"success_count": 10,
"failure_count": 0
}
],
[
"coal_gz.json",
{
"name": "coal_gz.json",
"latency": 575.7,
"variance": 84969.61000000003,
"success_count": 10,
"failure_count": 0
}
],
[
"wawo-tw.json",
{
"name": "wawo-tw.json",
"latency": 603.4000000000001,
"variance": 39791.240000000005,
"success_count": 10,
"failure_count": 0
}
],
[
"wawo-us.json",
{
"name": "wawo-us.json",
"latency": 698.3,
"variance": 96746.01000000001,
"success_count": 10,
"failure_count": 0
}
],
[
"coal-hk-v2-36.json",
{
"name": "coal-hk-v2-36.json",
"latency": 794.2,
"variance": 56481.96,
"success_count": 10,
"failure_count": 0
}
],
[
"coal-hk-v2-72",
{
"name": "coal-hk-v2-72",
"latency": 864.6999999999999,
"variance": 293791.81000000006,
"success_count": 10,
"failure_count": 0
}
],
[
"coal-hk-v2-36",
{
"name": "coal-hk-v2-36",
"latency": 994.9,
"variance": 181420.69,
"success_count": 10,
"failure_count": 0
}
],
[
"ak-hkv2-5.json",
{
"name": "ak-hkv2-5.json",
"latency": 1052.4,
"variance": 187489.24,
"success_count": 10,
"failure_count": 0
}
],
[
"bv-sg-opt.json",
{
"name": "bv-sg-opt.json",
"latency": 1107.9,
"variance": 1226764.89,
"success_count": 10,
"failure_count": 0
}
],
[
"ak-hk-v2",
{
"name": "ak-hk-v2",
"latency": 1211.1,
"variance": 545035.89,
"success_count": 10,
"failure_count": 0
}
]
]

File diff suppressed because it is too large Load Diff

2
run.py
View File

@ -27,7 +27,7 @@ def main(json_file, url, count):
name = entry['name']
bind = entry['bind']
result = run_web_test(url, count, bind, name)
if result.find("error") == -1:
if result.find("error") == -1 and result != "":
data = process_string(result)
results[name] = data
results = sort_by_field(results)

View File

@ -0,0 +1,119 @@
use std::time::Duration;
use reqwest::{
header::{HeaderValue, CONTENT_LENGTH, HOST, USER_AGENT},
Client, Method, Request, Url,
};
use socks5_impl::client;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
use tokio_native_tls::{native_tls, TlsConnector};
fn create_http_req(client: reqwest::Client, end_point: &str) -> Option<Request> {
let url: Url = end_point.parse().ok()?;
let host = url.host().unwrap().to_string();
let mut req = client
.post(url.clone())
.timeout(Duration::from_secs(5))
.build()
.ok()?;
req.headers_mut()
.insert(HOST, HeaderValue::from_str(&host).ok()?);
req.headers_mut()
.insert(USER_AGENT, HeaderValue::from_static("curl/8.9.1-DEV"));
Some(req)
}
fn request_to_http_text(req: &Request) -> anyhow::Result<String> {
use std::fmt::Write;
let mut result = String::new();
// Write the request line
write!(
&mut result,
"{} {} {:?}\r\n",
req.method(),
req.url(),
req.version()
)?;
// Write the headers
for (key, value) in req.headers() {
write!(&mut result, "{}: {}\r\n", key, value.to_str()?)?;
}
// End of headers
write!(&mut result, "\r\n")?;
if let Some(body) = req.body() {
write!(
&mut result,
"{}",
String::from_utf8(body.as_bytes().unwrap().to_owned())?
)?;
}
Ok(result)
}
// #[tokio::main]
// async fn main() -> anyhow::Result<()> {
// let now = std::time::Instant::now();
// let mut ac = tokio::net::TcpStream::connect("192.168.4.4:888").await?;
// println!("tcp conn established time used: {:?}", now.elapsed());
// let r = client::connect(&mut ac, ("cp.cloudflare.com", 443), None).await?;
// println!("socks5 conn established time used: {:?}", now.elapsed());
// ;
// let tls_conn = TlsConnector::from(native_tls::TlsConnector::new().unwrap());
// // let url: Url = "https://cp.cloudflare.com/generate_204".parse().unwrap();
// let mut tls_s = tls_conn.connect("cp.cloudflare.com", ac).await?;
// println!("tls conn established time used: {:?}", now.elapsed());
// let req =create_http_req(Client::new(), "https://cp.cloudflare.com/generate_204").unwrap();
// let txt = request_to_http_text(&req).unwrap();
// tls_s.write_all(&txt.as_bytes()).await?;
// tls_s.flush().await?;
// println!("req write time used: {:?}", now.elapsed());
// let mut buf = vec![0;4096];
// let n = tls_s.read(&mut buf).await?;
// println!("resp get time used: {:?}, resp len: {}", now.elapsed(), n);
// Ok(())
// }
#[tokio::main]
async fn main() -> anyhow::Result<()> {
use rustls_pki_types::ServerName;
use std::sync::Arc;
use tokio_rustls::rustls::{ClientConfig, RootCertStore};
use tokio_rustls::TlsConnector;
// ...
let mut root_cert_store = RootCertStore::empty();
root_cert_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned());
let config = ClientConfig::builder()
.with_root_certificates(root_cert_store)
.with_no_client_auth();
let connector = TlsConnector::from(Arc::new(config));
let dnsname = ServerName::try_from("cp.cloudflare.com").unwrap();
// let stream = TcpStream::connect(&addr).await?;
// let mut stream = connector.connect(dnsname, stream).await?;
let now = std::time::Instant::now();
let mut ac = tokio::net::TcpStream::connect("192.168.4.4:888").await?;
println!("tcp conn established time used: {:?}", now.elapsed());
let r = client::connect(&mut ac, ("cp.cloudflare.com", 443), None).await?;
println!("socks5 conn established time used: {:?}", now.elapsed());
// let tls_conn = TlsConnector::from(native_tls::TlsConnector::new().unwrap());
let mut tls_s = connector.connect(dnsname, ac).await?;
// let url: Url = "https://cp.cloudflare.com/generate_204".parse().unwrap();
// let mut tls_s = tls_conn.connect("cp.cloudflare.com", ac).await?;
println!("tls conn established time used: {:?}", now.elapsed());
let req = create_http_req(Client::new(), "https://cp.cloudflare.com/generate_204").unwrap();
let txt = request_to_http_text(&req).unwrap();
tls_s.write_all(&txt.as_bytes()).await?;
tls_s.flush().await?;
println!("req write time used: {:?}", now.elapsed());
let mut buf = vec![0; 4096];
let n = tls_s.read(&mut buf).await?;
println!("resp get time used: {:?}, resp len: {}", now.elapsed(), n);
Ok(())
}

View File

@ -0,0 +1,15 @@
use tokio::io::AsyncWriteExt;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let ac = tokio::net::TcpListener::bind("0.0.0.0:99").await?;
while let Ok((mut s, _)) = ac.accept().await {
tokio::spawn(async move {
let _ = s.write_all("Hello world".as_bytes()).await;
let _ = s.flush().await;
tokio::time::sleep(std::time::Duration::from_secs(10)).await;
let _ = s.shutdown().await;
});
}
Ok(())
}

View File

@ -1,5 +1,12 @@
use reqwest;
use std::time::Instant;
use futures::future::Either;
use reqwest::{
self,
header::{HeaderValue, HOST, USER_AGENT},
Client, Request, Url,
};
use socks5_impl::client;
use std::time::Duration;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
pub struct IncrementalStats {
count: u64,
@ -37,7 +44,133 @@ impl IncrementalStats {
}
}
fn main() {
fn create_http_req(client: reqwest::Client, end_point: &str) -> Option<Request> {
let url: Url = end_point.parse().ok()?;
let host = url.host().unwrap().to_string();
let mut req = client
.post(url.clone())
.timeout(Duration::from_secs(5))
.build()
.ok()?;
req.headers_mut()
.insert(HOST, HeaderValue::from_str(&host).ok()?);
req.headers_mut()
.insert(USER_AGENT, HeaderValue::from_static("curl/8.9.1-DEV"));
Some(req)
}
fn request_to_http_text(req: &Request) -> anyhow::Result<String> {
use std::fmt::Write;
let mut result = String::new();
// Write the request line
write!(
&mut result,
"{} {} {:?}\r\n",
req.method(),
req.url(),
req.version()
)?;
// Write the headers
for (key, value) in req.headers() {
write!(&mut result, "{}: {}\r\n", key, value.to_str()?)?;
}
// End of headers
write!(&mut result, "\r\n")?;
if let Some(body) = req.body() {
write!(
&mut result,
"{}",
String::from_utf8(body.as_bytes().unwrap().to_owned())?
)?;
}
Ok(result)
}
async fn rustls_req(url_str: &str, proxy: &str) -> anyhow::Result<std::time::Duration> {
use rustls_pki_types::ServerName;
use std::sync::Arc;
use tokio_rustls::rustls::{ClientConfig, RootCertStore};
use tokio_rustls::TlsConnector;
// ...
let mut root_cert_store = RootCertStore::empty();
root_cert_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned());
let config = ClientConfig::builder()
.with_root_certificates(root_cert_store)
.with_no_client_auth();
let connector = TlsConnector::from(Arc::new(config));
let url: Url = url_str.parse()?;
let dnsname = ServerName::try_from(url.host().unwrap().to_string())?;
// let stream = TcpStream::connect(&addr).await?;
// let mut stream = connector.connect(dnsname, stream).await?;
let proxy_url: Url = proxy.parse()?;
let now = std::time::Instant::now();
let mut ac = tokio::net::TcpStream::connect((
proxy_url.host().unwrap().to_string(),
proxy_url.port().unwrap(),
))
.await?;
log::debug!("tcp conn established time used: {:?}", now.elapsed());
let r = client::connect(&mut ac, (url.host().unwrap().to_string(), 443), None).await?;
log::debug!("socks5 conn established time used: {:?}", now.elapsed());
// let tls_conn = TlsConnector::from(native_tls::TlsConnector::new().unwrap());
let mut tls_s = connector.connect(dnsname, ac).await?;
// let url: Url = "https://cp.cloudflare.com/generate_204".parse().unwrap();
// let mut tls_s = tls_conn.connect("cp.cloudflare.com", ac).await?;
log::debug!("tls conn established time used: {:?}", now.elapsed());
let req = create_http_req(Client::new(), url_str).unwrap();
let txt = request_to_http_text(&req).unwrap();
tls_s.write_all(&txt.as_bytes()).await?;
tls_s.flush().await?;
log::debug!("req write time used: {:?}", now.elapsed());
let mut buf = vec![0; 4096];
let n = tls_s.read(&mut buf).await?;
log::debug!("resp get time used: {:?}, resp len: {}", now.elapsed(), n);
Ok(now.elapsed())
}
async fn http_req(url_str: &str, proxy: &str) -> anyhow::Result<std::time::Duration> {
let url: Url = url_str.parse()?;
// let stream = TcpStream::connect(&addr).await?;
// let mut stream = connector.connect(dnsname, stream).await?;
let proxy_url: Url = proxy.parse()?;
let now = std::time::Instant::now();
let mut ac = tokio::net::TcpStream::connect((
proxy_url.host().unwrap().to_string(),
proxy_url.port().unwrap(),
))
.await?;
log::debug!("tcp conn established time used: {:?}", now.elapsed());
let r = client::connect(
&mut ac,
(url.host().unwrap().to_string(), url.port().unwrap()),
None,
)
.await?;
log::debug!("socks5 conn established time used: {:?}", now.elapsed());
// let tls_conn = TlsConnector::from(native_tls::TlsConnector::new().unwrap());
// let url: Url = "https://cp.cloudflare.com/generate_204".parse().unwrap();
// let mut tls_s = tls_conn.connect("cp.cloudflare.com", ac).await?;
log::debug!("tls conn established time used: {:?}", now.elapsed());
let req = create_http_req(Client::new(), url_str).unwrap();
let txt = request_to_http_text(&req).unwrap();
ac.write_all(&txt.as_bytes()).await?;
ac.flush().await?;
log::debug!("req write time used: {:?}", now.elapsed());
let mut buf = vec![0; 4096];
let n = ac.read(&mut buf).await?;
log::debug!("resp get time used: {:?}, resp len: {}", now.elapsed(), n);
Ok(now.elapsed())
}
#[tokio::main]
async fn main() {
let url = std::env::args()
.nth(1)
.unwrap_or("https://www.youtube.com".to_owned()); // 你可以替换为你想要测量的网址
@ -47,58 +180,54 @@ fn main() {
.unwrap_or_else(|| "20".to_owned())
.parse()
.expect("second parameter should interger");
let proxy = std::env::args().nth(3);
let proxy = std::env::args().nth(3).unwrap();
let fmt = std::env::args().nth(4);
let mut stats = IncrementalStats::new();
let mut succ = 0;
let mut err = 0;
for i in 0..iter_num {
let start = Instant::now();
let builder =
reqwest::blocking::ClientBuilder::new().timeout(std::time::Duration::from_secs(1));
let c = if let Some(p) = proxy.as_ref() {
builder
.proxy(reqwest::Proxy::all(p.as_str()).unwrap())
.build()
.unwrap()
let fut = if url.starts_with("https") {
Either::Left(rustls_req(&url, &proxy))
} else {
builder.build().unwrap()
Either::Right(http_req(&url, &proxy))
};
match c.get(&url).send() {
Ok(response) => {
if response.status().is_success() {
let mut duration = start.elapsed();
let _r = response.bytes().unwrap();
if let Some(_name) = fmt.as_ref() {
// println!("{name}, {i},{}", duration.as_millis())
// duration /= 2;
} else {
println!(
"第{i}次测试, 访问 {} 花费了 {:?} 毫秒",
url,
duration.as_millis()
);
}
succ += 1;
// time_rec.push(duration);
stats.add(duration.as_millis() as f64);
match tokio::time::timeout(std::time::Duration::from_secs(5), fut).await {
Ok(Ok(duration)) => {
// if response.status().is_success() {
// let mut duration = start.elapsed();
// let _r = response.bytes().unwrap();
if let Some(_name) = fmt.as_ref() {
// println!("{name}, {i},{}", duration.as_millis())
// duration /= 2;
} else {
let mut duration = start.elapsed();
println!(
"第{i}次测试, 访问 {} 失败,状态码:{}",
"第{i}次测试, 访问 {} 花费了 {:?} 毫秒",
url,
response.status()
duration.as_millis()
);
stats.add(duration.as_millis() as f64);
err += 1;
}
succ += 1;
// time_rec.push(duration);
stats.add(duration.as_millis() as f64);
// }
}
Ok(Err(error)) => {
err += 1;
if let Some(_name) = fmt.as_ref() {
return;
} else {
println!("{i}次测试, 请求错误:{}", error);
}
}
Err(error) => {
err += 1;
println!("{i}次测试, 请求错误:{}", error);
if let Some(_name) = fmt.as_ref() {
return;
} else {
println!("{i}次测试, 请求错误:{}", error);
}
}
}