[package]
name = "grapsus-proxy"
version.workspace = true
edition.workspace = true
authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
description = "A security-first reverse proxy built on Pingora with sleepable ops at the edge"
keywords = ["proxy", "reverse-proxy", "http", "security", "pingora"]
categories = ["network-programming", "web-programming::http-server"]
readme = "../../README.md"
[lib]
name = "grapsus_proxy"
path = "src/lib.rs"
[[bin]]
name = "grapsus"
path = "src/main.rs"
[dependencies]
pingora = { workspace = true }
pingora-core = { workspace = true }
pingora-http = { workspace = true }
pingora-proxy = { workspace = true }
pingora-load-balancing = { workspace = true }
pingora-timeout = { workspace = true }
pingora-limits = { workspace = true }
pingora-cache = { workspace = true }
pingora-memory-cache = { workspace = true }
grapsus-config = { path = "../config", version = "0.5.12", features = ["validation"] }
grapsus-common = { path = "../common", version = "0.5.12" }
grapsus-agent-protocol = { path = "../agent-protocol", version = "0.5.12" }
tokio = { workspace = true }
async-trait = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
tracing = { workspace = true }
tracing-subscriber = { workspace = true }
prometheus = { workspace = true }
thiserror = { workspace = true }
anyhow = { workspace = true }
http = { workspace = true }
bytes = { workspace = true }
rustls = { workspace = true }
rustls-pemfile = { workspace = true }
webpki-roots = "1.0"
x509-parser = "0.18"
sha2 = "0.10"
url = "2.5"
hmac = "0.12"
uuid = { workspace = true }
chrono = { workspace = true }
dashmap = { workspace = true }
parking_lot = { workspace = true }
arc-swap = { workspace = true }
base64 = { workspace = true }
regex = "1.10"
urlencoding = "2.1"
once_cell = "1.20"
maxminddb = "0.27"
ip2location = "0.6"
jsonschema = "0.44"
serde_yaml = "0.9"
mime_guess = "2.0"
http-body-util = "0.1"
httpdate = "1.0"
html-escape = "0.2"
flate2 = "1.1"
brotli = "8.0"
tar = "0.4"
toml = "1.0"
tempfile = "3.25"
clap = { version = "4.5", features = ["derive", "env"] }
nix = { version = "0.31", features = ["signal"] }
libc = "0.2"
signal-hook = "0.4"
num_cpus = "1.16"
tikv-jemallocator = { workspace = true }
rand = "0.10"
tiktoken-rs = { version = "0.9", optional = true }
hex = "0.4"
redis = { version = "1.0", features = ["tokio-comp", "connection-manager"], optional = true }
async-memcached = { version = "0.6", optional = true }
opentelemetry = { version = "0.31", optional = true }
opentelemetry_sdk = { version = "0.31", features = ["rt-tokio"], optional = true }
opentelemetry-otlp = { version = "0.31", features = ["grpc-tonic"], optional = true }
opentelemetry-semantic-conventions = { version = "0.31", optional = true }
xxhash-rust = { version = "0.8", features = ["xxh3"] }
murmur3 = "0.5"
notify = "8.2"
tokio-util = { version = "0.7", features = ["codec"] }
futures = "0.3"
tonic = { workspace = true }
tonic-health = "0.14"
reqwest = { version = "0.13", default-features = false, features = ["rustls", "json", "query"] }
instant-acme = "0.8"
rcgen = "0.14"
hickory-resolver = "0.25"
[features]
default = []
distributed-rate-limit = ["redis", "async-memcached"]
distributed-rate-limit-redis = ["redis"]
distributed-rate-limit-memcached = ["async-memcached"]
opentelemetry = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp", "dep:opentelemetry-semantic-conventions"]
kubernetes = []
tiktoken = ["tiktoken-rs"]
[dev-dependencies]
criterion = { workspace = true }
proptest = { workspace = true }
insta = { workspace = true }
tempfile = "3.25"
reqwest = { version = "0.13", default-features = false, features = ["rustls"] }
tokio-tungstenite = "0.28"
futures-util = "0.3"
tokio-rustls = "0.26"
rcgen = "0.14"
wiremock = "0.6"