You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Today I discovered an unfortunate interaction between axum and http-body.
In axum you're able to write this:
use axum::{
body::{box_body,Body,BoxBody},
handler::get,
http::Response,Router,};let app = Router::new().route("/",get(|| async{// Build a response with a header.let response:Response<Body> = Response::builder().header("x-foo","foo").body(Body::empty()).unwrap();// Since `Response<B>` implements `Body`, we can use `box_body` to// convert it into a `BoxBody`.let body:BoxBody = box_body(response);// And because `BoxBody` implements `IntoResponse` we can return it// from handlers.//// However `impl IntoResponse for BoxBody` simply does// `Response::new(self)` thus removing headers, status, etc.
body
}),);
So because Response<B> implements Body it can be used with box_body but that ends up removing everything from the response except the body. I think being able to return bodies directly from axum handlers is a nice feature its just unfortunate that this particular thing compiles.
One could say "well just don't do this" but would be nice if it didn't compile at all, which could be done by removing impl Body for {Response, Request}<B>. Thats of course a breaking change 😞
The text was updated successfully, but these errors were encountered:
It was added for convenience. Some libraries in other languages allow you to treat a request or response directly as a stream, and it seemed useful.
That said, being explicit isn't necessarily a bad thing, especially if it makes something clearer or prevents frequent accidents. I haven't heard of a similar accident since we added that impl until now, so I don't know if it's frequent. But I could be convinced.
We couldn't make that breaking change to hyper, though. Maybe once, for 1.0. Is it worth it?
Today I discovered an unfortunate interaction between axum and http-body.
In axum you're able to write this:
So because
Response<B>
implementsBody
it can be used withbox_body
but that ends up removing everything from the response except the body. I think being able to return bodies directly from axum handlers is a nice feature its just unfortunate that this particular thing compiles.BoxBody
'sIntoResponse
impl is here.One could say "well just don't do this" but would be nice if it didn't compile at all, which could be done by removing
impl Body for {Response, Request}<B>
. Thats of course a breaking change 😞The text was updated successfully, but these errors were encountered: