HTTP/1.1 was plaintext-only, which left `https://` to either an HTTP/3
listener or a terminating proxy in front. Neither helps the callers this
stack exists for — curl scripts, CI tooling, old proxies — so wrap the
transport in libssl instead.
Two new partitions:
:Stream a ByteStream with per-call deadlines on both directions, plus
the plaintext socket implementation. The HTTP/1.1 client and
listener now hold a ByteStream& and never learn which
transport they have, which is what lets one code path serve
both schemes.
:TLS TLSContext/TLSStream over OpenSSL 3, with credentials for both
roles: chain and hostname verification on by default, private
trust anchors, client certificates, mutual TLS, ALPN, and an
in-process self-signed certificate for development.
Both descriptors go non-blocking and every read and write is driven by
poll() against a deadline. That is required for TLS — a blocking
descriptor cannot express a handshake timeout — and it means a plaintext
write can now time out too, instead of parking forever against a peer
that stopped reading.
ClientHTTP1 and ListenerHTTP1 gain credential-taking constructors; the
existing ones still speak http://. The listener handshakes on the
connection's own thread, so a peer that stalls mid-handshake costs one
thread rather than the accept loop, and a failed handshake is counted
rather than logged — on a public port it is ordinary traffic.
MessageParser gains SetDefaultScheme so origin-form targets report the
scheme the transport actually used; handlers shared with ListenerHTTP now
see the same "https" they would over HTTP/3.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
32 lines
No EOL
1.3 KiB
C++
Executable file
32 lines
No EOL
1.3 KiB
C++
Executable file
//SPDX-License-Identifier: LGPL-3.0-only
|
|
//SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
|
|
export module Crafter.Network;
|
|
|
|
export import :ClientTCP;
|
|
export import :ListenerTCP;
|
|
export import :ClientHTTP;
|
|
export import :ListenerHTTP;
|
|
export import :HTTP;
|
|
export import :ClientQUIC;
|
|
export import :ListenerQUIC;
|
|
export import :WebTransport;
|
|
#ifndef CRAFTER_NETWORK_BROWSER
|
|
// Exposed so user code can build WebTransport clients by hand against a
|
|
// ClientQUIC until we ship a ClientWebTransport wrapper. Most callers do
|
|
// not need the HTTP/3 frame helpers directly. Excluded from the browser
|
|
// build — HTTP3 uses throw and the wasm target runs with -fno-exceptions.
|
|
export import :HTTP3;
|
|
// HTTP/1.1 over TCP, for peers that are not ready for HTTP/3. Native only:
|
|
// in the browser this job is already done by fetch() behind :ClientHTTP,
|
|
// and these partitions use exceptions and POSIX sockets.
|
|
export import :HTTP1;
|
|
// The byte-stream abstraction the HTTP/1.1 endpoints run over, and the libssl
|
|
// TLS transport that turns them into https://. Exported so callers can build
|
|
// credentials, and so anything else holding a connected socket can wrap it the
|
|
// same way.
|
|
export import :Stream;
|
|
export import :TLS;
|
|
export import :ClientHTTP1;
|
|
export import :ListenerHTTP1;
|
|
#endif |