diff --git a/zap/src/main/java/org/parosproxy/paros/Constant.java b/zap/src/main/java/org/parosproxy/paros/Constant.java index fb6cd3d44d2..2cc36cbeb07 100644 --- a/zap/src/main/java/org/parosproxy/paros/Constant.java +++ b/zap/src/main/java/org/parosproxy/paros/Constant.java @@ -126,6 +126,7 @@ // ZAP: 2023/09/14 Lock home directory. // ZAP: 2024/04/25 Add new autoTagScanner regex patterns when upgrading from 2.14 or earlier. // ZAP: 2024/11/06 Add branding related constants. +// ZAP: 2025/11/10 Updated VERSION_TAG. package org.parosproxy.paros; import java.io.File; @@ -209,7 +210,7 @@ public final class Constant { private static final String VERSION_ELEMENT = "version"; // Accessible for tests - static final long VERSION_TAG = 20016001; + static final long VERSION_TAG = 20017000; // Old version numbers - for upgrade private static final long V_2_14_0_TAG = 20014000; diff --git a/zap/src/main/java/org/zaproxy/zap/network/AbstractStreamHttpEncoding.java b/zap/src/main/java/org/zaproxy/zap/network/AbstractStreamHttpEncoding.java index 25c69700dac..10d0f6a4f7c 100644 --- a/zap/src/main/java/org/zaproxy/zap/network/AbstractStreamHttpEncoding.java +++ b/zap/src/main/java/org/zaproxy/zap/network/AbstractStreamHttpEncoding.java @@ -29,6 +29,8 @@ abstract class AbstractStreamHttpEncoding implements HttpEncoding { private static final int BUFFER_SIZE = 2048; + private static final byte[] EMPTY = {}; + private final OutputStreamSupplier outputStreamSupplier; private final InputStreamSupplier inputStreamSupplier; @@ -49,6 +51,10 @@ public byte[] encode(byte[] content) throws IOException { @Override public byte[] decode(byte[] content) throws IOException { + if (content.length == 0) { + return EMPTY; + } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ByteArrayInputStream bais = new ByteArrayInputStream(content); InputStream is = inputStreamSupplier.get(bais)) { diff --git a/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingDeflateUnitTest.java b/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingDeflateUnitTest.java index 39fb07448f8..b238020f525 100644 --- a/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingDeflateUnitTest.java +++ b/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingDeflateUnitTest.java @@ -37,6 +37,9 @@ class HttpEncodingDeflateUnitTest { private static final byte[] CONTENT = "Content 123 ABC".getBytes(StandardCharsets.UTF_8); private static final byte[] CONTENT_ENCODED = deflate(CONTENT); + private static final byte[] EMPTY_CONTENT = {}; + private static final byte[] EMPTY_CONTENT_ENCODED = deflate(EMPTY_CONTENT); + private HttpEncodingDeflate encoding = HttpEncodingDeflate.getSingleton(); @Test @@ -55,6 +58,30 @@ void shouldDecodeContent() throws IOException { assertThat(decodedContent, is(equalTo(CONTENT))); } + @Test + void shouldEncodeEmptyContent() throws IOException { + // Given / When + byte[] encodedContent = encoding.encode(EMPTY_CONTENT); + // Then + assertThat(encodedContent, is(equalTo(EMPTY_CONTENT_ENCODED))); + } + + @Test + void shouldDecodeEmptyContent() throws IOException { + // Given / When + byte[] decodedContent = encoding.decode(EMPTY_CONTENT_ENCODED); + // Then + assertThat(decodedContent, is(equalTo(EMPTY_CONTENT))); + } + + @Test + void shouldSkipDecodePlainEmptyContent() throws IOException { + // Given / When + byte[] decodedContent = encoding.decode(EMPTY_CONTENT); + // Then + assertThat(decodedContent, is(equalTo(EMPTY_CONTENT))); + } + @Test void shouldThrowExceptionWhenDecodingIfNotProperlyEncoded() { // Given diff --git a/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingGzipUnitTest.java b/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingGzipUnitTest.java index 43584c8a321..6bd98e6008c 100644 --- a/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingGzipUnitTest.java +++ b/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingGzipUnitTest.java @@ -37,6 +37,9 @@ class HttpEncodingGzipUnitTest { private static final byte[] CONTENT = "Content 123 ABC".getBytes(StandardCharsets.UTF_8); private static final byte[] CONTENT_ENCODED = gzip(CONTENT); + private static final byte[] EMPTY_CONTENT = {}; + private static final byte[] EMPTY_CONTENT_ENCODED = gzip(EMPTY_CONTENT); + private HttpEncodingGzip encoding = HttpEncodingGzip.getSingleton(); @Test @@ -55,6 +58,30 @@ void shouldDecodeContent() throws IOException { assertThat(decodedContent, is(equalTo(CONTENT))); } + @Test + void shouldEncodeEmptyContent() throws IOException { + // Given / When + byte[] encodedContent = encoding.encode(EMPTY_CONTENT); + // Then + assertThat(encodedContent, is(equalTo(EMPTY_CONTENT_ENCODED))); + } + + @Test + void shouldDecodeEmptyContent() throws IOException { + // Given / When + byte[] decodedContent = encoding.decode(EMPTY_CONTENT_ENCODED); + // Then + assertThat(decodedContent, is(equalTo(EMPTY_CONTENT))); + } + + @Test + void shouldSkipDecodePlainEmptyContent() throws IOException { + // Given / When + byte[] decodedContent = encoding.decode(EMPTY_CONTENT); + // Then + assertThat(decodedContent, is(equalTo(EMPTY_CONTENT))); + } + @Test void shouldThrowExceptionWhenDecodingIfNotProperlyEncoded() { // Given