[][src]Module surf::middleware

Middleware types

Examples

use surf::middleware::{Next, Middleware};
use surf::{Client, Request, Response, Result};
use std::time;
use std::sync::Arc;

/// Log each request's duration
#[derive(Debug)]
pub struct Logger;

#[surf::utils::async_trait]
impl Middleware for Logger {
    async fn handle(
        &self,
        req: Request,
        client: Client,
        next: Next<'_>,
    ) -> Result<Response> {
        println!("sending request to {}", req.url());
        let now = time::Instant::now();
        let res = next.run(req, client).await?;
        println!("request completed ({:?})", now.elapsed());
        Ok(res)
    }
}

Middleware can also be instantiated using a free function thanks to some convenient trait implementations.

use futures_util::future::BoxFuture;
use surf::middleware::{Next, Middleware};
use surf::{Client, Request, Response, Result};
use std::time;
use std::sync::Arc;

fn logger<'a>(req: Request, client: Client, next: Next<'a>) -> BoxFuture<'a, Result<Response>> {
    Box::pin(async move {
        println!("sending request to {}", req.url());
        let now = time::Instant::now();
        let res = next.run(req, client).await?;
        println!("request completed ({:?})", now.elapsed());
        Ok(res)
    })
}

Structs

Logger

Log each request's duration.

Next

The remainder of a middleware chain, including the endpoint.

Redirect

A middleware which attempts to follow HTTP redirects.

Traits

Middleware

Middleware that wraps around remaining middleware chain.