ClickHouse / ClickHouse/clickhouse-java

Allow configuring HTTP redirect strategy for Apache HTTP Client

Abierto
#2,776 3 comentarios 0 reacciones 0 asignados Ver en GitHub
client-api-v2 enhancement
Lenguaje dominante
Java
Estrellas
1.6k
Forks
636
Merge medio
2 d 23 h
PR fusionados (30 d)
29

Descripción

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

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.