Skip to content

Commit e8a0d5a

Browse files
committed
Upgrade Jetty from 10.0.20 to 12.0.10 (EE 8)
1 parent 44a8b75 commit e8a0d5a

File tree

8 files changed

+66
-78
lines changed

8 files changed

+66
-78
lines changed

.github/dependabot.yml

-5
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ updates:
55
schedule:
66
interval: "weekly"
77
target-branch: "master"
8-
ignore:
9-
# Restrict updates to jetty in the 10.x space
10-
- dependency-name: "org.eclipse.jetty:*"
11-
versions: [ ">=11" ]
12-
138
- package-ecosystem: "github-actions"
149
directory: "/"
1510
schedule:

Jenkinsfile

+1-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,5 @@
55
*/
66
buildPlugin(useContainerAgent: true, configurations: [
77
[platform: 'linux', jdk: 21],
8-
[platform: 'windows', jdk: 17],
9-
[platform: 'linux', jdk: 11]
8+
[platform: 'windows', jdk: 17]
109
])

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# What is Winstone?
2-
Winstone is a command line interface around Jetty 10.0.x, which implements
2+
Winstone is a command line interface around Jetty 12.0.x, which implements
33
Servlet 4.0 (JakartaEE 8/`javax.servlet.*`), WebSocket/JSR-356, and HTTP/2 support. It is used as the default
44
embedded servlet container in Jenkins (via the `executable` package in the `war` module)
55
and can be used by any other web applications that wants to be self-contained.

pom.xml

+21-16
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,12 @@
3535
</scm>
3636

3737
<properties>
38-
<revision>6.21</revision>
38+
<revision>7.0</revision>
3939
<changelist>-SNAPSHOT</changelist>
40-
<jetty.version>10.0.21</jetty.version>
40+
<jetty.version>12.0.10</jetty.version>
4141
<slf4j.version>2.0.13</slf4j.version>
4242
<gitHubRepo>jenkinsci/winstone</gitHubRepo>
4343
<spotless.check.skip>false</spotless.check.skip>
44-
<!-- TODO until we are ready to ship Winstone 7 with Jetty 12 EE 8 -->
45-
<maven.compiler.release>11</maven.compiler.release>
4644
</properties>
4745

4846
<dependencyManagement>
@@ -54,6 +52,13 @@
5452
<type>pom</type>
5553
<scope>import</scope>
5654
</dependency>
55+
<dependency>
56+
<groupId>org.eclipse.jetty.ee8</groupId>
57+
<artifactId>jetty-ee8-bom</artifactId>
58+
<version>${jetty.version}</version>
59+
<type>pom</type>
60+
<scope>import</scope>
61+
</dependency>
5762
<!-- TODO SLF4J-437 use BOM -->
5863
<dependency>
5964
<groupId>org.slf4j</groupId>
@@ -101,10 +106,6 @@
101106
<groupId>org.eclipse.jetty</groupId>
102107
<artifactId>jetty-server</artifactId>
103108
</dependency>
104-
<dependency>
105-
<groupId>org.eclipse.jetty</groupId>
106-
<artifactId>jetty-servlet</artifactId>
107-
</dependency>
108109
<dependency>
109110
<groupId>org.eclipse.jetty</groupId>
110111
<artifactId>jetty-unixdomain-server</artifactId>
@@ -114,21 +115,25 @@
114115
<artifactId>jetty-util</artifactId>
115116
</dependency>
116117
<dependency>
117-
<groupId>org.eclipse.jetty</groupId>
118-
<artifactId>jetty-webapp</artifactId>
118+
<groupId>org.eclipse.jetty.ee8</groupId>
119+
<artifactId>jetty-ee8-servlet</artifactId>
119120
</dependency>
120121
<dependency>
121-
<groupId>org.eclipse.jetty.http2</groupId>
122-
<artifactId>http2-hpack</artifactId>
122+
<groupId>org.eclipse.jetty.ee8</groupId>
123+
<artifactId>jetty-ee8-webapp</artifactId>
124+
</dependency>
125+
<dependency>
126+
<groupId>org.eclipse.jetty.ee8.websocket</groupId>
127+
<artifactId>jetty-ee8-websocket-jetty-server</artifactId>
128+
<!-- or jetty-ee8-websocket-javax-server -->
123129
</dependency>
124130
<dependency>
125131
<groupId>org.eclipse.jetty.http2</groupId>
126-
<artifactId>http2-server</artifactId>
132+
<artifactId>jetty-http2-hpack</artifactId>
127133
</dependency>
128134
<dependency>
129-
<groupId>org.eclipse.jetty.websocket</groupId>
130-
<artifactId>websocket-jetty-server</artifactId>
131-
<!-- or websocket-javax-server -->
135+
<groupId>org.eclipse.jetty.http2</groupId>
136+
<artifactId>jetty-http2-server</artifactId>
132137
</dependency>
133138
<dependency>
134139
<groupId>org.slf4j</groupId>

src/main/java/winstone/HostConfiguration.java

+15-18
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,12 @@
3030
import java.util.jar.JarFile;
3131
import java.util.logging.Level;
3232
import javax.servlet.SessionTrackingMode;
33-
import org.eclipse.jetty.http.MimeTypes;
33+
import org.eclipse.jetty.ee8.webapp.WebAppContext;
34+
import org.eclipse.jetty.ee8.websocket.server.config.JettyWebSocketServletContainerInitializer;
3435
import org.eclipse.jetty.security.LoginService;
35-
import org.eclipse.jetty.server.Handler;
3636
import org.eclipse.jetty.server.RequestLog;
3737
import org.eclipse.jetty.server.Server;
38-
import org.eclipse.jetty.server.handler.RequestLogHandler;
3938
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
40-
import org.eclipse.jetty.webapp.WebAppContext;
41-
import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer;
4239
import winstone.cmdline.CompressionScheme;
4340
import winstone.cmdline.Option;
4441

@@ -55,7 +52,6 @@ public class HostConfiguration {
5552
private Map<String, String> args;
5653
private Map<String, WebAppContext> webapps;
5754
private ClassLoader commonLibCL;
58-
private MimeTypes mimeTypes = new MimeTypes();
5955
private final LoginService loginService;
6056

6157
public HostConfiguration(Server server, String hostname, ClassLoader commonLibCL, @NonNull Map<String, String> args)
@@ -85,7 +81,11 @@ public HostConfiguration(Server server, String hostname, ClassLoader commonLibCL
8581
// trim off the trailing '/' that Jetty doesn't like
8682
prefix = prefix.substring(0, prefix.length() - 1);
8783
}
88-
Handler handler = configureAccessLog(create(getWebRoot(webroot, warfile), prefix), "webapp");
84+
WebAppContext webAppContext = create(getWebRoot(webroot, warfile), prefix);
85+
RequestLog requestLog = configureAccessLog("webapp");
86+
if (requestLog != null) {
87+
server.setRequestLog(requestLog);
88+
}
8989

9090
{ // load additional mime types
9191
loadBuiltinMimeTypes();
@@ -100,7 +100,7 @@ public HostConfiguration(Server server, String hostname, ClassLoader commonLibCL
100100
}
101101
String extension = mapping.substring(0, delimPos);
102102
String mimeType = mapping.substring(delimPos + 1);
103-
this.mimeTypes.addMimeMapping(extension.toLowerCase(), mimeType);
103+
server.getMimeTypes().addMimeMapping(extension.toLowerCase(), mimeType);
104104
}
105105
}
106106
}
@@ -109,11 +109,11 @@ public HostConfiguration(Server server, String hostname, ClassLoader commonLibCL
109109
switch (compressionScheme) {
110110
case GZIP:
111111
GzipHandler gzipHandler = new GzipHandler();
112-
gzipHandler.setHandler(handler);
112+
gzipHandler.setHandler(webAppContext);
113113
server.setHandler(gzipHandler);
114114
break;
115115
case NONE:
116-
server.setHandler(handler);
116+
server.setHandler(webAppContext);
117117
break;
118118
default:
119119
throw new IllegalArgumentException("Unexpected compression scheme: " + compressionScheme);
@@ -132,7 +132,8 @@ private void loadBuiltinMimeTypes() {
132132
Properties props = new Properties();
133133
props.load(in);
134134
for (Entry<Object, Object> e : props.entrySet()) {
135-
mimeTypes.addMimeMapping(e.getKey().toString(), e.getValue().toString());
135+
server.getMimeTypes()
136+
.addMimeMapping(e.getKey().toString(), e.getValue().toString());
136137
}
137138
} catch (IOException e) {
138139
throw new UncheckedIOException("Failed to load the built-in MIME types", e);
@@ -143,24 +144,21 @@ private void loadBuiltinMimeTypes() {
143144
* @param webAppName
144145
* Unique name given to the access logger.
145146
*/
146-
private Handler configureAccessLog(Handler handler, String webAppName) {
147+
private RequestLog configureAccessLog(String webAppName) {
147148
try {
148149
Class<? extends RequestLog> loggerClass =
149150
Option.ACCESS_LOGGER_CLASSNAME.get(args, RequestLog.class, commonLibCL);
150151
if (loggerClass != null) {
151152
// Build the realm
152153
Constructor<? extends RequestLog> loggerConstr = loggerClass.getConstructor(String.class, Map.class);
153-
RequestLogHandler rlh = new RequestLogHandler();
154-
rlh.setHandler(handler);
155-
rlh.setRequestLog(loggerConstr.newInstance(webAppName, args));
156-
return rlh;
154+
return loggerConstr.newInstance(webAppName, args);
157155
} else {
158156
Logger.log(Level.FINER, Launcher.RESOURCES, "WebAppConfig.LoggerDisabled");
159157
}
160158
} catch (Throwable err) {
161159
Logger.log(Level.SEVERE, Launcher.RESOURCES, "WebAppConfig.LoggerError", "", err);
162160
}
163-
return handler;
161+
return null;
164162
}
165163

166164
private WebAppContext create(File app, String prefix) {
@@ -202,7 +200,6 @@ public void postConfigure() throws Exception {
202200
wac.getSecurityHandler().setLoginService(loginService);
203201
wac.setThrowUnavailableOnStartupException(
204202
true); // if boot fails, abort the process instead of letting empty Jetty run
205-
wac.setMimeTypes(mimeTypes);
206203
wac.getSessionHandler().setSessionTrackingModes(Set.of(SessionTrackingMode.COOKIE));
207204
wac.getSessionHandler().setSessionCookie(WinstoneSession.SESSION_COOKIE_NAME);
208205
this.webapps.put(wac.getContextPath(), wac);

src/main/java/winstone/HttpsConnectorFactory.java

+3-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import org.eclipse.jetty.server.Connector;
1212
import org.eclipse.jetty.server.Handler;
1313
import org.eclipse.jetty.server.Server;
14-
import org.eclipse.jetty.server.handler.HandlerList;
1514
import org.eclipse.jetty.server.handler.SecuredRedirectHandler;
1615
import winstone.cmdline.Option;
1716

@@ -40,14 +39,9 @@ public Connector start(Map<String, String> args, Server server) throws IOExcepti
4039
if (currentHandler == null) {
4140
server.setHandler(new SecuredRedirectHandler());
4241
} else {
43-
if (currentHandler instanceof HandlerList) {
44-
((HandlerList) currentHandler).addHandler(new SecuredRedirectHandler());
45-
} else {
46-
HandlerList handlers = new HandlerList();
47-
handlers.addHandler(new SecuredRedirectHandler());
48-
handlers.addHandler(currentHandler);
49-
server.setHandler(handlers);
50-
}
42+
Handler.Wrapper securedRedirectHandler = new SecuredRedirectHandler();
43+
securedRedirectHandler.setHandler(currentHandler);
44+
server.setHandler(securedRedirectHandler);
5145
}
5246
}
5347
configureSsl(args, server);

src/main/java/winstone/accesslog/SimpleAccessLogger.java

+23-25
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@
1616
import java.nio.file.Files;
1717
import java.nio.file.InvalidPathException;
1818
import java.nio.file.StandardOpenOption;
19+
import java.security.Principal;
1920
import java.text.DateFormat;
2021
import java.text.SimpleDateFormat;
2122
import java.util.Date;
2223
import java.util.Map;
2324
import java.util.logging.Level;
24-
import org.eclipse.jetty.server.Authentication;
25+
import org.eclipse.jetty.http.HttpFields;
2526
import org.eclipse.jetty.server.Request;
2627
import org.eclipse.jetty.server.RequestLog;
2728
import org.eclipse.jetty.server.Response;
@@ -95,44 +96,41 @@ public SimpleAccessLogger(String webAppName, Map<String, String> startupArgs) th
9596

9697
@Override
9798
public void log(Request request, Response response) {
98-
String uriLine = request.getMethod() + " " + request.getRequestURI() + " " + request.getProtocol();
99+
String uriLine = request.getMethod() + " " + request.getHttpURI().getPath() + " "
100+
+ request.getConnectionMetaData().getProtocol();
99101
int status = response.getStatus();
100-
long size = response.getContentCount();
102+
long size = Response.getContentBytesWritten(response);
101103
String date;
102104
synchronized (DF) {
103105
date = DF.format(new Date());
104106
}
105107

106108
// mimic
107-
// https://github.com/eclipse/jetty.project/blob/jetty-9.4.0.v20161208/jetty-server/src/main/java/org/eclipse/jetty/server/AbstractNCSARequestLog.java#L130
108-
Authentication authentication = request.getAuthentication();
109-
String remoteUser;
110-
if (authentication instanceof Authentication.User) {
111-
Authentication.User user = (Authentication.User) authentication;
112-
remoteUser = user.getUserIdentity().getUserPrincipal().getName();
113-
} else {
114-
remoteUser = null;
115-
}
109+
// https://github.com/jetty/jetty.project/blob/c5b2533fdecce21b54c6fbaf36f79bc3ba909775/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/CustomRequestLog.java#L1093-L1099
110+
Request.AuthenticationState authenticationState = Request.getAuthenticationState(request);
111+
Principal principal = authenticationState == null ? null : authenticationState.getUserPrincipal();
112+
String remoteUser = principal == null ? "-" : principal.getName();
116113

114+
HttpFields httpFields = request.getHeaders();
117115
String logLine = WinstoneResourceBundle.globalReplace(this.pattern, new String[][] {
118-
{"###x-forwarded-for###", nvl(request.getHeader("X-Forwarded-For"))},
119-
{"###x-forwarded-host###", nvl(request.getHeader("X-Forwarded-Host"))},
120-
{"###x-forwarded-proto###", nvl(request.getHeader("X-Forwarded-Proto"))},
121-
{"###x-forwarded-protocol###", nvl(request.getHeader("X-Forwarded-Protocol"))},
122-
{"###x-forwarded-server###", nvl(request.getHeader("X-Forwarded-Server"))},
123-
{"###x-forwarded-ssl###", nvl(request.getHeader("X-Forwarded-Ssl"))},
124-
{"###x-requested-with###", nvl(request.getHeader("X-Requested-With"))},
125-
{"###x-do-not-track###", nvl(request.getHeader("X-Do-Not-Track"))},
126-
{"###dnt###", nvl(request.getHeader("DNT"))},
127-
{"###via###", nvl(request.getHeader("Via"))},
128-
{"###ip###", request.getRemoteHost()},
116+
{"###x-forwarded-for###", nvl(httpFields.get("X-Forwarded-For"))},
117+
{"###x-forwarded-host###", nvl(httpFields.get("X-Forwarded-Host"))},
118+
{"###x-forwarded-proto###", nvl(httpFields.get("X-Forwarded-Proto"))},
119+
{"###x-forwarded-protocol###", nvl(httpFields.get("X-Forwarded-Protocol"))},
120+
{"###x-forwarded-server###", nvl(httpFields.get("X-Forwarded-Server"))},
121+
{"###x-forwarded-ssl###", nvl(httpFields.get("X-Forwarded-Ssl"))},
122+
{"###x-requested-with###", nvl(httpFields.get("X-Requested-With"))},
123+
{"###x-do-not-track###", nvl(httpFields.get("X-Do-Not-Track"))},
124+
{"###dnt###", nvl(httpFields.get("DNT"))},
125+
{"###via###", nvl(httpFields.get("Via"))},
126+
{"###ip###", Request.getRemoteAddr(request)},
129127
{"###user###", nvl(remoteUser)},
130128
{"###time###", "[" + date + "]"},
131129
{"###uriLine###", uriLine},
132130
{"###status###", "" + status},
133131
{"###size###", "" + size},
134-
{"###referer###", nvl(request.getHeader("Referer"))},
135-
{"###userAgent###", nvl(request.getHeader("User-Agent"))}
132+
{"###referer###", nvl(httpFields.get("Referer"))},
133+
{"###userAgent###", nvl(httpFields.get("User-Agent"))}
136134
});
137135
this.outWriter.println(logLine);
138136
}

src/test/java/winstone/AbstractWinstoneTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import java.net.ConnectException;
77
import java.net.Socket;
88
import java.nio.file.Path;
9+
import org.eclipse.jetty.client.ContentResponse;
910
import org.eclipse.jetty.client.HttpClient;
10-
import org.eclipse.jetty.client.api.ContentResponse;
11-
import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic;
11+
import org.eclipse.jetty.client.transport.HttpClientTransportDynamic;
1212
import org.eclipse.jetty.http.HttpStatus;
1313
import org.eclipse.jetty.io.ClientConnector;
1414
import org.junit.After;

0 commit comments

Comments
 (0)