use std::cell::Cell;
use std::net::SocketAddr;
use std::rc::Rc;
use std::sync::Arc;
use std::time::Duration;
use monoio::net::TcpStream;
use harrow_core::dispatch::SharedState;
#[derive(Debug, Clone, Copy, PartialEq)]
pub(crate) enum ProtocolVersion {
Http11,
Http2PriorKnowledge,
}
pub(crate) struct ConnConfig {
pub shared: Arc<SharedState>,
pub remote_addr: Option<SocketAddr>,
pub header_read_timeout: Option<Duration>,
pub body_read_timeout: Option<Duration>,
pub connection_timeout: Option<Duration>,
pub max_h2_streams: u32,
pub active_count: Rc<Cell<usize>>,
pub protocol: ProtocolVersion,
}
pub(crate) async fn handle_connection(stream: TcpStream, conn: ConnConfig) {
let protocol = conn.protocol;
let remote_addr = conn.remote_addr;
match protocol {
ProtocolVersion::Http11 => {
tracing::debug!(?remote_addr, "using HTTP/1.1");
crate::h1::handle_connection(stream, conn).await;
}
ProtocolVersion::Http2PriorKnowledge => {
tracing::debug!(?remote_addr, "using HTTP/2 (prior knowledge)");
crate::h2::handle_connection(stream, conn).await;
}
}
}