Struct MethodRouter
#[must_use]
pub struct MethodRouter<S = (), E = Infallible> { /* private fields */ }
A Service that accepts requests based on a MethodFilter and
allows chaining additional handlers and services.
When does MethodRouter implement Service?
Whether or not MethodRouter implements Service depends on the state type it requires.
use Service;
use ;
// this `MethodRouter` doesn't require any state, i.e. the state is `()`,
let method_router = get;
// and thus it implements `Service`
assert_service;
// this requires a `String` and doesn't implement `Service`
let method_router = get;
// until you provide the `String` with `.with_state(...)`
let method_router_with_state = method_router.with_state;
// and then it implements `Service`
assert_service;
// helper to check that a value implements `Service`
Implementations
impl MethodRouter<(), Infallible>
fn into_make_service(self) -> IntoMakeService<Self>Convert the router into a
MakeService.This allows you to serve a single
MethodRouterif you don't need any routing based on the path:use ; use SocketAddr; async let router = get.post; # async ;fn into_make_service_with_connect_info<C>(self) -> IntoMakeServiceWithConnectInfo<Self, C>Convert the router into a
MakeServicewhich stores information about the incoming connection.See
Router::into_make_service_with_connect_infofor more details.use ; use SocketAddr; async let router = get.post; # async ;
impl<S> MethodRouter<S, Infallible>
where
S: Clone,
fn on<H, T>(self, filter: MethodFilter, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will accept requests matching the given
MethodFilter.Example
use ; async async // Requests to `GET /` will go to `handler` and `DELETE /` will go to // `other_handler` let app = new.route; # let _: Router = app;fn connect<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
CONNECTrequests.See
MethodFilter::CONNECTfor when you'd want to use this, andMethodRouter::getfor an example.fn delete<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
DELETErequests.See
MethodRouter::getfor an example.fn get<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
GETrequests.Example
use ; async async // Requests to `POST /` will go to `handler` and `GET /` will go to // `other_handler`. let app = new.route; # let _: Router = app;Note that
getroutes will also be called forHEADrequests but will have the response body removed. Make sure to add explicitHEADroutes afterwards.fn head<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
HEADrequests.See
MethodRouter::getfor an example.fn options<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
OPTIONSrequests.See
MethodRouter::getfor an example.fn patch<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
PATCHrequests.See
MethodRouter::getfor an example.fn post<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
POSTrequests.See
MethodRouter::getfor an example.fn put<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
PUTrequests.See
MethodRouter::getfor an example.fn trace<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Chain an additional handler that will only accept
TRACErequests.See
MethodRouter::getfor an example.fn fallback<H, T>(self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'static,Add a fallback
Handlerto the router.
impl<S, E> MethodRouter<S, E>
where
S: Clone,
fn new() -> SelfCreate a default
MethodRouterthat will respond with405 Method Not Allowedto all requests.fn with_state<S2>(self, state: S) -> MethodRouter<S2, E>Provide the state for the router.
fn on_service<T>(self, filter: MethodFilter, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will accept requests matching the given
MethodFilter.Example
use ; use Response; use Infallible; let service = service_fn; // Requests to `DELETE /` will go to `service` let app = new.route; # let _: Router = app;fn connect_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
CONNECTrequests.See
MethodFilter::CONNECTfor when you'd want to use this, andMethodRouter::get_servicefor an example.fn delete_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
DELETErequests.See
MethodRouter::get_servicefor an example.fn get_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
GETrequests.Example
use ; use Response; use Infallible; let service = service_fn; let other_service = service_fn; // Requests to `POST /` will go to `service` and `GET /` will go to // `other_service`. let app = new.route; # let _: Router = app;Note that
getroutes will also be called forHEADrequests but will have the response body removed. Make sure to add explicitHEADroutes afterwards.fn head_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
HEADrequests.See
MethodRouter::get_servicefor an example.fn options_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
OPTIONSrequests.See
MethodRouter::get_servicefor an example.fn patch_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
PATCHrequests.See
MethodRouter::get_servicefor an example.fn post_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
POSTrequests.See
MethodRouter::get_servicefor an example.fn put_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
PUTrequests.See
MethodRouter::get_servicefor an example.fn trace_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Chain an additional service that will only accept
TRACErequests.See
MethodRouter::get_servicefor an example.fn fallback_service<T>(self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, T::Response: IntoResponse + 'static, T::Future: Send + 'static,Add a fallback service to the router.
This service will be called if no routes matches the incoming request.
use ; let handler = get.fallback; let app = new.route; async # let _: Router = app;When used with
MethodRouter::mergeTwo routers that both have a fallback cannot be merged. Doing so results in a panic:
use ; let one = get.fallback; let two = post.fallback; let method_route = one.merge; async async # let app: Router = new.route;Setting the
AllowheaderBy default
MethodRouterwill set theAllowheader when returning405 Method Not Allowed. This is also done when the fallback is used unless the response generated by the fallback already sets theAllowheader.This means if you use
fallbackto accept additional methods, you should make sure you set theAllowheader correctly.fn layer<L, NewError>(self, layer: L) -> MethodRouter<S, NewError> where L: Layer<Route<E>> + Clone + Send + Sync + 'static, L::Service: Service<Request> + Clone + Send + Sync + 'static, <L::Service as Service<Request>>::Response: IntoResponse + 'static, <L::Service as Service<Request>>::Error: Into<NewError> + 'static, <L::Service as Service<Request>>::Future: Send + 'static, E: 'static, S: 'static, NewError: 'static,Apply a
tower::Layerto all routes in the router.This can be used to add additional processing to a request for a group of routes.
Note that the middleware is only applied to existing routes. So you have to first add your routes (and / or fallback) and then call
layerafterwards. Additional routes added afterlayeris called will not have the middleware added.Works similarly to
Router::layer. See that method for more details.Example
use ; use ConcurrencyLimitLayer; async let app = new.route; # let _: Router = app;fn route_layer<L>(self, layer: L) -> MethodRouter<S, E> where L: Layer<Route<E>> + Clone + Send + Sync + 'static, L::Service: Service<Request, Error = E> + Clone + Send + Sync + 'static, <L::Service as Service<Request>>::Response: IntoResponse + 'static, <L::Service as Service<Request>>::Future: Send + 'static, E: 'static, S: 'static,Apply a
tower::Layerto the router that will only run if the request matches a route.Note that the middleware is only applied to existing routes. First add your routes and then call
route_layerafterwards. Additional routes added afterroute_layeris called will not have the middleware added.This works similarly to
MethodRouter::layerexcept the middleware will only run if the request matches a route. This is useful for middleware that return early (such as authorization) which might otherwise convert a405 Method Not Allowedinto a401 Unauthorized.Example
use ; use ValidateRequestHeaderLayer; let app = new.route; // `GET /foo` with a valid token will receive `200 OK` // `GET /foo` with a invalid token will receive `401 Unauthorized` // `POST /FOO` with a invalid token will receive `405 Method Not Allowed` # let _: Router = app;fn merge(self, other: MethodRouter<S, E>) -> SelfMerge two routers into one.
This is useful for breaking routers into smaller pieces and combining them into one.
use ; let get = get; let post = post; let merged = get.merge; let app = new.route; // Our app now accepts // - GET / // - POST / # let _: Router = app;fn handle_error<F, T>(self, f: F) -> MethodRouter<S, Infallible> where F: Clone + Send + Sync + 'static, HandleError<Route<E>, F, T>: Service<Request, Error = Infallible>, <HandleError<Route<E>, F, T> as Service<Request>>::Future: Send, <HandleError<Route<E>, F, T> as Service<Request>>::Response: IntoResponse + Send, T: 'static, E: 'static, S: 'static,Apply a
HandleErrorLayer.This is a convenience method for doing
self.layer(HandleErrorLayer::new(f)).
Trait Implementations
impl<B, E> Service<Request<B>> for MethodRouter<(), E>
where
B: HttpBody<Data = Bytes> + Send + 'static,
B::Error: Into<BoxError>,
type Response = Response<Body>;type Error = E;type Future = RouteFuture<E>;fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>fn call(&mut self, req: Request<B>) -> Self::Future
impl<L> Service<IncomingStream<'_, L>> for MethodRouter<()>
where
L: Listener,
type Response = MethodRouter;type Error = never;type Future = Ready<Result<<MethodRouter as Service<IncomingStream<'_, L>>>::Response, <MethodRouter as Service<IncomingStream<'_, L>>>::Error>>;fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>>fn call(&mut self, _req: IncomingStream<'_, L>) -> Self::Future
impl<S> Handler<(), S> for MethodRouter<S>
where
S: Clone + 'static,
type Future = InfallibleRouteFuture;fn call(self, req: Request, state: S) -> Self::Future
impl<S, E> Clone for MethodRouter<S, E>
fn clone(&self) -> Self
impl<S, E> Debug for MethodRouter<S, E>
fn fmt(&self, f: &mut Formatter<'_>) -> Result
impl<S, E> Default for MethodRouter<S, E>
where
S: Clone,
fn default() -> Self
Auto Trait Implementations
impl<S = (), E = never> !RefUnwindSafe for MethodRouter<S, E>
impl<S = (), E = never> !UnwindSafe for MethodRouter<S, E>
impl<S, E> Freeze for MethodRouter<S, E>
where
MethodEndpoint<S, E>: Freeze + Freeze + Freeze + Freeze + Freeze + Freeze + Freeze + Freeze + Freeze,
Fallback<S, E>: Freeze,
impl<S, E> Send for MethodRouter<S, E>
where
MethodEndpoint<S, E>: Send + Send + Send + Send + Send + Send + Send + Send + Send,
Fallback<S, E>: Send,
impl<S, E> Sync for MethodRouter<S, E>
where
MethodEndpoint<S, E>: Sync + Sync + Sync + Sync + Sync + Sync + Sync + Sync + Sync,
Fallback<S, E>: Sync,
impl<S, E> Unpin for MethodRouter<S, E>
where
MethodEndpoint<S, E>: Unpin + Unpin + Unpin + Unpin + Unpin + Unpin + Unpin + Unpin + Unpin,
Fallback<S, E>: Unpin,
impl<S, E> UnsafeUnpin for MethodRouter<S, E>
where
MethodEndpoint<S, E>: UnsafeUnpin + UnsafeUnpin + UnsafeUnpin + UnsafeUnpin + UnsafeUnpin + UnsafeUnpin + UnsafeUnpin + UnsafeUnpin + UnsafeUnpin,
Fallback<S, E>: UnsafeUnpin,
Blanket Implementations
impl<C, Target> MakeConnection<Target> for MethodRouter<S, E>
where
C: Service<Target>,
<C as Service<Target>>::Response: AsyncRead + AsyncWrite,
type Connection = <C as Service<Target>>::Response;type Error = <C as Service<Target>>::Error;type Future = <C as Service<Target>>::Future;fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), <C as MakeConnection<Target>>::Error>>fn make_connection(&mut self, target: Target) -> <C as MakeConnection<Target>>::Future
impl<H, T> HandlerWithoutStateExt<T> for MethodRouter<S, E>
where
H: Handler<T, ()>,
fn into_service(self) -> HandlerService<H, T, ()>fn into_make_service(self) -> IntoMakeService<HandlerService<H, T, ()>>fn into_make_service_with_connect_info<C>(self) -> IntoMakeServiceWithConnectInfo<HandlerService<H, T, ()>, C>
impl<M, S, Target, Request> MakeService<Target, Request> for MethodRouter<S, E>
where
M: Service<Target, Response = S>,
S: Service<Request>,
type Response = <S as Service<Request>>::Response;type Error = <S as Service<Request>>::Error;type Service = S;type MakeError = <M as Service<Target>>::Error;type Future = <M as Service<Target>>::Future;fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), <M as MakeService<Target, Request>>::MakeError>>fn make_service(&mut self, target: Target) -> <M as MakeService<Target, Request>>::Future
impl<S, R> ServiceExt<R> for MethodRouter<S, E>
where
S: Service<R>,
fn into_make_service(self) -> IntoMakeService<S>fn into_make_service_with_connect_info<C>(self) -> IntoMakeServiceWithConnectInfo<S, C>
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for MethodRouter<S, E>
where
ST: ?Sized,
DT: ?Sized,
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for MethodRouter<S, E>
where
ST: ?Sized,
DT: ?Sized,
impl<T> Any for MethodRouter<S, E>
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for MethodRouter<S, E>
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for MethodRouter<S, E>
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> CloneToUninit for MethodRouter<S, E>
where
T: Clone,
unsafe fn clone_to_uninit(&self, dest: *mut u8)
impl<T> From<T> for MethodRouter<S, E>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> FromRef<T> for MethodRouter<S, E>
where
T: Clone,
fn from_ref(input: &T) -> T
impl<T> Instrument for MethodRouter<S, E>
impl<T> Read<Exclusive, BecauseExclusive> for MethodRouter<S, E>
where
T: ?Sized,
impl<T> Same for MethodRouter<S, E>
type Output = T;
impl<T> ToOwned for MethodRouter<S, E>
where
T: Clone,
type Owned = T;fn to_owned(&self) -> Tfn clone_into(&self, target: &mut T)
impl<T> WithSubscriber for MethodRouter<S, E>
impl<T, Request> ServiceExt<Request> for MethodRouter<S, E>
where
T: Service<Request> + ?Sized,
impl<T, U> Into<U> for MethodRouter<S, E>
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for MethodRouter<S, E>
where
U: Into<T>,
type Error = never;fn try_from(value: U) -> Result<T, never>
impl<T, U> TryInto<U> for MethodRouter<S, E>
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
impl<V, T> VZip<V> for MethodRouter<S, E>
where
V: MultiLane<T>,
fn vzip(self) -> V