From b5d51a627132102fb99e4c4d23b88af441f19fd6 Mon Sep 17 00:00:00 2001 From: thc202 Date: Tue, 29 Sep 2026 12:54:40 +0100 Subject: [PATCH] Remove usage of core HTTP encodings Let the network add-on provide them. Signed-off-by: thc202 --- .../parosproxy/paros/network/HttpMessage.java | 22 +------ .../network/AbstractStreamHttpEncoding.java | 4 ++ .../zap/network/HttpEncodingDeflate.java | 3 + .../zaproxy/zap/network/HttpEncodingGzip.java | 3 + .../network/HttpInputStreamUnitTest.java | 44 ++------------ .../paros/network/HttpMessageUnitTest.java | 59 ++++++++----------- .../network/HttpEncodingDeflateUnitTest.java | 1 + .../zap/network/HttpEncodingGzipUnitTest.java | 1 + 8 files changed, 43 insertions(+), 94 deletions(-) diff --git a/zap/src/main/java/org/parosproxy/paros/network/HttpMessage.java b/zap/src/main/java/org/parosproxy/paros/network/HttpMessage.java index b8c79009717..49195d082c2 100644 --- a/zap/src/main/java/org/parosproxy/paros/network/HttpMessage.java +++ b/zap/src/main/java/org/parosproxy/paros/network/HttpMessage.java @@ -91,9 +91,6 @@ import org.zaproxy.zap.extension.httppanel.Message; import org.zaproxy.zap.extension.httpsessions.HttpSession; import org.zaproxy.zap.model.NameValuePair; -import org.zaproxy.zap.network.HttpEncoding; -import org.zaproxy.zap.network.HttpEncodingDeflate; -import org.zaproxy.zap.network.HttpEncodingGzip; import org.zaproxy.zap.network.HttpRequestBody; import org.zaproxy.zap.network.HttpResponseBody; import org.zaproxy.zap.users.User; @@ -112,22 +109,7 @@ public class HttpMessage implements Message { public static final String MESSAGE_TYPE = "HTTP"; private static final HttpEncodingsHandler DEFAULT_CONTENT_ENCODINGS_HANDLER = - (header, body) -> { - String encoding = header.getHeader(HttpHeader.CONTENT_ENCODING); - if (encoding == null || encoding.isEmpty()) { - body.setContentEncodings(List.of()); - return; - } - - List encodings = List.of(); - if (encoding.contains(HttpHeader.DEFLATE)) { - encodings = List.of(HttpEncodingDeflate.getSingleton()); - } else if (encoding.contains(HttpHeader.GZIP)) { - encodings = List.of(HttpEncodingGzip.getSingleton()); - } - - body.setContentEncodings(encodings); - }; + (header, body) -> body.setContentEncodings(List.of()); private static final CharsetProvider DEFAULT_CHARSET_PROVIDER = (header, body) -> header.getCharset(); @@ -454,7 +436,7 @@ public void setResponseHeader(String resHeader) throws HttpMalformedHeaderExcept /** * Sets the content encodings defined in the header into the body. * - *

Note: By default supports only {@code gzip} and {@code deflate}. + *

Note: Default content encodings are provided by an add-on. * * @param header the header. * @param body the body. 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 10d0f6a4f7c..4c7d5bf8210 100644 --- a/zap/src/main/java/org/zaproxy/zap/network/AbstractStreamHttpEncoding.java +++ b/zap/src/main/java/org/zaproxy/zap/network/AbstractStreamHttpEncoding.java @@ -25,6 +25,10 @@ import java.io.InputStream; import java.io.OutputStream; +/** + * @deprecated (2.18.0) No longer in use, it will be removed in a future release. + */ +@Deprecated(since = "2.18.0", forRemoval = true) abstract class AbstractStreamHttpEncoding implements HttpEncoding { private static final int BUFFER_SIZE = 2048; diff --git a/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingDeflate.java b/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingDeflate.java index 301297c7a83..96ae5f940ba 100644 --- a/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingDeflate.java +++ b/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingDeflate.java @@ -28,7 +28,10 @@ * The {@link HttpEncoding} for the {@code deflate} coding. * * @since 2.10.0 + * @deprecated (2.18.0) No longer in use, it will be removed in a future release. */ +@SuppressWarnings("removal") +@Deprecated(since = "2.18.0", forRemoval = true) public class HttpEncodingDeflate extends AbstractStreamHttpEncoding { private static final HttpEncodingDeflate SINGLETON = new HttpEncodingDeflate(); diff --git a/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingGzip.java b/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingGzip.java index c11850da9de..4fdb0521686 100644 --- a/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingGzip.java +++ b/zap/src/main/java/org/zaproxy/zap/network/HttpEncodingGzip.java @@ -26,7 +26,10 @@ * The {@link HttpEncoding} for the {@code gzip}/{@code x-gzip} coding. * * @since 2.10.0 + * @deprecated (2.18.0) No longer in use, it will be removed in a future release. */ +@SuppressWarnings("removal") +@Deprecated(since = "2.18.0", forRemoval = true) public class HttpEncodingGzip extends AbstractStreamHttpEncoding { private static final HttpEncodingGzip SINGLETON = new HttpEncodingGzip(); diff --git a/zap/src/test/java/org/parosproxy/paros/network/HttpInputStreamUnitTest.java b/zap/src/test/java/org/parosproxy/paros/network/HttpInputStreamUnitTest.java index 31f00570448..1d0edff023f 100644 --- a/zap/src/test/java/org/parosproxy/paros/network/HttpInputStreamUnitTest.java +++ b/zap/src/test/java/org/parosproxy/paros/network/HttpInputStreamUnitTest.java @@ -19,7 +19,6 @@ */ package org.parosproxy.paros.network; -import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; @@ -35,12 +34,9 @@ import java.io.InputStream; import java.net.Socket; import java.util.Arrays; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; -import org.zaproxy.zap.network.HttpEncodingDeflate; -import org.zaproxy.zap.network.HttpEncodingGzip; import org.zaproxy.zap.network.HttpRequestBody; /** Unit test for {@link HttpInputStream}. */ @@ -81,34 +77,18 @@ void shouldReadRequestBodyWithUnknownLength(int length) throws Exception { assertThat(httpBody.getBytes(), is(equalTo(data))); } - @Test - void shouldSetGzipEncodingToBody() throws Exception { - // Given - HttpHeader httpHeader = mock(HttpHeader.class); - given(httpHeader.getContentLength()).willReturn(0); - given(httpHeader.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(HttpHeader.GZIP); - HttpInputStream httpInputStream = new HttpInputStream(createSocket(EMPTY_BODY)); - // When - HttpRequestBody httpBody = httpInputStream.readRequestBody(httpHeader); - // Then - assertThat( - httpBody.getContentEncodings(), - is(equalTo(asList(HttpEncodingGzip.getSingleton())))); - } - - @Test - void shouldSetDeflateEncodingToBody() throws Exception { + @ParameterizedTest + @ValueSource(strings = {HttpHeader.GZIP, HttpHeader.DEFLATE, "Encoding Not Supported"}) + void shouldNotSetContentEncodingToBodyByDefault(String contentEncoding) throws Exception { // Given HttpHeader httpHeader = mock(HttpHeader.class); given(httpHeader.getContentLength()).willReturn(0); - given(httpHeader.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(HttpHeader.DEFLATE); + given(httpHeader.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(contentEncoding); HttpInputStream httpInputStream = new HttpInputStream(createSocket(EMPTY_BODY)); // When HttpRequestBody httpBody = httpInputStream.readRequestBody(httpHeader); // Then - assertThat( - httpBody.getContentEncodings(), - is(equalTo(asList(HttpEncodingDeflate.getSingleton())))); + assertThat(httpBody.getContentEncodings(), is(empty())); } @ParameterizedTest @@ -126,20 +106,6 @@ void shouldNotSetContentEncodingToBodyIfContentEncodingIsNotPresentOrIsEmpty( assertThat(httpBody.getContentEncodings(), is(empty())); } - @Test - void shouldNotSetContentEncodingToBodyIfContentEncodingNotSupported() throws Exception { - // Given - HttpHeader httpHeader = mock(HttpHeader.class); - given(httpHeader.getContentLength()).willReturn(0); - given(httpHeader.getHeader(HttpHeader.CONTENT_ENCODING)) - .willReturn("Encoding Not Supported"); - HttpInputStream httpInputStream = new HttpInputStream(createSocket(EMPTY_BODY)); - // When - HttpRequestBody httpBody = httpInputStream.readRequestBody(httpHeader); - // Then - assertThat(httpBody.getContentEncodings(), is(empty())); - } - private static Socket createSocket(byte[] data) throws IOException { InputStream inputStream = new ByteArrayInputStream(data); Socket socket = mock(Socket.class); diff --git a/zap/src/test/java/org/parosproxy/paros/network/HttpMessageUnitTest.java b/zap/src/test/java/org/parosproxy/paros/network/HttpMessageUnitTest.java index dd652abbe82..a49e11a2784 100644 --- a/zap/src/test/java/org/parosproxy/paros/network/HttpMessageUnitTest.java +++ b/zap/src/test/java/org/parosproxy/paros/network/HttpMessageUnitTest.java @@ -19,11 +19,9 @@ */ package org.parosproxy.paros.network; -import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -58,8 +56,6 @@ import org.parosproxy.paros.network.HttpMessage.HttpEncodingsHandler; import org.zaproxy.zap.extension.httpsessions.HttpSession; import org.zaproxy.zap.network.HttpEncoding; -import org.zaproxy.zap.network.HttpEncodingDeflate; -import org.zaproxy.zap.network.HttpEncodingGzip; import org.zaproxy.zap.network.HttpRequestBody; import org.zaproxy.zap.network.HttpResponseBody; import org.zaproxy.zap.testutils.Log4jTestAppender; @@ -369,6 +365,8 @@ void shouldRemoveContentTypeWhenMutatingMethodFromPost(String method) throws Exc @Test void shouldSetContentEncodingsWhenSettingRequestBodyByte() { // Given + HttpEncoding encoding = mock(HttpEncoding.class); + HttpMessage.setContentEncodingsHandler(gzipHandler(encoding)); HttpRequestHeader header = mock(HttpRequestHeader.class); given(header.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(HttpHeader.GZIP); HttpRequestBody body = mock(HttpRequestBody.class); @@ -376,12 +374,14 @@ void shouldSetContentEncodingsWhenSettingRequestBodyByte() { // When message.setRequestBody(new byte[0]); // Then - assertThat(encodings(body), is(not(empty()))); + assertThat(encodings(body), is(equalTo(List.of(encoding)))); } @Test void shouldSetContentEncodingsWhenSettingRequestBodyString() { // Given + HttpEncoding encoding = mock(HttpEncoding.class); + HttpMessage.setContentEncodingsHandler(gzipHandler(encoding)); HttpRequestHeader header = mock(HttpRequestHeader.class); given(header.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(HttpHeader.GZIP); HttpRequestBody body = mock(HttpRequestBody.class); @@ -389,7 +389,7 @@ void shouldSetContentEncodingsWhenSettingRequestBodyString() { // When message.setRequestBody("Body"); // Then - assertThat(encodings(body), is(not(empty()))); + assertThat(encodings(body), is(equalTo(List.of(encoding)))); } @Test @@ -410,6 +410,8 @@ void shouldNotSetContentEncodingsWhenSettingHttpResponseBody() { @Test void shouldSetContentEncodingsWhenSettingResponseBodyByte() { // Given + HttpEncoding encoding = mock(HttpEncoding.class); + HttpMessage.setContentEncodingsHandler(gzipHandler(encoding)); HttpResponseHeader header = mock(HttpResponseHeader.class); given(header.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(HttpHeader.GZIP); HttpResponseBody body = mock(HttpResponseBody.class); @@ -419,12 +421,14 @@ void shouldSetContentEncodingsWhenSettingResponseBodyByte() { // When message.setResponseBody(new byte[0]); // Then - assertThat(encodings(body), is(not(empty()))); + assertThat(encodings(body), is(equalTo(List.of(encoding)))); } @Test void shouldSetContentEncodingsWhenSettingResponseBodyString() { // Given + HttpEncoding encoding = mock(HttpEncoding.class); + HttpMessage.setContentEncodingsHandler(gzipHandler(encoding)); HttpResponseHeader header = mock(HttpResponseHeader.class); given(header.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(HttpHeader.GZIP); HttpResponseBody body = mock(HttpResponseBody.class); @@ -434,12 +438,13 @@ void shouldSetContentEncodingsWhenSettingResponseBodyString() { // When message.setResponseBody("Body"); // Then - assertThat(encodings(body), is(not(empty()))); + assertThat(encodings(body), is(equalTo(List.of(encoding)))); } @ParameterizedTest - @ValueSource(strings = {HttpHeader.GZIP, "x-gzip"}) - void shouldSetGzipEncodingToBody(String contentEncodingHeader) { + @ValueSource( + strings = {HttpHeader.GZIP, "x-gzip", HttpHeader.DEFLATE, "Encoding Not Supported"}) + void shouldNotSetContentEncodingToBodyByDefault(String contentEncodingHeader) { // Given HttpHeader header = mock(HttpHeader.class); given(header.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(contentEncodingHeader); @@ -447,19 +452,7 @@ void shouldSetGzipEncodingToBody(String contentEncodingHeader) { // When HttpMessage.setContentEncodings(header, body); // Then - verify(body).setContentEncodings(asList(HttpEncodingGzip.getSingleton())); - } - - @Test - void shouldSetDeflateEncodingToBody() { - // Given - HttpHeader header = mock(HttpHeader.class); - given(header.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn(HttpHeader.DEFLATE); - HttpBody body = mock(HttpBody.class); - // When - HttpMessage.setContentEncodings(header, body); - // Then - verify(body).setContentEncodings(asList(HttpEncodingDeflate.getSingleton())); + verify(body).setContentEncodings(List.of()); } @ParameterizedTest @@ -476,18 +469,6 @@ void shouldNotSetContentEncodingToBodyIfContentEncodingIsNotPresentOrIsEmpty( verify(body).setContentEncodings(Collections.emptyList()); } - @Test - void shouldNotSetContentEncodingToBodyIfContentEncodingNotSupported() { - // Given - HttpHeader header = mock(HttpHeader.class); - given(header.getHeader(HttpHeader.CONTENT_ENCODING)).willReturn("Encoding Not Supported"); - HttpBody body = mock(HttpBody.class); - // When - HttpMessage.setContentEncodings(header, body); - // Then - verify(body).setContentEncodings(Collections.emptyList()); - } - @Test void shouldUseContentEncodingsHandlerSet() { // Given @@ -847,6 +828,14 @@ private static List encodings(HttpBody body) { return arg.getValue(); } + private static HttpEncodingsHandler gzipHandler(HttpEncoding encoding) { + return (header, body) -> { + if (HttpHeader.GZIP.equals(header.getHeader(HttpHeader.CONTENT_ENCODING))) { + body.setContentEncodings(List.of(encoding)); + } + }; + } + private void withLoggerAppender() { testAppender = new Log4jTestAppender(); LoggerContext context = LoggerContext.getContext(); 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 b238020f525..3b55135b3ef 100644 --- a/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingDeflateUnitTest.java +++ b/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingDeflateUnitTest.java @@ -32,6 +32,7 @@ import org.junit.jupiter.api.Test; /** Unit test for {@link HttpEncodingDeflate}. */ +@SuppressWarnings({"deprecation", "removal"}) class HttpEncodingDeflateUnitTest { private static final byte[] CONTENT = "Content 123 ABC".getBytes(StandardCharsets.UTF_8); 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 6bd98e6008c..109dff02461 100644 --- a/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingGzipUnitTest.java +++ b/zap/src/test/java/org/zaproxy/zap/network/HttpEncodingGzipUnitTest.java @@ -32,6 +32,7 @@ import org.junit.jupiter.api.Test; /** Unit test for {@link HttpEncodingGzip}. */ +@SuppressWarnings({"deprecation", "removal"}) class HttpEncodingGzipUnitTest { private static final byte[] CONTENT = "Content 123 ABC".getBytes(StandardCharsets.UTF_8);