Example of clicking on the Jetty HTTP / 2 server

The Jetty HTTP / 2 client with server support was implemented in Jetty 9.3 RC ( Link ). However, I did not find any documentation or sample code related to this. Can someone provide an example of a code, for example, to get a pushed resource from this site: https://nghttp2.org (public server with http2 server click activated )

--- UPDATE 1 --- I tried to test this file as sbordet said. However, after executing this line

mvn compile exec:java 

I ran into this error

 [INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ http2client --- 2015-05-05 01:52:47.808:INFO::com.example.Client.main(): Logging initialized @3096ms [WARNING] java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293) at java.lang.Thread.run(Thread.java:745) Caused by: java.util.concurrent.TimeoutException at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:130) at com.example.Client.main(Client.java:55) ... 6 more 

Here is my pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>http2client</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>http2client</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>org.eclipse.jetty.http2</groupId> <artifactId>http2-client</artifactId> <version>9.3.0.M2</version> </dependency> <dependency> <groupId>org.mortbay.jetty.alpn</groupId> <artifactId>alpn-boot</artifactId> <version>8.1.3.v20150130</version> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.4.0</version> <executions> <execution> <goals> <goal>java</goal> </goals> </execution> </executions> <configuration> <mainClass>com.example.Client</mainClass> </configuration> </plugin> </plugins> </build> 

And here is my project directory

 |-- pom.xml |-- src | `-- main | `-- java | `-- com | `-- example | `-- Client.java `-- target |-- classes | `-- com | `-- example | |-- Client$1.class | `-- Client.class `-- maven-status `-- maven-compiler-plugin `-- compile `-- default-compile |-- createdFiles.lst `-- inputFiles.lst 

--- UPDATE 2 ---

Changed the pom.xml <build> : (explicitly use JDK 8 and add -Xbootclasspath to point to alpn-boot.jar provided by Jetty). I am using Java 8 update 31

 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.4.0</version> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <arguments> <argument>-Xbootclasspath/p:/path/to/alpn-boot-8.1.3.v20150130.jar</argument> <argument>-classpath</argument> <classpath/> <argument>com.example.Client</argument> </arguments> </configuration> </plugin> </plugins> </build> 

After executing this command:

 mvn clean compile exec:exec 

I got this error when trying to connect to https://webtide.com/ (the default host in the Client.java file)

 [INFO] --- exec-maven-plugin:1.4.0:exec (default-cli) @ http2client --- 2015-05-05 13:19:25.499:INFO::main: Logging initialized @153ms Exception in thread "main" java.util.concurrent.TimeoutException at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:130) at com.example.Client.main(Client.java:55) 

And this error when connecting to https://nghttp2.org/

 [INFO] --- exec-maven-plugin:1.4.0:exec (default-cli) @ http2client --- 2015-05-05 13:29:12.106:INFO::main: Logging initialized @196ms Exception in thread "main" java.util.concurrent.TimeoutException at java.util.concurrent.Phaser.awaitAdvanceInterruptibly(Phaser.java:800) at com.example.Client.main(Client.java:90) 

--- UPDATE 3 ---

Let's take a different approach: when I pull out the entire main branch of the berth project project and then create the Intellij project in jetty.project/jetty-http2/http2-client , then it works for the public servers https://webtide.com and https: // nghttp2.org . But when I test it on my self-signed http2 certificate server (using nghttp2 + nginx while in my virtual machine), I get this error

 2015-05-05 19:05:25.094:INFO::main: Logging initialized @220ms Exception in thread "main" java.util.concurrent.ExecutionException: java.nio.channels.ClosedChannelException at org.eclipse.jetty.util.FuturePromise.get(FuturePromise.java:138) at org.eclipse.jetty.http2.client.Client.main(Client.java:55) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) Caused by: java.nio.channels.ClosedChannelException at org.eclipse.jetty.http2.HTTP2Flusher.append(HTTP2Flusher.java:110) at org.eclipse.jetty.http2.HTTP2Session.frame(HTTP2Session.java:577) at org.eclipse.jetty.http2.HTTP2Session.frames(HTTP2Session.java:559) at org.eclipse.jetty.http2.client.HTTP2ClientConnectionFactory$HTTP2ClientConnection.onOpen(HTTP2ClientConnectionFactory.java:121) 
+5
source share
2 answers

In the message indicated in the question, HTTP / 2 transport for Jetty HttpClient .

Jetty HttpClient provides a common HTTP API for applications that must work with HTTP 1.0, 1.1, and 2.0, and therefore HttpClient does not provide an API for receiving HTTP / 2 push resources, since they are a kind of HTTP / 2 only mechanism.

If you really want to interact with the HTTP / 2 API, you can use the Jetty HTTP2Client , which provides a lower-level HTTP / 2-specific API for applications.

You can find a complete example of connecting to a website that redirects resources (in this case https://webtide.com ) here .

+3
source

Reply to UPDATE 3 :

Use another SslContextFactory constructor that has the trustAll boolean arguments:

 SslContextFactory sslContextFactory = new SslContextFactory(true); 

All code:

 HTTP2Client client = new HTTP2Client(); SslContextFactory sslContextFactory = new SslContextFactory(); client.addBean(sslContextFactory); client.start(); 
+1
source

All Articles