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