Skip to content

Commit feca2f7

Browse files
committed
Add negotiation tests
1 parent 601bf02 commit feca2f7

File tree

3 files changed

+72
-94
lines changed

3 files changed

+72
-94
lines changed

java/org/apache/coyote/http11/Http11Processor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.apache.coyote.http11.filters.SavedRequestInputFilter;
4848
import org.apache.coyote.http11.filters.VoidInputFilter;
4949
import org.apache.coyote.http11.filters.VoidOutputFilter;
50+
import org.apache.coyote.http11.filters.OutputFilterFactory;
5051
import org.apache.coyote.http11.upgrade.InternalHttpUpgradeHandler;
5152
import org.apache.coyote.http11.upgrade.UpgradeApplicationBufferHandler;
5253
import org.apache.juli.logging.Log;
@@ -881,9 +882,9 @@ protected final void prepareResponse() throws IOException {
881882
}
882883

883884
// Check for compression
884-
boolean useCompression = false;
885+
OutputFilterFactory compressionFactory = null;
885886
if (entityBody && sendfileData == null) {
886-
useCompression = protocol.useCompression(request, response);
887+
compressionFactory = protocol.useCompression(request, response);
887888
}
888889

889890
MimeHeaders headers = response.getMimeHeaders();
@@ -929,8 +930,9 @@ protected final void prepareResponse() throws IOException {
929930
}
930931
}
931932

932-
if (useCompression) {
933-
outputBuffer.addActiveFilter(outputFilters[Constants.GZIP_FILTER]);
933+
if (compressionFactory != null) {
934+
// Add the negotiated compression filter
935+
outputBuffer.addActiveFilter(compressionFactory.createFilter());
934936
}
935937

936938
// Add date header unless application has already set one (e.g. in a

test/org/apache/coyote/TestCompressionConfig.java

Lines changed: 66 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -153,20 +153,6 @@ public void testGzipOutputFilterFactoryJavaBeanProperties() {
153153
Assert.assertTrue(filter instanceof GzipOutputFilter);
154154
}
155155

156-
@Test
157-
public void testNoCompressionEncodings() {
158-
CompressionConfig config = new CompressionConfig();
159-
String encodings = config.getNoCompressionEncodings();
160-
Assert.assertTrue(Arrays.asList("br", "compress", "dcb", "dcz", "deflate", "gzip", "pack200-gzip", "zstd")
161-
.stream()
162-
.anyMatch(encodings::contains));
163-
164-
config.setNoCompressionEncodings("br");
165-
String newEncodings = config.getNoCompressionEncodings();
166-
Assert.assertTrue(newEncodings.contains("br"));
167-
Assert.assertFalse(newEncodings.contains("gzip"));
168-
}
169-
170156
@Test
171157
public void testNegotiationQualityFactor() {
172158
CompressionConfig config = new CompressionConfig();
@@ -190,7 +176,7 @@ public String getEncodingName() {
190176
// Client prefers deflate over gzip
191177
Request request = new Request();
192178
Response response = new Response();
193-
request.getMimeHeaders().addValue("accept-encoding").setString("gzip;q=0.5, defalte;q=1.0");
179+
request.getMimeHeaders().addValue("accept-encoding").setString("gzip;q=0.5, deflate;q=1.0");
194180

195181
OutputFilterFactory result = config.useCompression(request, response, factories);
196182
Assert.assertNotNull(result);
@@ -281,4 +267,69 @@ public void testNegotiationQZero() {
281267
OutputFilterFactory result = config.useCompression(request, response, factories);
282268
Assert.assertNull(result);
283269
}
270+
271+
@Test
272+
public void testCompressionOff() {
273+
CompressionConfig config = new CompressionConfig();
274+
// Default compression is "off"
275+
276+
Request request = new Request();
277+
Response response = new Response();
278+
request.getMimeHeaders().addValue("accept-encoding").setString("gzip");
279+
280+
List<OutputFilterFactory> factories = new ArrayList<>();
281+
factories.add(new GzipOutputFilterFactory());
282+
OutputFilterFactory result = config.useCompression(request, response, factories);
283+
Assert.assertNull(result);
284+
}
285+
286+
@Test
287+
public void testAlreadyCompressedContentEncoding() {
288+
CompressionConfig config = new CompressionConfig();
289+
config.setCompression("force");
290+
291+
Request request = new Request();
292+
Response response = new Response();
293+
request.getMimeHeaders().addValue("accept-encoding").setString("gzip");
294+
// Response already has gzip Content-Encoding - should skip compression
295+
response.getMimeHeaders().addValue("content-encoding").setString("gzip");
296+
297+
List<OutputFilterFactory> factories = new ArrayList<>();
298+
factories.add(new GzipOutputFilterFactory());
299+
OutputFilterFactory result = config.useCompression(request, response, factories);
300+
Assert.assertNull(result);
301+
}
302+
303+
@Test
304+
public void testTENegotiationWithFactories() {
305+
CompressionConfig config = new CompressionConfig();
306+
config.setCompression("force");
307+
308+
OutputFilterFactory deflateFactory = new OutputFilterFactory() {
309+
310+
public OutputFilter createFilter() {
311+
return new GzipOutputFilter();
312+
}
313+
314+
public String getEncodingName() {
315+
return "deflate";
316+
}
317+
};
318+
319+
List<OutputFilterFactory> factories = new ArrayList<>();
320+
factories.add(new GzipOutputFilterFactory());
321+
factories.add(deflateFactory);
322+
323+
// TE header should use Transfer-Encoding, not Content-Encoding
324+
Request request = new Request();
325+
Response response = new Response();
326+
request.getMimeHeaders().addValue("TE").setString("deflate;q=1.0, gzip;q=0.5");
327+
328+
OutputFilterFactory result = config.useCompression(request, response, factories);
329+
Assert.assertNotNull(result);
330+
Assert.assertEquals("deflate", result.getEncodingName());
331+
// TE negotiation sets Transfer-Encoding, not Content-Encoding
332+
Assert.assertEquals("deflate", response.getMimeHeaders().getHeader("Transfer-Encoding"));
333+
Assert.assertNull(response.getMimeHeaders().getValue("Content-Encoding"));
334+
}
284335
}

test/org/apache/coyote/http11/TestHttp11Processor.java

Lines changed: 0 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -2152,81 +2152,6 @@ public void testEarlyHintsSendErrorWithMessage() throws Exception {
21522152
Assert.assertEquals(HttpServletResponse.SC_OK, client.getStatusCode());
21532153
}
21542154

2155-
@Test
2156-
public void testGzipLevel() {
2157-
Http11NioProtocol protocol = new Http11NioProtocol();
2158-
2159-
Assert.assertEquals(-1, protocol.getGzipLevel());
2160-
2161-
protocol.setGzipLevel(Deflater.BEST_SPEED);
2162-
Assert.assertEquals(Deflater.BEST_SPEED, protocol.getGzipLevel());
2163-
2164-
protocol.setGzipLevel(Deflater.BEST_COMPRESSION);
2165-
Assert.assertEquals(Deflater.BEST_COMPRESSION, protocol.getGzipLevel());
2166-
}
2167-
2168-
@Test(expected = IllegalArgumentException.class)
2169-
public void testInvalidGzipLevelLow() {
2170-
new Http11NioProtocol().setGzipLevel(-2);
2171-
}
2172-
2173-
@Test(expected = IllegalArgumentException.class)
2174-
public void testInvalidGzipLevelHigh() {
2175-
new Http11NioProtocol().setGzipLevel(10);
2176-
}
2177-
2178-
@Test
2179-
public void testGzipBufferSize() {
2180-
Http11NioProtocol protocol = new Http11NioProtocol();
2181-
2182-
Assert.assertEquals(512, protocol.getGzipBufferSize());
2183-
2184-
protocol.setGzipBufferSize(1024);
2185-
Assert.assertEquals(1024, protocol.getGzipBufferSize());
2186-
}
2187-
2188-
@Test(expected = IllegalArgumentException.class)
2189-
public void testInvalidGzipBufferSize() {
2190-
new Http11NioProtocol().setGzipBufferSize(0);
2191-
}
2192-
2193-
@Test
2194-
public void testOutputFilterFactory() {
2195-
Http11NioProtocol protocol = new Http11NioProtocol();
2196-
2197-
// Test default factory is GzipOutputFilterFactory
2198-
Assert.assertNotNull(protocol.getOutputFilterFactory());
2199-
Assert.assertTrue(protocol.getOutputFilterFactory() instanceof GzipOutputFilterFactory);
2200-
2201-
protocol.setOutputFilterFactory(new MockOutputFilterFactory());
2202-
Assert.assertNotNull(protocol.getOutputFilterFactory());
2203-
Assert.assertTrue(protocol.getOutputFilterFactory() instanceof MockOutputFilterFactory);
2204-
}
2205-
2206-
@Test
2207-
public void testOutputFilterFactoryClassName() {
2208-
Http11NioProtocol protocol = new Http11NioProtocol();
2209-
2210-
protocol.setOutputFilterFactory(MockOutputFilterFactory.class.getName());
2211-
Assert.assertNotNull(protocol.getOutputFilterFactory());
2212-
Assert.assertTrue(protocol.getOutputFilterFactory() instanceof MockOutputFilterFactory);
2213-
}
2214-
2215-
@Test
2216-
public void testNoCompressionEncodings() {
2217-
Http11NioProtocol protocol = new Http11NioProtocol();
2218-
String encodings = protocol.getNoCompressionEncodings();
2219-
Assert.assertTrue(Arrays.asList("br", "compress", "dcb", "dcz", "deflate", "gzip", "pack200-gzip", "zstd")
2220-
.stream()
2221-
.anyMatch(encodings::contains));
2222-
2223-
protocol.setNoCompressionEncodings("br");
2224-
2225-
String newEncodings = protocol.getNoCompressionEncodings();
2226-
Assert.assertTrue(newEncodings.contains("br"));
2227-
Assert.assertFalse(newEncodings.contains("gzip"));
2228-
}
2229-
22302155
@Test
22312156
public void testDefaultAutoRegistration() {
22322157
Http11NioProtocol protocol = new Http11NioProtocol();

0 commit comments

Comments
 (0)