RFC 5234, "Augmented BNF for Syntax Specifications: ABNF", January 2008Source of RFC: IETF - NON WORKING GROUP
Area Assignment: app
Errata ID: 4040
Publication Format(s) : TEXT
Reported By: Chris Morgan
Date Reported: 2014-07-03
Rejected by: Barry Leiba
Date Rejected: 2014-07-04
Section B.1 says:
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
It should say:
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" / "a" / "b" / "c" / "d" / "e" / "f"
Various RFCs are quoting HEXDIG under the currently incorrect understanding that it includes a-f as well as 0-9 and A-F, and I believe this is the place where it should be changed, rather than altering them to use a different rule.
Here are a couple of examples of the problem this causes that came quickly to hand:
- RFC 7230: section 1.2 cites ?HEXDIG (hexadecimal 0-9/A-F/a-f)?, section 4.1 proceeds to use HEXDIG in chunk-size, which in RFC 2616 was HEX which did indeed include a-f.
- RFC 3986: it replaces the hex of RFC 2396, which included a-f, with this HEXDIG of RFC 2234 (of which this document is the latest form). This is then used in pct-encoded (percent-encoding in URLs), IPvFuture and h16 (IPv6 addresses), all of which can reasonably be expected to permit lowercase a-f as well as uppercase.
In Section 2.3, RFC 5234 explicitly says this:
ABNF strings are case insensitive and the character set for these
strings is US-ASCII.
So the definition of HEXDIG already allows for both upper and lower case (or a mixture).
It's true that some people aren't aware of that, and write their documents without understanding it. But it is not an error in 5234.