pub struct Server { /* private fields */ }Expand description
Core HTTP proxy server implementation that handles request processing, caching, and monitoring. Manages server configuration, connection lifecycle, and integration with various modules.
Implementations§
Source§impl Server
impl Server
Sourcepub fn new(conf: &ServerConf, ctx: AppContext) -> Result<Self, Error>
pub fn new(conf: &ServerConf, ctx: AppContext) -> Result<Self, Error>
Creates a new HTTP proxy server instance with the given configuration. Initializes all server components including:
- TCP socket options
- TLS settings
- Prometheus metrics (if enabled)
- Threading configuration
Sourcepub fn enable_lets_encrypt(&mut self)
pub fn enable_lets_encrypt(&mut self)
Enable lets encrypt proxy plugin for handling ACME challenges at
/.well-known/acme-challenge path
Sourcepub fn get_prometheus_push_service(&self) -> Option<Box<dyn BackgroundTask>>
pub fn get_prometheus_push_service(&self) -> Option<Box<dyn BackgroundTask>>
Get the prometheus push service configuration if enabled. Returns a tuple of (metrics endpoint, service future) if push mode is configured.
Sourcepub fn run(self, conf: Arc<ServerConf>) -> Result<ServerServices, Error>
pub fn run(self, conf: Arc<ServerConf>) -> Result<ServerServices, Error>
Starts the server and sets up TCP/TLS listening endpoints.
- Configures listeners for each address
- Sets up TLS if enabled
- Initializes HTTP/2 support
- Configures thread pool
Source§impl Server
impl Server
Sourcepub async fn handle_request_plugin(
&self,
step: PluginStep,
session: &mut Session,
ctx: &mut Ctx,
) -> Result<bool>
pub async fn handle_request_plugin( &self, step: PluginStep, session: &mut Session, ctx: &mut Ctx, ) -> Result<bool>
Executes request plugins in the configured chain Returns true if a plugin handled the request completely
Sourcepub async fn handle_response_plugin(
&self,
session: &mut Session,
ctx: &mut Ctx,
upstream_response: &mut ResponseHeader,
) -> Result<()>
pub async fn handle_response_plugin( &self, session: &mut Session, ctx: &mut Ctx, upstream_response: &mut ResponseHeader, ) -> Result<()>
Run response plugins
pub fn handle_upstream_response_plugin( &self, session: &mut Session, ctx: &mut Ctx, upstream_response: &mut ResponseHeader, ) -> Result<()>
pub fn handle_upstream_response_body_plugin( &self, session: &mut Session, ctx: &mut Ctx, body: &mut Option<Bytes>, end_of_stream: bool, ) -> Result<()>
pub fn handle_response_body_plugin( &self, session: &mut Session, ctx: &mut Ctx, body: &mut Option<Bytes>, end_of_stream: bool, ) -> Result<()>
Trait Implementations§
Source§impl ProxyHttp for Server
impl ProxyHttp for Server
Source§fn early_request_filter<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
ctx: &'life2 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
fn early_request_filter<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, session: &'life1 mut Session, ctx: &'life2 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
Handles early request processing before main request handling. Key responsibilities:
- Sets up connection tracking and metrics
- Records timing information
- Initializes OpenTelemetry tracing
- Matches request to location configuration
- Validates request parameters
- Initializes compression and gRPC modules if needed
Source§fn request_filter<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
ctx: &'life2 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>
fn request_filter<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, session: &'life1 mut Session, ctx: &'life2 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>
Main request processing filter. Handles:
- Admin interface requests
- Let’s Encrypt certificate challenges
- Location-specific processing
- URL rewriting
- Plugin execution
Source§fn proxy_upstream_filter<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
ctx: &'life2 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>
fn proxy_upstream_filter<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, session: &'life1 mut Session, ctx: &'life2 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<bool>> + Send + 'async_trait>>
Filters requests before sending to upstream. Allows modifying request before proxying.
Source§fn upstream_peer<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
ctx: &'life2 mut Ctx,
) -> Pin<Box<dyn Future<Output = Result<Box<HttpPeer>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn upstream_peer<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
ctx: &'life2 mut Ctx,
) -> Pin<Box<dyn Future<Output = Result<Box<HttpPeer>>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
Selects and configures the upstream peer to proxy to. Handles upstream connection pooling and health checking.
Source§fn connected_to_upstream<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
_session: &'life1 mut Session,
reused: bool,
_peer: &'life2 HttpPeer,
_fd: RawFd,
digest: Option<&'life3 Digest>,
ctx: &'life4 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
fn connected_to_upstream<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, _session: &'life1 mut Session, reused: bool, _peer: &'life2 HttpPeer, _fd: RawFd, digest: Option<&'life3 Digest>, ctx: &'life4 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
Called when connection is established to upstream. Records timing metrics and TLS details.
Source§fn upstream_request_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
upstream_response: &'life2 mut RequestHeader,
ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
fn upstream_request_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, session: &'life1 mut Session, upstream_response: &'life2 mut RequestHeader, ctx: &'life3 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
Filters upstream request before sending. Adds proxy headers and performs any request modifications.
Source§fn request_body_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_session: &'life1 mut Session,
body: &'life2 mut Option<Bytes>,
_end_of_stream: bool,
ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
fn request_body_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, _session: &'life1 mut Session, body: &'life2 mut Option<Bytes>, _end_of_stream: bool, ctx: &'life3 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
Filters request body chunks before sending upstream. Tracks payload size and enforces size limits.
Source§fn cache_key_callback(
&self,
session: &Session,
ctx: &mut Self::CTX,
) -> Result<CacheKey>
fn cache_key_callback( &self, session: &Session, ctx: &mut Self::CTX, ) -> Result<CacheKey>
Generates cache keys for request caching. Combines:
- Cache namespace
- Request method
- URL path and query
- Optional custom prefix
Source§fn response_cache_filter(
&self,
_session: &Session,
resp: &ResponseHeader,
ctx: &mut Self::CTX,
) -> Result<RespCacheable>
fn response_cache_filter( &self, _session: &Session, resp: &ResponseHeader, ctx: &mut Self::CTX, ) -> Result<RespCacheable>
Determines if and how responses should be cached. Checks:
- Cache-Control headers
- TTL settings
- Cache privacy settings
- Custom cache control directives
Source§fn upstream_response_body_filter(
&self,
session: &mut Session,
body: &mut Option<Bytes>,
end_of_stream: bool,
ctx: &mut Self::CTX,
) -> Result<Option<Duration>>
fn upstream_response_body_filter( &self, session: &mut Session, body: &mut Option<Bytes>, end_of_stream: bool, ctx: &mut Self::CTX, ) -> Result<Option<Duration>>
Filters upstream response body chunks. Records timing metrics and finalizes spans.
Source§fn response_body_filter(
&self,
session: &mut Session,
body: &mut Option<Bytes>,
end_of_stream: bool,
ctx: &mut Self::CTX,
) -> Result<Option<Duration>>
fn response_body_filter( &self, session: &mut Session, body: &mut Option<Bytes>, end_of_stream: bool, ctx: &mut Self::CTX, ) -> Result<Option<Duration>>
Final filter for response body before sending to client. Handles response body modifications and compression.
Source§fn fail_to_proxy<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
e: &'life2 Error,
ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = FailToProxy> + Send + 'async_trait>>
fn fail_to_proxy<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, session: &'life1 mut Session, e: &'life2 Error, ctx: &'life3 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = FailToProxy> + Send + 'async_trait>>
Handles proxy failures and generates appropriate error responses. Error handling for:
- Upstream connection failures (502, 504)
- Client timeouts (408)
- Client disconnections (499) Generates error pages using configured template
Source§fn logging<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
_e: Option<&'life2 Error>,
ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
fn logging<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, session: &'life1 mut Session, _e: Option<&'life2 Error>, ctx: &'life3 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
Performs request logging and cleanup after request completion. Handles:
- Request counting cleanup
- Compression statistics
- Prometheus metrics
- OpenTelemetry span completion
- Access logging
Source§fn init_downstream_modules(&self, modules: &mut HttpModules)
fn init_downstream_modules(&self, modules: &mut HttpModules)
Source§fn fail_to_connect(
&self,
_session: &mut Session,
peer: &HttpPeer,
ctx: &mut Self::CTX,
e: Box<Error>,
) -> Box<Error>
fn fail_to_connect( &self, _session: &mut Session, peer: &HttpPeer, ctx: &mut Self::CTX, e: Box<Error>, ) -> Box<Error>
Source§fn response_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
upstream_response: &'life2 mut ResponseHeader,
ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
fn response_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, session: &'life1 mut Session, upstream_response: &'life2 mut ResponseHeader, ctx: &'life3 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>
Source§fn upstream_response_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
upstream_response: &'life2 mut ResponseHeader,
ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
fn upstream_response_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
session: &'life1 mut Session,
upstream_response: &'life2 mut ResponseHeader,
ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<()>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Source§fn allow_spawning_subrequest(
&self,
_session: &Session,
_ctx: &Self::CTX,
) -> bool
fn allow_spawning_subrequest( &self, _session: &Session, _ctx: &Self::CTX, ) -> bool
Source§fn request_cache_filter(
&self,
_session: &mut Session,
_ctx: &mut Self::CTX,
) -> Result<(), Box<Error>>
fn request_cache_filter( &self, _session: &mut Session, _ctx: &mut Self::CTX, ) -> Result<(), Box<Error>>
Source§fn cache_miss(&self, session: &mut Session, _ctx: &mut Self::CTX)
fn cache_miss(&self, session: &mut Session, _ctx: &mut Self::CTX)
Source§fn cache_hit_filter<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>(
&'life0 self,
_session: &'life1 mut Session,
_meta: &'life2 CacheMeta,
_hit_handler: &'life3 mut Box<dyn HandleHit + Send + Sync>,
_is_fresh: bool,
_ctx: &'life4 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<Option<ForcedFreshness>, Box<Error>>> + Send + 'async_trait>>
fn cache_hit_filter<'life0, 'life1, 'life2, 'life3, 'life4, 'async_trait>( &'life0 self, _session: &'life1 mut Session, _meta: &'life2 CacheMeta, _hit_handler: &'life3 mut Box<dyn HandleHit + Send + Sync>, _is_fresh: bool, _ctx: &'life4 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<Option<ForcedFreshness>, Box<Error>>> + Send + 'async_trait>>
Source§fn cache_vary_filter(
&self,
_meta: &CacheMeta,
_ctx: &mut Self::CTX,
_req: &RequestHeader,
) -> Option<[u8; 16]>
fn cache_vary_filter( &self, _meta: &CacheMeta, _ctx: &mut Self::CTX, _req: &RequestHeader, ) -> Option<[u8; 16]>
Source§fn cache_not_modified_filter(
&self,
session: &Session,
resp: &ResponseHeader,
_ctx: &mut Self::CTX,
) -> Result<bool, Box<Error>>
fn cache_not_modified_filter( &self, session: &Session, resp: &ResponseHeader, _ctx: &mut Self::CTX, ) -> Result<bool, Box<Error>>
Source§fn range_header_filter(
&self,
session: &mut Session,
resp: &mut ResponseHeader,
_ctx: &mut Self::CTX,
) -> RangeType
fn range_header_filter( &self, session: &mut Session, resp: &mut ResponseHeader, _ctx: &mut Self::CTX, ) -> RangeType
range_filter::RangeType. Read moreSource§fn upstream_response_trailer_filter(
&self,
_session: &mut Session,
_upstream_trailers: &mut HeaderMap,
_ctx: &mut Self::CTX,
) -> Result<(), Box<Error>>
fn upstream_response_trailer_filter( &self, _session: &mut Session, _upstream_trailers: &mut HeaderMap, _ctx: &mut Self::CTX, ) -> Result<(), Box<Error>>
Source§fn response_trailer_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
_session: &'life1 mut Session,
_upstream_trailers: &'life2 mut HeaderMap,
_ctx: &'life3 mut Self::CTX,
) -> Pin<Box<dyn Future<Output = Result<Option<Bytes>, Box<Error>>> + Send + 'async_trait>>
fn response_trailer_filter<'life0, 'life1, 'life2, 'life3, 'async_trait>( &'life0 self, _session: &'life1 mut Session, _upstream_trailers: &'life2 mut HeaderMap, _ctx: &'life3 mut Self::CTX, ) -> Pin<Box<dyn Future<Output = Result<Option<Bytes>, Box<Error>>> + Send + 'async_trait>>
Source§fn suppress_error_log(
&self,
_session: &Session,
_ctx: &Self::CTX,
_error: &Error,
) -> bool
fn suppress_error_log( &self, _session: &Session, _ctx: &Self::CTX, _error: &Error, ) -> bool
Source§fn error_while_proxy(
&self,
peer: &HttpPeer,
session: &mut Session,
e: Box<Error>,
_ctx: &mut Self::CTX,
client_reused: bool,
) -> Box<Error>
fn error_while_proxy( &self, peer: &HttpPeer, session: &mut Session, e: Box<Error>, _ctx: &mut Self::CTX, client_reused: bool, ) -> Box<Error>
Source§fn should_serve_stale(
&self,
_session: &mut Session,
_ctx: &mut Self::CTX,
error: Option<&Error>,
) -> bool
fn should_serve_stale( &self, _session: &mut Session, _ctx: &mut Self::CTX, error: Option<&Error>, ) -> bool
Source§fn request_summary(&self, session: &Session, _ctx: &Self::CTX) -> String
fn request_summary(&self, session: &Session, _ctx: &Self::CTX) -> String
Source§fn is_purge(&self, _session: &Session, _ctx: &Self::CTX) -> bool
fn is_purge(&self, _session: &Session, _ctx: &Self::CTX) -> bool
Source§fn purge_response_filter(
&self,
_session: &Session,
_ctx: &mut Self::CTX,
_purge_status: PurgeStatus,
_purge_response: &mut Cow<'static, ResponseHeader>,
) -> Result<(), Box<Error>>
fn purge_response_filter( &self, _session: &Session, _ctx: &mut Self::CTX, _purge_status: PurgeStatus, _purge_response: &mut Cow<'static, ResponseHeader>, ) -> Result<(), Box<Error>>
Auto Trait Implementations§
impl !Freeze for Server
impl !RefUnwindSafe for Server
impl Send for Server
impl Sync for Server
impl Unpin for Server
impl UnsafeUnpin for Server
impl !UnwindSafe for Server
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request