Skip to main content

zerodds_http2/
lib.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 ZeroDDS Contributors
3
4//! Crate `zerodds-http2`. Safety classification: **STANDARD**.
5//!
6//! HTTP/2 (RFC 9113) Wire-Codec — no_std Framing + Stream-State-
7//! Machine + Flow-Control + Connection-Preface + Settings.
8//! `forbid(unsafe_code)`. Implementiert die Wire-Schicht von HTTP/2
9//! ohne Heap-Buffering oder Async-Runtime: Frames werden in/aus
10//! byte-Slices kodiert/dekodiert, die State-Machine ist callback-
11//! basiert.
12//!
13//! Hinweis: RFC 9113 (HTTP/2) hat RFC 7540 abgeloest, behaelt das
14//! Wire-Format und die meisten §-Nummern bei und entfernt einige
15//! ungenutzte Features (Priority, Hint-Direktiven). Diese Crate
16//! folgt RFC 9113.
17//!
18//! Spec: RFC 9113 §3 (Connection-Preface) + §4 (Frame-Layer) + §5
19//! (Streams + Multiplexing) + §6 (Frame-Definitions) + §7 (Error-
20//! Codes).
21//!
22//! ## Schichten-Position
23//!
24//! Layer 5 — Bridges. Substrat fuer:
25//!
26//! - [`zerodds-grpc-bridge`](../zerodds_grpc_bridge/index.html) —
27//!   gRPC-over-HTTP/2 + gRPC-Web Length-Prefixed-Message-Codec
28//!   (Header-Block via [`zerodds-hpack`](../zerodds_hpack/index.html)).
29//!
30//! ## Public API (Stand 1.0.0-rc.1)
31//!
32//! - [`Frame`] / [`FrameHeader`] / [`FrameType`] / [`Flags`] /
33//!   [`encode_frame`] / [`decode_frame`] — Frame-Layer-Codec (§4 +
34//!   §6).
35//! - [`CLIENT_PREFACE`] / [`check_preface`] — Connection-Preface
36//!   (§3.4).
37//! - [`Settings`] / [`Setting`] / [`SettingId`] — Settings-Frame-
38//!   Codec + Defaults (§6.5).
39//! - [`StreamId`] / [`StreamState`] — Stream-State-Machine (§5.1).
40//! - [`FlowControl`] — Connection + Stream Flow-Control (§5.2).
41//! - [`ErrorCode`] / [`Http2Error`] — Error-Codes (§7).
42//!
43//! ## Beispiel
44//!
45//! ```rust
46//! use zerodds_http2::{FrameHeader, FrameType, Flags, encode_frame, decode_frame};
47//! use zerodds_http2::frame::DEFAULT_MAX_FRAME_SIZE;
48//!
49//! // PING-Frame (8-Byte-Opaque-Payload, Stream-ID 0).
50//! let payload = [0u8; 8];
51//! let header = FrameHeader {
52//!     length: 8,
53//!     frame_type: FrameType::Ping,
54//!     flags: Flags(0),
55//!     stream_id: 0,
56//! };
57//!
58//! let mut buf = [0u8; 17]; // 9-Byte-Header + 8-Byte-Payload
59//! let written = encode_frame(&header, &payload, &mut buf, DEFAULT_MAX_FRAME_SIZE)
60//!     .expect("encode");
61//! assert_eq!(written, 17);
62//!
63//! let (decoded, consumed) = decode_frame(&buf, DEFAULT_MAX_FRAME_SIZE).expect("decode");
64//! assert_eq!(consumed, 17);
65//! assert_eq!(decoded.header.frame_type, FrameType::Ping);
66//! ```
67
68#![no_std]
69#![forbid(unsafe_code)]
70#![warn(missing_docs)]
71
72extern crate alloc;
73
74#[cfg(feature = "std")]
75extern crate std;
76
77pub mod error;
78pub mod flow;
79pub mod frame;
80pub mod preface;
81pub mod settings;
82pub mod stream;
83
84pub use error::{ErrorCode, Http2Error};
85pub use flow::FlowControl;
86pub use frame::{Flags, Frame, FrameHeader, FrameType, decode_frame, encode_frame};
87pub use preface::{CLIENT_PREFACE, check_preface};
88pub use settings::{Setting, SettingId, Settings};
89pub use stream::{StreamId, StreamState};