diff --git a/Cargo.lock b/Cargo.lock index d38653f..dec2883 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "ahash" version = "0.8.6" @@ -45,15 +39,6 @@ dependencies = [ "thiserror", ] -[[package]] -name = "ansi_colours" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a1558bd2075d341b9ca698ec8eb6fcc55a746b1fc4255585aad5b141d918a80" -dependencies = [ - "rgb", -] - [[package]] name = "anstream" version = "0.6.5" @@ -102,6 +87,17 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + [[package]] name = "async-channel" version = "2.1.1" @@ -158,7 +154,7 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel", + "async-channel 2.1.1", "async-executor", "async-io 2.2.2", "async-lock 3.2.0", @@ -267,13 +263,13 @@ checksum = "e1d90cd0b264dfdd8eb5bad0a2c217c1f88fa96a8573f40e7b12de23fb468f46" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -324,48 +320,6 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" -[[package]] -name = "bat" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcc9e5637c2330d8eb7b920f2aa5d9e184446c258466f825ea1412c7614cc86" -dependencies = [ - "ansi_colours", - "bincode", - "bytesize", - "clap", - "clircle", - "console", - "content_inspector", - "encoding_rs", - "etcetera", - "flate2", - "globset", - "grep-cli", - "home", - "nu-ansi-term", - "once_cell", - "path_abs", - "plist", - "semver", - "serde", - "serde_yaml", - "shell-words", - "syntect", - "thiserror", - "unicode-width", - "wild", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -393,7 +347,7 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel", + "async-channel 2.1.1", "async-lock 3.2.0", "async-task", "fastrand 2.0.1", @@ -417,29 +371,12 @@ dependencies = [ "slab", ] -[[package]] -name = "bstr" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" - [[package]] name = "byteorder" version = "1.5.0" @@ -452,12 +389,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" -[[package]] -name = "bytesize" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" - [[package]] name = "cc" version = "1.0.83" @@ -515,7 +446,6 @@ dependencies = [ "anstyle", "clap_lex", "strsim", - "terminal_size", ] [[package]] @@ -527,7 +457,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -536,18 +466,6 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" -[[package]] -name = "clircle" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e87cbed5354f17bd8ca8821a097fb62599787fe8f611743fad7ee156a0a600" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "serde", - "winapi", -] - [[package]] name = "cloudabi" version = "0.0.3" @@ -582,28 +500,6 @@ dependencies = [ "crossbeam-utils", ] -[[package]] -name = "console" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.45.0", -] - -[[package]] -name = "content_inspector" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" -dependencies = [ - "memchr", -] - [[package]] name = "convert_case" version = "0.4.0" @@ -635,15 +531,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if 1.0.0", -] - [[package]] name = "crossbeam-channel" version = "0.5.9" @@ -707,7 +594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -776,12 +663,6 @@ dependencies = [ "dtoa", ] -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - [[package]] name = "encoding_rs" version = "0.8.33" @@ -804,12 +685,6 @@ dependencies = [ "termcolor", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - [[package]] name = "errno" version = "0.3.8" @@ -830,17 +705,6 @@ dependencies = [ "xxhash-rust", ] -[[package]] -name = "etcetera" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" -dependencies = [ - "cfg-if 1.0.0", - "home", - "windows-sys 0.48.0", -] - [[package]] name = "event-listener" version = "2.5.3" @@ -906,16 +770,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "flate2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - [[package]] name = "fnv" version = "1.0.7" @@ -1024,7 +878,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -1097,39 +951,6 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "globset" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" -dependencies = [ - "aho-corasick", - "bstr", - "log", - "regex-automata", - "regex-syntax 0.8.2", -] - -[[package]] -name = "grep-cli" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea40788c059ab8b622c4d074732750bfb3bd2912e2dd58eabc11798a4d5ad725" -dependencies = [ - "bstr", - "globset", - "libc", - "log", - "termcolor", - "winapi-util", -] - [[package]] name = "hashbrown" version = "0.13.2" @@ -1170,15 +991,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" -[[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.11" @@ -1218,16 +1030,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown 0.14.3", -] - [[package]] name = "inotify" version = "0.9.6" @@ -1338,15 +1140,6 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", -] - [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -1454,15 +1247,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - [[package]] name = "mio" version = "0.8.10" @@ -1529,15 +1313,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "nu-ansi-term" -version = "0.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68" -dependencies = [ - "windows-sys 0.48.0", -] - [[package]] name = "num_threads" version = "0.1.6" @@ -1553,28 +1328,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "onig" -version = "6.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f" -dependencies = [ - "bitflags 1.3.2", - "libc", - "once_cell", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7" -dependencies = [ - "cc", - "pkg-config", -] - [[package]] name = "openssl" version = "0.10.61" @@ -1598,7 +1351,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -1668,15 +1421,6 @@ dependencies = [ "windows-targets 0.48.5", ] -[[package]] -name = "path_abs" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ef02f6342ac01d8a93b65f96db53fe68a92a15f41144f97fb00a9e669633c3" -dependencies = [ - "std_prelude", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -1762,23 +1506,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "plist" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" -dependencies = [ - "base64", - "indexmap", - "line-wrap", - "quick-xml", - "serde", - "time", -] +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" [[package]] name = "polling" @@ -1843,15 +1573,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "quick-xml" -version = "0.31.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" -dependencies = [ - "memchr", -] - [[package]] name = "quote" version = "1.0.33" @@ -1966,7 +1687,7 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax 0.8.2", + "regex-syntax", ] [[package]] @@ -1977,15 +1698,9 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.2", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - [[package]] name = "regex-syntax" version = "0.8.2" @@ -1998,15 +1713,6 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c707298afce11da2efef2f600116fa93ffa7a032b5d7b628aa17711ec81383ca" -[[package]] -name = "rgb" -version = "0.8.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" -dependencies = [ - "bytemuck", -] - [[package]] name = "ring" version = "0.16.20" @@ -2256,7 +1962,7 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -2270,19 +1976,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_yaml" -version = "0.9.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c" -dependencies = [ - "indexmap", - "itoa 1.0.10", - "ryu", - "serde", - "unsafe-libyaml", -] - [[package]] name = "servo_arc" version = "0.1.1" @@ -2315,12 +2008,6 @@ dependencies = [ "digest", ] -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - [[package]] name = "signal-hook" version = "0.3.17" @@ -2373,6 +2060,17 @@ dependencies = [ "autocfg", ] +[[package]] +name = "sluice" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d7400c0eff44aa2fcb5e31a5f24ba9716ed90138769e4977a2ba6014ae63eb5" +dependencies = [ + "async-channel 1.9.0", + "futures-core", + "futures-io", +] + [[package]] name = "smallvec" version = "1.11.2" @@ -2433,12 +2131,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "std_prelude" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8207e78455ffdf55661170876f88daf85356e4edd54e0a3dbc79586ca1e50cbe" - [[package]] name = "stopper" version = "0.2.3" @@ -2475,34 +2167,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "5b7d0a2c048d661a1a59fcd7355baa232f7ed34e0ee4df2eef3c1c1c0d3852d8" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "syntect" -version = "5.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02b4b303bf8d08bfeb0445cba5068a3d306b6baece1d5582171a9bf49188f91" -dependencies = [ - "bincode", - "bitflags 1.3.2", - "flate2", - "fnv", - "once_cell", - "onig", - "regex-syntax 0.7.5", - "serde", - "serde_json", - "thiserror", - "walkdir", -] - [[package]] name = "tempfile" version = "3.8.1" @@ -2525,16 +2198,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "terminal_size" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" -dependencies = [ - "rustix 0.38.28", - "windows-sys 0.48.0", -] - [[package]] name = "thin-slice" version = "0.1.1" @@ -2558,7 +2221,7 @@ checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -2640,16 +2303,16 @@ name = "trillium-cli" version = "0.1.1" dependencies = [ "ansi-to-html", - "async-channel", + "async-channel 2.1.1", "async-fs 2.1.0", "async-global-executor", "async-io 2.2.2", "atty", - "bat", "blocking", "broadcaster", "clap", "clap-verbosity-flag", + "colored", "env_logger", "futures-lite 2.1.0", "libc", @@ -2675,9 +2338,9 @@ dependencies = [ [[package]] name = "trillium-client" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511a6101bd51879fadfdc471487782d1ee48f9d0c38ea25d4c28e61e2b48c532" +checksum = "fff47c1086f01f8eea120b3f11a85aa39634148b60dffddc8fb8ddb9d942cb91" dependencies = [ "crossbeam-queue", "dashmap", @@ -2720,9 +2383,9 @@ dependencies = [ [[package]] name = "trillium-http" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f16e62a17ac82da28cd2ab9e2f3695d89c8f8ae9be6ef62141f10d29e176f" +checksum = "151af102d6f753df5133745dfc901ba39b1979d23edb2b3b57c3dda5e08ca895" dependencies = [ "encoding_rs", "futures-lite 2.1.0", @@ -2762,7 +2425,7 @@ checksum = "6d19bf7f37bc3e66beae9792c0f7a0e3500465cf431da63fdb6af593b0e353a4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] [[package]] @@ -2778,13 +2441,16 @@ dependencies = [ [[package]] name = "trillium-proxy" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6154dd30ce9ad4e5422e379497eaf8728aa9a61dfadd8887cc2bcf22bff6e97" +checksum = "54376c36642a9c9a2e71b76f43b46165b864e0c864f5f281a83d618879a327fa" dependencies = [ + "event-listener 4.0.1", "full-duplex-async-copy", + "futures-lite 2.1.0", "log", "size", + "sluice", "trillium", "trillium-client", "trillium-forwarding", @@ -2948,18 +2614,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" - -[[package]] -name = "unsafe-libyaml" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b" - [[package]] name = "untrusted" version = "0.7.1" @@ -3056,7 +2710,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", "wasm-bindgen-shared", ] @@ -3078,7 +2732,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3108,15 +2762,6 @@ dependencies = [ "rustls-webpki 0.100.3", ] -[[package]] -name = "wild" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10d01931a94d5a115a53f95292f51d316856b68a035618eb831bbba593a30b67" -dependencies = [ - "glob", -] - [[package]] name = "winapi" version = "0.3.9" @@ -3148,15 +2793,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -3175,21 +2811,6 @@ dependencies = [ "windows-targets 0.52.0", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" @@ -3220,12 +2841,6 @@ dependencies = [ "windows_x86_64_msvc 0.52.0", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -3238,12 +2853,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -3256,12 +2865,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -3274,12 +2877,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -3292,12 +2889,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -3310,12 +2901,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -3328,12 +2913,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -3348,9 +2927,9 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "xxhash-rust" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9828b178da53440fa9c766a3d2f73f7cf5d0ac1fe3980c1e5018d899fd19e07b" +checksum = "53be06678ed9e83edb1745eb72efc0bbcd7b5c3c35711a860906aed827a13d61" [[package]] name = "zerocopy" @@ -3369,5 +2948,5 @@ checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.42", ] diff --git a/Cargo.toml b/Cargo.toml index 114d7d3..d166739 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,27 +22,23 @@ broadcaster = "1.0.0" env_logger = "0.10.1" futures-lite = "2.1.0" log = "0.4.20" -serde = "1.0.193" +serde = { version = "1.0.193", features = ["derive"] } serde_json = "1.0.108" trillium = "0.2.11" trillium-native-tls = "0.3.0" trillium-rustls = "0.4.0" -trillium-proxy = "0.4.2" +trillium-proxy = "0.4.3" trillium-router = "0.3.5" trillium-static = { version = "0.4.0", features = ["smol"] } trillium-websockets = { version = "0.5.2", features = ["json"] } trillium-smol = "0.3.1" -trillium-client = "0.4.8" +trillium-client = "0.4.9" trillium-logger = "0.4.3" trillium-html-rewriter = "0.3.0" url = "2.5.0" clap = { version = "4.4.11", features = ["derive", "env"] } clap-verbosity-flag = "2.1.1" - -[dependencies.bat] -features = ["minimal-application"] -version = "0.24.0" -default-features = false +colored = "2.1.0" [target.'cfg(unix)'.dependencies] signal-hook = "0.3.17" diff --git a/src/cli_options.rs b/src/cli_options.rs index 0f06b54..129fa95 100644 --- a/src/cli_options.rs +++ b/src/cli_options.rs @@ -12,6 +12,9 @@ pub enum Cli { /// Make http requests using the trillium client Client(crate::ClientCli), + + /// Run a http proxy + Proxy(crate::ProxyCli), } impl Cli { @@ -22,6 +25,7 @@ impl Cli { #[cfg(unix)] DevServer(d) => d.run(), Client(c) => c.run(), + Proxy(p) => p.run(), } } } diff --git a/src/client.rs b/src/client.rs index 1478df7..b58711f 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1,14 +1,19 @@ -use bat::{Input, PagingMode, PrettyPrinter}; use blocking::Unblock; use clap::Parser; -use std::{borrow::Cow, io::ErrorKind, path::PathBuf, str::FromStr}; -use trillium::{Body, KnownHeaderName, Method}; +use clap_verbosity_flag::Verbosity; +use colored::*; +use log::Level; +use std::{ + io::{ErrorKind, IsTerminal}, + path::PathBuf, + str::FromStr, +}; +use trillium::{Body, Headers, Method, Status}; use trillium_client::{Client, Conn, Error}; use trillium_native_tls::NativeTlsConfig; use trillium_rustls::RustlsConfig; use trillium_smol::ClientConfig; use url::{self, Url}; - #[derive(Parser, Debug)] pub struct ClientCli { #[arg(value_parser = parse_method_case_insensitive)] @@ -54,21 +59,16 @@ pub struct ClientCli { /// example: /// trillium client get https://www.google.com -vvv # `trace` verbosity level #[command(flatten)] - verbose: clap_verbosity_flag::Verbosity, + verbose: Verbosity, } impl ClientCli { async fn build(&self) -> Conn { - let client = match self.tls { - TlsType::None => Client::new(ClientConfig::default()), - TlsType::Rustls => Client::new(RustlsConfig::::default()), - TlsType::NativeTls => Client::new(NativeTlsConfig::::default()), - }; - + let client = Client::from(self.tls); + log::trace!("{}", self.url.as_str()); let mut conn = client.build_conn(self.method, self.url.clone()); - for (name, value) in &self.headers { - conn.request_headers().append(name.clone(), value.clone()); - } + + conn.request_headers().extend(self.headers.clone()); if let Some(path) = &self.file { let metadata = async_fs::metadata(path) @@ -79,14 +79,14 @@ impl ClientCli { .await .unwrap_or_else(|e| panic!("could not read file {:?} ({})", path, e)); - conn.with_body(Body::new_streaming(file, Some(metadata.len()))) + conn.set_request_body(Body::new_streaming(file, Some(metadata.len()))) } else if let Some(body) = &self.body { - conn.with_body(body.clone()) + conn.set_request_body(body.clone()) } else if atty::isnt(atty::Stream::Stdin) { - conn.with_body(Body::new_streaming(Unblock::new(std::io::stdin()), None)) - } else { - conn + conn.set_request_body(Body::new_streaming(Unblock::new(std::io::stdin()), None)) } + + conn } pub fn run(self) { @@ -109,44 +109,38 @@ impl ClientCli { return; } - if atty::is(atty::Stream::Stdout) { - let body = conn.response_body().read_string().await.unwrap(); - - let request_headers_as_string = format!("{:#?}", conn.request_headers()); - let headers = conn.response_headers(); - let response_headers_as_string = format!("{:#?}", headers); - let content_type = headers.get_str(KnownHeaderName::ContentType); - let filename = match content_type { - Some("application/json") => "body.json", // bat can't sniff json for some reason - _ => self.url.path(), - }; - - let status_string = conn.status().unwrap().to_string(); - - PrettyPrinter::new() - .paging_mode(PagingMode::QuitIfOneScreen) - .header(true) - .grid(true) - .inputs(vec![ - Input::from_bytes(request_headers_as_string.as_bytes()) - .name("request_headers.rs") - .title("request headers"), - Input::from_bytes(response_headers_as_string.as_bytes()) - .name("response_headers.rs") - .title("response headers"), - Input::from_bytes(status_string.as_bytes()) - .name("status") - .title("status"), - Input::from_bytes(body.as_bytes()).name(filename).title( - if let Some(content_type) = content_type { - Cow::Owned(format!("response body ({})", content_type)) - } else { - Cow::Borrowed("response body") - }, - ), - ]) - .print() - .unwrap(); + if std::io::stdout().is_terminal() { + let status = conn.status().unwrap_or(Status::NotFound); + println!( + "{}: {}", + "Status".italic(), + if status.is_client_error() { + status.to_string().yellow() + } else if status.is_server_error() { + status.to_string().bright_red() + } else { + status.to_string().bright_green() + } + ); + + match self.verbose.log_level() { + Some(level) if level >= Level::Warn => { + println!("\n{}", "Request Headers".bold().underline()); + print_headers(conn.request_headers()); + println!("\n{}", "Response Headers".bold().underline()); + print_headers(conn.response_headers()); + + println!("\n{}", "Body".bold().underline()); + } + _ => {} + } + + futures_lite::io::copy( + &mut conn.response_body(), + &mut Unblock::new(std::io::stdout()), + ) + .await + .unwrap(); } else { futures_lite::io::copy( &mut conn.response_body(), @@ -159,11 +153,29 @@ impl ClientCli { } } -#[derive(clap::ValueEnum, Debug, Eq, PartialEq, Clone)] -enum TlsType { +fn print_headers(headers: &Headers) { + for (name, values) in headers { + for value in values { + println!("{}: {}", name.as_ref().italic().bright_blue(), value); + } + } +} + +#[derive(clap::ValueEnum, Debug, Eq, PartialEq, Clone, Copy)] +pub enum TlsType { None, Rustls, - NativeTls, + Native, +} + +impl From for Client { + fn from(value: TlsType) -> Self { + match value { + TlsType::None => Client::new(ClientConfig::default()), + TlsType::Rustls => Client::new(RustlsConfig::::default()), + TlsType::Native => Client::new(NativeTlsConfig::::default()), + } + } } fn parse_method_case_insensitive(src: &str) -> Result { @@ -172,7 +184,7 @@ fn parse_method_case_insensitive(src: &str) -> Result { .map_err(|_| format!("unrecognized method {}", src)) } -fn parse_url(src: &str) -> Result { +pub fn parse_url(src: &str) -> Result { if src.starts_with("http") { src.parse() } else { @@ -187,7 +199,7 @@ impl FromStr for TlsType { match &*s.to_ascii_lowercase() { "none" => Ok(Self::None), "rustls" => Ok(Self::Rustls), - "native" | "native-tls" => Ok(Self::NativeTls), + "native" | "native-tls" => Ok(Self::Native), _ => Err(format!("unrecognized tls {}", s)), } } diff --git a/src/lib.rs b/src/lib.rs index 1cf1a38..2585f25 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,7 @@ mod cli_options; mod client; #[cfg(unix)] mod dev_server; +mod proxy; mod root_path; mod static_cli_options; @@ -19,6 +20,7 @@ pub(crate) use cli_options::*; pub(crate) use client::ClientCli; #[cfg(unix)] pub(crate) use dev_server::DevServer; +pub(crate) use proxy::*; pub(crate) use root_path::*; pub(crate) use static_cli_options::*; diff --git a/src/proxy.rs b/src/proxy.rs new file mode 100644 index 0000000..233f66e --- /dev/null +++ b/src/proxy.rs @@ -0,0 +1,172 @@ +use crate::client::{parse_url, TlsType}; + +use clap::Parser; +use std::{fmt::Debug, fs, path::PathBuf}; +use trillium_logger::Logger; +use trillium_native_tls::NativeTlsAcceptor; +use trillium_proxy::Proxy; +use trillium_rustls::RustlsAcceptor; + +use url::Url; + +#[derive(Parser, Debug)] +pub struct ProxyCli { + /// Host to forward (reverse proxy) requests to + /// + /// This forwards any request that would otherwise be a 404 Not + /// Found to the specified listener spec. + /// + /// Note: http+unix:// schemes are not yet supported + #[arg(value_parser = parse_url)] + upstream: Url, + + /// Local host or ip to listen on + #[arg(short = 'o', long, env, default_value = "localhost")] + host: String, + + /// Local port to listen on + #[arg(short, long, env, default_value = "8080")] + port: u16, + + /// Path to a tls certificate for trillium_rustls + /// + /// This will panic unless rustls_key is also provided. Providing + /// both rustls_key and rustls_cert enables tls. + /// + /// Example: `--rustls-cert ./cert.pem --rustls-key ./key.pem` + /// For development, try using mkcert + #[arg(long, env)] + rustls_cert: Option, + + /// The path to a tls key file for trillium_rustls + /// + /// This will panic unless rustls_cert is also provided. Providing + /// both rustls_key and rustls_cert enables tls. + /// + /// Example: `--rustls-cert ./cert.pem --rustls-key ./key.pem` + /// For development, try using mkcert + #[arg(long, env)] + rustls_key: Option, + + #[arg(long, env)] + native_tls_identity: Option, + + #[arg(long, env)] + native_tls_password: Option, + + /// tls implementation. options: rustls, native-tls, none + /// + /// required if the upstream url is https. + #[arg(short, long, default_value = "rustls", verbatim_doc_comment)] + client_tls: TlsType, + + #[command(flatten)] + verbose: clap_verbosity_flag::Verbosity, +} + +impl ProxyCli { + pub fn rustls_acceptor(&self) -> Option { + match &self { + Self { + rustls_cert: Some(_), + rustls_key: None, + .. + } + | Self { + rustls_cert: None, + rustls_key: Some(_), + .. + } => { + panic!("rustls_cert_path must be combined with rustls_key_path"); + } + + Self { + rustls_cert: Some(cert), + rustls_key: Some(key), + native_tls_identity: None, + .. + } => Some(RustlsAcceptor::from_single_cert( + &fs::read(cert).unwrap(), + &fs::read(key).unwrap(), + )), + + Self { + rustls_cert: Some(_), + rustls_key: Some(_), + native_tls_identity: Some(_), + .. + } => { + panic!("sorry, i'm not sure what to do when provided with both native tls and rustls info. please pick one or the other") + } + + _ => None, + } + } + + pub fn native_tls_acceptor(&self) -> Option { + match &self { + Self { + native_tls_identity: Some(_), + native_tls_password: None, + .. + } + | Self { + native_tls_identity: None, + native_tls_password: Some(_), + .. + } => { + panic!("native_tls_identity_path and native_tls_identity_password must be used together"); + } + + Self { + rustls_cert: None, + rustls_key: None, + native_tls_identity: Some(x), + native_tls_password: Some(y), + .. + } => Some(NativeTlsAcceptor::from_pkcs12(&fs::read(x).unwrap(), y)), + + Self { + rustls_cert: Some(_), + rustls_key: Some(_), + native_tls_identity: Some(_), + .. + } => { + panic!("sorry, i'm not sure what to do when provided with both native tls and rustls info. please pick one or the other") + } + + _ => None, + } + } + + pub fn run(self) { + env_logger::Builder::new() + .filter_level(self.verbose.log_level_filter()) + .init(); + + if self.client_tls == TlsType::None && self.upstream.scheme() == "https" { + eprintln!("cannot use tls type none with an upstream scheme of https"); + std::process::exit(-1); + } + println!("Proxying to {}", &self.upstream); + + let server = ( + Logger::new(), + Proxy::new(self.client_tls, self.upstream.clone()) + .with_via_pseudonym("trillium-proxy") + .proxy_not_found(), + ); + + let config = trillium_smol::config() + .with_port(self.port) + .with_host(&self.host); + + if let Some(acceptor) = self.rustls_acceptor() { + config.with_acceptor(acceptor).run(server); + } else if let Some(acceptor) = self.native_tls_acceptor() { + config.with_acceptor(acceptor).run(server); + } else { + config.run(server); + } + } +} diff --git a/src/static_cli_options.rs b/src/static_cli_options.rs index 0ed5d10..3fd07a3 100644 --- a/src/static_cli_options.rs +++ b/src/static_cli_options.rs @@ -24,7 +24,7 @@ pub struct StaticCli { #[arg(short, long, env, default_value = "8080")] port: u16, - /// Path to a tls certificate for tide_rustls + /// Path to a tls certificate for trillium_rustls /// /// This will panic unless rustls_key is also provided. Providing /// both rustls_key and rustls_cert enables tls. @@ -34,7 +34,7 @@ pub struct StaticCli { #[arg(long, env)] rustls_cert: Option, - /// The path to a tls key file for tide_rustls + /// The path to a tls key file for trillium_rustls /// /// This will panic unless rustls_cert is also provided. Providing /// both rustls_key and rustls_cert enables tls.