This is an automated email from the ASF dual-hosted git repository.

zixuan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new e19856a1a1b [improve][client] Allow adding custom description to 
User-Agent header (#24729)
e19856a1a1b is described below

commit e19856a1a1bf065d86c6c61c6ce96577e3310eb5
Author: Zixuan Liu <node...@gmail.com>
AuthorDate: Fri Sep 12 09:59:02 2025 +0800

    [improve][client] Allow adding custom description to User-Agent header 
(#24729)
---
 .../apache/pulsar/client/admin/PulsarAdminBuilder.java  | 17 +++++++++++++++++
 .../client/admin/internal/PulsarAdminBuilderImpl.java   |  6 ++++++
 .../client/admin/internal/http/AsyncHttpConnector.java  |  5 ++++-
 .../client/admin/internal/PulsarAdminImplTest.java      |  9 +++++++++
 .../java/org/apache/pulsar/client/impl/HttpClient.java  |  5 ++++-
 5 files changed, 40 insertions(+), 2 deletions(-)

diff --git 
a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java
 
b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java
index 5c41d98b89d..216376c7eb6 100644
--- 
a/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java
+++ 
b/pulsar-client-admin-api/src/main/java/org/apache/pulsar/client/admin/PulsarAdminBuilder.java
@@ -376,4 +376,21 @@ public interface PulsarAdminBuilder {
      * @return the PulsarAdminBuilder instance
      */
     PulsarAdminBuilder connectionMaxIdleSeconds(int connectionMaxIdleSeconds);
+
+    /**
+     * Set the description.
+     *
+     * <p> By default, PulsarAdmin sends an HTTP <i>User-Agent</i> header such 
as
+     * <code>Pulsar-Java-v&lt;x.y.z&gt;</code> when making requests to the 
broker.
+     *
+     * <p> This method provides a way to add more description to a specific 
PulsarAdmin instance. If it's configured,
+     * the description will be appended to the original admin version string, 
with '-' as the separator.
+     *
+     * <p>For example, if the admin version is 4.0.0, and the description is 
"forked", the final client version string
+     * will be "Pulsar-Java-v4.0.0-forked".
+     *
+     * @param description the description of the current PulsarAdmin instance
+     * @throws IllegalArgumentException if the length of description exceeds 64
+     */
+    PulsarAdminBuilder description(String description);
 }
\ No newline at end of file
diff --git 
a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java
 
b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java
index 7f0b3ab9a42..8a4659c5b87 100644
--- 
a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java
+++ 
b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/PulsarAdminBuilderImpl.java
@@ -283,4 +283,10 @@ public class PulsarAdminBuilderImpl implements 
PulsarAdminBuilder {
         this.conf.setConnectionMaxIdleSeconds(connectionMaxIdleSeconds);
         return this;
     }
+
+    @Override
+    public PulsarAdminBuilder description(String description) {
+        this.conf.setDescription(description);
+        return this;
+    }
 }
diff --git 
a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java
 
b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java
index fb11d9e46d3..b9ef758e3c6 100644
--- 
a/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java
+++ 
b/pulsar-client-admin/src/main/java/org/apache/pulsar/client/admin/internal/http/AsyncHttpConnector.java
@@ -165,7 +165,10 @@ public class AsyncHttpConnector implements Connector, 
AsyncHttpRequestExecutor {
         confBuilder.setRequestTimeout(conf.getRequestTimeoutMs());
         confBuilder.setConnectTimeout(connectTimeoutMs);
         confBuilder.setReadTimeout(readTimeoutMs);
-        confBuilder.setUserAgent(String.format("Pulsar-Java-v%s", 
PulsarVersion.getVersion()));
+        confBuilder.setUserAgent(String.format("Pulsar-Java-v%s%s",
+                PulsarVersion.getVersion(),
+                (conf.getDescription() == null ? "" : ("-" + 
conf.getDescription()))
+        ));
         confBuilder.setRequestTimeout(requestTimeoutMs);
         confBuilder.setIoThreadsCount(conf.getNumIoThreads());
         confBuilder.setKeepAliveStrategy(new DefaultKeepAliveStrategy() {
diff --git 
a/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java
 
b/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java
index 27c6fd96079..8b406b8bc6d 100644
--- 
a/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java
+++ 
b/pulsar-client-admin/src/test/java/org/apache/pulsar/client/admin/internal/PulsarAdminImplTest.java
@@ -20,8 +20,11 @@ package org.apache.pulsar.client.admin.internal;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
+import lombok.Cleanup;
 import lombok.SneakyThrows;
+import org.apache.pulsar.client.admin.PulsarAdmin;
 import org.apache.pulsar.client.api.Authentication;
+import org.apache.pulsar.client.api.PulsarClientException;
 import org.apache.pulsar.client.impl.auth.AuthenticationDisabled;
 import org.apache.pulsar.client.impl.conf.ClientConfigurationData;
 import org.testng.annotations.Test;
@@ -45,6 +48,12 @@ public class PulsarAdminImplTest {
         assertThat(createAdminAndGetAuth(conf)).isSameAs(auth);
     }
 
+    @Test
+    public void testClientDescription() throws PulsarClientException {
+        @Cleanup PulsarAdmin ignored =
+                
PulsarAdmin.builder().serviceHttpUrl("http://localhost:8080";).description("forked").build();
+    }
+
     @SneakyThrows
     private Authentication createAdminAndGetAuth(ClientConfigurationData conf) 
{
         try (PulsarAdminImpl admin = new 
PulsarAdminImpl("http://localhost:8080";, conf, null)) {
diff --git 
a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java 
b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java
index f9312be39aa..633ca606388 100644
--- a/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java
+++ b/pulsar-client/src/main/java/org/apache/pulsar/client/impl/HttpClient.java
@@ -84,7 +84,10 @@ public class HttpClient implements Closeable {
         confBuilder.setMaxRedirects(conf.getMaxLookupRedirects());
         confBuilder.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT_IN_SECONDS * 
1000);
         confBuilder.setReadTimeout(DEFAULT_READ_TIMEOUT_IN_SECONDS * 1000);
-        confBuilder.setUserAgent(String.format("Pulsar-Java-v%s", 
PulsarVersion.getVersion()));
+        confBuilder.setUserAgent(String.format("Pulsar-Java-v%s%s",
+                PulsarVersion.getVersion(),
+                (conf.getDescription() == null ? "" : ("-" + 
conf.getDescription()))
+        ));
         confBuilder.setKeepAliveStrategy(new DefaultKeepAliveStrategy() {
             @Override
             public boolean keepAlive(InetSocketAddress remoteAddress, Request 
ahcRequest,

Reply via email to