pub struct WebContext;
Expand description
middleware for bridging xitca-http
and xitca-web
types. useful for utilizing xitca-web
when manually constructing http services.
§Examples
use xitca_http::util::{
middleware::context::ContextBuilder,
service::{handler::handler_service, route::get, Router}
};
use xitca_service::{Service, ServiceExt};
use xitca_web::{error::Error, handler::state::StateRef};
// handler function depending on xitca-web types.
async fn handler(StateRef(_): StateRef<'_, ()>) -> Error {
xitca_web::error::ErrorStatus::bad_request().into()
}
// low level router from xitca-http
let router = Router::new()
// utilize handler function with xitca-web types
.insert("/", get(handler_service(handler)))
// utilize xitca-web's middleware to xitca-http's router
.enclosed(xitca_web::middleware::CatchUnwind)
// converting xitca-http types to xitca-web types with web context middleware.
.enclosed(xitca_web::middleware::WebContext)
// xitca-http's context builder middleware is also needed for helping type conversion.
// this middleware is tasked with constructing typed application state and pass down it
// to xitca_web's WebContext middleware. In case of absence of application state a tuple
// is constructed to act as the default type.
.enclosed(ContextBuilder::new(|| async { Ok::<_, std::convert::Infallible>(()) }));
// call the router service and observe the output. in real world the service caller should be a http
// library and server.
let res = router
.call(())
.await
.unwrap()
.call(Default::default())
.await
.unwrap();
assert_eq!(res.status(), xitca_http::http::StatusCode::BAD_REQUEST);
Trait Implementations§
Auto Trait Implementations§
impl Freeze for WebContext
impl RefUnwindSafe for WebContext
impl Send for WebContext
impl Sync for WebContext
impl Unpin for WebContext
impl UnwindSafe for WebContext
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
Mutably borrows from an owned value. Read more
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<S, Arg> ServiceExt<Arg> for Swhere
S: Service<Arg>,
impl<S, Arg> ServiceExt<Arg> for Swhere
S: Service<Arg>,
Source§fn enclosed<T>(self, build: T) -> Pipeline<Self, T, BuildEnclosed>
fn enclosed<T>(self, build: T) -> Pipeline<Self, T, BuildEnclosed>
Enclose Self with given
T as Service<<Self as Service<_>>::Response>>
. In other word T
would take Self’s Service::Response
type as it’s generic argument of Service<_>
impl.Source§fn enclosed_fn<T, Req, O>(
self,
func: T,
) -> Pipeline<Self, AsyncFn<T>, BuildEnclosed>
fn enclosed_fn<T, Req, O>( self, func: T, ) -> Pipeline<Self, AsyncFn<T>, BuildEnclosed>
Function version of Self::enclosed method.
Source§fn map<F, Res, ResMap>(self, mapper: F) -> Pipeline<Self, Map<F>, BuildEnclosed>
fn map<F, Res, ResMap>(self, mapper: F) -> Pipeline<Self, Map<F>, BuildEnclosed>
Mutate
<<Self::Response as Service<Req>>::Future as Future>::Output
type with given
closure.