#[non_exhaustive]pub enum ServeTarget {
Accept,
Proxy {
to: String,
},
Text {
body: String,
},
TcpForward {
to: String,
},
Path {
handlers: BTreeMap<String, ServeTarget>,
},
Redirect {
to: String,
status: u16,
},
}Expand description
What to do with a stream once TLS is terminated (or, for ServeTarget::TcpForward, a raw TCP
stream with no TLS).
Mirrors the handler shapes of upstream ipn.ServeConfig’s HTTPHandler/TCPPortHandler
(Proxy/Text/TCPForward/Path/Redirect), plus an Accept hand-back the in-process Rust
embedder uses in place of Go’s net.Listener.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Accept
Hand the accepted, decrypted stream back to the embedder (like
tsnet’s ListenTLS returning a net.Listener).
Proxy
Reverse-proxy the decrypted stream to a local address (like a Serve
Proxy handler). The address is a real OS socket target on this host.
Text
Serve a fixed plaintext body to every connection, then close (Go HTTPHandler.Text). The
bytes are written as-is after TLS termination — the embedder supplies any HTTP framing.
TcpForward
Forward the raw (non-TLS-terminated) TCP stream to a local backend (Go
TCPPortHandler.TCPForward). Unlike ServeTarget::Proxy, no TLS is terminated — bytes are
spliced through verbatim to to (a real OS socket on this host).
Path
HTTP path-prefix mux (Go HTTPHandler path map). Terminates TLS, reads the request line, and
dispatches the longest-matching path prefix’s nested target on the already-decrypted stream.
Fields
handlers: BTreeMap<String, ServeTarget>Path-prefix → nested target. Longest-prefix wins at dispatch; an unmatched path is a
fail-closed 404. Nested Path is rejected by validate to bound
recursion (one level of nesting only).
Redirect
HTTP redirect response (Go HTTPHandler redirect). Terminates TLS, then writes a bodyless
status/Location: to response and closes.
Implementations§
Source§impl ServeTarget
impl ServeTarget
Sourcepub fn terminates_tls(&self) -> bool
pub fn terminates_tls(&self) -> bool
Whether this target requires TLS termination on the serve port. Accept/Proxy/Text/
Path/Redirect ride an HTTPS port and terminate TLS; only TcpForward is a raw passthrough
with no TLS. Explicit arms (not a single matches!) so the #[non_exhaustive] intent — every
future variant must declare its TLS posture deliberately — is clear at the call site.
Trait Implementations§
Source§impl Clone for ServeTarget
impl Clone for ServeTarget
Source§fn clone(&self) -> ServeTarget
fn clone(&self) -> ServeTarget
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ServeTarget
impl Debug for ServeTarget
Source§impl<'de> Deserialize<'de> for ServeTarget
impl<'de> Deserialize<'de> for ServeTarget
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<ServeTarget, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<ServeTarget, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
impl Eq for ServeTarget
Source§impl PartialEq for ServeTarget
impl PartialEq for ServeTarget
Source§fn eq(&self, other: &ServeTarget) -> bool
fn eq(&self, other: &ServeTarget) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for ServeTarget
impl Serialize for ServeTarget
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl StructuralPartialEq for ServeTarget
Auto Trait Implementations§
impl Freeze for ServeTarget
impl RefUnwindSafe for ServeTarget
impl Send for ServeTarget
impl Sync for ServeTarget
impl Unpin for ServeTarget
impl UnsafeUnpin for ServeTarget
impl UnwindSafe for ServeTarget
Blanket Implementations§
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<A, T> DynMessage<A> for T
impl<A, T> DynMessage<A> for T
Source§fn handle_dyn<'a>(
self: Box<T>,
state: &'a mut A,
actor_ref: ActorRef<A>,
tx: Option<Sender<Result<Box<dyn Any + Send>, SendError<Box<dyn Any + Send>, Box<dyn Any + Send>>>>>,
stop: &'a mut bool,
) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn ReplyError>>> + Send + 'a>>
fn handle_dyn<'a>( self: Box<T>, state: &'a mut A, actor_ref: ActorRef<A>, tx: Option<Sender<Result<Box<dyn Any + Send>, SendError<Box<dyn Any + Send>, Box<dyn Any + Send>>>>>, stop: &'a mut bool, ) -> Pin<Box<dyn Future<Output = Result<(), Box<dyn ReplyError>>> + Send + 'a>>
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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