hyper icon indicating copy to clipboard operation
hyper copied to clipboard

Feature: Implement the Body trait for more native data types to improve ergonomics

Open akneni opened this issue 1 year ago • 7 comments

Currently, the 'String' is the only native data type that implements hyper::body::Body. If we're passing other data types as a body, we need to add the http_body_util crate and add a little bit of boiler plate when building our request.

use http_body_util::Full;

let some_bytes = vec![0_u8, 1, 2];
let mut req = Request::builder()
    .method("POST")
    .body(Full::<Bytes>::from(some_bytes))
    .unwrap();

Note: While the request builder itself may not require the body to implement the Body trait, both the sender and connection returned by http1::handshake require the request's body to implement it.

With the body trait implemented for Vec<u8> (just one example that probably should implement body) we could leave out the http_body_util crate. Building a request would also become more intuitive and ergonomic.

    let some_bytes = vec![0_u8, 1, 2];
    let mut req = Request::builder()
        .method("POST")
        .body(some_bytes)
        .unwrap();

akneni avatar Aug 27 '24 05:08 akneni

Hi! I would like to try my hand on this issue.

zaira-bibi avatar Aug 27 '24 11:08 zaira-bibi

I've been personally torn on this. I appreciate the explicitness of having Full, and I kind of regret that we stabilized with an implementation on String.

So, part of me resists adding it to any other standard buffer types.

But I also understand that one exists, so should we just swallow the pill and provide the rest? Maybe. I don't love it. But perhaps I'm just wrong.

seanmonstar avatar Aug 27 '24 13:08 seanmonstar

I've launched a poll here #3747 . I say we give it a little bit and see what others think.

akneni avatar Aug 27 '24 14:08 akneni

It seems like 80% of people (granted, only out of 5 responses) want the body trait implemented on additional types. I can get started working on this if that's good with you @seanmonstar

akneni avatar Sep 05 '24 13:09 akneni

I've been personally torn on this. I appreciate the explicitness of having Full, and I kind of regret that we stabilized with an implementation on String.

So, part of me resists adding it to any other standard buffer types.

But I also understand that one exists, so should we just swallow the pill and provide the rest? Maybe. I don't love it. But perhaps I'm just wrong.

In hindsight, it makes sense to at least have an implementation for bytes if we have one for String.

dswij avatar Sep 06 '24 12:09 dswij

Are there any plans to have an implementation for more native data types? If yes, then I would love to work on this.

zaira-bibi avatar Oct 10 '24 07:10 zaira-bibi

I've already implemented this trait for Vec<u8>, but no other native types. However, it has yet to be merged, so I think the maintainers are still hesitant to extend this past the string type.

akneni avatar Oct 10 '24 13:10 akneni