@@ -27,10 +27,13 @@ as its maintained example.
2727Connection selection does not create product authority. ` --client ` delegates
2828to the product adapter, which owns any retained local endpoint, credential,
2929profile headers, and readiness checks. ` --connection ` materializes one saved
30- connection for that product, and ` --url ` is an advanced one-off destination
31- that is anonymous unless ` --token-file ` is supplied. Saved authentication is
32- exactly one of anonymous, a referenced bearer, or ` private_key_jwt ` . The
33- receiving product still authenticates and authorizes every protected request.
30+ connection for that product. ` --url ` is an advanced one-off destination with
31+ no automatic credential unless ` --token-file ` is supplied. A saved
32+ connection's automatic authentication mode is one of anonymous, a referenced
33+ bearer, or ` private_key_jwt ` . Anonymous means that the connection supplies no
34+ automatic credential; when no automatic provider is selected, the raw command
35+ may still supply one explicit ` Authorization ` header. The receiving product
36+ still authenticates and authorizes every protected request.
3437
3538The direct ` --token-file ` input must fit within 8 KiB, including its optional
3639line ending. That ending is removed and the bearer remains opaque; it need not
@@ -43,19 +46,33 @@ the same reader under its own document bound. Saved bearer and private-key
4346references instead use the platform secret resolver, retaining that resolver's
4447separate root, permission, size, and symlink policy.
4548
49+ An explicit header may be inline, read as one value with ` NAME: @FILE ` , or
50+ read as complete ` NAME: VALUE ` lines with ` @FILE ` . Each header file is bounded
51+ to 64 KiB. These explicit headers are raw request material held as ordinary
52+ strings; they do not inherit the 8 KiB ` --token-file ` credential contract or
53+ the saved secret resolver's custody policy. In particular, an inline
54+ credential may be visible to process-argument inspection.
55+
4656Every service base URL uses the shared checked HTTP(S) type, which permits
4757plain HTTP only for loopback. A request path stays under the selected origin
4858and deployment prefix. The selected connection owns ` Host ` , automatic
49- ` Authorization ` , and any product profile header it sets, so command-line headers
50- cannot replace them. The client ignores ambient proxies, follows no redirect,
51- retries no request, applies fixed connect and overall deadlines, and bounds
52- both request and response bodies. Debug output and transport errors do not
53- contain the bearer or request values.
59+ ` Authorization ` , and any product profile header it sets, so command-line
60+ headers cannot replace them. Without an automatic provider, exactly one
61+ explicit ` Authorization ` header is accepted through any of the raw header
62+ forms; another explicit source is refused. The client ignores ambient proxies,
63+ follows no redirect, retries no request, applies fixed connect and overall
64+ deadlines, and bounds both request and response bodies. ` ApiArgs ` debug output
65+ records header counts and option presence rather than raw request values, and
66+ the automatic bearer connection's tested debug and failure paths do not expose
67+ that bearer. Those focused properties are not a general secret-custody
68+ guarantee for explicit raw headers.
5469
5570The maintained proofs are:
5671
5772- ` crates/registry-cli-api/tests/api_http.rs ` , including
73+ ` anonymous_requests_accept_one_explicit_authorization_header_from_each_supported_input ` ,
5874 ` automatic_credentials_cannot_be_replaced_by_a_repeated_header ` ,
75+ ` api_args_debug_redacts_request_values ` ,
5976 ` paths_and_host_headers_cannot_escape_the_selected_endpoint ` ,
6077 ` redirect_answers_are_returned_without_following_them ` ,
6178 ` response_bodies_are_bounded ` , and
0 commit comments