Merge remote-tracking branch 'jetty-11.0.x' into `jetty-12.0.x`

This commit is contained in:
Joakim Erdfelt 2022-05-11 16:52:08 -05:00
commit 385f00f72b
No known key found for this signature in database
GPG Key ID: 2D0E1FB8FE4B68B4
26 changed files with 468 additions and 253 deletions

View File

@ -57,12 +57,14 @@ updates:
versions: [ ">=4.0.0" ]
- dependency-name: "jakarta.enterprise:jakarta.enterprise.cdi-api:*"
versions: [ ">=3.0.0" ]
- dependency-name: "com.sun.xml.ws:jaxws*"
- dependency-name: "com.sun.xml.ws:jaxws-rt"
versions: [ ">=3.0.0" ]
- dependency-name: "jakarta.transaction:*"
versions: [ ">=2.0.0" ]
- dependency-name: "org.infinispan:*"
versions: [ ">=12" ]
- dependency-name: "jakarta.xml.bind:*"
versions: [ ">=3.0.0" ]
- package-ecosystem: "maven"
directory: "/"

View File

@ -17,19 +17,12 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Import-Package>${osgi.slf4j.import.packages},org.eclipse.jetty.alpn;resolution:=optional,*</Import-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional, osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client)";resolution:=optional;cardinality:=multiple</Require-Capability>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Import-Package>${osgi.slf4j.import.packages},org.eclipse.jetty.alpn;resolution:=optional,*</Import-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional, osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client)";resolution:=optional;cardinality:=multiple</Require-Capability>
</instructions>
</configuration>
</plugin>
<!-- always include the sources to be able to prepare the eclipse-jetty-SDK feature
with a snapshot. -->

View File

@ -104,13 +104,11 @@ public class HttpStreamOverHTTP2 implements HttpStream, HTTP2Channel.Server
{
if (LOG.isDebugEnabled())
LOG.debug("onRequest", x);
onBadMessage(x);
return null;
return () -> onBadMessage(x);
}
catch (Throwable x)
{
onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
return null;
return () -> onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
}
}
@ -432,13 +430,11 @@ public class HttpStreamOverHTTP2 implements HttpStream, HTTP2Channel.Server
}
catch (BadMessageException x)
{
onBadMessage(x);
return null;
return () -> onBadMessage(x);
}
catch (Throwable x)
{
onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
return null;
return () -> onBadMessage(new BadMessageException(HttpStatus.INTERNAL_SERVER_ERROR_500, null, x));
}
}

View File

@ -0,0 +1,148 @@
//
// ========================================================================
// Copyright (c) 1995-2022 Mort Bay Consulting Pty Ltd and others.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
// which is available at https://www.apache.org/licenses/LICENSE-2.0.
//
// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
// ========================================================================
//
package org.eclipse.jetty.http2.tests;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.http.HostPortHttpField;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpMethod;
import org.eclipse.jetty.http.HttpScheme;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.frames.HeadersFrame;
import org.eclipse.jetty.http2.frames.PrefaceFrame;
import org.eclipse.jetty.http2.frames.SettingsFrame;
import org.eclipse.jetty.http2.internal.generator.Generator;
import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ErrorProcessor;
import org.eclipse.jetty.util.BufferUtil;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.component.LifeCycle;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class BadURITest
{
private Server server;
private ServerConnector connector;
protected void startServer(Handler handler) throws Exception
{
server = new Server();
connector = new ServerConnector(server, 1, 1, new HTTP2CServerConnectionFactory(new HttpConfiguration()));
server.addConnector(connector);
server.setHandler(handler);
server.start();
}
@AfterEach
public void dispose()
{
LifeCycle.stop(server);
}
@Test
@Disabled("TODO: need to fix ErrorProcessor")
public void testBadURI() throws Exception
{
CountDownLatch handlerLatch = new CountDownLatch(1);
startServer(new Handler.Processor()
{
@Override
public void process(Request request, Response response, Callback callback)
{
handlerLatch.countDown();
callback.succeeded();
}
});
// Remove existing ErrorHandlers.
server.getBeans(ErrorProcessor.class).forEach(server::removeBean);
server.addBean(new ErrorProcessor()
{
@Override
public ByteBuffer badMessageError(int status, String reason, HttpFields.Mutable fields)
{
// Return a very large buffer that will cause HTTP/2 flow control exhaustion and/or TCP congestion.
return ByteBuffer.allocateDirect(128 * 1024 * 1024);
}
});
ByteBufferPool byteBufferPool = connector.getByteBufferPool();
Generator generator = new Generator(byteBufferPool);
// Craft a request with a bad URI, it will not hit the Handler.
MetaData.Request metaData1 = new MetaData.Request(
HttpMethod.GET.asString(),
HttpScheme.HTTP.asString(),
new HostPortHttpField("localhost:" + connector.getLocalPort()),
// Use an ambiguous path parameter so that the URI is invalid.
"/foo/..;/bar",
HttpVersion.HTTP_2,
HttpFields.EMPTY,
-1
);
ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
generator.control(lease, new PrefaceFrame());
generator.control(lease, new SettingsFrame(new HashMap<>(), false));
generator.control(lease, new HeadersFrame(1, metaData1, null, true));
try (Socket client = new Socket("localhost", connector.getLocalPort()))
{
OutputStream output = client.getOutputStream();
for (ByteBuffer buffer : lease.getByteBuffers())
{
output.write(BufferUtil.toArray(buffer));
}
// Wait for the first request be processed on the server.
Thread.sleep(1000);
// Send a second request and verify that it hits the Handler.
lease.recycle();
MetaData.Request metaData2 = new MetaData.Request(
HttpMethod.GET.asString(),
HttpScheme.HTTP.asString(),
new HostPortHttpField("localhost:" + connector.getLocalPort()),
"/valid",
HttpVersion.HTTP_2,
HttpFields.EMPTY,
-1
);
generator.control(lease, new HeadersFrame(3, metaData2, null, true));
for (ByteBuffer buffer : lease.getByteBuffers())
{
output.write(BufferUtil.toArray(buffer));
}
assertTrue(handlerLatch.await(5, TimeUnit.SECONDS));
}
}
}

View File

@ -36,19 +36,11 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<id>generate-manifest</id>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Export-Package>*,org.eclipse.jetty.websocket.core.client.internal.*</Export-Package>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Export-Package>*,org.eclipse.jetty.websocket.core.client.internal.*</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -35,25 +35,18 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<id>generate-manifest</id>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Export-Package>*,org.eclipse.jetty.websocket.core.common.internal.*</Export-Package>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"
</Require-Capability>
<Provide-Capability>
osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.websocket.core.Extension
</Provide-Capability>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Bundle-Description>Jetty Websocket Core Common</Bundle-Description>
<Export-Package>*,org.eclipse.jetty.websocket.core.common.internal.*</Export-Package>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"; resolution:=optional
</Require-Capability>
<Provide-Capability>
osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.websocket.core.Extension
</Provide-Capability>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -85,6 +85,21 @@
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<!-- No point deploying testing projects -->
<skip>true</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>

View File

@ -16,27 +16,19 @@
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Bundle-SymbolicName>org.eclipse.jetty.demos.demo-mock-resources</Bundle-SymbolicName>
<Bundle-Description>Mock resources used for testing</Bundle-Description>
<Export-Package>
<configuration>
<instructions>
<Bundle-SymbolicName>org.eclipse.jetty.demos.demo-mock-resources</Bundle-SymbolicName>
<Bundle-Description>Mock resources used for testing</Bundle-Description>
<Export-Package>
org.example;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
<Import-Package>
javax.sql, jakarta.transaction;version="2.0.0"
</Import-Package>
<_nouses>true</_nouses>
</instructions>
</configuration>
</execution>
</executions>
</Export-Package>
<Import-Package>
javax.sql, jakarta.transaction;version="2.0.0"
</Import-Package>
<_nouses>true</_nouses>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -39,6 +39,7 @@ import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.CompressedContentFormat;
import org.eclipse.jetty.http.DateGenerator;
import org.eclipse.jetty.http.HttpField;
import org.eclipse.jetty.http.HttpHeader;
@ -1960,6 +1961,51 @@ public class DefaultServletTest
assertThat(body, containsString("fake gzip"));
}
@Test
public void testProgrammaticCustomCompressionFormats() throws Exception
{
createFile(docRoot.resolve("data0.txt"), "Hello Text 0");
createFile(docRoot.resolve("data0.txt.br"), "fake brotli");
createFile(docRoot.resolve("data0.txt.gz"), "fake gzip");
createFile(docRoot.resolve("data0.txt.bz2"), "fake bzip2");
ResourceService resourceService = new ResourceService();
resourceService.setPrecompressedFormats(new CompressedContentFormat[]{
new CompressedContentFormat("bzip2", ".bz2"),
new CompressedContentFormat("gzip", ".gz"),
new CompressedContentFormat("br", ".br")
});
ServletHolder defholder = new ServletHolder(new DefaultServlet()); // TODO: how to integrate resource service / precompressed format
context.addServlet(defholder, "/");
defholder.setInitParameter("resourceBase", docRoot.toString());
String rawResponse;
HttpTester.Response response;
String body;
rawResponse = connector.getResponse("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:bzip2, br, gzip\r\n\r\n");
response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
assertThat(response, containsHeaderValue(HttpHeader.CONTENT_LENGTH, "10"));
assertThat(response, containsHeaderValue(HttpHeader.CONTENT_TYPE, "text/plain"));
assertThat(response, containsHeaderValue(HttpHeader.VARY, "Accept-Encoding"));
assertThat(response, containsHeaderValue(HttpHeader.CONTENT_ENCODING, "bzip2"));
body = response.getContent();
assertThat(body, containsString("fake bzip2"));
// TODO: show accept-encoding search order issue (shouldn't this request return data0.txt.br?)
rawResponse = connector.getResponse("GET /context/data0.txt HTTP/1.0\r\nHost:localhost:8080\r\nAccept-Encoding:br, gzip\r\n\r\n");
response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getStatus(), is(HttpStatus.OK_200));
assertThat(response, containsHeaderValue(HttpHeader.CONTENT_LENGTH, "9"));
assertThat(response, containsHeaderValue(HttpHeader.CONTENT_TYPE, "text/plain"));
assertThat(response, containsHeaderValue(HttpHeader.VARY, "Accept-Encoding"));
assertThat(response, containsHeaderValue(HttpHeader.CONTENT_ENCODING, "gzip"));
body = response.getContent();
assertThat(body, containsString("fake gzip"));
}
@Test
public void testControlCharacter() throws Exception
{

View File

@ -40,6 +40,7 @@ import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.eclipse.jetty.http.CompressedContentFormat;
import org.eclipse.jetty.http.HttpStatus;
import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.server.LocalConnector;
import org.eclipse.jetty.server.Server;
@ -54,6 +55,7 @@ import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
@ -687,6 +689,49 @@ public class GzipHandlerTest
assertEquals(__icontent, testOut.toString("UTF8"));
}
@Test
public void testIncludeExcludeGzipHandlerInflate() throws Exception
{
gzipHandler.addExcludedInflationPaths("/ctx/echo/exclude");
gzipHandler.addIncludedInflationPaths("/ctx/echo/include");
String message = "hello world";
byte[] gzippedMessage = gzipContent(message);
// The included path does deflate the content.
HttpTester.Response response = sendGzipRequest("/ctx/echo/include", message);
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
assertThat(response.getContent(), equalTo(message));
// The excluded path does not deflate the content.
response = sendGzipRequest("/ctx/echo/exclude", message);
assertThat(response.getStatus(), equalTo(HttpStatus.OK_200));
assertThat(response.getContentBytes(), equalTo(gzippedMessage));
}
private byte[] gzipContent(String content) throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream output = new GZIPOutputStream(baos);
output.write(content.getBytes(StandardCharsets.UTF_8));
output.close();
return baos.toByteArray();
}
private HttpTester.Response sendGzipRequest(String uri, String data) throws Exception
{
HttpTester.Request request = HttpTester.newRequest();
request.setMethod("GET");
request.setURI(uri);
request.setVersion("HTTP/1.0");
request.setHeader("Host", "tester");
request.setHeader("Content-Type", "text/plain");
request.setHeader("Content-Encoding", "gzip");
request.setContent(gzipContent(data));
return HttpTester.parseResponse(_connector.getResponse(request.generate()));
}
@Test
public void testAddGetPaths()
{

View File

@ -21,19 +21,12 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
<Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory</Provide-Capability>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
<Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory</Provide-Capability>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -50,6 +50,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
private final LongAdder _expires = new LongAdder();
private final LongAdder _errors = new LongAdder();
private final LongAdder _responsesThrown = new LongAdder();
private final LongAdder _responses1xx = new LongAdder();
private final LongAdder _responses2xx = new LongAdder();
private final LongAdder _responses3xx = new LongAdder();
@ -86,7 +87,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
long elapsed = System.currentTimeMillis() - request.getTimeStamp();
_requestStats.decrement();
_requestTimeStats.record(elapsed);
updateResponse(request);
updateResponse(request, false);
_asyncWaitStats.decrement();
if (_shutdown.isShutdown())
@ -161,10 +162,16 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
_asyncDispatches.increment();
}
boolean thrownError = false;
try
{
handler.handle(path, baseRequest, request, response);
}
catch (Throwable t)
{
thrownError = true;
throw t;
}
finally
{
final long now = System.currentTimeMillis();
@ -184,7 +191,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
{
_requestStats.decrement();
_requestTimeStats.record(dispatched);
updateResponse(baseRequest);
updateResponse(baseRequest, thrownError);
}
}
@ -193,10 +200,14 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
}
}
protected void updateResponse(Request request)
protected void updateResponse(Request request, boolean thrownError)
{
Response response = request.getResponse();
if (request.isHandled())
if (thrownError)
{
_responsesThrown.increment();
}
else if (request.isHandled())
{
switch (response.getStatus() / 100)
{
@ -532,6 +543,18 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
return _responses5xx.intValue();
}
/**
* @return the number of requests that threw an exception during handling
* since {@link #statsReset()} was last called. These may have resulted in
* some error responses which were unrecorded by the {@link StatisticsHandler}.
*/
@ManagedAttribute("number of requests that threw an exception during handling")
public int getResponsesThrown()
{
return _responsesThrown.intValue();
}
/**
* @return the milliseconds since the statistics were started with {@link #statsReset()}.
*/
@ -585,6 +608,7 @@ public class StatisticsHandler extends HandlerWrapper implements Graceful
sb.append("3xx responses: ").append(getResponses3xx()).append("<br />\n");
sb.append("4xx responses: ").append(getResponses4xx()).append("<br />\n");
sb.append("5xx responses: ").append(getResponses5xx()).append("<br />\n");
sb.append("responses thrown: ").append(getResponsesThrown()).append("<br />\n");
sb.append("Bytes sent total: ").append(getResponsesBytesTotal()).append("<br />\n");
return sb.toString();

View File

@ -21,19 +21,12 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
<Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory</Provide-Capability>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)"</Require-Capability>
<Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory</Provide-Capability>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -17,7 +17,7 @@
<pax.url.version>2.6.2</pax.url.version>
<swissbox.version>1.8.3</swissbox.version>
<tinybundles.version>3.0.0</tinybundles.version>
<spifly.version>1.3.4</spifly.version>
<spifly.version>1.3.5</spifly.version>
</properties>
<dependencies>
<!-- Pax Exam Dependencies -->

View File

@ -45,7 +45,6 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import static org.ops4j.pax.exam.CoreOptions.wrappedBundle;
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
@ -89,12 +88,8 @@ public class TestJettyOSGiBootHTTP2Conscrypt
res.add(CoreOptions.systemProperty("jetty.alpn.protocols").value("h2,http/1.1"));
res.add(CoreOptions.systemProperty("jetty.sslContext.provider").value("Conscrypt"));
res.add(wrappedBundle(mavenBundle().groupId("org.conscrypt").artifactId("conscrypt-openjdk-uber").versionAsInProject())
.imports("javax.net.ssl,*")
.exports("org.conscrypt;version=" + System.getProperty("conscrypt-version"))
.instructions("Bundle-NativeCode=META-INF/native/libconscrypt_openjdk_jni-linux-x86_64.so")
.start());
res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-ee9-osgi-alpn").versionAsInProject().noStart());
res.add(mavenBundle().groupId("org.conscrypt").artifactId("conscrypt-openjdk-uber").versionAsInProject().start());
res.add(mavenBundle().groupId("org.eclipse.jetty.osgi").artifactId("jetty-osgi-alpn").versionAsInProject().noStart());
res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-conscrypt-server").versionAsInProject().start());
res.add(mavenBundle().groupId("org.eclipse.jetty").artifactId("jetty-alpn-server").versionAsInProject().start());

View File

@ -21,18 +21,11 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Require-Capability>osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory)";resolution:=optional;cardinality:=multiple, osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional</Require-Capability>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Require-Capability>osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.security.Authenticator$Factory)";resolution:=optional;cardinality:=multiple, osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional</Require-Capability>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -16,6 +16,7 @@ package org.eclipse.jetty.ee9.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.StringTokenizer;
import jakarta.servlet.ServletContext;
@ -170,7 +171,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
_resourceService.setAcceptRanges(getInitBoolean("acceptRanges", _resourceService.isAcceptRanges()));
_resourceService.setDirAllowed(getInitBoolean("dirAllowed", _resourceService.isDirAllowed()));
_resourceService.setRedirectWelcome(getInitBoolean("redirectWelcome", _resourceService.isRedirectWelcome()));
_resourceService.setPrecompressedFormats(parsePrecompressedFormats(getInitParameter("precompressed"), getInitBoolean("gzip", false)));
_resourceService.setPrecompressedFormats(parsePrecompressedFormats(getInitParameter("precompressed"), getInitBoolean("gzip"), _resourceService.getPrecompressedFormats()));
_resourceService.setPathInfoOnly(getInitBoolean("pathInfoOnly", _resourceService.isPathInfoOnly()));
_resourceService.setEtags(getInitBoolean("etags", _resourceService.isEtags()));
@ -303,8 +304,12 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
LOG.debug("resource base = {}", _resourceBase);
}
private CompressedContentFormat[] parsePrecompressedFormats(String precompressed, boolean gzip)
private CompressedContentFormat[] parsePrecompressedFormats(String precompressed, Boolean gzip, CompressedContentFormat[] dft)
{
if (precompressed == null && gzip == null)
{
return dft;
}
List<CompressedContentFormat> ret = new ArrayList<>();
if (precompressed != null && precompressed.indexOf('=') > 0)
{
@ -314,7 +319,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
String encoding = setting[0].trim();
String extension = setting[1].trim();
ret.add(new CompressedContentFormat(encoding, extension));
if (gzip && !ret.contains(CompressedContentFormat.GZIP))
if (gzip == Boolean.TRUE && !ret.contains(CompressedContentFormat.GZIP))
ret.add(CompressedContentFormat.GZIP);
}
}
@ -326,7 +331,7 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
ret.add(CompressedContentFormat.GZIP);
}
}
else if (gzip)
else if (gzip == Boolean.TRUE)
{
// gzip handling is for backwards compatibility with older Jetty
ret.add(CompressedContentFormat.GZIP);
@ -367,11 +372,11 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
return value;
}
private boolean getInitBoolean(String name, boolean dft)
private Boolean getInitBoolean(String name)
{
String value = getInitParameter(name);
if (value == null || value.length() == 0)
return dft;
return null;
return (value.startsWith("t") ||
value.startsWith("T") ||
value.startsWith("y") ||
@ -379,6 +384,11 @@ public class DefaultServlet extends HttpServlet implements ResourceFactory, Welc
value.startsWith("1"));
}
private boolean getInitBoolean(String name, boolean dft)
{
return Optional.ofNullable(getInitBoolean(name)).orElse(dft);
}
private int getInitInt(String name, int dft)
{
String value = getInitParameter(name);

View File

@ -59,28 +59,21 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket.client Implementation</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.client.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
</Require-Capability>
<Provide-Capability>
osgi.serviceloader;osgi.serviceloader=jakarta.websocket.ContainerProvider,
osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
</Provide-Capability>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket.client Implementation</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.client.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
</Require-Capability>
<Provide-Capability>
osgi.serviceloader;osgi.serviceloader=jakarta.websocket.ContainerProvider,
osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
</Provide-Capability>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -20,21 +20,14 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket.client Implementation</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket.client Implementation</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -61,20 +61,18 @@
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket.server Implementation</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.server.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Provide-Capability>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket.server Implementation</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.server.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Provide-Capability>
osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.ee9.webapp.Configuration,osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer,osgi.serviceloader;osgi.serviceloader=jakarta.websocket.server.ServerEndpointConfig$Configurator
</Provide-Capability>
</instructions>
</configuration>
</execution>
</executions>
</Provide-Capability>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -77,21 +77,14 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket Integration Tests</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Bundle-Description>jakarta.websocket Integration Tests</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jakarta.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>

View File

@ -64,9 +64,12 @@
<configuration>
<instructions>
<Bundle-Description>Jetty Websocket Server</Bundle-Description>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Require-Capability>
osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional
</Require-Capability>
<Provide-Capability>
osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.ee9.webapp.Configuration,osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.ee9.webapp.Configuration,
osgi.serviceloader;osgi.serviceloader=jakarta.servlet.ServletContainerInitializer
</Provide-Capability>
</instructions>
</configuration>

View File

@ -98,21 +98,14 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Bundle-Description>jetty.websocket Integration Tests</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jetty.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Bundle-Description>jetty.websocket Integration Tests</Bundle-Description>
<Export-Package>
org.eclipse.jetty.websocket.jetty.tests.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -50,20 +50,13 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<goal>manifest</goal>
</goals>
<configuration>
<instructions>
<Export-Package>
org.eclipse.jetty.gcloud.session.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</execution>
</executions>
<configuration>
<instructions>
<Export-Package>
org.eclipse.jetty.gcloud.session.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
</Export-Package>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>

View File

@ -12,7 +12,7 @@
<description>Generates a (maven based) P2 Updatesite</description>
<packaging>pom</packaging>
<properties>
<tycho-version>2.5.0</tycho-version>
<tycho-version>2.7.3</tycho-version>
</properties>
<build>
<plugins>

71
pom.xml
View File

@ -27,31 +27,31 @@
<apache.httpclient.version>4.5.13</apache.httpclient.version>
<apache.httpcore.version>4.4.15</apache.httpcore.version>
<asciidoctorj.version>2.5.3</asciidoctorj.version>
<asciidoctorj-diagram.version>2.2.1</asciidoctorj-diagram.version>
<asm.version>9.2</asm.version>
<awaitility.version>4.1.1</awaitility.version>
<bndlib.version>5.3.0</bndlib.version>
<asm.version>9.3</asm.version>
<awaitility.version>4.2.0</awaitility.version>
<bndlib.version>6.2.0</bndlib.version>
<build-support.version>1.5</build-support.version>
<checkstyle.version>9.2.1</checkstyle.version>
<checkstyle.version>10.2</checkstyle.version>
<commons-codec.version>1.15</commons-codec.version>
<commons-lang3.version>3.12.0</commons-lang3.version>
<conscrypt.version>2.5.2</conscrypt.version>
<disruptor.version>3.4.2</disruptor.version>
<felix.version>7.0.3</felix.version>
<findbugs.jsr305.version>3.0.2</findbugs.jsr305.version>
<google.errorprone.version>2.10.0</google.errorprone.version>
<grpc.version>1.43.1</grpc.version>
<gson.version>2.8.9</gson.version>
<guava.version>31.0.1-jre</guava.version>
<guice.version>5.0.1</guice.version>
<google.errorprone.version>2.13.1</google.errorprone.version>
<grpc.version>1.46.0</grpc.version>
<gson.version>2.9.0</gson.version>
<guava.version>31.1-jre</guava.version>
<guice.version>5.1.0</guice.version>
<hamcrest.version>2.2</hamcrest.version>
<hazelcast.version>4.2.4</hazelcast.version>
<infinispan.version>11.0.11.Final</infinispan.version>
<infinispan.protostream.version>4.3.4.Final</infinispan.protostream.version>
<jackson-databind.version>2.13.0</jackson-databind.version>
<jamon.version>2.82</jamon.version>
<jboss.logging.version>3.4.3.Final</jboss.logging.version>
<jboss-logging.version>2.2.1.Final</jboss-logging.version>
<hawtio.version>2.14.5</hawtio.version>
<hazelcast.version>4.2.5</hazelcast.version>
<infinispan.protostream.version>4.4.3.Final</infinispan.protostream.version>
<infinispan.version>11.0.15.Final</infinispan.version>
<jackson.databind.version>2.13.2.2</jackson.databind.version>
<jboss.logging.annotations.version>2.2.1.Final</jboss.logging.annotations.version>
<jboss.logging.processor.version>2.2.1.Final</jboss.logging.processor.version>
<jboss.logging.version>3.5.0.Final</jboss.logging.version>
<jboss-logmanager.version>2.1.18.Final</jboss-logmanager.version>
<jboss-threads.version>3.1.0.Final</jboss-threads.version>
<jetty-assembly-descriptors.version>1.1</jetty-assembly-descriptors.version>
@ -70,18 +70,21 @@
<json-smart.version>2.4.7</json-smart.version>
<jsp.impl.version>10.0.10</jsp.impl.version>
<junit.version>5.8.2</junit.version>
<kerb-simplekdc.version>2.0.1</kerb-simplekdc.version>
<log4j2.version>2.17.1</log4j2.version>
<logback.version>1.3.0-alpha12</logback.version>
<mariadb.version>2.7.4</mariadb.version>
<kerb-simplekdc.version>2.0.2</kerb-simplekdc.version>
<log4j2.version>2.17.2</log4j2.version>
<logback.version>1.3.0-alpha15</logback.version>
<mariadb.version>3.0.4</mariadb.version>
<mariadb.docker.version>10.3.6</mariadb.docker.version>
<maven.deps.version>3.8.4</maven.deps.version>
<maven-artifact-transfer.version>0.13.1</maven-artifact-transfer.version>
<maven.resolver.version>1.7.3</maven.resolver.version>
<mongodb.version>3.2.2</mongodb.version>
<maven.resolver.version>1.8.0</maven.resolver.version>
<maven.version>3.8.4</maven.version>
<mongodb.version>3.12.11</mongodb.version>
<openpojo.version>0.9.1</openpojo.version>
<org.osgi.annotation.version>8.0.1</org.osgi.annotation.version>
<org.osgi.core.version>6.0.0</org.osgi.core.version>
<org.osgi.util.function.version>1.2.0</org.osgi.util.function.version>
<org.osgi.util.promise.version>1.2.0</org.osgi.util.promise.version>
<plexus-component-annotations.version>2.1.1</plexus-component-annotations.version>
<plexus-utils.version>3.4.1</plexus-utils.version>
<slf4j.version>2.0.0-alpha6</slf4j.version>
@ -753,7 +756,6 @@
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>${maven.bundle.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<supportedProjectTypes>
<supportedProjectType>jar</supportedProjectType>
@ -1493,12 +1495,12 @@
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging-annotations</artifactId>
<version>${jboss-logging.version}</version>
<version>${jboss.logging.annotations.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging-processor</artifactId>
<version>${jboss-logging.version}</version>
<version>${jboss.logging.processor.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.logmanager</groupId>
@ -1539,14 +1541,31 @@
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<!-- older artifact location, some of our transitive deps still use this coordinate -->
<artifactId>org.osgi.core</artifactId>
<version>${org.osgi.core.version}</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<!-- newer artifact location, some of our transitive deps use this up to date coordinate -->
<artifactId>osgi.core</artifactId>
<version>${org.osgi.core.version}</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>osgi.annotation</artifactId>
<version>${org.osgi.annotation.version}</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.util.function</artifactId>
<version>${org.osgi.util.function.version}</version>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.util.promise</artifactId>
<version>${org.osgi.util.promise.version}</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>