pub struct ProxyService { /* private fields */ }Expand description
Proxy service that handles incoming HTTP connections.
Implementations§
Source§impl ProxyService
impl ProxyService
Sourcepub fn new(
config: Arc<RwLock<ProxyConfig>>,
health_checker: Arc<HealthChecker>,
rate_limiter: Arc<RateLimiter>,
) -> Self
pub fn new( config: Arc<RwLock<ProxyConfig>>, health_checker: Arc<HealthChecker>, rate_limiter: Arc<RateLimiter>, ) -> Self
Create a new proxy service.
Sourcepub async fn load_config(&self)
pub async fn load_config(&self)
Load configuration into the backend manager.
Sourcepub async fn serve_http(
self: Arc<Self>,
addr: SocketAddr,
cancel_token: CancellationToken,
) -> Result<()>
pub async fn serve_http( self: Arc<Self>, addr: SocketAddr, cancel_token: CancellationToken, ) -> Result<()>
Start the HTTP proxy server.
Sourcepub async fn serve_https(
self: Arc<Self>,
addr: SocketAddr,
tls_config: Arc<ServerConfig>,
cancel_token: CancellationToken,
) -> Result<()>
pub async fn serve_https( self: Arc<Self>, addr: SocketAddr, tls_config: Arc<ServerConfig>, cancel_token: CancellationToken, ) -> Result<()>
Serve HTTPS, negotiating the protocol with ALPN.
ALPN is the whole point: without it a TLS listener negotiates nothing and
every client falls back to HTTP/1.1, which leaves HTTP/2 reachable only
as cleartext h2c and WebSocket only as ws://.
Because ALPN decides the protocol rather than guessing it, the h2 path can use the HTTP/2 builder directly instead of sniffing – so, unlike the cleartext port, an invalid preface here is answered with a proper GOAWAY.
Sourcepub async fn serve_h2c(
self: Arc<Self>,
addr: SocketAddr,
cancel_token: CancellationToken,
) -> Result<()>
pub async fn serve_h2c( self: Arc<Self>, addr: SocketAddr, cancel_token: CancellationToken, ) -> Result<()>
Serve HTTP/2 only, on a dedicated port.
The main listener negotiates by sniffing the opening bytes, which is why a corrupted HTTP/2 preface there gets an HTTP/1 400 instead of GOAWAY(PROTOCOL_ERROR): it cannot be told apart from a malformed HTTP/1 request (h2spec 3.5). A listener that only ever speaks HTTP/2 has no such ambiguity and answers the way the RFC asks.
This is additive. The main port still serves HTTP/1.1 and h2c together; nothing is given up by enabling it.
Auto Trait Implementations§
impl !RefUnwindSafe for ProxyService
impl !UnwindSafe for ProxyService
impl Freeze for ProxyService
impl Send for ProxyService
impl Sync for ProxyService
impl Unpin for ProxyService
impl UnsafeUnpin for ProxyService
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> 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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more