ClickHouse / ClickHouse/clickhouse-java

Allow configuring HTTP redirect strategy for Apache HTTP Client

Open
#2,776 3 comments 0 reactions 0 assignees View on GitHub
client-api-v2 enhancement
Dominant language
Java
Stars
1.6k
Forks
636
Avg merge
2d 23h
Merged PRs (30d)
29

Description

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

Contributor guide

Open the contributing guide

Research direction

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.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
api, backend
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.