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

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


The following commit(s) were added to refs/heads/master by this push:
     new 1cd19ce86 perf(java): build header length error text only on failure 
(#4382)
1cd19ce86 is described below

commit 1cd19ce8608405d1a545af49098bc6a8ec5ccb47
Author: Justin Mclean <[email protected]>
AuthorDate: Sun Oct 11 13:35:09 2026 +1100

    perf(java): build header length error text only on failure (#4382)
---
 .../org/apache/iggy/serde/BytesSerializer.java     | 11 +++++----
 .../client/blocking/tcp/BytesSerializerTest.java   | 26 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git 
a/foreign/java/java-sdk/src/main/java/org/apache/iggy/serde/BytesSerializer.java
 
b/foreign/java/java-sdk/src/main/java/org/apache/iggy/serde/BytesSerializer.java
index 2ca3e0720..3adac3a17 100644
--- 
a/foreign/java/java-sdk/src/main/java/org/apache/iggy/serde/BytesSerializer.java
+++ 
b/foreign/java/java-sdk/src/main/java/org/apache/iggy/serde/BytesSerializer.java
@@ -120,13 +120,13 @@ public final class BytesSerializer {
         var buffer = Unpooled.buffer();
         for (Map.Entry<HeaderKey, HeaderValue> entry : headers.entrySet()) {
             HeaderKey key = entry.getKey();
-            checkFieldLength(key.value().length, "key '" + key + "'");
+            checkFieldLength(key.value().length, "key", key);
             buffer.writeByte(key.kind().asCode());
             buffer.writeIntLE(key.value().length);
             buffer.writeBytes(key.value());
 
             HeaderValue value = entry.getValue();
-            checkFieldLength(value.value().length, "value for key '" + key + 
"'");
+            checkFieldLength(value.value().length, "value for key", key);
             buffer.writeByte(value.kind().asCode());
             buffer.writeIntLE(value.value().length);
             buffer.writeBytes(value.value());
@@ -458,10 +458,13 @@ public final class BytesSerializer {
      * records whose canonical constructor is public and unchecked. A field 
out of range would
      * encode here and come back as a generic server error naming neither the 
key nor the bound it
      * broke.
+     *
+     * <p>The message names the key, so it is built only on failure: this runs 
for every header of
+     * every message sent.
      */
-    private static void checkFieldLength(int length, String field) {
+    private static void checkFieldLength(int length, String field, HeaderKey 
key) {
         if (length < 1 || length > MAX_HEADER_FIELD_LENGTH) {
-            throw new IggyInvalidArgumentException("Invalid header " + field + 
" length: " + length
+            throw new IggyInvalidArgumentException("Invalid header " + field + 
" '" + key + "' length: " + length
                     + " bytes, must be between 1 and " + 
MAX_HEADER_FIELD_LENGTH);
         }
     }
diff --git 
a/foreign/java/java-sdk/src/test/java/org/apache/iggy/client/blocking/tcp/BytesSerializerTest.java
 
b/foreign/java/java-sdk/src/test/java/org/apache/iggy/client/blocking/tcp/BytesSerializerTest.java
index 346b63bc3..64f5c88ec 100644
--- 
a/foreign/java/java-sdk/src/test/java/org/apache/iggy/client/blocking/tcp/BytesSerializerTest.java
+++ 
b/foreign/java/java-sdk/src/test/java/org/apache/iggy/client/blocking/tcp/BytesSerializerTest.java
@@ -27,6 +27,7 @@ import org.apache.iggy.exception.IggyInvalidArgumentException;
 import org.apache.iggy.identifier.ConsumerId;
 import org.apache.iggy.identifier.StreamId;
 import org.apache.iggy.message.HeaderKey;
+import org.apache.iggy.message.HeaderKind;
 import org.apache.iggy.message.HeaderValue;
 import org.apache.iggy.message.Partitioning;
 import org.apache.iggy.message.PollingStrategy;
@@ -575,6 +576,31 @@ class BytesSerializerTest {
             // then - verify buffer contains data for both headers
             assertThat(result.readableBytes()).isEqualTo(28);
         }
+
+        @Test
+        void shouldNameTheKeyWhenAKeyIsTooLong() {
+            // given
+            String name = "k".repeat(256);
+            Map<HeaderKey, HeaderValue> headers = new HashMap<>();
+            headers.put(new HeaderKey(HeaderKind.String, name.getBytes()), 
HeaderValue.fromRaw("v".getBytes()));
+
+            // when / then
+            assertThatThrownBy(() -> BytesSerializer.toBytes(headers))
+                    .isInstanceOf(IggyInvalidArgumentException.class)
+                    .hasMessage("Invalid header key '" + name + "' length: 256 
bytes, must be between 1 and 255");
+        }
+
+        @Test
+        void shouldNameTheKeyWhenAValueIsEmpty() {
+            // given
+            Map<HeaderKey, HeaderValue> headers = new HashMap<>();
+            headers.put(HeaderKey.fromString("k1"), new 
HeaderValue(HeaderKind.Raw, new byte[0]));
+
+            // when / then
+            assertThatThrownBy(() -> BytesSerializer.toBytes(headers))
+                    .isInstanceOf(IggyInvalidArgumentException.class)
+                    .hasMessage("Invalid header value for key 'k1' length: 0 
bytes, must be between 1 and 255");
+        }
     }
 
     @Nested

Reply via email to