ClickHouse / ClickHouse/clickhouse-java
Allow configuring HTTP redirect strategy for Apache HTTP Client
- 主要言語
- Java
- スター
- 1.6k
- フォーク
- 636
- 平均マージ
- 2日 23時間
- マージ済み PR(30日)
- 29
説明
Description:
Currently, the Client.Builder does not expose any way to configure the redirect strategy for the underlying Apache HTTP Client 5. This causes issues in environments where ClickHouse cluster infrastructure uses HTTP redirects (e.g., load balancers, reverse proxies, or cluster coordinators that redirect requests to the appropriate shard/replica).
Root cause:
Apache HTTP Client 5 does not follow redirects for POST requests by default. Since the ClickHouse Java client uses POST for all operations (queries, inserts, commands), any HTTP redirect response (301, 302, 303, 307, 308) from the server-side infrastructure will result in a failed request instead of being transparently followed.
The relevant code is in HttpAPIClientHelper.createHttpClient() where HttpClientBuilder is used without setting a redirect strategy:
```
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
// No .setRedirectStrategy(...) call
return clientBuilder.build();
Expected behavior:
```
Client.Builder should provide a way to configure redirect following behavior, for example:
```
Client client = new Client.Builder()
.addEndpoint("http://my-cluster:8123")
.setUsername("user")
.setPassword("password")
.followRedirects(true) // follow redirects for POST requests
.build();
```
Or alternatively allow passing a custom RedirectStrategy implementation:
```
Client client = new Client.Builder()
.addEndpoint("http://my-cluster:8123")
.setUsername("user")
.setPassword("password")
.setRedirectStrategy(new DefaultRedirectStrategy())
.build();
```
Workaround:
Currently the only workaround is to patch the internal httpClient field inside HttpAPIClientHelper via reflection, which is fragile and not suitable for production use:
```
Field helperField = client.getClass().getDeclaredField("httpClientHelper");
helperField.setAccessible(true);
Object helper = helperField.get(client);
Field httpClientField = helper.getClass().getDeclaredField("httpClient");
httpClientField.setAccessible(true);
httpClientField.set(helper, HttpClientBuilder.create()
.setRedirectStrategy(new DefaultRedirectStrategy())
.build());
```
Environment:
clickhouse-java version: 0.9.4
Apache HTTP Client 5 (HC5)
ClickHouse server behind a load balancer / reverse proxy with HTTP redirects enabled
コントリビューションガイド
調査の方向性
Start in HttpAPIClientHelper.createHttpClient(), where HttpClientBuilder is created without a redirect strategy, and trace how Client.Builder constructs the helper. Review the proposed followRedirects or setRedirectStrategy API and determine how it should affect POST redirects. Done means the builder exposes the chosen configuration and requests can follow the supported redirect responses without reflection.
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- java
- 領域
- api, backend
- issue の種類
- 機能追加
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 55/100