Skip to content

Commit a61f145

Browse files
Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-10.0.x-legacyMultipartParser
2 parents 1c24238 + f1c2b0d commit a61f145

File tree

6 files changed

+156
-21
lines changed

6 files changed

+156
-21
lines changed

jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientGZIPTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -292,10 +292,10 @@ protected void service(String target, Request jettyRequest, HttpServletRequest r
292292
InputStreamResponseListener listener = new InputStreamResponseListener();
293293
client.newRequest("localhost", connector.getLocalPort())
294294
.scheme(scenario.getScheme())
295-
.timeout(5, TimeUnit.SECONDS)
295+
.timeout(20, TimeUnit.SECONDS)
296296
.send(listener);
297297

298-
Response response = listener.get(5, TimeUnit.SECONDS);
298+
Response response = listener.get(20, TimeUnit.SECONDS);
299299
assertEquals(HttpStatus.OK_200, response.getStatus());
300300

301301
ByteArrayOutputStream output = new ByteArrayOutputStream();

jetty-http3/http3-server/src/main/java/org/eclipse/jetty/http3/server/internal/HttpChannelOverHTTP3.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -161,13 +161,11 @@ public Runnable onRequest(HeadersFrame frame)
161161
{
162162
if (LOG.isDebugEnabled())
163163
LOG.debug("onRequest() failure", x);
164-
onBadMessage(x);
165-
return null;
164+
return () -> onBadMessage(x);
166165
}
167166
catch (Throwable x)
168167
{
169-
onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
170-
return null;
168+
return () -> onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
171169
}
172170
}
173171

jetty-p2/pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
artifacts are created -->
4444
<dependency>
4545
<groupId>org.eclipse.jetty</groupId>
46-
<artifactId>jetty-bom</artifactId>
46+
<artifactId>jetty-home</artifactId>
4747
<version>${project.version}</version>
4848
<type>pom</type>
4949
</dependency>

jetty-server/src/main/java/org/eclipse/jetty/server/handler/gzip/GzipHandler.java

+21-8
Original file line numberDiff line numberDiff line change
@@ -664,14 +664,20 @@ public void setInflateBufferSize(int size)
664664
@Override
665665
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
666666
{
667+
if (baseRequest.isHandled())
668+
{
669+
super.handle(target, baseRequest, request, response);
670+
return;
671+
}
672+
667673
final ServletContext context = baseRequest.getServletContext();
668674
final String path = baseRequest.getPathInContext();
669675
LOG.debug("{} handle {} in {}", this, baseRequest, context);
670676

671677
if (!_dispatchers.contains(baseRequest.getDispatcherType()))
672678
{
673679
LOG.debug("{} excluded by dispatcherType {}", this, baseRequest.getDispatcherType());
674-
_handler.handle(target, baseRequest, request, response);
680+
super.handle(target, baseRequest, request, response);
675681
return;
676682
}
677683

@@ -688,6 +694,15 @@ public void handle(String target, Request baseRequest, HttpServletRequest reques
688694
baseRequest.getHttpInput().addInterceptor(gzipHttpInputInterceptor);
689695
}
690696

697+
// From here on out, the response output gzip determination is made
698+
699+
// Don't attempt to modify the response output if it's already committed.
700+
if (response.isCommitted())
701+
{
702+
super.handle(target, baseRequest, request, response);
703+
return;
704+
}
705+
691706
// Are we already being gzipped?
692707
HttpOutput out = baseRequest.getResponse().getHttpOutput();
693708
HttpOutput.Interceptor interceptor = out.getInterceptor();
@@ -764,15 +779,15 @@ else if (COMMA_GZIP.matcher(field.getValue()).matches())
764779
if (alreadyGzipped)
765780
{
766781
LOG.debug("{} already intercepting {}", this, request);
767-
_handler.handle(target, baseRequest, request, response);
782+
super.handle(target, baseRequest, request, response);
768783
return;
769784
}
770785

771786
// If not a supported method - no Vary because no matter what client, this URI is always excluded
772787
if (!_methods.test(baseRequest.getMethod()))
773788
{
774789
LOG.debug("{} excluded by method {}", this, request);
775-
_handler.handle(target, baseRequest, request, response);
790+
super.handle(target, baseRequest, request, response);
776791
return;
777792
}
778793

@@ -781,7 +796,7 @@ else if (COMMA_GZIP.matcher(field.getValue()).matches())
781796
if (!isPathGzipable(path))
782797
{
783798
LOG.debug("{} excluded by path {}", this, request);
784-
_handler.handle(target, baseRequest, request, response);
799+
super.handle(target, baseRequest, request, response);
785800
return;
786801
}
787802

@@ -794,7 +809,7 @@ else if (COMMA_GZIP.matcher(field.getValue()).matches())
794809
{
795810
LOG.debug("{} excluded by path suffix mime type {}", this, request);
796811
// handle normally without setting vary header
797-
_handler.handle(target, baseRequest, request, response);
812+
super.handle(target, baseRequest, request, response);
798813
return;
799814
}
800815
}
@@ -804,9 +819,7 @@ else if (COMMA_GZIP.matcher(field.getValue()).matches())
804819
{
805820
// install interceptor and handle
806821
out.setInterceptor(new GzipHttpOutputInterceptor(this, getVaryField(), baseRequest.getHttpChannel(), origInterceptor, isSyncFlush()));
807-
808-
if (_handler != null)
809-
_handler.handle(target, baseRequest, request, response);
822+
super.handle(target, baseRequest, request, response);
810823
}
811824
finally
812825
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
//
2+
// ========================================================================
3+
// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
4+
//
5+
// This program and the accompanying materials are made available under the
6+
// terms of the Eclipse Public License v. 2.0 which is available at
7+
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
8+
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
9+
//
10+
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
11+
// ========================================================================
12+
//
13+
14+
package org.eclipse.jetty.servlet;
15+
16+
import java.io.IOException;
17+
import java.util.concurrent.LinkedBlockingQueue;
18+
import javax.servlet.ServletException;
19+
import javax.servlet.http.HttpServletRequest;
20+
import javax.servlet.http.HttpServletResponse;
21+
22+
import org.eclipse.jetty.client.HttpClient;
23+
import org.eclipse.jetty.client.api.ContentResponse;
24+
import org.eclipse.jetty.server.Handler;
25+
import org.eclipse.jetty.server.Request;
26+
import org.eclipse.jetty.server.Server;
27+
import org.eclipse.jetty.server.ServerConnector;
28+
import org.eclipse.jetty.server.handler.AbstractHandler;
29+
import org.eclipse.jetty.server.handler.DefaultHandler;
30+
import org.eclipse.jetty.server.handler.HandlerCollection;
31+
import org.eclipse.jetty.server.handler.ResourceHandler;
32+
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
33+
import org.eclipse.jetty.toolchain.test.jupiter.WorkDir;
34+
import org.eclipse.jetty.util.component.LifeCycle;
35+
import org.eclipse.jetty.util.resource.PathResource;
36+
import org.junit.jupiter.api.AfterEach;
37+
import org.junit.jupiter.api.Test;
38+
39+
import static org.hamcrest.MatcherAssert.assertThat;
40+
import static org.hamcrest.Matchers.containsString;
41+
import static org.hamcrest.Matchers.is;
42+
43+
/**
44+
* Tests of behavior of GzipHandler when Request.isHandled() or Response.isCommitted() is true
45+
*/
46+
public class GzipHandlerIsHandledTest
47+
{
48+
public WorkDir workDir;
49+
50+
private Server server;
51+
private HttpClient client;
52+
public LinkedBlockingQueue<String> events = new LinkedBlockingQueue<>();
53+
54+
public void startServer(Handler rootHandler) throws Exception
55+
{
56+
server = new Server();
57+
ServerConnector connector = new ServerConnector(server);
58+
connector.setPort(0);
59+
server.addConnector(connector);
60+
61+
server.setHandler(rootHandler);
62+
server.start();
63+
64+
client = new HttpClient();
65+
client.start();
66+
}
67+
68+
@AfterEach
69+
public void tearDown()
70+
{
71+
LifeCycle.stop(client);
72+
LifeCycle.stop(server);
73+
}
74+
75+
@Test
76+
public void testRequest() throws Exception
77+
{
78+
HandlerCollection handlers = new HandlerCollection();
79+
80+
ResourceHandler resourceHandler = new ResourceHandler();
81+
resourceHandler.setBaseResource(new PathResource(workDir.getPath()));
82+
resourceHandler.setDirectoriesListed(true);
83+
resourceHandler.setHandler(new EventHandler(events, "ResourceHandler"));
84+
85+
GzipHandler gzipHandler = new GzipHandler();
86+
gzipHandler.setMinGzipSize(32);
87+
gzipHandler.setHandler(new EventHandler(events, "GzipHandler-wrapped-handler"));
88+
89+
handlers.setHandlers(new Handler[]{resourceHandler, gzipHandler, new DefaultHandler()});
90+
91+
startServer(handlers);
92+
93+
ContentResponse response = client.GET(server.getURI().resolve("/"));
94+
assertThat("response.status", response.getStatus(), is(200));
95+
// we should have received a directory listing from the ResourceHandler
96+
assertThat("response.content", response.getContentAsString(), containsString("Directory: /"));
97+
// resource handler should have handled the request
98+
// the gzip handler and default handlers should have been executed, seeing as this is a HandlerCollection
99+
// but the gzip handler should not have acted on the request, as the response is committed
100+
assertThat("One event should have been recorded", events.size(), is(1));
101+
// the event handler should see the request.isHandled = true
102+
// and response.isCommitted = true as the gzip handler didn't really do anything due to these
103+
// states and let the wrapped handler (the EventHandler in this case) make the call on what it should do.
104+
assertThat("Event indicating that GzipHandler-wrapped-handler ran", events.remove(), is("GzipHandler-wrapped-handler [request.isHandled=true, response.isCommitted=true]"));
105+
}
106+
107+
private static class EventHandler extends AbstractHandler
108+
{
109+
private final LinkedBlockingQueue<String> events;
110+
private final String action;
111+
112+
public EventHandler(LinkedBlockingQueue<String> events, String action)
113+
{
114+
this.events = events;
115+
this.action = action;
116+
}
117+
118+
@Override
119+
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
120+
{
121+
events.offer(String.format("%s [request.isHandled=%b, response.isCommitted=%b]", action, baseRequest.isHandled(), response.isCommitted()));
122+
}
123+
}
124+
}

pom.xml

+6-6
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
<junit.version>5.8.2</junit.version>
104104
<kerb-simplekdc.version>2.0.2</kerb-simplekdc.version>
105105
<log4j2.version>2.17.2</log4j2.version>
106-
<logback.version>1.3.0-alpha15</logback.version>
106+
<logback.version>1.3.0-alpha16</logback.version>
107107
<mariadb.version>3.0.4</mariadb.version>
108108
<mariadb.docker.version>10.3.6</mariadb.docker.version>
109109
<maven-artifact-transfer.version>0.13.1</maven-artifact-transfer.version>
@@ -116,12 +116,12 @@
116116
<org.osgi.util.function.version>1.2.0</org.osgi.util.function.version>
117117
<org.osgi.util.promise.version>1.2.0</org.osgi.util.promise.version>
118118
<plexus-component-annotations.version>2.1.1</plexus-component-annotations.version>
119-
<plexus-utils.version>3.4.1</plexus-utils.version>
119+
<plexus-utils.version>3.4.2</plexus-utils.version>
120120
<slf4j.version>2.0.0-alpha6</slf4j.version>
121121
<springboot.version>2.1.1.RELEASE</springboot.version>
122122
<taglibs-standard-impl.version>1.2.5</taglibs-standard-impl.version>
123123
<taglibs-standard-spec.version>1.2.5</taglibs-standard-spec.version>
124-
<testcontainers.version>1.17.1</testcontainers.version>
124+
<testcontainers.version>1.17.2</testcontainers.version>
125125
<weld.version>3.1.9.Final</weld.version>
126126
<wildfly.common.version>1.6.0.Final</wildfly.common.version>
127127
<wildfly.elytron.version>1.19.0.Final</wildfly.elytron.version>
@@ -141,7 +141,7 @@
141141
<license.maven.plugin.version>4.1</license.maven.plugin.version>
142142
<maven.antrun.plugin.version>3.1.0</maven.antrun.plugin.version>
143143
<maven.assembly.plugin.version>3.3.0</maven.assembly.plugin.version>
144-
<maven.bundle.plugin.version>5.1.4</maven.bundle.plugin.version>
144+
<maven.bundle.plugin.version>5.1.6</maven.bundle.plugin.version>
145145
<maven.clean.plugin.version>3.2.0</maven.clean.plugin.version>
146146
<maven.checkstyle.plugin.version>3.1.2</maven.checkstyle.plugin.version>
147147
<maven.compiler.plugin.version>3.10.1</maven.compiler.plugin.version>
@@ -166,8 +166,8 @@
166166
<maven.surefire.plugin.version>3.0.0-M5</maven.surefire.plugin.version>
167167
<maven.source.plugin.version>3.2.1</maven.source.plugin.version>
168168
<maven.war.plugin.version>3.3.2</maven.war.plugin.version>
169-
<spotbugs.maven.plugin.version>4.6.0.0</spotbugs.maven.plugin.version>
170-
<versions.maven.plugin.version>2.10.0</versions.maven.plugin.version>
169+
<spotbugs.maven.plugin.version>4.7.0.0</spotbugs.maven.plugin.version>
170+
<versions.maven.plugin.version>2.11.0</versions.maven.plugin.version>
171171

172172
<!-- testing -->
173173
<invoker.mergeUserSettings>false</invoker.mergeUserSettings>

0 commit comments

Comments
 (0)