Skip to content

Permit HTTP redirects globally and add RFC references#607

Open
tianon wants to merge 1 commit intoopencontainers:mainfrom
tianon:307
Open

Permit HTTP redirects globally and add RFC references#607
tianon wants to merge 1 commit intoopencontainers:mainfrom
tianon:307

Conversation

@tianon
Copy link
Copy Markdown
Member

@tianon tianon commented Apr 23, 2026

See also:

@tianon
Copy link
Copy Markdown
Member Author

tianon commented Apr 23, 2026

Implementation evidence:

307:

429 / Retry-After:

Comment thread spec.md Outdated
- allow registries to redirect any request per RFC 9110 (section 15.4); status codes in this spec are those returned after redirects have been followed; clients MUST NOT forward `Authorization` headers across host boundaries
- add 429 / Retry-After guidance per RFC 6585 (section 4) and RFC 9110 (section 10.2.3)
- note that RFC 9110 governs HTTP behaviors not otherwise specified
- normalize all RFC citations to consistent rfc-editor.org URLs with section numbers in link text

Signed-off-by: Tianon Gravi <admwiggin@gmail.com>
@tianon tianon changed the title Permit 307 redirects on blob fetch and add RFC references Permit HTTP redirects globally and add RFC references Apr 23, 2026
Copy link
Copy Markdown
Contributor

@sudo-bmitch sudo-bmitch left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

Comment thread spec.md
The API operates over HTTP. Below is a summary of the endpoints used by the API.
The API operates over HTTP.
Where this specification does not define specific behavior, implementations SHOULD follow the HTTP semantics defined in [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110).
Registries MAY respond to any request with a redirect per [RFC 9110 (section 15.4)](https://www.rfc-editor.org/rfc/rfc9110#section-15.4); clients MUST follow such redirects, and MUST NOT forward `Authorization` headers across host boundaries unless explicitly configured to do so.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Registries MAY respond to any request with a redirect per [RFC 9110 (section 15.4)](https://www.rfc-editor.org/rfc/rfc9110#section-15.4); clients MUST follow such redirects, and MUST NOT forward `Authorization` headers across host boundaries unless explicitly configured to do so.
Registries MAY respond to any request with a redirect per [RFC 9110 (section 15.4)](https://www.rfc-editor.org/rfc/rfc9110#section-15.4); clients following such redirects MUST NOT forward `Authorization` headers across host boundaries unless explicitly configured to do so.

Don't think we should force clients to accept redirects, that feels like an optional consideration.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not "forcing", it's documenting reality.

Do you have a counter example of a client that doesn't follow redirects today? Any such client won't work against almost every single major registry, which is really compelling evidence for "this should be normative in the spec"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

keyword .. "should be normative" not MUST follow.. should be noted that in some circles redirects are not normative.

Not aware of any clients that disallow redirects outside some restrictions on the number of redirects.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Limiting the number of redirects followed is totally reasonable and actually called out in the RFC itself:

A client SHOULD detect and intervene in cyclical redirections (i.e., "infinite" redirection loops).

Note: An earlier version of this specification recommended a maximum of five redirections ([RFC2068], Section 10.3). Content developers need to be aware that some clients might implement such a fixed limitation.

I'd be willing to soften to a SHOULD from a MUST, but removing the strong language is (IMO) not being honest about how this actually works in practice -- for example, any client that doesn't follow redirects at all will literally not work with any of the largest public registries. That's stronger ecosystem evidence than would be covered by just a recommendation.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Limiting the number of redirects followed is totally reasonable and actually called out in the RFC itself:

A client SHOULD detect and intervene in cyclical redirections (i.e., "infinite" redirection loops).

Note: An earlier version of this specification recommended a maximum of five redirections ([RFC2068], Section 10.3). Content developers need to be aware that some clients might implement such a fixed limitation.

I'd be willing to soften to a SHOULD from a MUST, but removing the strong language is (IMO) not being honest about how this actually works in practice -- for example, any client that doesn't follow redirects at all will literally not work with any of the largest public registries. That's stronger ecosystem evidence than would be covered by just a recommendation.

soften to SHOULD language SGTM

I think it would also be fair to mention the need for reasoned following of redirects to enable working with the preponderance of public registries. Another reasonable response might be to check redirect allowance config for certain regions / providers, or just to include an info/debug log of the redirects so as not to hide them from the user.. etc..

Copy link
Copy Markdown
Contributor

@jcarter3 jcarter3 Apr 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approaching this from a different perspective: A valid client is expected to work with a valid registry.

In order to accomplish this, a client must have more strict rules than the registry. If it is valid for a registry to return a redirect, then a client must handle that. If it does not, then the client does not work with valid registries, and thus is not a valid client.

If a custom client is created for internal use cases that does not want to honor redirects, this is fine. But it's also not a spec compatible client. Which is also fine.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this "new" spec language is based on existing behavior typically considered by at least some secure guidelines as a red flag... Obviously, redirects can lead to hijacking exploits. It's fair to say the client MUST follow redirects where the desire is to load from the vast majority, or what not, of registries. Simple enough to build a registry that does not redirect, or if it does, keeps the redirect to some reasonable secure domain and count of, e.g. local registry and/or domain cached registry, ... IMO the client SHOULD be allowed to reject redirects under certain conditions and remain in spec.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Pulling a blob doesn't specify 307 as a valid response status code Support pull/push redirect

4 participants