httpio 0.2.4

A transport-agnostic, async HTTP/1.1 client library for any runtime.
Documentation
use futures::{AsyncBufRead, AsyncRead, AsyncWrite};
use std::{
    io::{self},
    pin::Pin,
    task::{Context, Poll},
};

pub struct HttpStream<R: AsyncBufRead + Unpin, W: AsyncWrite + Unpin> {
    pub reader: R,
    pub writer: W,
}

impl<R: AsyncBufRead + Unpin, W: AsyncWrite + Unpin> HttpStream<R, W> {
    pub fn new(reader: R, writer: W) -> Self {
        HttpStream { reader, writer }
    }
}

impl<R: AsyncBufRead + Unpin, W: AsyncWrite + Unpin> AsyncRead for HttpStream<R, W> {
    fn poll_read(
        mut self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        buf: &mut [u8],
    ) -> Poll<io::Result<usize>> {
        Pin::new(&mut self.reader).poll_read(cx, buf)
    }
}

impl<R: AsyncBufRead + Unpin, W: AsyncWrite + Unpin> AsyncWrite for HttpStream<R, W> {
    fn poll_write(
        mut self: Pin<&mut Self>,
        cx: &mut Context<'_>,
        buf: &[u8],
    ) -> Poll<io::Result<usize>> {
        Pin::new(&mut self.writer).poll_write(cx, buf)
    }

    fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
        Pin::new(&mut self.writer).poll_flush(cx)
    }

    fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {
        Pin::new(&mut self.writer).poll_close(cx)
    }
}