One request to an http(s) URL with redirects followed by RFC 9110 §15.4: 301, 302, 303, 307 and 308 for every method; a 303 makes the request a GET without its body and content headers, a 301 or 302 does so for a POST alone, a 307 or 308 keeps the method and the body. The Location is resolved against the sending URL by RFC 3986, a hop between http and https is allowed, Authorization, Proxy-Authorization and Cookie are dropped on a change of origin, and each hop is a client of its own, since one ClientHTTP1 is one origin. A redirect without a usable Location, to another scheme, back to a URL already visited or past maxRedirects comes back as the response, with `stop` saying why. The new :URL partition is the URL type behind it, exported: Parse, Resolve (RFC 3986 §5.2; its §5.4 examples are the test), ToString, and the pieces a request is built from. This replaces the FetchHTTP1 free function, which followed redirects the way Python's urllib did (its repeat limit, its quoting of the Location, a POST turned back on a 307) for a port that no longer needs the fidelity. Breaking: FetchHTTP1, FetchOptionsHTTP1 and FetchResultHTTP1 are gone; use ClientHTTP1::Fetch, FetchOptions and FetchResult, whose `url` is a URL and whose `limited` became `stop`.
41 lines
No EOL
1.6 KiB
C++
Executable file
41 lines
No EOL
1.6 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 :HTTP;
|
|
#ifndef CRAFTER_NETWORK_NO_QUIC
|
|
// HTTP/3, QUIC and WebTransport: over msquic natively, over the browser's
|
|
// WebTransport in wasm. A native build with --no-quic leaves them out.
|
|
export import :ClientHTTP;
|
|
export import :ListenerHTTP;
|
|
export import :ClientQUIC;
|
|
export import :ListenerQUIC;
|
|
export import :WebTransport;
|
|
#endif
|
|
#ifndef CRAFTER_NETWORK_BROWSER
|
|
#ifndef CRAFTER_NETWORK_NO_QUIC
|
|
// 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;
|
|
#endif
|
|
// 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;
|
|
// The URL type ClientHTTP1::Fetch parses and resolves, for callers that
|
|
// build or resolve URLs themselves.
|
|
export import :URL;
|
|
export import :ClientHTTP1;
|
|
export import :ListenerHTTP1;
|
|
#endif |