与 Jetty HttpClient 9.3.6.v20151106 的代理 HTTP/2 Apple APN 连接

Posted

技术标签:

【中文标题】与 Jetty HttpClient 9.3.6.v20151106 的代理 HTTP/2 Apple APN 连接【英文标题】:Proxied HTTP/2 Apple APN connection with Jetty HttpClient 9.3.6.v20151106 【发布时间】:2016-04-24 19:41:07 【问题描述】:

我正在尝试使用经过身份验证的 HTTP 代理(如 Squid)通过新的 Apple APN HTTP/2 接口发送推送通知。

使用 Jetty HTTPClient 9.3.6.v20151106 我已经设法在不使用代理的情况下发送通知,遵循this page 上的代码。

Apple APN HTTP/2 API 需要 ALPN TLS 扩展。我使用的是 JavaSE 1.8.0_u40,所以我用 alpn-boot-8.1.3.v20150130.jar 修改了 JVM 引导类路径:

-Xbootclasspath/p:/latinia/dev/LIMSP/Collectors/AppleHTTP2/alpn-boot-8.1.3.v20150130.jar

现在我正在尝试通过 Squid 代理服务器建立 TLS 隧道。参考 Jetty 文档,代理配置如下:

        HttpProxy httpProxy = new HttpProxy("proxyHost", 3128);
        ProxyConfiguration proxyConfig = client.getProxyConfiguration();
        proxyConfig.getProxies().add(httpProxy);

当我使用代理集运行我的代码时,ALPN API 抛出一个内部异常:

Caused by: java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
at org.eclipse.jetty.alpn.ALPN.put(ALPN.java:149)
at org.eclipse.jetty.alpn.client.ALPNClientConnection.<init>(ALPNClientConnection.java:44)
at org.eclipse.jetty.alpn.client.ALPNClientConnectionFactory.newConnection(ALPNClientConnectionFactory.java:52)
at org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2.newConnection(HttpClientTransportOverHTTP2.java:150)
at org.eclipse.jetty.client.HttpProxy$HttpProxyClientConnectionFactory.newConnection(HttpProxy.java:84)
at org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2.lambda$doStart$0(HttpClientTransportOverHTTP2.java:80)
at org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2$$Lambda$2/1340328248.newConnection(Unknown Source)
at org.eclipse.jetty.http2.client.HTTP2Client$ClientSelectorManager.newConnection(HTTP2Client.java:334)
at org.eclipse.jetty.io.ManagedSelector.createEndPoint(ManagedSelector.java:411)
at org.eclipse.jetty.io.ManagedSelector.access$1600(ManagedSelector.java:56)
at org.eclipse.jetty.io.ManagedSelector$CreateEndPoint.run(ManagedSelector.java:587)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.execute(ExecuteProduceConsume.java:101)
at org.eclipse.jetty.io.ManagedSelector.run(ManagedSelector.java:136)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
at java.lang.Thread.run(Thread.java:745)

我不知道发生了什么 ¿ 有没有人成功做到这一点?

【问题讨论】:

【参考方案1】:

Jetty 9.3.8 修复了一些与转发代理处理相关的错误,例如您的示例。试试看吧。

【讨论】:

【参考方案2】:

我想你不能为这个版本。

9.3.8 版解决了您的 NPE 异常。

但是,HttpProxy 使用的 HttpClient 只使用一个传输客户端。当您尝试与代理通信时,它使用 HTTP/2 (PRI * HTTP/2.0) 而不是 HTTP/1.1。

我正在开发transportClient,它可以使用http 1.1 或http 2。选择取决于ALPN 协商。我正在尝试集成代理。

https://github.com/stephanemartin/jettyTests/tree/master/src/main/java/testjettys2

错误:https://github.com/eclipse/jetty.project/issues/250

【讨论】:

以上是关于与 Jetty HttpClient 9.3.6.v20151106 的代理 HTTP/2 Apple APN 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jetty HttpClient 中进行多部分/表单数据发布

总结httpclient资源释放和连接复用

如何使用 Jetty 客户端根据请求获取 bytesIn/bytesOut

冒泡排序(CPython)

Jetty 的工作原理以及与 Tomcat 的比较

jetty与tomcat