Early Review of draft-ietf-httpapi-ratelimit-headers-10
review-ietf-httpapi-ratelimit-headers-10-httpdir-early-pardue-2026-01-16-00
| Request | Review of | draft-ietf-httpapi-ratelimit-headers |
|---|---|---|
| Requested revision | No specific revision (document currently at 10) | |
| Type | Early Review | |
| Team | HTTP Directorate (httpdir) | |
| Deadline | 2025-10-31 | |
| Requested | 2025-10-08 | |
| Requested by | Rich Salz | |
| Authors | Roberto Polli , Alex MartÃnez Ruiz , Darrel Miller | |
| I-D last updated | 2025-09-27 (Latest revision 2025-09-27) | |
| Completed reviews |
Httpdir Early review of -10
by Lucas Pardue
|
|
| Comments |
It would be great to have this before IETF 124. |
|
| Assignment | Reviewer | Lucas Pardue |
| State | Completed | |
| Request | Early review on draft-ietf-httpapi-ratelimit-headers by HTTP Directorate Assigned | |
| Reviewed revision | 10 | |
| Result | Not ready | |
| Completed | 2026-01-16 |
review-ietf-httpapi-ratelimit-headers-10-httpdir-early-pardue-2026-01-16-00
The document defines RateLimit header fields for HTTP that augment the extant Retry-After field and fill several capability gaps that affect concrete HTTP use cases. I am not a rate-limiting expert but the technical design presented seems sound. The range of examples presented in appendix B suggest that several aspects have been thoughtfully considered, especially with respect to slotting this in to the current ecosystem. However, I'm marking this document as not ready. Primarily this is because of the number of minor-ish things I noticed during the review, that add up to a document that seems to lack some precision of the core protocol elements, while containing some bloat that distracts. I believe a strong editorial pass through the document would improve the ability for new implementers to more easily pick this document and run with it. Below are a detailed set of notes captured during a single front-to-back review. As always, these comments are made as suggestions and I do not expect everyone of them to be actioned, especially if the authors have a suitable response. However, I think the parameter extensibility is the largest concern that does significant work in order to switch my review position. # Abstract 1. "thereby allowing clients to avoid being throttled" - I didn't understand this on first inspection and after having read the whole document I am still unclear. Are clients throttling themselves or trying to avoid being throttled. The usage of the term seems a bit loose. # Section 1 2. "Rate limiting of HTTP clients has become a widespread practice, especially for HTTP APIs. " - has become, or is? - is the reference to HTTP APIs important and justification for the "especially" qualifier? Nothing elsewhere in the document seemed to imply that. - what is rate limiting - cite HTTP at the earliest convenience, currently its later on in the document 3. "Typically, servers who do so so limit the number of acceptable" - This sentence seems clunky 4. "See Appendix A for further information on the current usage" - what is usage here? - about half the text in appendix A seems like it could be cut, especially interoperability issues. 5. "Currently, there is no standard way to communicate quotas" - at this stage its not super clear what is quota. You could probably just move some of the useful text from appendix A into the introduction to address that. - can probably drop the currently no standard bit, there will be once this draft is published 6. "RateLimit-Policy: a quota policy, defined by the server, that client HTTP requests will consume." - what does "requests will consume" mean here? Its a Passive voice. Consider rewording such as "RateLimit-Policy: a quota policy defined by the server. Client requests consume quota. 7. "RateLimit: the currently remaining quota available for a specific policy." - "currently" is ambiguous, would be clearer to be more specific e.g. "the remaining quota for a specific policy at the moment the response is generated" or whatever is technical correct for this doc 8. "These fields enable establishing complex rate limiting policies" - what is being established exactly? A server can make up a policy however it likes. It seems the intent is more about communicating and working with policies? # Section 1.1 9. The section is named "Goals" but it includes a mix of things. "interoperabilty" - seems superfluous, this is the goal of internet standards. Suggest dropping it. "resiliency" - ok "documentation" - never mentioned again Suggest you fold this section into the introduction by dropping the 2 distracting goals. The resiliency angle follows on nicely from the last sentence of section 1. # Section 1.2 10. * Why is Origin imported from [WEB-ORIGIN] not [HTTP]? 11. [SF] is not consistent with reference style, use [STRUCTURED-FIELDS] - https://httpwg.org/admin/editors/style-guide#reference-style # Section 2 12. Why have a terminology section when we already have a notational convention section? Perhaps rename 1.12 as Terms and Definitions and put it all in one place 13. What is a "resource server"? Probably want to change this to "server" or something otherwise aligned with HTTP terminology. 14. "Quota policies can be advertised by servers, but they are not required to be, and more than one quota policy can affect a given request from a client to a server." This is a bit of a long sentence with some awkward grammar. Suggest splitting into shorter sentences and rewriting "but are not required to be" to be clearer. "Request from a client to a server" is a superfluous statement. 15. List and Item are defined and they don't need to be because they are already imported # Section 3 16. The "RateLimit-Policy" response header field is a non-empty List[SF] of Quota Policy Items (Section 3.1). The Item[SF] value MUST be a String[SF]. - There seems to be a stress on non-empty but I'm unsure what this is supposed to represent. Stuctured fields states "An empty List is denoted by not serializing the field at all. This implies that fields defined as Lists have a default empty value.". So absence of the field can be interpreted as an empty List. There doesn't seem to be a clear statement about this "non-empty" condition so is it really important? - You might want to reword this sentence to "The "RateLimit-Policy" response header field is a List of Strings. Each list item identifies a Quota Policy (Section 3.1).", which would make it more compliant with https://httpwg.org/admin/editors/style-guide#structured-fields - The text in paragraph 2 should be reordered/restructured. Explain simply and clearly what the field is used for first. Requirements about its usage and relationship to other headers are secondary. The use of the normative MAY here, in reference to a different header, is confusing. 17. The field value SHOULD remain consistent over a sequence of HTTP responses. - This is a weak requirement. Who does it apply to? Is it on servers to send a consistent value (and if so, when does it make sense not to). It it on clients to detect inconsistencies, and if so what should they do? Under what circumstances might they be inconsistent but its not a problem? 18. Lists of Quota Policy Items (Section 3.1) can be split over multiple "RateLimit-Policy" fields in the same HTTP response as described in Section 3.1 of [SF]. - This is a hard to read statement that seems to have a minor technical problem. Why is it important to say this. The wording here - "same HTTP response" is in conflict with Section 3.1 of Structured Fields, which says "Lists can have their members split across multiple lines of the same header or trailer section". Restating things risks interoperability errors and affects long-term maintenance of protocol documents. - The example is immediately after the statement about splitting but does not demonstrate splitting, which is confusing. Suggest you put the example directly after the definitin of RateLimit-Policy field # Section 3.1 19. "A quota policy Item contains an identifier for the policy and a set of Parameters[SF] that contain information about a server's capacity allocation for the policy." - If applying suggestions above, you could rephrase this to something like "A Quota Policy is identified by a String, a set of Parameters describe mandatory and optional details of the policy." - In the list of defined parameters, please add forward references to the full definition, so that its a bit clearer the list is a summary. 20. "Other parameters are allowed and can be regarded as comments." - This seems dangerously permissive. Are you (un)intentionally shutting the door on potential extensibility? What is the use case for "comments"? If you have a concree use case, define a single optional parameter e.g. a `desc` field that is a String. Then think about whether it is human readable or not (i.e., whether you need language/locale etc). If you don't actually need that capability, state something along the lines that unknown extensions are ignored 21. "Implementation- or service-specific parameters SHOULD be prefixed parameters with a vendor identifier, e.g. acme-policy, acme-burst." - Oh, there we go, now we're saying that other parameters are expected. But by the above definition they are all comments? - This text indicates you need to do more work on the extensibiliy of parameters. There's a risk people will make a landgrab for parameters and burn the interop space. E.g. 1-character names are very appealing. It seems you'd benefit from an IANA registry and more policy (pun intended) about use of parameters. I suggest taking a look at https://www.rfc-editor.org/rfc/rfc9218.html#section-4.3 for some inspiration. 22. "This field MUST NOT appear in a trailer section." - This section is not about the RateLimit-Policy, so the requirement is in the wrong place. - Why can't the field appear in trailers? What should a client do if it sees one there? - That leads me on to wondering if there is a use case for sending RateLimit headers in 1xx responses? Not sure you need to say anything but maybe there's something here you didn't think about. 23. What is the expected behaviour for a client that receives a RateLimit-Policy header that does not fulfill all of the requirements? E.g. if a parameter has an invalid value # Section 3.2 24. Are these examples really useful? There's already an example next to the definition. Strongly suggest deleting it because it just list things that anyone can work out for themselves. 25. This field MAY convey the time window associated with the quota, as shown in this example: - The section is called examples but this is a normative requirement text. # Section 4 26. The style of definition is not entirely consistent with RateLimit-Policy, which is a little jaring. Whatever you choose to do to address my feedback in Section 3, it would be very beneficial to carry over here too. # Section 4.1 27. Same observations here as in 3.1. # Section 4.1.1 28. There is a reference to self. # Section 4.2 29. Again the examples don't seem particularly useful. In fact, I found the last two examples confusing when they change the units, presumably because the hypothetical RateLimit-Policy tat the example applies to uses different units. That is not abundantly clear. Again, suggest deleting the section. # Section 5 30. This is the first mention that the document defines problem types! The abstract and introduction would benefit from a short foreshadowing. 31. Since the use of problem types is optional, it might be more logical to push this section down behind your current sections 6 and 7. I.e., define the header fields then move onto how they are expected to be used # Section 6 32. "Servers should be careful when returning RateLimit header fields in redirection responses" - Given the scary language in this sentence, should this be a "SHOULD" 33. "A service using RateLimit header fields MUST NOT convey values exposing an unwanted volume of requests and SHOULD implement mechanisms to cap the ratio between the remaining and the reset parameter values (see Section 8.5); this is especially important when a quota policy uses a large time window." - It's not clear to me what a "service" is in this context. However, more importantly it seems like this is an unenforcable MUST NOT? The rest of the text seems useful to describing the potential issues and providing some recommendations but the use of MUST NOT seems like a lazy way of describing some of the risks. 34. "Under certain conditions, a server MAY artificially lower RateLimit header field values between subsequent requests." - I think I understand what you're trying to say but if I was to artificially lower the 't' parameter, wouldn't that allow a client to make more requests and increase load? Suggest you tighten up the text here. # Section 6.1 35. "The server SHOULD document how the partition key is generated so that clients can predict the key value for a future request and determine if there is sufficient quota remaining to execute the request." - I know we're in a new era of AI but I don't think the server will be documenting anything. Maybe the operator? I honestly have no clue what this normative requirement is trying to do. Earlier in the draft one of the goals is stated as eliminating the need for detailed API documentation. How would a client access the documentation recommended in this sentence? If there is no protocol for that, its not clear to me why it belongs in this draft. - Its unclear to me if partition keys are opaque byte sequences or is there supposed to be some aspect of client interop going on. Should the value be encrypted? There's some text in the security considerations but its not super clear to me. I tried to skip ahead to section 7.1 (consuming partition keys) but it didn't help much. - The above points indicate to me that the partition keys are perhaps a sub-protocol running over the RateLimit headers and that it might help to extact all of the taxt around partition keys into a separate section that combines client and server considerations. # Section 7.2 36. "An intermediary MAY alter the RateLimit header fields in such a way as to communicate a more restrictive quota policy when:" - This seems perhaps overly prescriptive? If I offer an intermediary service that scales better than the origin and does request collapsing, then why can't advertise a more permissive rate limit? You're already alluding to an intermediary being "aware of the quota unit semantic used by the Origin Server" so potentially that awareness allows it to make various appropiate decisions. # Appendix A 37. As noted above, it seems some of the useful text could be migrated to the main part of the document, while this appendix section is dropped entirely.