Struct MethodRouter
struct MethodRouter<S = (), E = std::convert::Infallible> { ... }
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<(), std::convert::Infallible>
fn into_make_service(self: 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: 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, std::convert::Infallible>
fn on<H, T>(self: Self, filter: MethodFilter, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain 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: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain 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: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain an additional handler that will only accept
DELETErequests.See
MethodRouter::getfor an example.fn get<H, T>(self: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain 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: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain an additional handler that will only accept
HEADrequests.See
MethodRouter::getfor an example.fn options<H, T>(self: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain an additional handler that will only accept
OPTIONSrequests.See
MethodRouter::getfor an example.fn patch<H, T>(self: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain an additional handler that will only accept
PATCHrequests.See
MethodRouter::getfor an example.fn post<H, T>(self: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain an additional handler that will only accept
POSTrequests.See
MethodRouter::getfor an example.fn put<H, T>(self: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain an additional handler that will only accept
PUTrequests.See
MethodRouter::getfor an example.fn trace<H, T>(self: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticChain an additional handler that will only accept
TRACErequests.See
MethodRouter::getfor an example.fn fallback<H, T>(self: Self, handler: H) -> Self where H: Handler<T, S>, T: 'static, S: Send + Sync + 'staticAdd a fallback
Handlerto the router.
impl<S, E> MethodRouter<S, E>
fn new() -> SelfCreate a default
MethodRouterthat will respond with405 Method Not Allowedto all requests.fn with_state<S2>(self: Self, state: S) -> MethodRouter<S2, E>Provide the state for the router.
fn on_service<T>(self: Self, filter: MethodFilter, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain 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: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain 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: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain an additional service that will only accept
DELETErequests.See
MethodRouter::get_servicefor an example.fn get_service<T>(self: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain 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: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain an additional service that will only accept
HEADrequests.See
MethodRouter::get_servicefor an example.fn options_service<T>(self: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain an additional service that will only accept
OPTIONSrequests.See
MethodRouter::get_servicefor an example.fn patch_service<T>(self: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain an additional service that will only accept
PATCHrequests.See
MethodRouter::get_servicefor an example.fn post_service<T>(self: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain an additional service that will only accept
POSTrequests.See
MethodRouter::get_servicefor an example.fn put_service<T>(self: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain an additional service that will only accept
PUTrequests.See
MethodRouter::get_servicefor an example.fn trace_service<T>(self: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticChain an additional service that will only accept
TRACErequests.See
MethodRouter::get_servicefor an example.fn fallback_service<T>(self: Self, svc: T) -> Self where T: Service<Request, Error = E> + Clone + Send + Sync + 'static, <T as >::Response: IntoResponse + 'static, <T as >::Future: Send + 'staticAdd 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: Self, layer: L) -> MethodRouter<S, NewError> where L: Layer<Route<E>> + Clone + Send + Sync + 'static, <L as >::Service: Service<Request> + Clone + Send + Sync + 'static, <<L as >::Service as Service<Request>>::Response: IntoResponse + 'static, <<L as >::Service as Service<Request>>::Error: Into<NewError> + 'static, <<L as >::Service as Service<Request>>::Future: Send + 'static, E: 'static, S: 'static, NewError: 'staticApply 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: Self, layer: L) -> MethodRouter<S, E> where L: Layer<Route<E>> + Clone + Send + Sync + 'static, <L as >::Service: Service<Request, Error = E> + Clone + Send + Sync + 'static, <<L as >::Service as Service<Request>>::Response: IntoResponse + 'static, <<L as >::Service as Service<Request>>::Future: Send + 'static, E: 'static, S: 'staticApply 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. So you have to first add your routes (and / or fallback) 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: 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: 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: 'staticApply a
HandleErrorLayer.This is a convenience method for doing
self.layer(HandleErrorLayer::new(f)).
impl<B, E> Service for MethodRouter<(), E>
fn poll_ready(self: &mut Self, _cx: &mut Context<'_>) -> Poll<Result<(), <Self as >::Error>>fn call(self: &mut Self, req: Request<B>) -> <Self as >::Future
impl<H, T> HandlerWithoutStateExt for MethodRouter<S, E>
fn into_service(self: Self) -> HandlerService<H, T, ()>fn into_make_service(self: Self) -> IntoMakeService<HandlerService<H, T, ()>>fn into_make_service_with_connect_info<C>(self: Self) -> IntoMakeServiceWithConnectInfo<HandlerService<H, T, ()>, C>
impl<L> Service for MethodRouter<()>
fn poll_ready(self: &mut Self, _cx: &mut Context<'_>) -> Poll<Result<(), <Self as >::Error>>fn call(self: &mut Self, _req: serve::IncomingStream<'_, L>) -> <Self as >::Future
impl<M, S, Target, Request> MakeService for MethodRouter<S, E>
fn poll_ready(self: &mut Self, cx: &mut Context<'_>) -> Poll<Result<(), <M as MakeService<Target, Request>>::MakeError>>fn make_service(self: &mut Self, target: Target) -> <M as MakeService<Target, Request>>::Future
impl<S = (), E = Infallible> RefUnwindSafe for MethodRouter<S, E>
impl<S = (), E = Infallible> UnwindSafe for MethodRouter<S, E>
impl<S> Handler for MethodRouter<S>
fn call(self: Self, req: Request, state: S) -> <Self as >::Future
impl<S, E> Clone for MethodRouter<S, E>
fn clone(self: &Self) -> Self
impl<S, E> Debug for MethodRouter<S, E>
fn fmt(self: &Self, f: &mut fmt::Formatter<'_>) -> fmt::Result
impl<S, E> Default for MethodRouter<S, E>
fn default() -> Self
impl<S, E> Freeze for MethodRouter<S, E>
impl<S, E> Send for MethodRouter<S, E>
impl<S, E> Sync for MethodRouter<S, E>
impl<S, E> Unpin for MethodRouter<S, E>
impl<S, R> ServiceExt for MethodRouter<S, E>
fn into_make_service(self: Self) -> IntoMakeService<S>fn into_make_service_with_connect_info<C>(self: Self) -> IntoMakeServiceWithConnectInfo<S, C>
impl<T> Any for MethodRouter<S, E>
fn type_id(self: &Self) -> TypeId
impl<T> Borrow for MethodRouter<S, E>
fn borrow(self: &Self) -> &T
impl<T> BorrowMut for MethodRouter<S, E>
fn borrow_mut(self: &mut Self) -> &mut T
impl<T> CloneToUninit for MethodRouter<S, E>
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)
impl<T> From for MethodRouter<S, E>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> FromRef for MethodRouter<S, E>
fn from_ref(input: &T) -> T
impl<T> Instrument for MethodRouter<S, E>
impl<T> Same for MethodRouter<S, E>
impl<T> ToOwned for MethodRouter<S, E>
fn to_owned(self: &Self) -> Tfn clone_into(self: &Self, target: &mut T)
impl<T> WithSubscriber for MethodRouter<S, E>
impl<T, Request> ServiceExt for MethodRouter<S, E>
impl<T, U> Into for MethodRouter<S, E>
fn into(self: Self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom for MethodRouter<S, E>
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto for MethodRouter<S, E>
fn try_into(self: Self) -> Result<U, <U as TryFrom<T>>::Error>
impl<V, T> VZip for MethodRouter<S, E>
fn vzip(self: Self) -> V