diff --git a/Cargo.lock b/Cargo.lock index f2de0b0..4159387 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -64,43 +64,12 @@ dependencies = [ "rustc-demangle", ] -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - [[package]] name = "bytes" version = "1.0.1" @@ -159,24 +128,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "cpufeatures" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" -dependencies = [ - "libc", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "dirs" version = "3.0.2" @@ -221,30 +172,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.16" @@ -252,7 +179,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -261,12 +187,6 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" -[[package]] -name = "futures-io" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" - [[package]] name = "futures-sink" version = "0.3.16" @@ -287,32 +207,9 @@ checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" dependencies = [ "autocfg", "futures-core", - "futures-sink", "futures-task", "pin-project-lite", "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] @@ -323,7 +220,7 @@ checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if", "libc", - "wasi 0.10.2+wasi-snapshot-preview1", + "wasi", ] [[package]] @@ -363,31 +260,6 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -[[package]] -name = "headers" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7591fb62902706ae8e7aaff416b1b0fa2c0fd0878b46dc13baa3712d8a855" -dependencies = [ - "base64", - "bitflags", - "bytes", - "headers-core", - "http", - "mime", - "sha-1", - "time", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - [[package]] name = "hermit-abi" version = "0.1.19" @@ -455,17 +327,6 @@ dependencies = [ "want", ] -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "indexmap" version = "1.7.0" @@ -476,15 +337,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "input_buffer" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" -dependencies = [ - "bytes", -] - [[package]] name = "itoa" version = "0.4.7" @@ -544,34 +396,12 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" - [[package]] name = "memchr" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "mime_guess" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "miniz_oxide" version = "0.4.4" @@ -606,7 +436,7 @@ dependencies = [ [[package]] name = "multihook" -version = "0.1.1" +version = "0.1.2" dependencies = [ "chrono", "colored", @@ -614,6 +444,7 @@ dependencies = [ "dirs", "fern", "glob", + "hyper", "jsonpath", "lazy_static", "log", @@ -623,25 +454,6 @@ dependencies = [ "thiserror", "tokio", "toml", - "warp", -] - -[[package]] -name = "multipart" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050aeedc89243f5347c3e237e3e13dc76fbe4ae3742a57b94dc14f69acf76d4" -dependencies = [ - "buf_redux", - "httparse", - "log", - "mime", - "mime_guess", - "quick-error", - "rand 0.7.3", - "safemem", - "tempfile", - "twoway", ] [[package]] @@ -717,18 +529,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - [[package]] name = "pest" version = "1.0.6" @@ -746,26 +546,6 @@ dependencies = [ "syn 0.11.11", ] -[[package]] -name = "pin-project" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" -dependencies = [ - "proc-macro2", - "quote 1.0.9", - "syn 1.0.74", -] - [[package]] name = "pin-project-lite" version = "0.2.7" @@ -778,12 +558,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - [[package]] name = "proc-macro2" version = "1.0.28" @@ -793,12 +567,6 @@ dependencies = [ "unicode-xid 0.2.2", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" version = "0.3.15" @@ -814,87 +582,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom 0.2.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - [[package]] name = "redox_syscall" version = "0.2.10" @@ -910,7 +597,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" dependencies = [ - "getrandom 0.2.3", + "getrandom", "redox_syscall", ] @@ -931,15 +618,6 @@ version = "0.6.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rust-ini" version = "0.13.0" @@ -958,18 +636,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - [[package]] name = "serde" version = "0.8.23" @@ -1019,31 +685,6 @@ dependencies = [ "serde 1.0.127", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde 1.0.127", -] - -[[package]] -name = "sha-1" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a0c8611594e2ab4ebbf06ec7cbbf0a99450b8570e96cbf5188b5d5f6ef18d81" -dependencies = [ - "block-buffer", - "cfg-if", - "cpufeatures", - "digest", - "opaque-debug", -] - [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -1055,9 +696,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" [[package]] name = "socket2" @@ -1106,20 +747,6 @@ dependencies = [ "unicode-xid 0.0.4", ] -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if", - "libc", - "rand 0.8.4", - "redox_syscall", - "remove_dir_all", - "winapi", -] - [[package]] name = "thiserror" version = "1.0.26" @@ -1150,21 +777,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "tinyvec" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - [[package]] name = "tokio" version = "1.9.0" @@ -1195,30 +807,6 @@ dependencies = [ "syn 1.0.74", ] -[[package]] -name = "tokio-stream" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1a5f475f1b9d077ea1017ecbc60890fda8e54942d680ca0b1d2b47cfa2d861b" -dependencies = [ - "futures-util", - "log", - "pin-project", - "tokio", - "tungstenite", -] - [[package]] name = "tokio-util" version = "0.6.7" @@ -1255,7 +843,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if", - "log", "pin-project-lite", "tracing-core", ] @@ -1275,67 +862,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" -[[package]] -name = "tungstenite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" -dependencies = [ - "base64", - "byteorder", - "bytes", - "http", - "httparse", - "input_buffer", - "log", - "rand 0.8.4", - "sha-1", - "url", - "utf-8", -] - -[[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" -dependencies = [ - "memchr", -] - -[[package]] -name = "typenum" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" - -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-xid" version = "0.0.4" @@ -1348,24 +874,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "version_check" version = "0.9.3" @@ -1382,41 +890,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "warp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "332d47745e9a0c38636dbd454729b147d16bd1ed08ae67b3ab281c4506771054" -dependencies = [ - "bytes", - "futures", - "headers", - "http", - "hyper", - "log", - "mime", - "mime_guess", - "multipart", - "percent-encoding", - "pin-project", - "scoped-tls", - "serde 1.0.127", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util", - "tower-service", - "tracing", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index 2658c94..3f34968 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,14 +4,13 @@ description = "A webhook server" authors = ["trivernis "] license = "GPL-3.0" readme = "README.md" -version = "0.1.1" +version = "0.1.2" edition = "2018" repository = "https://github.com/Trivernis/multihook.git" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -warp = "0.3.1" thiserror = "1.0.26" config = "0.11.0" lazy_static = "1.4.0" @@ -34,6 +33,10 @@ features = ["derive"] version = "1.9.0" features = ["macros", "process", "sync"] +[dependencies.hyper] +version = "0.14.11" +features = ["server", "http1", "http2", "tcp"] + [features] default = ["tokio/rt-multi-thread"] singlethreaded = ["tokio/rt"] \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 5f5a2bd..ff92c65 100644 --- a/src/main.rs +++ b/src/main.rs @@ -41,5 +41,8 @@ async fn init_and_start() { .address .clone() .unwrap_or(String::from("127.0.0.1:8080")); - server.start(&address).await + server + .start(&address) + .await + .expect("Failed to start server"); } diff --git a/src/server/action.rs b/src/server/action.rs index 76a1222..4ddec41 100644 --- a/src/server/action.rs +++ b/src/server/action.rs @@ -1,6 +1,7 @@ use crate::server::command_template::CommandTemplate; use crate::utils::error::MultihookResult; use crate::utils::settings::EndpointSettings; +use hyper::{Body, Request}; use serde_json::Value; use std::fs::read_to_string; use std::mem; @@ -32,11 +33,12 @@ impl HookAction { } } - pub async fn execute(&self, body: &str) -> MultihookResult<()> { + pub async fn execute(&self, req: Request) -> MultihookResult<()> { + let body = hyper::body::to_bytes(req.into_body()).await?.to_vec(); + let body = String::from_utf8(body)?; if self.run_detached { tokio::spawn({ let action = self.clone(); - let body = body.to_owned(); async move { if let Err(e) = action.execute_command(&body).await { log::error!("Detached hook threw an error: {:?}", e); @@ -46,7 +48,7 @@ impl HookAction { Ok(()) } else { - self.execute_command(body).await + self.execute_command(&body).await } } diff --git a/src/server/http.rs b/src/server/http.rs new file mode 100644 index 0000000..6f05f87 --- /dev/null +++ b/src/server/http.rs @@ -0,0 +1,94 @@ +use crate::utils::error::MultihookResult; +use hyper::service::{make_service_fn, service_fn}; +use hyper::{Body, Request, Response, Server}; +use std::collections::HashMap; +use std::convert::Infallible; +use std::future::Future; +use std::net::{SocketAddr, ToSocketAddrs}; +use std::pin::Pin; +use std::sync::Arc; + +pub struct HTTPCallback { + inner: Arc< + dyn Fn( + Request, + ) + -> Pin>> + Send + Sync>> + + Send + + Sync, + >, +} + +impl HTTPCallback { + pub fn new(cb: F) -> Self + where + F: 'static + + Fn( + Request, + ) + -> Pin>> + Send + Sync>> + + Send + + Sync, + { + Self { + inner: Arc::new(cb), + } + } + + pub async fn execute(&self, req: Request) -> MultihookResult> { + self.inner.as_ref()(req).await + } +} + +#[derive(Default)] +pub struct HTTPServer { + routes: HashMap>>, +} + +impl HTTPServer { + pub fn add_callback(&mut self, route: S, cb: HTTPCallback) { + self.routes.insert(route.to_string(), Arc::new(cb)); + } + + async fn execute_callback(&self, req: Request) -> Result, Infallible> { + let path = req.uri().path(); + let response = if let Some(cb) = self.routes.get(path) { + match cb.as_ref().execute(req).await { + Ok(res) => res, + Err(e) => Response::builder() + .status(500) + .body(Body::from(format!("{:?}", e))) + .unwrap(), + } + } else { + Response::builder() + .status(404) + .body(Body::from("Unknown endpoint")) + .unwrap() + }; + + Ok(response) + } + + pub async fn start(self, addr: A) -> MultihookResult<()> { + let address: SocketAddr = addr + .to_socket_addrs() + .expect("Failed to convert address to socket address.") + .next() + .expect("No socket address specified"); + let self_ref = Arc::new(self); + let service_fn = make_service_fn(|_conn| { + let self_ref = Arc::clone(&self_ref); + async move { + Ok::<_, Infallible>(service_fn(move |req| { + let self_ref = Arc::clone(&self_ref); + async move { self_ref.execute_callback(req).await } + })) + } + }); + let server = Server::bind(&address).serve(service_fn); + server.await?; + + Ok(()) + } +} diff --git a/src/server/mod.rs b/src/server/mod.rs index 5e9f61d..5c1e75e 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,84 +1,50 @@ -use std::collections::HashMap; -use std::net::SocketAddr; use std::sync::Arc; -use warp::http::Response; -use warp::hyper::body::Bytes; -use warp::{Filter, Rejection}; - use action::HookAction; -use crate::utils::error::MultihookError; +use crate::server::http::{HTTPCallback, HTTPServer}; +use crate::utils::error::MultihookResult; +use hyper::{Body, Response}; pub mod action; pub mod command_template; +mod http; pub struct HookServer { - endpoints: HashMap, + server: HTTPServer, } impl HookServer { pub fn new() -> Self { Self { - endpoints: Default::default(), + server: HTTPServer::default(), } } pub fn add_hook(&mut self, point: String, action: HookAction) { - self.endpoints.insert(point, action); - } - - async fn execute_action( - body: Bytes, - point: String, - action: Arc, - ) -> Result, Rejection> { - let body = String::from_utf8(body.to_vec()).map_err(MultihookError::from)?; - action.execute(&body).await?; - log::info!("Hook '{}' executed", point); - Ok(Response::builder() - .body(format!("Hook '{}' executed", point)) - .unwrap()) + let action = Arc::new(action); + + let cb = HTTPCallback::new({ + let point = point.clone(); + move |req| { + let action = Arc::clone(&action); + let point = point.clone(); + Box::pin(async move { + log::debug!("Executing hook {}", point); + action.execute(req).await?; + log::debug!("Hook {} executed", point); + Ok(Response::new(Body::from(format!( + "Hook '{}' executed.", + point + )))) + }) + } + }); + self.server.add_callback(point, cb); } - async fn not_found_response() -> Result, Rejection> { - log::info!("Endpoint not found"); - Ok(Response::builder() - .status(404) - .body(String::from("Endpoint not found")) - .unwrap()) - } - - pub async fn start(self, address: &str) { - let routes = self - .endpoints - .into_iter() - .map(|(p, a)| (p, Arc::new(a))) - .map(|(point, action)| { - warp::post() - .and(warp::path(point.clone())) - .and(warp::body::bytes()) - .and_then(move |b| { - let action = Arc::clone(&action); - let point = point.clone(); - async move { Self::execute_action(b, point, action).await } - }) - .boxed() - }) - .fold( - warp::get() - .and_then(|| async { Self::not_found_response().await }) - .boxed(), - |routes, route| routes.or(route).unify().boxed(), - ); - + pub async fn start(self, address: &str) -> MultihookResult<()> { log::info!("Starting server on {}", address); - warp::serve(routes) - .bind( - address - .parse::() - .expect("Invalid address in settings"), - ) - .await; + self.server.start(address).await } } diff --git a/src/utils/error.rs b/src/utils/error.rs index 06efb40..2c4b60a 100644 --- a/src/utils/error.rs +++ b/src/utils/error.rs @@ -1,14 +1,10 @@ use std::string::FromUtf8Error; use thiserror::Error; -use warp::reject::Reject; pub type MultihookResult = Result; #[derive(Error, Debug)] pub enum MultihookError { - #[error(transparent)] - Warp(#[from] warp::Error), - #[error("Failed to parse body as utf8 string {0}")] UTF8Error(#[from] FromUtf8Error), @@ -23,6 +19,7 @@ pub enum MultihookError { #[error(transparent)] ConfigError(#[from] config::ConfigError), -} -impl Reject for MultihookError {} + #[error(transparent)] + Hyper(#[from] hyper::Error), +}