2016-08-10 3 views
2

NettyでHTTP/2プッシュプロミスをテストしようとしていますが、動作していないようです。以下のような単純なようである場合に使用します。Netty HTTP/2 writePushPromiseはブラウザを無期限にループさせます

  1. リクエストホーム/インデックスページ
  2. インデックスページ私はPUSH_PROMISE
  3. index.jsのために書くと indexのページのフラッシュコンテンツを送信するよう index.jsファイルに依存します。ここで

私がやったことです:

int nextStreamId = encoder.connection().local().incrementAndGetNextStreamId(); 
String authority = request.headers().get("host"); 
Http2Headers pushHeaders = new DefaultHttp2Headers() 
    .method("GET") 
    .path("/assets/index.js") 
    .authority(authority) 
    .scheme("https"); 

encoder.writePushPromise(ctx, Integer.parseInt(streamId), nextStreamId, pushHeaders, 0, ctx.newPromise()); 

それが正常に/assets/index.jsファイルは、すべての時にロードされていませんし、ブラウザにPUSH_PROMISEを送ったが(ブラウザが応答を無期限待機)

これは、PUSH_PROMISEを送信したときにのみ発生し、すべての行が削除され、両方のファイル(HTML + j)がH2経由で適切に配信されます。

フルデモがPUSH_PROMISEのソースコードはhereある

(あなたが危険な警告を受け入れなければならないので、それが自己署名証明書を使用しています)here可能です。

何か間違っていますか?

ありがとうございました。

+0

オンラインでコードを送信していただきありがとうございます!理解して助けがとても簡単になります! –

答えて

2

サーバーはPUSH_PROMISEを送信していますが、実際にはデータを送信して約束したストリームを完了することはありません。 PUSH_PROMISE契約は、クライアントに「今後このデータを要求すると思うので、リクエストする必要はなく、このデータを送信するように努力しています。 PUSH_PROMISEを送信していないときのブラウザーの動作の違いに注目してください。この場合、あなたは、少なくとも2つの要求を取得:

  1. /
  2. /assets/index.jsを

は今、この動作を対比[お使いのブラウザはまた/favicon.ico要求することができます]あなたのサーバーはPUSH_PROMISEを送信するとき:

  1. /
  2. [お使いのブラウザかもしれませんLSO要求/favicon.ico]あなたは既にこの要求を予想し、その結果を送信する上で作業しているブラウザに語ったので、ブラウザでも「/assets/index.js」を要求しない

注意してください。したがって、PUSH_PROMSIEの後に "/assets/index.js"のデータを送信すると、ブラウザは満足できます。

+0

ありがとう! PUSH_PROMISEが間違っています!ブラウザはPUSH_PROMISEを取得したときに新しいリクエストを行うと考えられていました。 –

+0

こんにちはスコット、私はどのように新しいリクエスト(私がプッシュしたいもの)を処理するためにネチェットを送るのですか?または 'assets/index.js'のリクエストをどのようにして、正しいハンドラやパイプラインが実行されているかを確認するには?たとえば、アンダータウまたは桟橋はこれを自動的に行いますが、PUSH APIを使用するだけです。 –

関連する問題