Summary
Define whether an explicit trailing DNS root dot is stripped, preserved, or rejected when deriving request-signing @authority and @target-uri, and publish a conformance vector for the decision.
Context
The Python SDK normalizes IDN hosts through UTS-46. That normalizer strips a trailing root dot, while the former ASCII-only path preserved it. Without one normative rule, equivalent host spellings can produce different signature bases:
https://example.com./p
https://example.com/p
- A-label and U-label forms of the same IDN host with a trailing dot
The Python SDK currently strips one trailing dot before branching so ASCII, A-label, and U-label inputs agree. This is an interim interoperability choice, not a protocol decision. Other implementations following RFC 9421 and RFC 3986 literally could preserve the wire form and silently diverge.
Requested specification work
- State the normative trailing-root-dot rule in the
@authority / @target-uri canonicalization steps.
- Add
root-dot-* accept/reject cases to the current request-signing canonicalization vectors under dist/compliance/<version>/test-vectors/.
- Cover ASCII, A-label, and U-label spellings that identify the same DNS name.
- Note the wire-compatibility consequence for mixed old/new SDK deployments.
SDK tracking
Python: adcontextprotocol/adcp-client-python#986
The Python-local regression test should be replaced by the vendored upstream vector once this lands.
Summary
Define whether an explicit trailing DNS root dot is stripped, preserved, or rejected when deriving request-signing
@authorityand@target-uri, and publish a conformance vector for the decision.Context
The Python SDK normalizes IDN hosts through UTS-46. That normalizer strips a trailing root dot, while the former ASCII-only path preserved it. Without one normative rule, equivalent host spellings can produce different signature bases:
https://example.com./phttps://example.com/pThe Python SDK currently strips one trailing dot before branching so ASCII, A-label, and U-label inputs agree. This is an interim interoperability choice, not a protocol decision. Other implementations following RFC 9421 and RFC 3986 literally could preserve the wire form and silently diverge.
Requested specification work
@authority/@target-uricanonicalization steps.root-dot-*accept/reject cases to the current request-signing canonicalization vectors underdist/compliance/<version>/test-vectors/.SDK tracking
Python: adcontextprotocol/adcp-client-python#986
The Python-local regression test should be replaced by the vendored upstream vector once this lands.