Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Artifact download: let HTTP do the rest

Open
#321 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
30/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active

Research direction

Start by reading the endpoint proposal in #262, the encoding issue in #283, and the artifact-format material discussed here. Work through the HTTP negotiation, signature-link, checksum, and artifact representation changes; done means the specification consistently defines one revision download endpoint plus its latest alias without the duplicated transport fields.

Written by the indexing model from the issue text.

Description

The download endpoint from #262 is a great move. /artifact/{uuid}/{artifactVersion}/download is something you can curl: no TEA client library, no metadata parsing, and content negotiation, ETag, Cache-Control and Repr-Digest all come from HTTP for free. Thanks for that.

I think it can be taken one step further. Once the endpoint exists, most of what artifact-format describes is already expressed by HTTP:

  1. Format selection is Accept. The mediaType query parameter duplicates it, with its own matching and encoding rules (see #283). Dropping the parameter leaves what every framework already implements: Accept in, Content-Type and Vary: Accept out, 406 when nothing matches.
  2. artifact-format reduces to a list of media types. With negotiation on the endpoint, an artifact needs at most to advertise which media types it is available in. The per-format sub-object with url, signatureUrl, checksums and description is no longer needed.
  3. Direct download URLs are not needed. The endpoint already answers 302 to an external location. That covers pre-signed object storage, Maven Central and everything else url was for, and the token boundary is simply "under the API base or not".
  4. The signature is a link on the response. An RFC 8288 Link header with a TEA relation type, for example Link: <…>; rel="https://tc54.org/tea/rel/signature", names the signature of exactly the representation returned, on GET and HEAD. There is no registered relation for detached signatures (the closest precedent in the IANA registry is c2pa-manifest), and RFC 8288 allows a URI, so nothing needs registering. No signature endpoint family, no mediaType parameter on it, no SIGNATURE_NOT_FOUND: no link means no signature.
  5. Checksums are already there. Repr-Digest (RFC 9530) is defined on the download response. It can be the only place checksums live, and it covers HEAD too.

The result is one endpoint per artifact revision, plus its latest alias, and an artifact object that lists media types instead of describing transports. Everything else is standard HTTP that clients and servers already have.

References: #246 (motivation), #262 (the endpoint), #283 (encoding issue caused by the mediaType parameter).

Dominant language
Shell
Stars
116
Forks
23
Avg merge
2d 11h
Merged PRs (30d)
63

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from CycloneDX/transparency-exchange-api

All issues in CycloneDX/transparency-exchange-api

Similar issues

More Shell/Bash issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.