Sign a request with the SigV4 query-string auth variant and return the
fully signed URL together with the SignedHeaders value: every header
listed in signed_headers (semicolon-joined, lowercase names) must be
sent verbatim with the request for the signature to verify. Headers named
in excluded_headers are never signed.
The auth components (X-Amz-Algorithm, X-Amz-Credential,
X-Amz-Date, X-Amz-Expires, X-Amz-SignedHeaders,
X-Amz-Security-Token when present, and X-Amz-Signature) land in the
URL query string rather than headers.
The payload line follows options.payload_hash; shared-download URLs
conventionally use Unsigned, while signing a request against a known
body uses Sha256 or Provided.
Raises if request.headers has no Host header.
expires is bounded by SigV4 to [1, 604800] (1 second to 7 days); the
bound is not enforced here — AWS rejects out-of-range values server-side.
Existing query entries are taken as sent and merged with the auth
params.
scheme defaults to https (use e.g. wss for WebSocket endpoints).