[undertow-dev] Enable HTTP/2 and get JDK9 ALPN not supported

Steve Hu stevehu at gmail.com
Wed Mar 22 17:53:15 EDT 2017


It works. Thanks a lot for your help. I will add two more http/2 post test
cases and give you a pull request.

On Wed, Mar 22, 2017 at 5:01 PM, Stuart Douglas <sdouglas at redhat.com> wrote:

> The issue is that it is reporting the wrong protocol in the response,
> I have fixed this upstream.
>
> Stuart
>
> On Thu, Mar 23, 2017 at 1:31 AM, Steve Hu <stevehu at gmail.com> wrote:
> > Hi Stuart,
> >
> > Thanks for the upgrade handler fix. I can clearly see the handler is
> > registered and handleRequest is called in a debug session. I also
> replaced
> > EMPTY option with OptionMap.create(UndertowOptions.ENABLE_HTTP2, true)
> when
> > opening client connection. The response protocol is still HTTP/1.1 for
> both
> > http and https requests. The following is the output from the console and
> > the syched/updated source code can be found
> > https://github.com/stevehu/undertow/blob/master/core/src/
> test/java/io/undertow/client/http/Http2ClientTestCase.java
> >
> > 10:16:43,804 INFO  (main) [org.xnio] <Xnio.java:99> XNIO version
> 3.3.6.Final
> > 10:16:43,829 INFO  (main) [org.xnio.nio] <NioXnio.java:55> XNIO NIO
> > Implementation Version 3.3.6.Final
> > 10:17:42,980 DEBUG (main) [io.undertow.request.io]
> <Http2Channel.java:753>
> > Sending goaway on channel Http2Channel peer localhost/127.0.0.1:7778
> local
> > /127.0.0.1:64696[ No Receiver [] -- [] -- []]:
> > java.nio.channels.ClosedChannelException
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:753)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:744)
> > at
> > io.undertow.client.http2.Http2ClientConnection.close(
> Http2ClientConnection.java:312)
> > at org.xnio.IoUtils.safeClose(IoUtils.java:134)
> > at
> > io.undertow.client.http.Http2ClientTestCase.testHttpsConnectionClose(
> Http2ClientTestCase.java:245)
> > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> > HTTP/1.1
> > at
> > sun.reflect.NativeMethodAccessorImpl.invoke(
> NativeMethodAccessorImpl.java:62)
> > at
> > sun.reflect.DelegatingMethodAccessorImpl.invoke(
> DelegatingMethodAccessorImpl.java:43)
> > at java.lang.reflect.Method.invoke(Method.java:498)
> > at
> > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(
> FrameworkMethod.java:50)
> > at
> > org.junit.internal.runners.model.ReflectiveCallable.run(
> ReflectiveCallable.java:12)
> > at
> > org.junit.runners.model.FrameworkMethod.invokeExplosively(
> FrameworkMethod.java:47)
> > at
> > org.junit.internal.runners.statements.InvokeMethod.
> evaluate(InvokeMethod.java:17)
> > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> > at
> > org.junit.runners.BlockJUnit4ClassRunner.runChild(
> BlockJUnit4ClassRunner.java:78)
> > at
> > org.junit.runners.BlockJUnit4ClassRunner.runChild(
> BlockJUnit4ClassRunner.java:57)
> > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> > at
> > org.junit.internal.runners.statements.RunBefores.
> evaluate(RunBefores.java:26)
> > at
> > org.junit.internal.runners.statements.RunAfters.evaluate(
> RunAfters.java:27)
> > at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> > at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> > at
> > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(
> JUnit4IdeaTestRunner.java:117)
> > at
> > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(
> JUnit4IdeaTestRunner.java:42)
> > at
> > com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(
> JUnitStarter.java:262)
> > at com.intellij.rt.execution.junit.JUnitStarter.main(
> JUnitStarter.java:84)
> >
> > 10:17:42,986 DEBUG (Client I/O-7) [io.undertow.request.io]
> > <AbstractFramedChannel.java:791> Channel Http2Channel peer
> > localhost/127.0.0.1:7778 local /127.0.0.1:64696[ No Receiver [] -- []
> -- []]
> > is being closed: java.nio.channels.ClosedChannelException
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> close(AbstractFramedChannel.java:791)
> > at org.xnio.IoUtils.safeClose(IoUtils.java:134)
> > at
> > io.undertow.protocols.http2.Http2Channel$3.handleEvent(
> Http2Channel.java:762)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at org.xnio.ChannelListeners$14.handleEvent(ChannelListeners.java:421)
> > at org.xnio.ChannelListeners$14.handleEvent(ChannelListeners.java:409)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedStreamSinkChanne
> l$1.run(AbstractFramedStreamSinkChannel.java:212)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> 3.run(AbstractFramedChannel.java:231)
> > at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:580)
> > at org.xnio.nio.WorkerThread.run(WorkerThread.java:464)
> >
> > 10:17:42,986 DEBUG (XNIO-1 I/O-7) [io.undertow.request.io]
> > <Http2Channel.java:753> Sending goaway on channel Http2Channel peer
> > /127.0.0.1:64696 local /127.0.0.1:7778[ No Receiver [] -- [] -- []]:
> > java.nio.channels.ClosedChannelException
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:753)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:744)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannelImpl(
> Http2Channel.java:478)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:317)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:65)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> receive(AbstractFramedChannel.java:452)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:106)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:57)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:931)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:912)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.
> readReady(ReadReadyHandler.java:66)
> > at
> > io.undertow.protocols.ssl.SslConduit$SslReadReadyHandler.readReady(
> SslConduit.java:1129)
> > at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88)
> > at org.xnio.nio.WorkerThread.run(WorkerThread.java:559)
> >
> > 10:17:42,988 DEBUG (XNIO-1 I/O-7) [io.undertow.request.io]
> > <AbstractFramedChannel.java:791> Channel Http2Channel peer /
> 127.0.0.1:64696
> > local /127.0.0.1:7778[ No Receiver [] -- [] -- []] is being closed:
> > java.nio.channels.ClosedChannelException
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> close(AbstractFramedChannel.java:791)
> > at org.xnio.IoUtils.safeClose(IoUtils.java:134)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:767)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:744)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannelImpl(
> Http2Channel.java:478)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:317)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:65)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> receive(AbstractFramedChannel.java:452)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:106)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:57)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:931)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:912)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.
> readReady(ReadReadyHandler.java:66)
> > at
> > io.undertow.protocols.ssl.SslConduit$SslReadReadyHandler.readReady(
> SslConduit.java:1129)
> > at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88)
> > at org.xnio.nio.WorkerThread.run(WorkerThread.java:559)
> >
> > 10:17:43,001 DEBUG (Client I/O-7) [io.undertow.request.io]
> > <Http2ClientConnection.java:458> UT005013: An IOException occurred:
> > java.nio.channels.ClosedChannelException
> > at
> > io.undertow.client.http2.Http2ClientConnection$Http2ReceiveListener.
> handleEvent(Http2ClientConnection.java:452)
> > at
> > io.undertow.client.http2.Http2ClientConnection$Http2ReceiveListener.
> handleEvent(Http2ClientConnection.java:366)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:931)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:912)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.
> readReady(ReadReadyHandler.java:66)
> > at
> > io.undertow.protocols.ssl.SslConduit$SslReadReadyHandler.readReady(
> SslConduit.java:1129)
> > at io.undertow.protocols.ssl.SslConduit$1.run(SslConduit.java:168)
> > at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:580)
> > at org.xnio.nio.WorkerThread.run(WorkerThread.java:464)
> >
> > HTTP/1.1
> > 10:20:14,473 DEBUG (main) [io.undertow.request.io]
> <Http2Channel.java:753>
> > Sending goaway on channel Http2Channel peer localhost/127.0.0.1:7777
> local
> > /127.0.0.1:64697[ No Receiver [] -- [] -- []]:
> > java.nio.channels.ClosedChannelException
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:753)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:744)
> >
> > at
> > io.undertow.client.http2.Http2ClientConnection.close(
> Http2ClientConnection.java:312)
> > at org.xnio.IoUtils.safeClose(IoUtils.java:134)
> > at
> > io.undertow.client.http.Http2ClientTestCase.testHttpConnectionClose(
> Http2ClientTestCase.java:220)
> > 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:498)
> > at
> > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(
> FrameworkMethod.java:50)
> > at
> > org.junit.internal.runners.model.ReflectiveCallable.run(
> ReflectiveCallable.java:12)
> > at
> > org.junit.runners.model.FrameworkMethod.invokeExplosively(
> FrameworkMethod.java:47)
> > at
> > org.junit.internal.runners.statements.InvokeMethod.
> evaluate(InvokeMethod.java:17)
> > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> > at
> > org.junit.runners.BlockJUnit4ClassRunner.runChild(
> BlockJUnit4ClassRunner.java:78)
> > at
> > org.junit.runners.BlockJUnit4ClassRunner.runChild(
> BlockJUnit4ClassRunner.java:57)
> > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> > at
> > org.junit.internal.runners.statements.RunBefores.
> evaluate(RunBefores.java:26)
> > at
> > org.junit.internal.runners.statements.RunAfters.evaluate(
> RunAfters.java:27)
> > at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> > at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> > at
> > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(
> JUnit4IdeaTestRunner.java:117)
> > at
> > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(
> JUnit4IdeaTestRunner.java:42)
> > at
> > com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(
> JUnitStarter.java:262)
> > at com.intellij.rt.execution.junit.JUnitStarter.main(
> JUnitStarter.java:84)
> >
> > 10:20:14,474 DEBUG (Client I/O-4) [io.undertow.request.io]
> > <AbstractFramedChannel.java:791> Channel Http2Channel peer
> > localhost/127.0.0.1:7777 local /127.0.0.1:64697[ No Receiver [] -- []
> -- []]
> > is being closed: java.nio.channels.ClosedChannelException
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> close(AbstractFramedChannel.java:791)
> > at org.xnio.IoUtils.safeClose(IoUtils.java:134)
> > at
> > io.undertow.protocols.http2.Http2Channel$3.handleEvent(
> Http2Channel.java:762)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at org.xnio.ChannelListeners$14.handleEvent(ChannelListeners.java:421)
> > at org.xnio.ChannelListeners$14.handleEvent(ChannelListeners.java:409)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at org.xnio.ChannelListeners$4.run(ChannelListeners.java:147)
> > at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:580)
> > at org.xnio.nio.WorkerThread.run(WorkerThread.java:464)
> >
> > 10:20:14,474 DEBUG (XNIO-1 I/O-1) [io.undertow.request.io]
> > <Http2Channel.java:753> Sending goaway on channel Http2Channel peer
> > /127.0.0.1:64697 local /127.0.0.1:7777[ No Receiver [] -- [] -- []]:
> > java.nio.channels.ClosedChannelException
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:753)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:744)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannelImpl(
> Http2Channel.java:478)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:317)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:65)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> receive(AbstractFramedChannel.java:452)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:106)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:57)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:931)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:912)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.
> readReady(ReadReadyHandler.java:66)
> > at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88)
> > at org.xnio.nio.WorkerThread.run(WorkerThread.java:559)
> >
> > 10:20:14,476 DEBUG (XNIO-1 I/O-1) [io.undertow.request.io]
> > <AbstractFramedChannel.java:791> Channel Http2Channel peer /
> 127.0.0.1:64697
> > local /127.0.0.1:7777[ No Receiver [] -- [] -- []] is being closed:
> > java.nio.channels.ClosedChannelException
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> close(AbstractFramedChannel.java:791)
> > at org.xnio.IoUtils.safeClose(IoUtils.java:134)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:767)
> > at
> > io.undertow.protocols.http2.Http2Channel.sendGoAway(
> Http2Channel.java:744)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannelImpl(
> Http2Channel.java:478)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:317)
> > at
> > io.undertow.protocols.http2.Http2Channel.createChannel(
> Http2Channel.java:65)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel.
> receive(AbstractFramedChannel.java:452)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:106)
> > at
> > io.undertow.server.protocol.http2.Http2ReceiveListener.handleEvent(
> Http2ReceiveListener.java:57)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:931)
> > at
> > io.undertow.server.protocol.framed.AbstractFramedChannel$
> FrameReadListener.handleEvent(AbstractFramedChannel.java:912)
> > at org.xnio.ChannelListeners.invokeChannelListener(
> ChannelListeners.java:92)
> > at
> > org.xnio.conduits.ReadReadyHandler$ChannelListenerHandler.
> readReady(ReadReadyHandler.java:66)
> > at org.xnio.nio.NioSocketConduit.handleReady(NioSocketConduit.java:88)
> > at org.xnio.nio.WorkerThread.run(WorkerThread.java:559)
> >
> >
> > On Tue, Mar 21, 2017 at 11:39 PM, Stuart Douglas <sdouglas at redhat.com>
> > wrote:
> >>
> >> On Wed, Mar 22, 2017 at 12:50 PM, Steve Hu <stevehu at gmail.com> wrote:
> >> > Hi Stuart,
> >> >
> >> > I debugged into the ALPN code and found some issues with Http2Client.
> >> >
> >> > I started with the Http2Server example and found
> >> > LoadBalancingProxyClient is
> >> > using an instance of UndertowClient which can only load HTTP1.1
> >> > ClientProviders. The following is the code to get ClientProvider and
> >> > only
> >> > "http" or "https" can be the return from uri.getSchema().
> >> >
> >> > ClientProvider provider = clientProviders.get(uri.getScheme());
> >> >
> >> > If this is true, then the communication between the proxy and Http/2
> >> > server
> >> > is Http/1.1
> >>
> >> You need to pass in the ENABLE_HTTP2 option in the OptionsMap. For
> >> http URI's this means that the client will attempt an upgrade on the
> >> first request, for https URI's ALPN will be used to try and negotiate
> >> HTTP/2. This is how browsers behave, and will work even if the target
> >> does not support HTTP/2.
> >>
> >> One thing I did notice that I fixed upstream was that the Undertow
> >> builder was not registering a HTTP2UpgradeHandler when HTTP/2 was
> >> enabled, which has been fixed.
> >>
> >> >
> >> > In addition, I have created a new class UndertowHttp2Client and
> >> > Http2ClientTestCase in my forked repo to try
> >> >
> >> > the Http2ClientProviders and found all three http2 client providers
> >> > don't
> >> > work as expected.
> >> >
> >> > h2c and h2-prior got 200 response code back during handshake and h2
> >> > works
> >> > but the connection is still http 1.1
> >>
> >> I think this was probably caused by the lack of the upgrade handler
> >> (well for h2c, h2c-prior should still work).
> >>
> >> Stuart
> >>
> >> >
> >> > I am debugging the ALPN code now but it is very slow as I have to dig
> >> > into
> >> > the spec to learn how the handshake works.
> >> >
> >> > As you have resolved the ALPN boot jar issue with the hack, I think
> >> > Undertow
> >> > is very usable for HTTP/2 and it would
> >> >
> >> > be perfect if the client is working as well. Could you please confirm
> my
> >> > findings and let me know direction I should
> >> >
> >> > focus on?
> >>
> >>
> >> >
> >> >
> >> > Thanks,
> >> >
> >> >
> >> > Steve
> >> >
> >> >
> >> > Here is my repo with UndertowHttp2Client and Test.
> >> >
> >> > https://github.com/stevehu/undertow
> >> >
> >> >
> >> > And here is the files I have added.
> >> >
> >> >
> >> > https://github.com/stevehu/undertow/blob/master/core/src/
> main/java/io/undertow/client/UndertowHttp2Client.java
> >> >
> >> >
> >> > https://github.com/stevehu/undertow/blob/master/core/src/
> test/java/io/undertow/client/http/Http2ClientTestCase.java
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > On Sun, Mar 19, 2017 at 8:23 PM, Stuart Douglas <sdouglas at redhat.com>
> >> > wrote:
> >> >>
> >> >> I don't really have time to do it (there is no real benefit for
> >> >> Undertow, so it is not high on my priority list), but the code is all
> >> >> Apache licensed so there is no reason why you can't start a project
> >> >> that provides this code as a standalone implementation.
> >> >>
> >> >> You would still need to implement code in Netty etc to actually use
> >> >> this as well, as there is no standardized ALPN API yet.
> >> >>
> >> >> Stuart
> >> >>
> >> >> On Mon, Mar 20, 2017 at 11:07 AM, Steve Hu <stevehu at gmail.com>
> wrote:
> >> >> > I am reading the code in client package and they look really good.
> As
> >> >> > currently none of the http/2 client library has a work around on
> alpn
> >> >> > boot
> >> >> > jar and this blocks majority of developers to move to http/2. I am
> >> >> > wondering
> >> >> > if you want to split client package to a standalone client module
> so
> >> >> > that it
> >> >> > can be used by other developers to connect to servers that
> implement
> >> >> > http/2.
> >> >> > If you are interested in it, I can help to create a pull request
> and
> >> >> > add
> >> >> > some test cases while I am working on my own client implementation.
> >> >> > Thanks.
> >> >> >
> >> >> > On Sun, Mar 19, 2017 at 5:32 PM, Stuart Douglas <
> sdouglas at redhat.com>
> >> >> > wrote:
> >> >> >>
> >> >> >> You could use Undertow's HTTP/2 client, although it's API was
> >> >> >> designed
> >> >> >> around the reverse proxy use case and as a result is not ideal for
> >> >> >> the
> >> >> >> general purpose HTTP client use case (although it is still
> perfectly
> >> >> >> usable).
> >> >> >>
> >> >> >> In terms of using Undertow's ALPN implementation with Netty etc it
> >> >> >> would require someone to port it over. The code is at [1] if you
> are
> >> >> >> interested.
> >> >> >>
> >> >> >> Stuart
> >> >> >>
> >> >> >> [1]
> >> >> >>
> >> >> >>
> >> >> >> https://github.com/undertow-io/undertow/blob/master/core/
> src/main/java/io/undertow/protocols/ssl/ALPNHackSSLEngine.java
> >> >> >>
> >> >> >> On Mon, Mar 20, 2017 at 7:21 AM, Steve Hu <stevehu at gmail.com>
> wrote:
> >> >> >> > Thanks Stuart for the quick response. Now I have server started
> >> >> >> > with
> >> >> >> > HTTP/2
> >> >> >> > and it works perfect with some client tools. Now I am looking
> for
> >> >> >> > Java
> >> >> >> > HTTP/2 client libraries to update my client module to support
> >> >> >> > HTTP/2
> >> >> >> > protocol for microservices communication. There are three major
> >> >> >> > libraries
> >> >> >> > okhttp, jetty and netty but all of them require Jetty's ALPN
> boot
> >> >> >> > JAR. I
> >> >> >> > saw
> >> >> >> > you have resolved the boot jar dependency in Undertow and am
> >> >> >> > wondering
> >> >> >> > if
> >> >> >> > you could point me to the right direction. Do you have any
> >> >> >> > recommendation
> >> >> >> > for HTTP/2 client library? How do you work around the alpn boot
> >> >> >> > jar?
> >> >> >> > Is
> >> >> >> > the
> >> >> >> > same solution can be used by okhttp, jetty and netty before
> Java 9
> >> >> >> > is
> >> >> >> > released?
> >> >> >> >
> >> >> >> >
> >> >> >> >
> >> >> >> > On Fri, Mar 17, 2017 at 11:03 PM, Stuart Douglas
> >> >> >> > <sdouglas at redhat.com>
> >> >> >> > wrote:
> >> >> >> >>
> >> >> >> >> No, that is a debug level message. The JDK8 ALPN provider
> should
> >> >> >> >> still
> >> >> >> >> be registered.
> >> >> >> >>
> >> >> >> >> Stuart
> >> >> >> >>
> >> >> >> >> On Sat, Mar 18, 2017 at 12:18 PM, Steve Hu <stevehu at gmail.com>
> >> >> >> >> wrote:
> >> >> >> >> > Hi,
> >> >> >> >> >
> >> >> >> >> > I searched this mailing list and one post mentioned that I
> >> >> >> >> > don't
> >> >> >> >> > need
> >> >> >> >> > to
> >> >> >> >> > use
> >> >> >> >> > -Xbootclasspath/p:<path_to_alpn_boot_jar> after 1.4.0Final.
> I
> >> >> >> >> > am
> >> >> >> >> > trying
> >> >> >> >> > HTTP/2 on my server with 1.4.10 and Oracle JDK 1.8 but when I
> >> >> >> >> > start
> >> >> >> >> > the
> >> >> >> >> > server I got the following error. Do I have to use OpenJDK 8?
> >> >> >> >> > If I
> >> >> >> >> > switch to
> >> >> >> >> > JBoss OpenSSL implementation?
> >> >> >> >> >
> >> >> >> >> > Thanks,
> >> >> >> >> >
> >> >> >> >> > Steve
> >> >> >> >> >
> >> >> >> >> > 21:00:36.468 [main]  DEBUG io.undertow - Configuring listener
> >> >> >> >> > with
> >> >> >> >> > protocol
> >> >> >> >> > HTTPS for interface 0.0.0.0 and port 8843
> >> >> >> >> >
> >> >> >> >> > 21:00:36.486 [main]  DEBUG io.undertow - JDK9 ALPN not
> >> >> >> >> > supported
> >> >> >> >> >
> >> >> >> >> > java.lang.NoSuchMethodException:
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > javax.net.ssl.SSLParameters.setApplicationProtocols([
> Ljava.lang.String;)
> >> >> >> >> >
> >> >> >> >> > at java.lang.Class.getMethod(Class.java:1786)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > io.undertow.protocols.alpn.JDK9AlpnProvider$1.run(
> JDK9AlpnProvider.java:47)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > io.undertow.protocols.alpn.JDK9AlpnProvider$1.run(
> JDK9AlpnProvider.java:43)
> >> >> >> >> >
> >> >> >> >> > at java.security.AccessController.doPrivileged(Native
> Method)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > io.undertow.protocols.alpn.JDK9AlpnProvider.<clinit>(
> JDK9AlpnProvider.java:43)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> > sun.reflect.NativeConstructorAccessorImpl.
> newInstance0(Native
> >> >> >> >> > Method)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > sun.reflect.NativeConstructorAccessorImpl.newInstance(
> NativeConstructorAccessorImpl.java:62)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(
> DelegatingConstructorAccessorImpl.java:45)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> > java.lang.reflect.Constructor.newInstance(Constructor.java:
> 423)
> >> >> >> >> >
> >> >> >> >> > at java.lang.Class.newInstance(Class.java:442)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > java.util.ServiceLoader$LazyIterator.nextService(
> ServiceLoader.java:380)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> > java.util.ServiceLoader$LazyIterator.next(
> ServiceLoader.java:404)
> >> >> >> >> >
> >> >> >> >> > at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> > io.undertow.protocols.alpn.ALPNManager.<init>(
> ALPNManager.java:40)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > io.undertow.protocols.alpn.ALPNManager.<clinit>(
> ALPNManager.java:35)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > io.undertow.server.protocol.http.AlpnOpenListener.<init>(
> AlpnOpenListener.java:67)
> >> >> >> >> >
> >> >> >> >> > at
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > io.undertow.server.protocol.http.AlpnOpenListener.<init>(
> AlpnOpenListener.java:90)
> >> >> >> >> >
> >> >> >> >> > at io.undertow.Undertow.start(Undertow.java:179)
> >> >> >> >> >
> >> >> >> >> > at com.networknt.server.Server.start(Server.java:170)
> >> >> >> >> >
> >> >> >> >> > at com.networknt.server.Server.main(Server.java:90)
> >> >> >> >> >
> >> >> >> >> > 21:00:36.503 [main]  INFO  com.networknt.server.Server -
> Https
> >> >> >> >> > Server
> >> >> >> >> > started on ip:0.0.0.0 Port:8843
> >> >> >> >> >
> >> >> >> >> >
> >> >> >> >> > _______________________________________________
> >> >> >> >> > undertow-dev mailing list
> >> >> >> >> > undertow-dev at lists.jboss.org
> >> >> >> >> > https://lists.jboss.org/mailman/listinfo/undertow-dev
> >> >> >> >
> >> >> >> >
> >> >> >
> >> >> >
> >> >
> >> >
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20170322/b97e65e1/attachment-0001.html 


More information about the undertow-dev mailing list