An automated agent sometimes receives a 502 or 504 response even though its request was correctly formed. Should it resend the request, change credentials, investigate DNS, or alert an operator? The HTTP Proxy-Status response field helps answer a narrower, crucial question: what happened while an HTTP intermediary tried to obtain and return a response? It identifies participating intermediaries and, when supplied, structured diagnostic parameters such as error types, upstream protocol and the status received from the next hop. It is evidence about a particular network path, not proof of the origin application’s state.
For real agent systems, that distinction prevents damaging reactions to ambiguous failures. A request may fail before reaching the application, after being accepted upstream, or while a response is being streamed back. Those are not interchangeable outcomes, especially when the request could create an order, send a notification or update a record. This guide explains the field from first principles, works through original numerical and operational examples, shows how to preserve safe diagnostics without leaking infrastructure, and separates what RFC 9209 actually guarantees from what a deployment still has to verify. Nothing here assumes that artificial superintelligence currently exists.
Contents and quick reading route
- Why an ordinary HTTP status code is not enough
- What counts as an intermediary and a next hop
- Reading the list without reversing the chain
- Parsing a Structured Field rather than splitting on punctuation
- The error parameter explains a failure stage
- A recommended status code is not a guaranteed status code
- DNS errors and destination selection are different
- Connection errors and the limits of inference
- TLS-related failures are not application permission failures
- The next-hop parameter and privacy boundaries
- The next-protocol parameter identifies the upstream protocol
- Received status versus the final status
- Details provides text, not executable instructions
- Next-hop aliases and the later RFC 9532 extension
- A first incident: separating DNS timeout from a failed application
- A second incident: refused versus timed-out connections
- A third incident: upstream 429 and the tempting wrong repair
- Streaming responses and trailer limitations
- Safe diagnostics for an automated agent
- A decision table in prose for four common situations
- Failure to report a parameter is not proof of success
- Logging without leaking the private service map
- Trust and authenticity: why a field is not a signature
- The difference from HTTP Structured Fields and CONNECT-UDP
- An independent transfer exercise: an upload with uncertain completion
- A second transfer: an alias list in a privacy-sensitive service
- A practical test suite before relying on the field
- Frequently asked questions
- What to read next and which sources to trust
Why an ordinary HTTP status code is not enough
Suppose a research agent calls a laboratory scheduling API through a corporate proxy, a content delivery network and an origin-facing reverse proxy. It receives HTTP 504. The status tells it that some gateway or proxy did not receive a timely response, but it does not by itself identify which hop waited, whether name resolution failed, whether a TCP or QUIC connection failed, or whether the backend application was already processing the request. A useful operational decision requires a better account of the failure stage.
A standard HTTP status is a compact summary of the response returned to the requester. A network path may contain several components that are each capable of generating that status. Application logs may be unavailable to the requester; a proxy might even be unable to reach the application log service. RFC 9209 therefore defines Proxy-Status so an intermediary can explain its handling of the response without inventing an application error code.
This diagnostic field does not replace the actual HTTP status. Nor does it guarantee completeness, cryptographic integrity or correctness of the statements made by a proxy. It gives a structured vocabulary for an additional observation. The agent still needs request identifiers, local timestamps, retry policy, security policy and the operation’s idempotency contract to decide what action is safe.
What counts as an intermediary and a next hop
An intermediary is a component that handles HTTP traffic between a client and an origin. A forward proxy acts on behalf of clients, while a reverse proxy or gateway sits in front of application servers. A content delivery network can include many intermediary services, but one HTTP request sees a particular path rather than the provider’s entire infrastructure. Proxy-Status refers to the intermediaries that handled that response, not to every possible hop of the network.
The next hop is the server or intermediary selected in the direction of the origin. If agent A connects to edge B, which forwards to gateway C, which contacts origin D, then C’s next hop is D and B’s next hop is C. This direction matters. A response travels back from D to C to B to A, so entries appended as it returns form an origin-near to client-near list. Misreading the order can send an investigation to the wrong team.
RFC 9209 uses a Structured Fields List. In a simple illustrative deployment, the field might say: Proxy-Status: gateway.example, edge.example. The left entry represents the intermediary nearest the origin; the right entry represents the one nearer the client. This is not an IP-level route trace, and it does not prove that the named hosts exist or that they are under the same trust administrator.
Reading the list without reversing the chain
Imagine an agent contacting api.example through edge.example and gateway.example. Gateway obtains a response and inserts its member. Edge forwards that response and appends its own member. The combined list reads gateway.example, edge.example. If the edge lists itself first by mistake, a reader may misinterpret an upstream error as an edge-generated error. Preserve ordering when composing or presenting the field.
Each member is a Structured Fields Token or String identifying the deployment-specific intermediary. An identifier can be a hostname, service name, address or generated label. It should identify that deployed intermediary rather than merely the generic software product. The exact label does not need to expose an internal machine name. A public-safe pseudonym can be sufficient when engineers have an authorised private mapping.
RFC 9209 says intermediaries should preserve existing members unless configured to remove them, for example to prevent disclosure of internal details. That makes the list an operational aid, not an invariant that every hop must appear. A missing member is not proof that a proxy was absent. Some hops may deliberately suppress the field, others may lack support, and a gateway may strip untrusted inbound entries.
Parsing a Structured Field rather than splitting on punctuation
Proxy-Status is not a free-form string assembled with informal commas and semicolons. A member is an item with optional parameters under HTTP Structured Fields. For example, Proxy-Status: edge.example; error=connection_timeout; next-protocol=h2 is one member whose name is edge.example and whose error parameter is the token connection_timeout. Another comma-separated member represents another intermediary, not another parameter of the first.
A simplistic program that splits a header at each comma will eventually fail. Quoted Strings can carry delimiters, and RFC 9532 later introduced a parameter whose quoted value itself contains a comma-separated sequence of DNS aliases. A parser must respect quoting and Structured Fields grammar before assigning meaning to commas and semicolons. The current Structured Fields specification is RFC 9651, which obsoleted RFC 8941; deployments should use a conforming parser rather than ad hoc regular expressions.
It is also important not to coerce every parameter into the same data type. The received-status parameter is an Integer; details is a String; error is a Token. An unknown parameter is to be ignored as specified in RFC 9209 rather than treated as a parsing catastrophe. Untrusted prose contained in a valid String should not be interpreted as a new protocol rule.
A worked two-hop example
Consider Proxy-Status: gateway.example; received-status=200, edge.example; next-protocol=h2. The first member says that gateway.example reports receiving HTTP status 200 from its next hop. The second says edge.example reports using the protocol identifier h2 toward its next hop. These facts are not enough to infer that the end-user definitely received a complete application response; the transport might still fail or an intermediary might change the body.
If the final response sent to the agent is 502, the difference between 200 received by the gateway and 502 delivered downstream warrants investigation. It does not automatically convict edge.example. Capture the final status, the complete Proxy-Status list, the response length and the request identifier. Compare them against trustworthy server-side logs before assigning cause.
The error parameter explains a failure stage
The error parameter is a token naming a registered proxy error type. RFC 9209 defines types for DNS resolution, destination selection, connection establishment, read and write timeouts, TLS problems, malformed HTTP responses, excessive headers, proxy configuration failures and loops. This vocabulary is deliberately more specific than the broad family of HTTP 5xx statuses.
For example, connection_timeout means the attempt to open a connection to the next hop timed out. connection_read_timeout means a connection existed and the intermediary waited for data that did not arrive within a configured interval. Both have a recommended 504 status, but they point to different instrumentation. Conflating them can produce a useless fix: increasing a connect timeout will not cure a slow upstream response body.
The type is diagnostic, not an automatic retry instruction. A connection failed while an application operation was being attempted does not establish that the operation is safely repeatable. In particular, a read timeout after a successful write leaves the application outcome uncertain. Agents handling payments, modifications or messages should reconcile transaction state using the application protocol before repeating anything with side effects.
A recommended status code is not a guaranteed status code
Each registered proxy error type has a recommended HTTP status. dns_timeout recommends 504; dns_error recommends 502; destination_unavailable recommends 503; proxy_internal_error recommends 500. That is a useful consistency convention, not a universal equivalence between a code and an error. RFC 9209 explicitly allows circumstances in which a different final status is used, such as compatibility or a status that has already been sent.
The distinction matters for analytics. If an operator groups all 504 responses under connection_timeout, a DNS outage and a response-generation delay will vanish into one bucket. Conversely, counting a single error token as proof of the actual status delivered to the client ignores rewrites performed by another intermediary. Store the final HTTP status and the per-member error token separately.
An agent should avoid upgrading an unauthenticated error token into a security decision. If a downstream proxy reports http_request_denied, that is a claim about a hop’s handling, not an authorisation verdict that overrides the user’s identity, endpoint policy or an application-level 403. Security decisions belong to verified policy enforcement, not solely to this field.
DNS errors and destination selection are different
The dns_timeout error describes a timeout while resolving the next-hop hostname. The dns_error type covers another DNS failure and can include additional information such as a DNS response code or Extended DNS Error code. Those names are more precise than a generic upstream failure, but the difference between a resolver timeout and a negative DNS answer is still significant when deciding whether another network path might help.
The destination_not_found type applies when a gateway cannot determine the appropriate backend at all. For instance, routing configuration might have no match for an API’s host and path. destination_unavailable instead describes a next hop considered unavailable, perhaps because health checks or recent communications failed. One suggests a routing or configuration problem; the other suggests an unavailable but known target.
Destination selection errors should not be treated as evidence that the origin explicitly rejected the client. If the gateway did not know which backend to contact, the backend had no opportunity to return that error for this request. Diagnose routing rules, service discovery or health selection first; do not ask the agent to change account credentials as its initial repair.
Connection errors and the limits of inference
Connection_refused records that the attempted connection to the next hop was refused. Connection_timeout means an attempted connection did not complete in time. Connection_terminated indicates that a connection ended before a complete response was received. These states belong to different phases, and they have different implications for whether the upstream application might have handled the request.
A connection refusal before an HTTP request could be sent is generally stronger evidence that no work reached that next hop than a read timeout after the request body was transmitted. Even then, a multi-hop topology may complicate conclusions about other destinations. An automated system should record whether it sent request headers, whether it sent the entire body, whether any response bytes arrived and whether it possesses an application-level transaction identifier.
There is no portable rule saying connection_terminated means an operation failed. The server could have committed an update and then lost its connection before returning the acknowledgement. The safe repair is reconciliation, not blind repetition. A well-designed agent can ask a read-only status endpoint for the operation’s idempotency key or receipt before issuing a replacement write.
TLS-related failures are not application permission failures
RFC 9209 includes tls_protocol_error, tls_certificate_error and tls_alert_received. Such categories help distinguish secure-transport negotiation or certificate validation problems from failures in application logic. If a gateway cannot authenticate its upstream peer, the correct response is not to disable verification just so an agent can continue completing tasks.
An upstream certificate failure could arise from an expired certificate, a wrong hostname, an unsuitable trust anchor, a deployment mistake or hostile interception. Proxy-Status by itself does not reveal which cause is true. Proper incident investigation requires certificate validation logs, server-name context and authorised trust configuration. Any sensitive certificate or hostname details need access controls separate from the public-facing field.
The same principle applies to next-protocol=h2 or next-protocol=h3: it describes the protocol identifier used on the next-hop leg, not proof that the connection had particular cryptographic properties. HTTP protocol identifiers and certificate verification are related but separate concerns. Do not infer mutual authentication, cipher choice or certificate trust solely from the reported protocol.
The next-hop parameter and privacy boundaries
The next-hop parameter can name the server selected toward the origin; RFC 9209 allows a Token or String, such as a hostname or alias. It helps a team locate a backend failure without guessing which pool member was selected. In a multi-tenant platform, however, exposing an internal hostname, raw IP address or tenancy label could reveal infrastructure structure to an unauthorised caller.
A public-safe reporting policy can publish a stable service alias while retaining the exact backend address in protected logs. For example, an external response might use next-hop=”orders-service” while a privileged trace links that name to a particular healthy or unhealthy instance. This approach preserves actionable diagnostics for the proper audience without gratuitously publishing the private network map.
If the proxy is permitted to expose a real hostname, the field still is not proof that DNS actually resolved to that hostname or that the TLS peer was verified against it. It is a statement from an intermediary. Compare with independently trusted connection records when the identity is security-critical.
The next-protocol parameter identifies the upstream protocol
The next-protocol value denotes an Application-Layer Protocol Negotiation identifier for the protocol the intermediary used toward its next hop. A token such as h2 indicates HTTP/2 in the example. RFC 9209 notes that the identifier may or may not have been selected through actual ALPN negotiation. Do not turn the presence of this value into a claim that the TLS handshake negotiated a specific security mode.
Why record it? An intermediary might receive HTTP/3 from the client while sending HTTP/2 to the backend. A protocol-specific issue can therefore occur on one leg without affecting the other. If a deployment changes upstream connection pools from HTTP/1.1 to HTTP/2, next-protocol can help correlate failures with that boundary when combined with connection and error logs.
An agent deciding whether to fallback from one protocol to another needs explicit policy and endpoint compatibility information. Proxy-Status can suggest where to look, but it does not grant authority to bypass encryption, downgrade verification or ignore application semantics.
Received status versus the final status
Received-status is an Integer representing the HTTP status that an intermediary received from its next hop. The HTTP status delivered to the agent may differ because another proxy produced a new response, transformed it or encountered a later failure. Preserving both numbers helps distinguish an origin response from a downstream rewriting event.
Take an illustrative successful upstream response of 200 and a final 502. The mismatch is a diagnostic clue, not a mathematical contradiction. A gateway might receive status 200, then fail while processing or streaming the body, leaving another downstream layer to report a gateway error. But the field alone cannot establish the entire sequence of bytes or which component is faulty; additional trusted telemetry must fill the gaps.
Conversely, if the final response and received-status are both 429, do not conclude that the agent exceeded an application quota. The 429 could have come from an upstream rate limiter rather than the application. Inspect which member reports receiving 429, which component generated the response and any independently defined Retry-After or application rate-limit policy. Do not assume Proxy-Status defines rate limits.
Details provides text, not executable instructions
The optional details parameter is a String for further information not otherwise encoded in a registered parameter. It can be useful to a human reading an incident report, especially when a deployment has a stable internal diagnostic identifier. It can also be dangerous when an untrusted message is displayed verbatim in an operational console or passed into an assistant’s instruction context.
Treat details as untrusted observational data. Do not execute commands inside it, grant it privileges, parse its contents as authoritative policy or let it override a system’s task objective. Escaping output when displaying the String is essential; length limits, redaction and structured logging can prevent accidental disclosure of credentials, internal route labels or customer-specific identifiers.
A deployment should prefer stable registered error tokens for machine action and use details for a controlled explanatory supplement. Changing free-text wording during a software upgrade ought not to alter how the agent retries operations. Build rules around verified error categories and application state rather than matching fragments of diagnostic prose.
Next-hop aliases and the later RFC 9532 extension
RFC 9532, published in January 2024, extends Proxy-Status with next-hop-aliases. This String conveys DNS alias and canonical names encountered when resolving the next-hop name. In particular, it can help a forward-proxy client understand a CNAME chain that its own DNS resolver never queried directly. The IANA registry lists this as a separate parameter alongside those defined by RFC 9209.
The value is one Structured Fields String containing names separated by commas, not multiple top-level Proxy-Status members. A chain such as tracker.example, service.example appears within quotation marks and must be decoded according to RFC 9532, including percent-encoding of special characters. This is a concrete reason that naïvely splitting an HTTP header on commas is unsafe.
The parameter may be absent or incomplete if the resolver API cannot expose the full CNAME chain. It is also not a DNSSEC proof, and a malicious intermediary can omit or misreport the chain. RFC 9532 cautions against using the claimed alias list alone as a security decision about resource identity. It is a clue for investigation and certain client policies, not a replacement for independently verified DNS and certificate checks.
A first incident: separating DNS timeout from a failed application
Suppose an agent issues 250 read-only catalogue requests over a ten-minute observation window. A gateway reports dns_timeout on 10 of them, connection_timeout on 5, and 235 with no proxy error recorded. For this example the denominator is all 250 attempted requests, not only those that returned errors. The observed fractions are 10/250 = 4 percent DNS-timeout responses, 5/250 = 2 percent connection-timeout responses and 235/250 = 94 percent without either named error.
These are deliberately invented numbers for a worked diagnostic; they are not measurements from eduKate or any external system. They also do not prove that the remaining 235 operations were successful. A response might be an application 4xx or 5xx even when no Proxy-Status error is reported. To measure task success, collect final status codes and validated application results separately.
A useful first repair is to inspect resolver behaviour and upstream address selection for the 10 DNS cases, and connection establishment telemetry for the other 5. If DNS failures are clustered behind one gateway, route policy may differ by region. Retrying all 15 requests blindly could multiply load without fixing the cause. For a safe read-only catalogue query, a bounded retry may be acceptable; for a state-changing request, it still requires the relevant application guarantee.
A second incident: refused versus timed-out connections
Imagine 600 requests through two authorised gateways over 15 minutes. Gateway A reports connection_refused for 18 requests out of 300, while gateway B reports connection_timeout for 9 requests out of 300. The first rate is 18/300 = 6 percent and the second is 9/300 = 3 percent. Reporting 27 errors divided by 300 would be wrong because the combined denominator is 600; the combined proportion is 27/600 = 4.5 percent.
The operational questions differ. A refusal may follow a closed port, rejecting endpoint, overloaded listener or policy device. A connection timeout may arise when packets are dropped, routes are unavailable or the connection cannot complete promptly. Those are possibilities, not diagnoses certified by the token. An engineer still needs connection traces, health checks and the relevant network topology.
If an agent is issuing two different kinds of request through these gateways, do not merge those rates as though traffic were identical. Read-only lookups and transaction writes have different risks and may use different backend pools. Compare like with like, preserving request class, operation identity and time window before deciding that one gateway is reliably better.
A third incident: upstream 429 and the tempting wrong repair
Assume an agent makes 120 requests to a documentation API in one minute. The final responses include 20 instances of 429. A proxy member reports received-status=429 on 12 of those, while the other 8 do not provide an upstream status. The verified fraction of final 429 responses is 20/120 = 16.7 percent to one decimal place; the fraction with that particular proxy evidence is 12/20 = 60 percent of 429 responses.
Those ratios answer different questions. The first describes user-visible throttling or refusal responses in the sample. The second describes how frequently the diagnostic field identified an upstream 429 among the 429 responses. It would be incorrect to infer that exactly eight responses were generated by the edge, since missing data does not establish origin.
The repair might involve explicit application rate-limit documentation, bounded concurrency, appropriate caching of permitted reads or a wait indicated by a valid Retry-After field. Proxy-Status alone does not set a retry delay. The agent should not circumvent the limit by rotating credentials or changing endpoints without authorisation.
Streaming responses and trailer limitations
When a proxy has already sent response headers and later detects failure while streaming the body, it may no longer be possible to change the header section. RFC 9209 permits Proxy-Status as a trailer in such cases, but recommends against using trailers unless necessary because they may be silently discarded on the path to the user agent.
There is an ordering rule: a proxy must not send a Proxy-Status trailer unless it also generated a header member with the same intermediary identifier. This gives recipients an anchor for where the later trailer information belongs in the chain. A receiver can then reconcile trailer members with the matching header entries rather than treating them as unrelated extra network hops.
An agent that only checks initial response headers can miss the later failure. For streamed tasks, log the number of application bytes or records successfully consumed, the expected completion marker if the protocol defines one, and any final trailers that survive. Never treat an initial 200 and a partially delivered body as a complete successful operation without validating application-level completion.
Safe diagnostics for an automated agent
A practical diagnostic record should include the request identifier, the action class, a timestamp and bounded duration, the final HTTP status, the parsed Proxy-Status members in order, any relevant application response code and whether the request was read-only or state-changing. Avoid collecting secret tokens, raw authentication headers, private request bodies or unbounded error strings simply because they would make debugging easier.
An agent should have a constrained reaction map: on a confirmed read-only, retryable network failure it may attempt a bounded retry with backoff; on ambiguous state-changing failure it must query the authoritative operation status or escalate; on evidence of certificate validation failure it must preserve the trust requirement; and on an authorisation denial it must stop rather than try alternate identities.
These are application design choices rather than commands embedded in RFC 9209. The RFC defines a response field. It does not create an idempotency mechanism, authorise retries, certify upstream identity or waive the need for human governance. Keeping that boundary explicit makes diagnostics useful without turning them into a new privilege channel.
A decision table in prose for four common situations
If the field reports dns_timeout for a read-only request, the agent may collect resolver context and use a documented, bounded retry plan. If it reports connection_read_timeout for a write request, the agent must treat application completion as unknown until an idempotency receipt or authoritative status query resolves it. If a proxy reports tls_certificate_error, the agent must not downgrade verification merely to complete the task. If the field is absent, the agent should rely on ordinary HTTP status, trusted logs and application-specific reconciliation.
Notice what the decision table does not say. It does not declare that 502 always means a failed upstream process, or that any 504 is safe to retry, or that all proxies provide complete Proxy-Status telemetry. The safety of a retry depends on the operation’s semantics and on evidence about whether the side effect might already have occurred.
A robust agent also separates observability from authority. Logs can suggest a next diagnostic step; identity, permission, state changes and recovery approval must still be enforced by the application and its administrators. This principle matters more as orchestration systems become capable of calling multiple services on a user’s behalf.
Failure to report a parameter is not proof of success
Every Proxy-Status parameter is optional, and the field itself is optional. A 200 response with no field is not proof that there were no proxies. A 504 without an error parameter is not evidence that DNS resolution succeeded. A named proxy entry without next-hop is not proof that no upstream server was contacted.
There are many legitimate reasons for missing information: older components, disabled debug mode, public-facing privacy policy, error paths that fail before headers are composed, truncated transports or intermediaries that remove inbound diagnostics. Treat presence and absence asymmetrically: presence may provide a claim to investigate; absence normally provides little basis for a positive conclusion.
This is why instrumenting one component and then graphing ‘percentage of failures with a proxy error token’ can mislead. A low observed count may reflect telemetry coverage rather than system reliability. Measure the denominator of eligible responses for which the diagnostic is expected to be emitted, and monitor its coverage separately from the actual operation’s outcome.
Logging without leaking the private service map
Proxy-Status is especially sensitive because its purpose is to disclose how a request moved through infrastructure. RFC 9209’s security section warns that detailed topology can help an attacker target unprepared backends. Labels, next-hop addresses, resolver aliases and free-text details may reveal more than an external API caller should know.
A sensible deployment maintains public and privileged diagnostic views. The public response can expose a minimal error token and perhaps a stable pseudonymous proxy name; internal logs protected by access controls can associate that name with a concrete process, pool or address. Do not assume a pseudonym is harmless if it stays stable enough to reveal tenant layout or geographic routing patterns.
Redaction should happen before public delivery, not only after an agent records the header. Once private information has reached a third-party caller it cannot be made secret by masking a later dashboard. Likewise, an agent should not echo raw diagnostic headers into prompts, shared documents or logs accessible to people who lack legitimate operational need.
Trust and authenticity: why a field is not a signature
RFC 9209 explicitly notes that the field’s contents are not verified. An intermediary can claim that it used an encrypted next hop without having done so. A malicious or misconfigured proxy can insert false members or misleading details. Even a truthful proxy cannot certify events it did not observe.
The proper trust model is layered. The client authenticates its direct transport peer under the transport protocol; the application authenticates and authorises the API call; trusted gateway logs can correlate request and response handling; Proxy-Status contributes optional observations about intervening HTTP handling. None of those mechanisms automatically substitutes for the others.
Do not use Proxy-Status to decide whether a certificate is valid, whether an upstream transaction committed or whether a remote party is authorised to receive user data. An operational dashboard may aggregate this field as evidence, but any sensitive action must be guarded by an independent control with a documented threat model.
The difference from HTTP Structured Fields and CONNECT-UDP
Proxy-Status uses the HTTP Structured Fields syntax, but learning the syntax is not the same as understanding the semantics of this diagnostic field. The companion eduKate guide to HTTP Structured Fields explains types, parsers and signature boundaries more generally. Here the concern is which proxy reported which next-hop event and how to interpret error tokens without inventing facts.
Proxy-Status also differs from the agent CONNECT-UDP and MASQUE guide. CONNECT-UDP defines a way to proxy UDP traffic using HTTP mechanisms. Proxy-Status instead reports information about an HTTP intermediary’s handling of an HTTP response. A system using HTTP proxy infrastructure may involve both subjects, but their core reader questions are different.
A troubleshooting workflow can use these resources together: understand the transport being proxied, parse the diagnostic fields correctly, then decide what a particular error does or does not establish. Those are separate tasks and should remain separate in the agent’s implementation.
An independent transfer exercise: an upload with uncertain completion
Consider a new situation. An agent uploads a 12-megabyte report to a storage API using a state-changing POST. It sends the complete body, waits 20 seconds, then receives HTTP 504 with Proxy-Status: upload-edge.example; error=connection_read_timeout. The user asks the agent to resend immediately. Does the diagnostic establish that the storage API never accepted the upload?
No. A read timeout says the intermediary did not receive expected data within its configured interval. It does not say whether the origin stored the object, began asynchronous processing or completed a commit before its reply was lost. The size of the body and the fact that the client finished sending it do not establish a successful commit either. If the agent sends the same POST again without a deduplication contract, it may create a duplicate.
The correct transfer of principle is to distinguish transport observation from authoritative application state. If the API supports idempotency keys, use the original key and follow the documented retry semantics. Otherwise query an authorised upload-status endpoint or unique object identifier, compare checksums and metadata, and obtain an explicit state resolution before repeating a side effect. A 504 plus connection_read_timeout directs investigation; it does not give permission to risk a second upload.
A second transfer: an alias list in a privacy-sensitive service
Suppose a forward proxy reports next-hop-aliases=”tracking.example,backend.example” while retrieving a public image. The agent is building a privacy report. Should it label the service malicious solely because a tracker-like string appears in the field? The answer is no. The names are intermediary-reported hints, the chain may be partial, and the field provides no DNSSEC evidence or authenticated statement about the website’s ownership.
The appropriate next step is corroboration: obtain authoritative DNS evidence through a permitted trusted resolver, inspect actual request destinations and compare with the user’s privacy policy. Preserve the exact diagnostic as an observation with its source and timestamp. If the proxy is untrusted, include that limitation prominently rather than creating an unsupported accusation.
This second transfer shows why technical reading is a form of disciplined reasoning. Identical parsing skill does not justify identical conclusions. One field can guide a reliability investigation, a privacy review or a compatibility test, but its role remains bounded by how it was obtained and what it can prove.
A practical test suite before relying on the field
Test a successful two-hop response and confirm that origin-near and client-near members are ordered correctly. Test a gateway-generated 504 containing connection_timeout and a different case containing connection_read_timeout; verify that dashboards preserve the difference. Test an unknown parameter and confirm it is ignored rather than causing a failed request. Test a quoted String containing a comma so the parser does not create a fictitious extra hop.
Then test trailers. Stream a controlled response, trigger a late upstream termination in a staging environment and check whether the client observes a trailer or loses it along its path. Ensure the system can report incomplete bodies without treating the initial status as final task success. Test redaction by attempting to include an internal next-hop address and a sensitive details value; public responses must not expose them.
Finally, test failure policy with a state-changing request whose response is intentionally delayed after an application commit. The expected agent behaviour is reconciliation, not blind retry. These are suggested controlled engineering tests, not claims about actual eduKate infrastructure or results. Record environment, request count, exact denominators and the chosen acceptance criteria before drawing reliability conclusions.
Frequently asked questions
Can an HTTP 200 response include Proxy-Status?
Yes. RFC 9209 allows intermediaries to attach handling information even where they did not generate an error response. A successful final status and a chain of proxy identifiers are compatible. Whether any given deployment emits the field on successes is its policy choice, and the field itself does not guarantee complete application data.
Does a 504 with connection_timeout prove that the origin was down?
No. It reports that an intermediary’s attempt to open a connection timed out. Network path, routing, firewall behaviour and upstream capacity may be involved. The origin’s overall health cannot be established from one observation. Keep a correlation identifier and investigate the actual next-hop path.
Can an origin server generate Proxy-Status?
RFC 9209 states that origin servers must not generate the field. Its role belongs to intermediaries. An application can provide its own structured diagnostic body or response identifiers, but it should not impersonate a proxy by inserting this field as an origin.
Are Proxy-Status entries cryptographically authenticated?
Not by RFC 9209 itself. The transport to a trusted peer and logs controlled by an operator can contribute external assurance, but this field does not carry its own signature or certify the correctness of reported claims. Security-sensitive decisions need independently trustworthy inputs.
Should a client retry whenever it sees a proxy error token?
No. Read-only calls may be retryable with bounded limits; writes may have already committed even where the response fails. Retry only under the API’s documented idempotency, reconciliation and authorisation rules. Never interpret the diagnostic token as permission to ignore a rate limit or access rule.
Why might the field disappear between services?
An intermediary may choose not to emit it, a gateway may remove prior members to protect topology, a trailer may be dropped, or a component may not support the feature. Missing telemetry is not proof of a healthy path. Operational teams should explicitly measure coverage and avoid inventing unseen hops.
Is next-hop-aliases always a reliable DNS record?
No. RFC 9532 explains that the field may be incomplete, does not convey DNSSEC verification, and only has the trustworthiness of the reporting intermediary and its resolver path. Treat it as a hint for corroborated analysis rather than a certificate of identity.
Is Proxy-Status enough to measure an agent’s success rate?
No. Success belongs to a defined application task, such as correctly retrieving a document or confirming a write. Proxy-Status describes intermediate HTTP handling. Combine final HTTP response, validated application result, operation receipts, task-level checks and network diagnostics. State the denominator for each statistic rather than mixing proxy events with user outcomes.
What to read next and which sources to trust
For the field’s normative definitions and error registry, consult RFC 9209: The Proxy-Status HTTP Response Header Field and the IANA HTTP Proxy-Status registry. The IANA register was last updated on 21 August 2026 when checked for this guide; its living entries take precedence over an old copied list. For the DNS alias extension, use RFC 9532. For the current general Structured Fields parser standard, consult RFC 9651.
A useful learning route is to first understand the difference between a user’s final HTTP status and an intermediary’s received-status, then master the structured list of intermediary members, then study the error categories, and only then design the agent’s retry and incident-handling policy. That order prevents an error label from becoming an unexamined instruction. Readers interested in how technical protocols fit into a wider educational framework can visit the How Super Intelligence Works learning hub.
The larger idea is modest but powerful: a diagnostic message can narrow uncertainty without eliminating it. The responsible agent records what each hop claims to have observed, verifies what the application actually did, protects confidential infrastructure details and changes behaviour only when authorised evidence supports the change.