Open jub0bs opened 6 months ago
CC @neild @bradfitz
I'd be fine with adding httpguts.IsToken
, but the simple interim approach that doesn't require this proposal to be accepted is to add an internal isToken
function in net/http
:
// isToken reports whether v is a valid token (https://www.rfc-editor.org/rfc/rfc2616#section-2.2).
func isToken(v string) bool {
// For historical reasons, this function is called ValidHeaderFieldName (see issue #67031).
return httpguts.ValidHeaderFieldName(v)
}
@neild
the simple interim approach that doesn't require this proposal to be accepted is to add an internal
isToken
function innet/http
I'd be fine with that!
Proposal Details
According to RFC 9110 and RFC 6265, header-field names, methods, and cookie names all share the same production: token. However, the logic for validating tokens is duplicated across
x/net/http/httpguts
andnet/http
:net/http
relies onhttpguts.ValidHeaderFieldName
for validating header names in transport.go.net/http
relies on a combination ofstrings.IndexFunc
andhttpguts.IsTokenRune
for validating HTTP methods in method.go; andnet/http
relies on that same combination for validating cookie names in cookie.go./cc @neild
I propose the addition, in
x/net/http/httpguts
, of a function unifying the logic for validating tokens:Its implementation would be identical to
httpguts.ValidHeaderFieldName
's implementation at tip.Then, both method validation and cookie-name validation could simply call
httpguts.IsToken
.httpguts.ValidHeaderFieldName
would simply delegate tohttpguts.IsToken
. The former would then become redundant; perhaps it could be marked for deprecation, but I'm not sure what the best course of action is in this regard.(Of course, a simple alternative to all this would be to add no function to
httpguts
and instead rely onhttpguts.ValidHeaderFieldName
for all three types of validation; but such an approach feels semantically dishonest.)Beside the argument for reducing logic duplication, benchmarks indicate that the validation logic for methods and cookie names is not as fast as it could be (due in part to unnecessary UTF-8 decoding) and would benefit (at no extra cost) from
httpguts.ValidHeaderFieldName
's recent speedup:Although a speedup of method validation is unlikely to be noticeable in practice, a speedup of cookie-name validation may be noticeable in cases of requests containing many cookies and/or cookies with long names (esp. those that use cookie name prefixes like
__Secure-
and__Host-
).