Skip to content

Commit 3dbc73f

Browse files
author
Nicolai Parlog
committed
Demonstrate address resolution SPI
1 parent 72f7b11 commit 3dbc73f

File tree

5 files changed

+85
-0
lines changed

5 files changed

+85
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ Check out the [jpms](http://blog.codefx.org/tag/jpms/) tag on my blog, [this dem
8989

9090
## New APIs
9191

92+
*[address resolution SPI](src/main/java/org/codefx/demo/java18/api/ip_resolution) ([JEP 418](http://openjdk.java.net/jeps/418))
9293
*[random generator](src/main/java/org/codefx/demo/java17/api/random) ([article](https://nipafx.dev/java-random-generator/), [JEP 356](https://openjdk.java.net/jeps/356), [very good Javadoc](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/random/package-summary.html))
9394
*[Unix domain sockets](src/main/java/org/codefx/demo/java16/api/unix_sockets) ([article](https://nipafx.dev/java-unix-domain-sockets/), [JEP-380](https://openjdk.java.net/jeps/380))
9495
* ⑪ HTTP/2 client: [simple](src/main/java/org/codefx/demo/java11/api/http2/Http2Api.java), [more formal](src/main/java/org/codefx/demo/java11/api/http2/formalized) ([tutorial](https://blog.codefx.org/java/http-2-api-tutorial/), [reactive request/response bodies](https://blog.codefx.org/java/reactive-http-2-requests-responses/))

src/main/java/module-info.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import org.codefx.demo.java17.api.random.Xkcd;
2+
import org.codefx.demo.java18.api.ip_resolution.ForwardingInetAddressResolverProvider;
23

4+
import java.net.spi.InetAddressResolverProvider;
35
import java.util.random.RandomGenerator;
46

57
/**
@@ -12,4 +14,5 @@
1214
requires java.net.http;
1315

1416
provides RandomGenerator with Xkcd;
17+
provides InetAddressResolverProvider with ForwardingInetAddressResolverProvider;
1518
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package org.codefx.demo.java18.api.ip_resolution;
2+
3+
import java.net.InetAddress;
4+
import java.net.UnknownHostException;
5+
import java.net.spi.InetAddressResolver;
6+
import java.util.Arrays;
7+
import java.util.stream.Stream;
8+
9+
/**
10+
* An {@link InetAddressResolver} that simply forwards to the builtin resolver.
11+
* It acts as a starting point for adding custom behavior to host and address resolution.
12+
*/
13+
public class ForwardingInetAddressResolver implements InetAddressResolver {
14+
15+
private InetAddressResolver builtinResolver;
16+
17+
public ForwardingInetAddressResolver(InetAddressResolver builtinResolver) {
18+
this.builtinResolver = builtinResolver;
19+
}
20+
21+
@Override
22+
public Stream<InetAddress> lookupByName(String host, LookupPolicy lookupPolicy) throws UnknownHostException {
23+
System.out.printf("Looking up '%s'.%n", host);
24+
return builtinResolver.lookupByName(host, lookupPolicy);
25+
}
26+
27+
@Override
28+
public String lookupByAddress(byte[] addr) throws UnknownHostException {
29+
System.out.printf("Looking up '%s'.%n", Arrays.toString(addr));
30+
return builtinResolver.lookupByAddress(addr);
31+
}
32+
33+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.codefx.demo.java18.api.ip_resolution;
2+
3+
import java.net.spi.InetAddressResolver;
4+
import java.net.spi.InetAddressResolverProvider;
5+
6+
public class ForwardingInetAddressResolverProvider extends InetAddressResolverProvider {
7+
8+
@Override
9+
public InetAddressResolver get(Configuration configuration) {
10+
return new ForwardingInetAddressResolver(configuration.builtinResolver());
11+
}
12+
13+
@Override
14+
public String name() {
15+
return "Injectable";
16+
}
17+
18+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.codefx.demo.java18.api.ip_resolution;
2+
3+
import java.net.URI;
4+
import java.net.http.HttpClient;
5+
import java.net.http.HttpRequest;
6+
7+
import static java.net.http.HttpResponse.BodyHandlers.ofLines;
8+
9+
/**
10+
* This demo sends a simple request to a website. If the project is wired up
11+
* correctly, the address resolution machinery picks up the other two classes
12+
* in this package and uses them for resolution, in which case you should see
13+
* a log message like "Looking up ..." on the command line for each request.
14+
*/
15+
public class ResolverDemo {
16+
17+
public static void main(String[] args) throws Exception {
18+
HttpClient client = HttpClient.newHttpClient();
19+
HttpRequest request = HttpRequest
20+
.newBuilder(new URI("https://nipafx.dev"))
21+
.GET()
22+
.build();
23+
client
24+
.send(request, ofLines())
25+
.body()
26+
.limit(5)
27+
.forEach(System.out::println);
28+
}
29+
30+
}

0 commit comments

Comments
 (0)