#![forbid(unsafe_code)]
mod budget;
mod conn;
pub mod frame;
mod headers;
mod upgrade;
pub use budget::Budgets;
pub use conn::{http2_settings_header, Connection, Role};
pub use frame::{ErrorCode, PREFACE};
pub use headers::Headers;
pub use upgrade::{base64url_decode, base64url_encode};
use std::fmt;
#[derive(Clone, Debug)]
pub struct Config {
pub header_table_size: u32,
pub encoder_table_size: u32,
pub max_concurrent_streams: u32,
pub initial_window_size: u32,
pub connection_window_size: u32,
pub window_autotune: bool,
pub max_stream_window: u32,
pub max_connection_window: u32,
pub max_frame_size: u32,
pub max_header_list_size: u32,
pub max_continuation_frames: u32,
pub max_send_buffer: usize,
pub settings_timeout_ms: u64,
pub graceful_timeout_ms: u64,
pub budgets: Budgets,
pub enable_connect_protocol: bool,
pub keepalive_interval_ms: Option<u64>,
pub keepalive_timeout_ms: u64,
}
impl Default for Config {
fn default() -> Self {
Config {
header_table_size: 4096,
encoder_table_size: 4096,
max_concurrent_streams: 100,
initial_window_size: 256 * 1024,
connection_window_size: 1024 * 1024,
window_autotune: true,
max_stream_window: 4 * 1024 * 1024,
max_connection_window: 16 * 1024 * 1024,
max_frame_size: 16_384,
max_header_list_size: 16 * 1024,
max_continuation_frames: 32,
max_send_buffer: 128 * 1024,
settings_timeout_ms: 10_000,
graceful_timeout_ms: 1_000,
budgets: Budgets::default(),
enable_connect_protocol: false,
keepalive_interval_ms: None,
keepalive_timeout_ms: 20_000,
}
}
}
#[derive(Debug)]
pub enum Event<'a> {
Headers { stream: u32, headers: &'a Headers, end_stream: bool },
Data { stream: u32, data: &'a [u8], end_stream: bool },
Trailers { stream: u32, trailers: &'a Headers },
Reset { stream: u32, code: ErrorCode, remote: bool },
Settings,
Pong { data: [u8; 8] },
GoAway { last_stream: u32, code: ErrorCode, debug: &'a [u8] },
Closed { code: ErrorCode },
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Error {
UnknownStream,
StreamReset,
StreamClosed,
HeadersAlreadySent,
HeadersNotSent,
InvalidHeader,
StreamLimit,
StreamIdsExhausted,
GoingAway,
ConnectionClosed,
WrongRole,
InvalidUpgradeSettings,
HeaderListTooLarge,
ConnectProtocolDisabled,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Debug::fmt(self, f)
}
}
impl std::error::Error for Error {}