プロキシ認証の再試行に向けた Jersey 2 アップロードのバッファリング
認証ネゴシエーションでアップロードを再送する必要があるとき、Jersey 2 の Apache コネクタのリクエストエンティティを繰り返し可能にします。
プロキシのチャレンジ後に再試行されるアップロードは、ボディをもう一度必要とします。Jersey 2 の Apache コネクタでは、そのクライアントを構築する設定でバッファ付きエンティティ処理を選びます:
ClientConfig config = new ClientConfig();
config.connectorProvider(new ApacheConnectorProvider());
config.property(ClientProperties.PROXY_URI,
"http://proxy.example.net:8080");
config.property(ClientProperties.REQUEST_ENTITY_PROCESSING,
RequestEntityProcessing.BUFFERED);生成されたクライアントでアップロードを実行します。これらの型は Jersey client と Apache-connector のパッケージに由来します。使われない設定を指定してもリクエストには影響しません。
コネクタはバッファ付きエンティティを Apache の BufferedHttpEntity で包みます。バッファなしのストリーミングエンティティは繰り返せません。バッファリングにより、消費済みのプロデューサを読み直す代わりに、認証フローへ再送できるバイト列が渡されます。
これは 407 の 1 回で認証が終わることを保証しません。方式によっては正当に複数回のやり取りを要するため、さらなるチャレンジを状態の喪失と見なす前にネゴシエーション全体を確認してください。
ボディのサイズをメモリ予算内に保ちます。大きなストリーミングアップロードにはその負荷に適した再送戦略が必要です。すべてのリクエストでバッファリングを有効にすると、ネゴシエーションの失敗と引き換えにメモリ枯渇を招くことがあります。