pub trait IntoResponseParts {
    type Error: IntoResponse;

    // Required method
    fn into_response_parts(
        self,
        res: ResponseParts
    ) -> Result<ResponseParts, Self::Error>;
}
Expand description

Trait for adding headers and extensions to a response.

Example

use axum::{
    response::{ResponseParts, IntoResponse, IntoResponseParts, Response},
    http::{StatusCode, header::{HeaderName, HeaderValue}},
};

// Hypothetical helper type for setting a single header
struct SetHeader<'a>(&'a str, &'a str);

impl<'a> IntoResponseParts for SetHeader<'a> {
    type Error = (StatusCode, String);

    fn into_response_parts(self, mut res: ResponseParts) -> Result<ResponseParts, Self::Error> {
        match (self.0.parse::<HeaderName>(), self.1.parse::<HeaderValue>()) {
            (Ok(name), Ok(value)) => {
                res.headers_mut().insert(name, value);
            },
            (Err(_), _) => {
                return Err((
                    StatusCode::INTERNAL_SERVER_ERROR,
                    format!("Invalid header name {}", self.0),
                ));
            },
            (_, Err(_)) => {
                return Err((
                    StatusCode::INTERNAL_SERVER_ERROR,
                    format!("Invalid header value {}", self.1),
                ));
            },
        }

        Ok(res)
    }
}

// Its also recommended to implement `IntoResponse` so `SetHeader` can be used on its own as
// the response
impl<'a> IntoResponse for SetHeader<'a> {
    fn into_response(self) -> Response {
        // This gives an empty response with the header
        (self, ()).into_response()
    }
}

// We can now return `SetHeader` in responses
//
// Note that returning `impl IntoResponse` might be easier if the response has many parts to
// it. The return type is written out here for clarity.
async fn handler() -> (SetHeader<'static>, SetHeader<'static>, &'static str) {
    (
        SetHeader("server", "axum"),
        SetHeader("x-foo", "custom"),
        "body",
    )
}

// Or on its own as the whole response
async fn other_handler() -> SetHeader<'static> {
    SetHeader("x-foo", "custom")
}

Required Associated Types§

source

type Error: IntoResponse

The type returned in the event of an error.

This can be used to fallibly convert types into headers or extensions.

Required Methods§

source

fn into_response_parts( self, res: ResponseParts ) -> Result<ResponseParts, Self::Error>

Set parts of the response

Implementations on Foreign Types§

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts, T10: IntoResponseParts, T11: IntoResponseParts, T12: IntoResponseParts, T13: IntoResponseParts, T14: IntoResponseParts, T15: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts, T10: IntoResponseParts, T11: IntoResponseParts, T12: IntoResponseParts, T13: IntoResponseParts, T14: IntoResponseParts, T15: IntoResponseParts, T16: IntoResponseParts,

source§

impl<T> IntoResponseParts for Option<T>where T: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts, T10: IntoResponseParts, T11: IntoResponseParts,

source§

impl IntoResponseParts for HeaderMap<HeaderValue>

source§

impl<K, V, const N: usize> IntoResponseParts for [(K, V); N]where K: TryInto<HeaderName>, <K as TryInto<HeaderName>>::Error: Display, V: TryInto<HeaderValue>, <V as TryInto<HeaderValue>>::Error: Display,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts, T10: IntoResponseParts, T11: IntoResponseParts, T12: IntoResponseParts,

source§

impl<T1> IntoResponseParts for (T1,)where T1: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6> IntoResponseParts for (T1, T2, T3, T4, T5, T6)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts, T10: IntoResponseParts, T11: IntoResponseParts, T12: IntoResponseParts, T13: IntoResponseParts,

source§

impl<T1, T2> IntoResponseParts for (T1, T2)where T1: IntoResponseParts, T2: IntoResponseParts,

source§

impl IntoResponseParts for Extensions

source§

impl<T1, T2, T3, T4> IntoResponseParts for (T1, T2, T3, T4)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts, T10: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts,

source§

impl<T1, T2, T3> IntoResponseParts for (T1, T2, T3)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> IntoResponseParts for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts, T6: IntoResponseParts, T7: IntoResponseParts, T8: IntoResponseParts, T9: IntoResponseParts, T10: IntoResponseParts, T11: IntoResponseParts, T12: IntoResponseParts, T13: IntoResponseParts, T14: IntoResponseParts,

source§

impl<T1, T2, T3, T4, T5> IntoResponseParts for (T1, T2, T3, T4, T5)where T1: IntoResponseParts, T2: IntoResponseParts, T3: IntoResponseParts, T4: IntoResponseParts, T5: IntoResponseParts,

Implementors§

source§

impl<I, K, V> IntoResponseParts for AppendHeaders<I>where I: IntoIterator<Item = (K, V)>, K: TryInto<HeaderName>, <K as TryInto<HeaderName>>::Error: Display, V: TryInto<HeaderValue>, <V as TryInto<HeaderValue>>::Error: Display,

source§

impl<T> IntoResponseParts for Extension<T>where T: Send + Sync + 'static,

source§

impl<T> IntoResponseParts for TypedHeader<T>where T: Header,

Available on crate feature headers only.