1. ホーム
  2. java

[解決済み] Http2におけるGoAway Frameとは何ですか、またRedirectsとの関連は何ですか?

2022-02-19 01:31:44

質問事項

私が知っているのは Java 9 が提供する HTTP/2 クライアント で、インキュベータモジュールを以下のコードで試しているところ。

// 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 の型の1つとしてリストアップされています。

jdk.incubator.http.internal.frame.Http2Frame

しかし、この内部クラスはあまり文書化されておらず、この型が何を表しているのかを正確に知ることはできません。JEPからのリンクでも同じように検索してみましたが、見つかりませんでした。

Q. GoAwayフレームとは何ですか?いつ、どのように使うのですか?

Q. リダイレクトを行わないクライアントを使用するようにコードを変更した場合、GET "stackoverflow.com"を試しても同じ例外が発生しないのはなぜでしょうか?

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

解決方法は?

で設定したように 仕様 ,

GOAWAYフレーム(type=0x7)を使用して、Graceful Shutdownを開始します。 は、サーバーによるコネクション

このフレームは、リダイレクトに続く2つ目の接続でサーバーから送信されていると思われます。

stackoverflow.comのすべてのURLはhttp/2接続を受け入れるのでしょうか?私のHTTP/2-SPDYブラウザプラグインのインジケータを見ると、そうではなさそうです。