> There are two distinct approaches to parsing IPv4 literal addresses. One is > the Java baseline "strict" syntax (all-decimal d.d.d.d form family), another > one is the "loose" syntax of RFC 6943 section 3.1.1 [1] (POSIX `inet_addr` > allowing octal and hexadecimal forms [2]). The goal of this PR is to provide > interface to construct InetAddress objects from literal addresses in POSIX > form, to applications that need to mimic the behavior of `inet_addr` used by > standard network utilities such as netcat/curl/wget and the majority of web > browsers. At present time, there's no way to construct `InetAddress` object > from such literal addresses because the existing APIs such as > `InetAddress.getByName()`, `InetAddress#ofLiteral()` and > `Inet4Address#ofLiteral()` will consume an address and successfully parse it > as decimal, regardless of the octal prefix. Hence, the resulting object will > point to a different IP address. > > Historically `InetAddress.getByName()/.getAllByName()` were the only way to > convert a literal address into an InetAddress object. `getAllByName()` API > relies on POSIX `getaddrinfo` / `inet_addr` which parses IP address segments > with `strtoul` (accepts octal and hexadecimal bases). > > The fallback to `getaddrinfo` is undesirable as it may end up with network > queries (blocking mode), if `inet_addr` rejects the input literal address. > The Java standard explicitly says that > > "If a literal IP address is supplied, only the validity of the address format > is checked." > > @AlekseiEfimov contributed JDK-8272215 [3] that adds new factory methods > `.ofLiteral()` to `InetAddress` classes. Although the new API is not affected > by the `getaddrinfo` fallback issue, it is not sufficient for an application > that needs to interoperate with external tooling that follows POSIX standard. > In the current state, `InetAddress#ofLiteral()` and > `Inet4Address#ofLiteral()` will consume the input literal address and > (regardless of the octal prefix) parse it as decimal numbers. Hence, it's not > possible to reliably construct an `InetAddress` object from a literal address > in POSIX form that would point to the desired host. > > It is proposed to extend the factory methods with > `Inet4Address#ofPosixLiteral()` that allows parsing literal IP(v4) addresses > in "loose" syntax, compatible with `inet_addr` POSIX api. The implementation > is based on `.isBsdParsableV4()` method added along with JDK-8277608 [4]. The > changes in the original algorithm are as follows: > > - `IPAddressUtil#parseBsdLiteralV4()` method is e...
Sergey Chernyshev has updated the pull request incrementally with one additional commit since the last revision: changed class level docs ------------- Changes: - all: https://git.openjdk.org/jdk/pull/18493/files - new: https://git.openjdk.org/jdk/pull/18493/files/e07dafad..6a7a310c Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=18493&range=07 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=18493&range=06-07 Stats: 3 lines in 1 file changed: 0 ins; 0 del; 3 mod Patch: https://git.openjdk.org/jdk/pull/18493.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/18493/head:pull/18493 PR: https://git.openjdk.org/jdk/pull/18493