Skip to content

UPDATE - feat: clarify end-to-end semantics of http status codes - #872

Open
tfrauenstein wants to merge 1 commit into
zalando:end-to-endfrom
tfrauenstein:patch-1
Open

UPDATE - feat: clarify end-to-end semantics of http status codes#872
tfrauenstein wants to merge 1 commit into
zalando:end-to-endfrom
tfrauenstein:patch-1

Conversation

@tfrauenstein

@tfrauenstein tfrauenstein commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Update of Tronje's PR feat: clarify end-to-end semantics of http status codes (#864).

As discussed in Tronje's PR thread, this PR anticipates infrastructure reality of returning 404 in case of missing routes. The rule is changed to SHOULD and a MUST rule for clients is added. This PR is an update of the original PR.

@tfrauenstein tfrauenstein changed the title Change rule to SHOULD rule and add client MUST rule UPDATE - feat: clarify end-to-end semantics of http status codes Jul 31, 2026
@tkrop

tkrop commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

I strongly disagree with the sense of reality mentioned here. The majority of HTTP layer load balancers correctly return 503 when there is no healthy service host available, particularly AWS and Google load balancers. Only routers that are usually installed close to or as part of the service are by default responding with 404 assuming that they can authoritative answer for the service since route and service configuration is part of a single (atomic) deployment step preventing misconfiguration.

However, the case we are tackling with the targeted rule is exactly the case, where the router/load balancer is not part of the actual service, but an independent component with an independent failure behavior. For these cases the formulation of must is imminent to exactly avoid what the additional rule is suggesting: that each client needs to be aware of the broken end-to-end principle instead of starting to repair it.

Comment on lines +95 to +105
== {MUST} be careful with interpreting 404 status code
Infrastructure components, like routers or proxies, may be configured
inconsistently not following the <<256>> guideline, and return {404} status code
instead of {503} when routes are missing. For example, the Kubernetes ingress
router https://github.com/zalando/skipper[Skipper] returns {404} per default
in case of missing routes.

Clients cannot generally rely on {404} representing the backend application resource
state. Depending on the network environment, clients must be careful with how to
interpret {404} error responses and may need to exclude e.g. routers as error source
via tests and inspection of router response headers or log information.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

I actually do not understand we do here about how Skipper behaves by default, since we actually do not need to change the default behavior of skipper, which is still correct when it is used inside a service as router, we just need to change how our skipper-ingress deployment behaves within Kubernetes/EKS.

For me such a change - of which we know that it represents a broken behavior - sounds much simpler and cheaper than to make all clients ware of this mis-behavior and inspecting routing headers.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants