http_proxy_client_async/
lib.rs

1#![warn(missing_debug_implementations, rust_2018_idioms)]
2
3pub mod flow;
4pub mod http;
5pub mod prepend_io_stream;
6
7use futures_io::{AsyncRead, AsyncWrite};
8
9pub use crate::http::*;
10pub use flow::{HandshakeOutcome, ResponseParts};
11pub use prepend_io_stream::PrependIoStream as Stream;
12pub use std::io::Result;
13
14pub async fn handshake_and_wrap<ARW>(
15    mut stream: ARW,
16    host: &str,
17    port: u16,
18    request_headers: &HeaderMap,
19    read_buf: &mut [u8],
20) -> Result<Outcome<Stream<ARW>>>
21where
22    ARW: AsyncRead + AsyncWrite + Unpin,
23{
24    let HandshakeOutcome {
25        response_parts,
26        data_after_handshake,
27    } = flow::handshake(&mut stream, host, port, request_headers, read_buf).await?;
28
29    Ok(Outcome {
30        response_parts,
31        stream: Stream::from_vec(stream, Some(data_after_handshake.into())),
32    })
33}
34
35#[derive(Debug)]
36pub struct Outcome<T> {
37    pub response_parts: ResponseParts,
38    pub stream: T,
39}
40
41impl<T> AsRef<T> for Outcome<T> {
42    fn as_ref(&self) -> &T {
43        &self.stream
44    }
45}