This is an automated email from the ASF dual-hosted git repository. gaul pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/jclouds.git
The following commit(s) were added to refs/heads/master by this push: new d404391651 JCLOUDS-1602: Upgrade to Jetty 9.4.46 d404391651 is described below commit d4043916518f73fab75756e46e41b53ecd37c644 Author: Andrew Gaul <g...@apache.org> AuthorDate: Sun Jun 12 13:04:02 2022 +0900 JCLOUDS-1602: Upgrade to Jetty 9.4.46 Remove BaseJettyTest which BaseMockWebServerTest superseded. --- .../test/java/org/jclouds/http/BaseJettyTest.java | 331 --------------------- project/pom.xml | 2 +- 2 files changed, 1 insertion(+), 332 deletions(-) diff --git a/core/src/test/java/org/jclouds/http/BaseJettyTest.java b/core/src/test/java/org/jclouds/http/BaseJettyTest.java deleted file mode 100644 index 2e28cd065c..0000000000 --- a/core/src/test/java/org/jclouds/http/BaseJettyTest.java +++ /dev/null @@ -1,331 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jclouds.http; - -import static com.google.common.base.Throwables.getStackTraceAsString; -import static com.google.common.hash.Hashing.md5; -import static com.google.common.io.BaseEncoding.base64; -import static com.google.common.net.HttpHeaders.CONTENT_DISPOSITION; -import static com.google.common.net.HttpHeaders.CONTENT_ENCODING; -import static com.google.common.net.HttpHeaders.CONTENT_LANGUAGE; -import static com.google.common.net.HttpHeaders.CONTENT_LENGTH; -import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly; -import static javax.servlet.http.HttpServletResponse.SC_OK; -import static org.jclouds.Constants.PROPERTY_RELAX_HOSTNAME; -import static org.jclouds.Constants.PROPERTY_TRUST_ALL_CERTS; -import static org.jclouds.providers.AnonymousProviderMetadata.forApiOnEndpoint; -import static org.jclouds.util.Closeables2.closeQuietly; -import static org.jclouds.util.Strings2.toStringAndClose; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Enumeration; -import java.util.Properties; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.Handler; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.AbstractHandler; -import org.eclipse.jetty.server.ssl.SslSelectChannelConnector; -import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.jclouds.ContextBuilder; -import org.jclouds.io.ByteStreams2; -import org.jclouds.utils.TestUtils; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Optional; -import org.testng.annotations.Parameters; - -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMap.Builder; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.io.ByteSource; -import com.google.inject.Injector; -import com.google.inject.Module; - -public abstract class BaseJettyTest { - - protected static final String XML = "<foo><bar>whoppers</bar></foo>"; - protected static final String XML2 = "<foo><bar>chubbs</bar></foo>"; - private static final ByteSource oneHundredOneConstitutions = TestUtils.randomByteSource().slice(0, 101 * 45118); - - protected Server server = null; - protected IntegrationTestClient client; - protected Injector injector; - private AtomicInteger cycle = new AtomicInteger(0); - private Server server2; - protected int testPort; - protected String md5; - static final Pattern actionPattern = Pattern.compile("/objects/(.*)/action/([a-z]*);?(.*)"); - - @BeforeClass - @Parameters({ "test-jetty-port" }) - public void setUpJetty(@Optional("8123") final int testPort) throws Exception { - this.testPort = testPort; - - md5 = base64().encode(oneHundredOneConstitutions.hash(md5()).asBytes()); - - Handler server1Handler = new AbstractHandler() { - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - if (failIfNoContentLength(request, response)) { - return; - } else if (target.indexOf("sleep") > 0) { - sleepUninterruptibly(100, TimeUnit.MILLISECONDS); - response.setContentType("text/xml"); - response.setStatus(SC_OK); - } else if (target.indexOf("redirect") > 0) { - // in OpenJDK 7.0, expect continue handling is enforced, so we - // have to consume the stream. - // http://hg.openjdk.java.net/jdk7/tl/jdk/rev/045aeb76b0ff - // getInputStream address the expect-continue, per jetty docs - // http://wiki.eclipse.org/Jetty/Feature/1xx_Responses#100_Continue - toStringAndClose(request.getInputStream()); - response.sendRedirect("https://localhost:" + (testPort + 1) + "/"); - } else if (target.indexOf("101constitutions") > 0) { - response.setContentType("text/plain"); - response.setHeader("Content-MD5", md5); - response.setStatus(SC_OK); - oneHundredOneConstitutions.copyTo(response.getOutputStream()); - } else if (request.getMethod().equals("PUT")) { - if (request.getContentLength() > 0) { - response.setStatus(SC_OK); - response.getWriter().println(toStringAndClose(request.getInputStream()) + "PUT"); - } else { - response.setStatus(SC_OK); - } - } else if (request.getMethod().equals("POST")) { - // don't redirect large objects - if (request.getContentLength() < 10240 && redirectEveryTwentyRequests(request, response)) - return; - if (failEveryTenRequests(request, response)) - return; - if (request.getContentLength() > 0) { - handlePost(request, response); - } else { - handleAction(request, response); - } - } else if (request.getHeader("range") != null) { - response.sendError(404, "no content"); - } else if (request.getHeader("test") != null) { - response.setContentType("text/plain"); - response.setStatus(SC_OK); - response.getWriter().println("test"); - } else if (request.getMethod().equals("HEAD")) { - // by HTML specification, HEAD response MUST NOT include a body - response.setContentType("text/xml"); - response.setStatus(SC_OK); - } else { - if (failEveryTenRequests(request, response)) - return; - response.setContentType("text/xml"); - response.setStatus(SC_OK); - response.getWriter().println(XML); - } - Request.class.cast(request).setHandled(true); - } - - }; - - server = new Server(testPort); - server.setHandler(server1Handler); - server.start(); - - setupAndStartSSLServer(testPort); - - Properties properties = new Properties(); - addConnectionProperties(properties); - client = newBuilder(testPort, properties, createConnectionModule()).buildApi(IntegrationTestClient.class); - assert client != null; - - assert client.newStringBuilder() != null; - } - - private static void handlePost(HttpServletRequest request, HttpServletResponse response) throws IOException { - InputStream body = request.getInputStream(); - try { - if (request.getHeader("Content-MD5") != null) { - String expectedMd5 = request.getHeader("Content-MD5"); - String realMd5FromRequest; - realMd5FromRequest = base64().encode(ByteStreams2.hashAndClose(body, md5()).asBytes()); - boolean matched = expectedMd5.equals(realMd5FromRequest); - if (matched) { - response.setStatus(SC_OK); - response.addHeader("x-Content-MD5", realMd5FromRequest); - } else { - response.sendError(500, "didn't match"); - } - } else { - String responseString = (request.getContentLength() < 10240) ? toStringAndClose(body) + "POST" : "POST"; - body = null; - for (String header : new String[] { CONTENT_DISPOSITION, CONTENT_LANGUAGE, CONTENT_ENCODING }) - if (request.getHeader(header) != null) { - response.addHeader("x-" + header, request.getHeader(header)); - } - response.setStatus(SC_OK); - response.getWriter().println(responseString); - } - Request.class.cast(request).setHandled(true); - } catch (IOException e) { - closeQuietly(body); - response.sendError(500, getStackTraceAsString(e)); - } - } - - protected void setupAndStartSSLServer(final int testPort) throws Exception { - Handler server2Handler = new AbstractHandler() { - public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException { - if (request.getMethod().equals("PUT")) { - if (request.getContentLength() > 0) { - response.setStatus(SC_OK); - String text = toStringAndClose(request.getInputStream()); - response.getWriter().println(text + "PUTREDIRECT"); - } - } else if (request.getMethod().equals("POST")) { - if (request.getContentLength() > 0) { - handlePost(request, response); - } else { - handleAction(request, response); - } - } else if (request.getMethod().equals("HEAD")) { - // by HTML specification, HEAD response MUST NOT include a body - response.setContentType("text/xml"); - response.setStatus(SC_OK); - } else { - response.setContentType("text/xml"); - response.setStatus(SC_OK); - response.getWriter().println(XML2); - } - Request.class.cast(request).setHandled(true); - } - }; - - server2 = new Server(); - server2.setHandler(server2Handler); - - SslSelectChannelConnector ssl_connector = new SslSelectChannelConnector(); - ssl_connector.setPort(testPort + 1); - ssl_connector.setMaxIdleTime(30000); - SslContextFactory ssl = ssl_connector.getSslContextFactory(); - ssl.setKeyStorePath("src/test/resources/test.jks"); - ssl.setKeyStorePassword("jclouds"); - ssl.setTrustStore("src/test/resources/test.jks"); - ssl.setTrustStorePassword("jclouds"); - - server2.setConnectors(new Connector[] { ssl_connector }); - - server2.start(); - } - - public static ContextBuilder newBuilder(int testPort, Properties properties, Module... connectionModules) { - properties.setProperty(PROPERTY_TRUST_ALL_CERTS, "true"); - properties.setProperty(PROPERTY_RELAX_HOSTNAME, "true"); - return ContextBuilder - .newBuilder(forApiOnEndpoint(IntegrationTestClient.class, "http://localhost:" + testPort)) - .modules(ImmutableSet.<Module> copyOf(connectionModules)).overrides(properties); - } - - @AfterClass - public void tearDownJetty() throws Exception { - closeQuietly(client); - if (server2 != null) - server2.stop(); - server.stop(); - } - - protected abstract void addConnectionProperties(Properties props); - - protected abstract Module createConnectionModule(); - - /** - * Fails every 10 requests. - * - * @param request - * @param response - * @return - * @throws IOException - */ - protected boolean failEveryTenRequests(HttpServletRequest request, HttpServletResponse response) throws IOException { - if (cycle.incrementAndGet() % 10 == 0) { - response.sendError(500, "unlucky 10"); - Request.class.cast(request).setHandled(true); - return true; - } - return false; - } - - protected boolean redirectEveryTwentyRequests(HttpServletRequest request, HttpServletResponse response) - throws IOException { - if (cycle.incrementAndGet() % 20 == 0) { - response.sendRedirect("http://localhost:" + (testPort + 1) + "/"); - Request.class.cast(request).setHandled(true); - return true; - } - return false; - } - - protected boolean failIfNoContentLength(HttpServletRequest request, HttpServletResponse response) throws IOException { - Multimap<String, String> realHeaders = LinkedHashMultimap.create(); - Enumeration<String> headers = request.getHeaderNames(); - while (headers.hasMoreElements()) { - String header = headers.nextElement().toString(); - Enumeration<String> values = request.getHeaders(header); - while (values.hasMoreElements()) { - realHeaders.put(header, values.nextElement().toString()); - } - } - if (realHeaders.get(CONTENT_LENGTH) == null) { - response.getWriter().println("no content length!"); - response.getWriter().println(realHeaders.toString()); - response.sendError(500, "no content length!"); - Request.class.cast(request).setHandled(true); - return true; - } - return false; - } - - private void handleAction(HttpServletRequest request, HttpServletResponse response) throws IOException { - final Matcher matcher = actionPattern.matcher(request.getRequestURI()); - boolean matchFound = matcher.find(); - if (matchFound) { - String objectId = matcher.group(1); - String action = matcher.group(2); - Builder<String, String> options = ImmutableMap.<String, String> builder(); - if (matcher.groupCount() == 3) { - options.putAll(Splitter.on(';').withKeyValueSeparator("=").split(matcher.group(3))); - } - response.setStatus(SC_OK); - response.getWriter().println(objectId + "->" + action + ":" + options.build()); - } else { - response.sendError(500, "no content"); - } - } - -} diff --git a/project/pom.xml b/project/pom.xml index bb4400084c..33982eba48 100644 --- a/project/pom.xml +++ b/project/pom.xml @@ -230,7 +230,7 @@ <auto-service.version>1.0-rc3</auto-service.version> <auto-value.version>1.4.1</auto-value.version> - <jetty.version>8.1.8.v20121106</jetty.version> + <jetty.version>9.4.46.v20220331</jetty.version> <javax.ws.rs-api.version>2.0.1</javax.ws.rs-api.version> <modernizer-maven-annotations.version>1.8.0</modernizer-maven-annotations.version>