私はhttpclient 4.2.5を使用して、リダイレクトも処理する必要があるhttpリクエストを作成しています。コンテキストを理解するための小さな例を次に示します。
- A は HTTP 要求を (httpclient 4.2.5 を使用して) B に送信します。
- B は 302 リダイレクト (C への URL を含む) を A に送り返します。
- A は C へのリダイレクトに従います
- C はリクエスト URL を取得し、それを処理します
C が (HttpServlet API) によってリクエスト URL を解析する場合request.getRequestURL()
、ステップ 1 からの元のリクエストのホストとポートなどが含まれますが、これは誤りです。
問題は、httpclient がリダイレクトを処理するステップ 2 に存在します。元のリクエスト (ステップ 1) から現在のリクエスト (ステップ 3) にすべてのヘッダーをコピーするだけです。grepcode:
DefaultRequestDirectorを介して、責任あるコードを既に確認しました。
HttpUriRequest redirect = redirectStrategy.getRedirect(request, response, context);
HttpRequest orig = request.getOriginal();
redirect.setHeaders(orig.getAllHeaders());
元のリクエストのすべてのヘッダーが現在のリクエストにコピーされる理由がよくわかりません。
たとえば、単純なテストに cURL を使用すると、期待どおりに動作します。C は正しいホストとポートを受け取ります。
元のヘッダーがその後にコピーされるため、独自のリダイレクト戦略を実装しても役に立ちません。