【问题标题】:What is a GoAway Frame in Http2 and how is it linked to Redirects?什么是 Http2 中的 GoAway Frame,它如何与重定向相关联?
【发布时间】:2018-03-06 01:18:44
【问题描述】:

我知道HTTP/2 Client provided by Java 9 并在使用以下代码尝试孵化器模块时:

// Request builder
URI uri = new URI("http://www.stackoverflow.com/"); // using www.google.com gives me some payload with no exception
HttpRequest request = HttpRequest.newBuilder().uri(uri).GET().build();

// Client
HttpClient httpClient = HttpClient.newBuilder().followRedirects(HttpClient.Redirect.ALWAYS).build();
System.out.println(httpClient.version());

// Response builder
HttpResponse response = httpClient.send(request, HttpResponse.BodyHandler.asString());

System.out.println("statusCode = " + response.statusCode()); // 200 for google.com

我收到了这个作为输出:

Exception in thread "main" java.io.IOException: /192.168.0.2:60726: GOAWAY received
  at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.handleGoAway(Http2Connection.java:613)
  at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.handleConnectionFrame(Http2Connection.java:531)
  at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.processFrame(Http2Connection.java:466)
  at jdk.incubator.httpclient/jdk.incubator.http.internal.frame.FramesDecoder.decode(FramesDecoder.java:114)
  at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection$FramesController.processReceivedData(Http2Connection.java:152)
  at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.asyncReceive(Http2Connection.java:425)
  at jdk.incubator.httpclient/jdk.incubator.http.AsyncSSLDelegate.upperRead(AsyncSSLDelegate.java:557)
  at jdk.incubator.httpclient/jdk.incubator.http.internal.common.Queue.put(Queue.java:73)
  at jdk.incubator.httpclient/jdk.incubator.http.AsyncSSLDelegate.asyncReceive(AsyncSSLDelegate.java:503)
  at jdk.incubator.httpclient/jdk.incubator.http.PlainHttpConnection.asyncRead(PlainHttpConnection.java:300)
  at jdk.incubator.httpclient/jdk.incubator.http.PlainHttpConnection$ReadEvent.handle(PlainHttpConnection.java:395)
  at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:438)
  at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:408)

向下移动堆栈跟踪,我发现GOAWAY 被列为一种类型

jdk.incubator.http.internal.frame.Http2Frame

但是内部类并没有太多文档可以准确地找到这种类型代表什么。我也尝试在 JEP 的链接上搜索相同的内容,但找不到。

问。什么是GoAway Frame?何时以及如何使用?

Q.为什么如果我更改我的代码以使用客户端而不遵循重定向尝试获取“stackoverflow.com”我没有得到相同的异常?

HttpClient httpClient = HttpClient.newBuilder().build();

【问题讨论】:

    标签: java http http-redirect http2 java-9


    【解决方案1】:

    specifications中所设置,

    GOAWAY 帧(类型=0x7)用于启动正常关闭 服务器的连接。

    很可能该帧是由服务器在第二个连接上发送的,即重定向之后的那个。

    stackoverflow.com 上的所有 URL 都接受 http/2 连接吗?在查看我的 HTTP/2-SPDY 浏览器插件的指示器时,情况似乎并非如此。

    【讨论】:

    • 感谢您的文档。您能否详细说明服务器在第二个连接上发送帧为什么一开始不会发生这种情况,当我删除以下重定向时,服务器不会尝试重定向(因为它会导致 200)?
    • 我在考虑以下场景:第一次连接是通过 http/2 发生的,它重定向到(重定向)URL。然后客户端尝试通过 HTTP/2 访问该 URL,但是响应该 URL 上的请求的服务器不支持 HTTP/2 => GOAWAY。如果您指示您的 http 客户端不遵循重定向,它不应该尝试访问重定向 URL(...我不明白在那种情况下您是如何获得 200 的)
    • 似乎链接已失效。我在 GOAWAY 框架中收到错误代码。有没有错误码和描述的映射关系?
    • “走开”这个表达方式可以呈现为“优雅”吗?
    【解决方案2】:

    从 HTTP/1.1 重定向并通过 TLS 升级到 HTTP/2 错误地包含升级标头。此问题已提交

    https://bugs.openjdk.java.net/browse/JDK-8198709

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 2012-06-23
      • 2017-10-26
      • 1970-01-01
      • 2013-12-18
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多