diff --git a/Cargo.lock b/Cargo.lock index 1656e12..b3491fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -89,6 +89,7 @@ dependencies = [ "bitflags", "bytes", "futures-util", + "headers", "http", "http-body", "hyper", @@ -128,6 +129,12 @@ dependencies = [ "tower-service", ] +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + [[package]] name = "bincode" version = "1.3.3" @@ -143,6 +150,15 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + [[package]] name = "bumpalo" version = "3.12.0" @@ -225,6 +241,15 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" +[[package]] +name = "cpufeatures" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.3.2" @@ -234,6 +259,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + [[package]] name = "cxx" version = "1.0.94" @@ -278,6 +313,16 @@ dependencies = [ "syn 2.0.13", ] +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "encoding_rs" version = "0.8.32" @@ -401,6 +446,16 @@ dependencies = [ "slab", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.9" @@ -437,6 +492,31 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "headers" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +dependencies = [ + "base64", + "bitflags", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[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.2.6" @@ -724,6 +804,7 @@ dependencies = [ "bincode", "chrono", "futures", + "headers", "rand", "sanitize-filename-reader-friendly", "serde", @@ -981,6 +1062,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -1275,6 +1367,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + [[package]] name = "unicase" version = "2.6.0" diff --git a/Cargo.toml b/Cargo.toml index 7628019..a8e07ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,10 +8,11 @@ edition = "2021" [dependencies] async-bincode = { version = "0.7.0", features = ["tokio"] } async_zip = { version = "0.0.13", features = ["deflate", "tokio", "tokio-fs", "async-compression"] } -axum = { version = "0.6.12", features = ["multipart", "http2"] } +axum = { version = "0.6.12", features = ["multipart", "http2", "headers"] } bincode = "1.3.3" chrono = { version = "0.4.24", features = ["serde"] } futures = "0.3.28" +headers = "0.3.8" rand = { version = "0.8.5", features = ["small_rng"] } sanitize-filename-reader-friendly = "2.2.1" serde = { version = "1.0.160", features = ["serde_derive", "derive"] } diff --git a/src/main.rs b/src/main.rs index e7f66e2..35891c9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,10 @@ use async_zip::{Compression, ZipEntryBuilder}; use axum::body::StreamBody; use axum::extract::{ConnectInfo, State}; use axum::http::{Request, StatusCode}; -use axum::middleware::{Next, self}; +use axum::middleware::{self, Next}; use axum::response::{IntoResponse, Response}; use axum::routing::{get, post}; +use axum::TypedHeader; use axum::{ extract::{DefaultBodyLimit, Multipart}, response::Redirect, @@ -15,6 +16,7 @@ use axum::{ use futures::TryStreamExt; +use headers::{Header, HeaderName, HeaderValue}; use rand::distributions::{Alphanumeric, DistString}; use rand::rngs::SmallRng; use rand::SeedableRng; @@ -89,8 +91,23 @@ async fn main() -> io::Result<()> { Ok(()) } -async fn log_source(ConnectInfo(addr): ConnectInfo, req: Request, next: Next) -> Response { - tracing::info!("{}", addr); +// async fn log_source( +// ConnectInfo(addr): ConnectInfo, +// req: Request, +// next: Next, +// ) -> Response { +// tracing::info!("{}", addr); +// +// next.run(req).await +// } + +async fn log_source( + ConnectInfo(addr): ConnectInfo, + TypedHeader(ForwardedFor(forwarded_for)): TypedHeader, + req: Request, + next: Next, +) -> Response { + tracing::info!("{} : {}", addr, forwarded_for); next.run(req).await } @@ -252,3 +269,33 @@ fn _bytes_to_human_readable(bytes: u64) -> String { format!("{:.2} {}", running, UNITS[count - 1]) } + +struct ForwardedFor(String); + +static FF_TEXT: &str = "f-forwarded-for"; +static FF_NAME: HeaderName = HeaderName::from_static(FF_TEXT); + +impl Header for ForwardedFor { + fn name() -> &'static HeaderName { + &FF_NAME + } + + fn decode<'i, I>(values: &mut I) -> Result + where + Self: Sized, + I: Iterator, + { + let value = values + .next() + .ok_or_else(headers::Error::invalid)? + .to_str() + .map_err(|_| headers::Error::invalid())? + .to_owned(); + + Ok(ForwardedFor(value)) + } + + fn encode>(&self, values: &mut E) { + values.extend(std::iter::once(HeaderValue::from_str(&self.0).unwrap())); + } +}