[][src]Module surf::middleware

Middleware types

Examples

use futures::future::BoxFuture;
use surf::middleware::{Next, Middleware, Request, Response, HttpClient};
use std::time;

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

impl<C: HttpClient> Middleware<C> for Logger {
    fn handle<'a>(
        &'a self,
        req: Request,
        client: C,
        next: Next<'a, C>,
    ) -> BoxFuture<'a, Result<Response, surf::Exception>> {
        Box::pin(async move {
            println!("sending request to {}", req.uri());
            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::future::BoxFuture;
use surf::middleware::{Next, Middleware, Request, Response, HttpClient};
use std::time;

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

Modules

logger

Logging middleware.

Structs

Body

The raw body of an http request or response.

Next

The remainder of a middleware chain, including the endpoint.

Traits

HttpClient

An abstract HTTP client.

Middleware

Middleware that wraps around remaining middleware chain.

Type Definitions

Request

An HTTP Request type with a streaming body.

Response

An HTTP Response type with a streaming body.