2026-02-09 10:55:46 +00:00
|
|
|
[workspace]
|
|
|
|
|
resolver = "2"
|
|
|
|
|
members = [
|
|
|
|
|
"crates/rustproxy",
|
|
|
|
|
"crates/rustproxy-config",
|
|
|
|
|
"crates/rustproxy-routing",
|
|
|
|
|
"crates/rustproxy-tls",
|
|
|
|
|
"crates/rustproxy-passthrough",
|
|
|
|
|
"crates/rustproxy-http",
|
|
|
|
|
"crates/rustproxy-nftables",
|
|
|
|
|
"crates/rustproxy-metrics",
|
|
|
|
|
"crates/rustproxy-security",
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[workspace.package]
|
|
|
|
|
version = "0.1.0"
|
|
|
|
|
edition = "2021"
|
|
|
|
|
license = "MIT"
|
|
|
|
|
authors = ["Lossless GmbH <hello@lossless.com>"]
|
|
|
|
|
|
|
|
|
|
[workspace.dependencies]
|
|
|
|
|
# Async runtime
|
|
|
|
|
tokio = { version = "1", features = ["full"] }
|
|
|
|
|
|
|
|
|
|
# Serialization
|
|
|
|
|
serde = { version = "1", features = ["derive"] }
|
|
|
|
|
serde_json = "1"
|
|
|
|
|
|
|
|
|
|
# HTTP proxy engine (hyper-based)
|
|
|
|
|
hyper = { version = "1", features = ["http1", "http2", "server", "client"] }
|
|
|
|
|
hyper-util = { version = "0.1", features = ["tokio", "http1", "http2", "client-legacy", "server-auto"] }
|
2026-02-13 23:18:22 +00:00
|
|
|
http-body = "1"
|
2026-02-09 10:55:46 +00:00
|
|
|
http-body-util = "0.1"
|
|
|
|
|
bytes = "1"
|
|
|
|
|
|
|
|
|
|
# ACME / Let's Encrypt
|
|
|
|
|
instant-acme = { version = "0.7", features = ["hyper-rustls"] }
|
|
|
|
|
|
|
|
|
|
# TLS for passthrough SNI
|
|
|
|
|
rustls = { version = "0.23", features = ["ring"] }
|
|
|
|
|
tokio-rustls = "0.26"
|
|
|
|
|
rustls-pemfile = "2"
|
|
|
|
|
|
|
|
|
|
# Self-signed cert generation for tests
|
|
|
|
|
rcgen = "0.13"
|
|
|
|
|
|
|
|
|
|
# Temp directories for tests
|
|
|
|
|
tempfile = "3"
|
|
|
|
|
|
|
|
|
|
# Lock-free atomics
|
|
|
|
|
arc-swap = "1"
|
|
|
|
|
|
|
|
|
|
# Concurrent maps
|
|
|
|
|
dashmap = "6"
|
|
|
|
|
|
|
|
|
|
# Domain wildcard matching
|
|
|
|
|
glob-match = "0.2"
|
|
|
|
|
|
|
|
|
|
# IP/CIDR parsing
|
|
|
|
|
ipnet = "2"
|
|
|
|
|
|
|
|
|
|
# JWT authentication
|
|
|
|
|
jsonwebtoken = "9"
|
|
|
|
|
|
|
|
|
|
# Structured logging
|
|
|
|
|
tracing = "0.1"
|
|
|
|
|
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
|
|
|
|
|
|
|
|
|
# Error handling
|
|
|
|
|
thiserror = "2"
|
|
|
|
|
anyhow = "1"
|
|
|
|
|
|
|
|
|
|
# CLI
|
|
|
|
|
clap = { version = "4", features = ["derive"] }
|
|
|
|
|
|
|
|
|
|
# Regex for URL rewriting
|
|
|
|
|
regex = "1"
|
|
|
|
|
|
|
|
|
|
# Base64 for basic auth
|
|
|
|
|
base64 = "0.22"
|
|
|
|
|
|
|
|
|
|
# Cancellation / utility
|
|
|
|
|
tokio-util = "0.7"
|
|
|
|
|
|
|
|
|
|
# Async traits
|
|
|
|
|
async-trait = "0.1"
|
|
|
|
|
|
|
|
|
|
# libc for uid checks
|
|
|
|
|
libc = "0.2"
|
|
|
|
|
|
|
|
|
|
# Internal crates
|
|
|
|
|
rustproxy-config = { path = "crates/rustproxy-config" }
|
|
|
|
|
rustproxy-routing = { path = "crates/rustproxy-routing" }
|
|
|
|
|
rustproxy-tls = { path = "crates/rustproxy-tls" }
|
|
|
|
|
rustproxy-passthrough = { path = "crates/rustproxy-passthrough" }
|
|
|
|
|
rustproxy-http = { path = "crates/rustproxy-http" }
|
|
|
|
|
rustproxy-nftables = { path = "crates/rustproxy-nftables" }
|
|
|
|
|
rustproxy-metrics = { path = "crates/rustproxy-metrics" }
|
|
|
|
|
rustproxy-security = { path = "crates/rustproxy-security" }
|