From 0b936f46cca5648478e8f19b03b12fa521c97f2a Mon Sep 17 00:00:00 2001 From: markdodgson Date: Thu, 29 Aug 2024 09:55:05 +0100 Subject: [PATCH 1/9] [MRESOLVER-600] - RFC9457 Implementation --- .../SupplierRepositorySystemFactory.java | 8 +- .../http/RFC9457/BiConsumerChecked.java | 24 ++++++ .../http/RFC9457/HttpRfc9457Exception.java | 46 +++++++++++ .../http/RFC9457/Rfc9457Reporter.java | 80 +++++++++++++++++++ .../supplier/RepositorySystemSupplier.java | 16 +++- .../supplier/RepositorySystemSupplier.java | 16 +++- .../internal/test/util/http/HttpServer.java | 25 ++++++ .../test/util/http/HttpTransporterTest.java | 12 +++ .../apache/ApacheRfc9457Reporter.java | 60 ++++++++++++++ .../transport/apache/ApacheTransporter.java | 16 ++-- .../apache/ApacheTransporterFactory.java | 8 +- .../apache/ApacheTransporterTest.java | 3 +- .../transport/jdk/JdkRfc9457Reporter.java | 56 +++++++++++++ .../aether/transport/jdk/JdkTransporter.java | 16 +++- .../transport/jdk/JdkTransporterFactory.java | 9 ++- .../transport/jdk/JdkTransporterTest.java | 6 +- .../transport/jdk/JdkRfc9457Reporter.java | 61 ++++++++++++++ .../transport/jdk/JdkTransporterFactory.java | 3 +- .../transport/jetty/JettyRfc9457Reporter.java | 71 ++++++++++++++++ .../transport/jetty/JettyTransporter.java | 10 ++- .../jetty/JettyTransporterFactory.java | 8 +- .../transport/jetty/JettyTransporterTest.java | 3 +- 22 files changed, 532 insertions(+), 25 deletions(-) create mode 100644 maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/BiConsumerChecked.java create mode 100644 maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRfc9457Exception.java create mode 100644 maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/Rfc9457Reporter.java create mode 100644 maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRfc9457Reporter.java create mode 100644 maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java create mode 100644 maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java create mode 100644 maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRfc9457Reporter.java diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java index 4eeb0ee9d..3517a71a9 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java @@ -35,7 +35,9 @@ import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.supplier.RepositorySystemSupplier; +import org.eclipse.aether.transport.jdk.JdkRfc9457Reporter; import org.eclipse.aether.transport.jdk.JdkTransporterFactory; +import org.eclipse.aether.transport.jetty.JettyRfc9457Reporter; import org.eclipse.aether.transport.jetty.JettyTransporterFactory; /** @@ -94,10 +96,12 @@ protected Map createTransporterFactories() { Map result = super.createTransporterFactories(); result.put( JdkTransporterFactory.NAME, - new JdkTransporterFactory(getChecksumExtractor(), getPathProcessor())); + new JdkTransporterFactory( + getChecksumExtractor(), getPathProcessor(), new JdkRfc9457Reporter())); result.put( JettyTransporterFactory.NAME, - new JettyTransporterFactory(getChecksumExtractor(), getPathProcessor())); + new JettyTransporterFactory( + getChecksumExtractor(), getPathProcessor(), new JettyRfc9457Reporter())); return result; } }.get(); diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/BiConsumerChecked.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/BiConsumerChecked.java new file mode 100644 index 000000000..4b48a5d49 --- /dev/null +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/BiConsumerChecked.java @@ -0,0 +1,24 @@ +/* + * 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.eclipse.aether.spi.connector.transport.http.RFC9457; + +@FunctionalInterface +public interface BiConsumerChecked { + void accept(T t, U u) throws E; +} diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRfc9457Exception.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRfc9457Exception.java new file mode 100644 index 000000000..3c8235e2a --- /dev/null +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRfc9457Exception.java @@ -0,0 +1,46 @@ +/* + * 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.eclipse.aether.spi.connector.transport.http.RFC9457; + +import org.eclipse.aether.spi.connector.transport.http.HttpTransporter; + +/** + * Exception thrown by {@link HttpTransporter} in case of errors. + * + * @since 2.0.2 + */ +public class HttpRfc9457Exception extends Exception { + private final int statusCode; + + private final String reasonPhrase; + + public HttpRfc9457Exception(int statusCode, String reasonPhrase, String message) { + super(message); + this.statusCode = statusCode; + this.reasonPhrase = reasonPhrase; + } + + public int getStatusCode() { + return statusCode; + } + + public String getReasonPhrase() { + return reasonPhrase; + } +} diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/Rfc9457Reporter.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/Rfc9457Reporter.java new file mode 100644 index 000000000..1e6c27031 --- /dev/null +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/Rfc9457Reporter.java @@ -0,0 +1,80 @@ +/* + * 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.eclipse.aether.spi.connector.transport.http.RFC9457; + +import java.io.IOException; + +/** + * A reporter for RFC9457 messages. + * RFC9457 is a standard for reporting problems in HTTP responses as a JSON object. + * There are members specified in the RFC but none of those appear to be required, + * @see rfc9457 section 3.7 + * Given the JSON fields are not mandatory, this reporter simply extracts the body of the + * response without validation. + * A RFC9457 message is detected by the content type "application/problem+json". + * + * @param The type of the response. + * @param The base exception type to throw if the response is not a RFC9457 message. + */ +public abstract class Rfc9457Reporter { + protected abstract boolean isRfc9457Message(T response); + + protected abstract int getStatusCode(T response); + + protected abstract String getReasonPhrase(T response); + + protected abstract String getBody(T response) throws IOException; + + protected boolean hasRfc9457ContentType(String contentType) { + return contentType != null && contentType.equals("application/problem+json"); + } + /** + * Generates a {@link HttpRfc9457Exception} if the response type is a RFC9457 message. + * Otherwise, it throws the base exception + * + * @param request The response to check for RFC9457 messages. + * @param baseException The base exception to throw if the response is not a RFC9457 message. + */ + public void generateException(T request, BiConsumerChecked baseException) + throws HttpRfc9457Exception, E { + int statusCode = getStatusCode(request); + String reasonPhrase = getReasonPhrase(request); + if (isRfc9457Message(request)) { + try { + /* The rfc9457 does not specify a structure to the payload, so we can't + really do anything with it other than add the content to the exception. */ + String body = getBody(request); + boolean hasReasonPhrase = reasonPhrase != null && !reasonPhrase.isEmpty(); + boolean hasBody = body != null && !body.isEmpty(); + + String message = String.format("status code: %d", statusCode); + if (hasReasonPhrase) { + message += String.format(", reason phrase: %s", reasonPhrase); + } + if (hasBody) { + message += String.format(", message: %s", body); + } + + throw new HttpRfc9457Exception(statusCode, reasonPhrase, message); + } catch (IOException ignored) { + } + } + baseException.accept(statusCode, reasonPhrase); + } +} diff --git a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java index b8189e21f..27343ecf0 100644 --- a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java +++ b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java @@ -132,6 +132,7 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor; import org.eclipse.aether.spi.synccontext.SyncContextFactory; +import org.eclipse.aether.transport.apache.ApacheRfc9457Reporter; import org.eclipse.aether.transport.apache.ApacheTransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.util.version.GenericVersionScheme; @@ -629,6 +630,19 @@ protected ChecksumExtractor createChecksumExtractor() { return new DefaultChecksumExtractor(getChecksumExtractorStrategies()); } + private ApacheRfc9457Reporter rfc9457Reporter; + + public final ApacheRfc9457Reporter getRfc9457Reporter() { + if (rfc9457Reporter == null) { + rfc9457Reporter = createRfc9457Reporter(); + } + return rfc9457Reporter; + } + + protected ApacheRfc9457Reporter createRfc9457Reporter() { + return new ApacheRfc9457Reporter(); + } + private Map transporterFactories; public final Map getTransporterFactories() { @@ -644,7 +658,7 @@ protected Map createTransporterFactories() { result.put(FileTransporterFactory.NAME, new FileTransporterFactory()); result.put( ApacheTransporterFactory.NAME, - new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor())); + new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor(), getRfc9457Reporter())); return result; } diff --git a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java index 917f2d689..3a0c1bafb 100644 --- a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java +++ b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java @@ -136,6 +136,7 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor; import org.eclipse.aether.spi.synccontext.SyncContextFactory; +import org.eclipse.aether.transport.apache.ApacheRfc9457Reporter; import org.eclipse.aether.transport.apache.ApacheTransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.util.version.GenericVersionScheme; @@ -633,6 +634,19 @@ protected ChecksumExtractor createChecksumExtractor() { return new DefaultChecksumExtractor(getChecksumExtractorStrategies()); } + private ApacheRfc9457Reporter rfc9457Reporter; + + public final ApacheRfc9457Reporter getRfc9457Reporter() { + if (rfc9457Reporter == null) { + rfc9457Reporter = createRfc9457Reporter(); + } + return rfc9457Reporter; + } + + protected ApacheRfc9457Reporter createRfc9457Reporter() { + return new ApacheRfc9457Reporter(); + } + private Map transporterFactories; public final Map getTransporterFactories() { @@ -648,7 +662,7 @@ protected Map createTransporterFactories() { result.put(FileTransporterFactory.NAME, new FileTransporterFactory()); result.put( ApacheTransporterFactory.NAME, - new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor())); + new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor(), getRfc9457Reporter())); return result; } diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java index ddab12fe4..ecab5b22d 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java @@ -18,6 +18,7 @@ */ package org.eclipse.aether.internal.test.util.http; +import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -284,6 +285,7 @@ public HttpServer start() throws Exception { handlers.addHandler(new AuthHandler()); handlers.addHandler(new RedirectHandler()); handlers.addHandler(new RepoHandler()); + handlers.addHandler(new Rfc9457Handler()); server = new Server(); httpConnector = new ServerConnector(server); @@ -495,6 +497,29 @@ private void writeResponseBodyMessage(HttpServletResponse response, String messa } } + private class Rfc9457Handler extends AbstractHandler { + @Override + public void handle( + final String target, + final Request req, + final HttpServletRequest request, + final HttpServletResponse response) + throws IOException, ServletException { + String path = req.getPathInfo().substring(1); + + if (!path.startsWith("rfc9457/")) { + return; + } + req.setHandled(true); + + if (HttpMethod.GET.is(req.getMethod())) { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); + response.setHeader(HttpHeader.CONTENT_TYPE.asString(), "application/problem+json"); + writeResponseBodyMessage(response, "{\"error\":\"error message\"}"); + } + } + } + private class RedirectHandler extends AbstractHandler { @Override public void handle(String target, Request req, HttpServletRequest request, HttpServletResponse response) { diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java index 2b6694614..f974864c1 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java @@ -57,6 +57,7 @@ import org.eclipse.aether.spi.connector.transport.http.HttpTransporter; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterFactory; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.HttpRfc9457Exception; import org.eclipse.aether.transfer.NoTransporterException; import org.eclipse.aether.transfer.TransferCancelledException; import org.eclipse.aether.util.repository.AuthenticationBuilder; @@ -478,6 +479,17 @@ protected void testGet_ProxyUnauthenticated() throws Exception { } } + @Test + protected void testGet_rfc9457Response() throws Exception { + try { + transporter.get(new GetTask(URI.create("rfc9457/file.txt"))); + fail("Expected error"); + } catch (HttpRfc9457Exception e) { + assertEquals(403, e.getStatusCode()); + assertTrue(e.getMessage().contains("{\"error\":\"error message\"}")); + } + } + @Test protected void testGet_SSL() throws Exception { httpServer.addSslConnector(); diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRfc9457Reporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRfc9457Reporter.java new file mode 100644 index 000000000..ea2348194 --- /dev/null +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRfc9457Reporter.java @@ -0,0 +1,60 @@ +/* + * 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.eclipse.aether.transport.apache; + +import java.io.IOException; + +import org.apache.http.Header; +import org.apache.http.HttpHeaders; +import org.apache.http.client.HttpResponseException; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.util.EntityUtils; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; + +public class ApacheRfc9457Reporter extends Rfc9457Reporter { + @Override + protected boolean isRfc9457Message(final CloseableHttpResponse response) { + Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE); + if (headers.length > 0) { + String contentType = headers[0].getValue(); + return hasRfc9457ContentType(contentType); + } + return false; + } + + @Override + protected int getStatusCode(final CloseableHttpResponse response) { + return response.getStatusLine().getStatusCode(); + } + + @Override + protected String getReasonPhrase(final CloseableHttpResponse response) { + String reasonPhrase = response.getStatusLine().getReasonPhrase(); + if (reasonPhrase == null || reasonPhrase.isEmpty()) { + return ""; + } + int statusCode = getStatusCode(response); + return reasonPhrase + " (" + statusCode + ")"; + } + + @Override + protected String getBody(final CloseableHttpResponse response) throws IOException { + return EntityUtils.toString(response.getEntity()); + } +} diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java index 612621342..5aea1d51a 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java @@ -145,16 +145,20 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo private final boolean supportWebDav; + private final ApacheRfc9457Reporter rfc9457Reporter; + @SuppressWarnings("checkstyle:methodlength") ApacheTransporter( RemoteRepository repository, RepositorySystemSession session, ChecksumExtractor checksumExtractor, - PathProcessor pathProcessor) + PathProcessor pathProcessor, + ApacheRfc9457Reporter rfc9457Reporter) throws NoTransporterException { if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) { throw new NoTransporterException(repository); } + this.rfc9457Reporter = rfc9457Reporter; this.checksumExtractor = checksumExtractor; this.pathProcessor = pathProcessor; try { @@ -492,7 +496,7 @@ private void execute(HttpUriRequest request, EntityGetter getter) throws Excepti } } - private void prepare(HttpUriRequest request, SharingHttpContext context) throws HttpTransporterException { + private void prepare(HttpUriRequest request, SharingHttpContext context) throws Exception { final boolean put = HttpPut.METHOD_NAME.equalsIgnoreCase(request.getMethod()); if (preemptiveAuth || (preemptivePutAuth && put)) { context.getAuthCache().put(server, new BasicScheme()); @@ -514,7 +518,7 @@ private void prepare(HttpUriRequest request, SharingHttpContext context) throws } @SuppressWarnings("checkstyle:magicnumber") - private void mkdirs(URI uri, SharingHttpContext context) throws HttpTransporterException { + private void mkdirs(URI uri, SharingHttpContext context) throws Exception { List dirs = UriUtils.getDirectories(baseUri, uri); int index = 0; for (; index < dirs.size(); index++) { @@ -603,10 +607,12 @@ private void resume(T request, GetTask task) throws I } @SuppressWarnings("checkstyle:magicnumber") - private void handleStatus(CloseableHttpResponse response) throws HttpResponseException { + private void handleStatus(CloseableHttpResponse response) throws Exception { int status = response.getStatusLine().getStatusCode(); if (status >= 300) { - throw new HttpResponseException(status, response.getStatusLine().getReasonPhrase() + " (" + status + ")"); + rfc9457Reporter.generateException(response, (statusCode, reasonPhrase) -> { + throw new HttpResponseException(statusCode, reasonPhrase + " (" + statusCode + ")"); + }); } } diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java index 14c076f4b..2c9c9f081 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java @@ -39,6 +39,8 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory { public static final String NAME = "apache"; + private final ApacheRfc9457Reporter rfc9457Reporter; + private float priority = 5.0f; private final ChecksumExtractor checksumExtractor; @@ -46,8 +48,10 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory { private final PathProcessor pathProcessor; @Inject - public ApacheTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { + public ApacheTransporterFactory( + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, ApacheRfc9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); + this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); } @@ -73,6 +77,6 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi requireNonNull(session, "session cannot be null"); requireNonNull(repository, "repository cannot be null"); - return new ApacheTransporter(repository, session, checksumExtractor, pathProcessor); + return new ApacheTransporter(repository, session, checksumExtractor, pathProcessor, rfc9457Reporter); } } diff --git a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java index bc7980c52..e4b28d4ca 100644 --- a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java +++ b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java @@ -44,7 +44,8 @@ class ApacheTransporterTest extends HttpTransporterTest { public ApacheTransporterTest() { - super(() -> new ApacheTransporterFactory(standardChecksumExtractor(), new TestPathProcessor())); + super(() -> new ApacheTransporterFactory( + standardChecksumExtractor(), new TestPathProcessor(), new ApacheRfc9457Reporter())); } @Override diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java new file mode 100644 index 000000000..6cf837166 --- /dev/null +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java @@ -0,0 +1,56 @@ +/* + * 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.eclipse.aether.transport.jdk; + +import java.io.IOException; +import java.io.InputStream; +import java.net.http.HttpResponse; +import java.util.Optional; + +import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; + +public class JdkRfc9457Reporter extends Rfc9457Reporter, HttpTransporterException> { + @Override + protected boolean isRfc9457Message(final HttpResponse response) { + Optional optionalContentType = response.headers().firstValue("Content-Type"); + if (optionalContentType.isPresent()) { + String contentType = optionalContentType.get(); + return hasRfc9457ContentType(contentType); + } + return false; + } + + @Override + protected int getStatusCode(final HttpResponse response) { + return response.statusCode(); + } + + @Override + protected String getReasonPhrase(final HttpResponse response) { + return null; + } + + @Override + protected String getBody(final HttpResponse response) throws IOException { + try (InputStream is = response.body()) { + return new String(is.readAllBytes()); + } + } +} diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java index 15a37326f..73eb1ed24 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java @@ -116,6 +116,8 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte private final PathProcessor pathProcessor; + private final JdkRfc9457Reporter rfc9457Reporter; + private final URI baseUri; private final HttpClient client; @@ -133,9 +135,11 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte RemoteRepository repository, int javaVersion, ChecksumExtractor checksumExtractor, - PathProcessor pathProcessor) + PathProcessor pathProcessor, + JdkRfc9457Reporter rfc9457Reporter) throws NoTransporterException { this.checksumExtractor = checksumExtractor; + this.rfc9457Reporter = rfc9457Reporter; this.pathProcessor = pathProcessor; try { URI uri = new URI(repository.getUrl()).parseServerAuthority(); @@ -285,12 +289,18 @@ protected void implGet(GetTask task) throws Exception { try { response = send(request.build(), HttpResponse.BodyHandlers.ofInputStream()); if (response.statusCode() >= MULTIPLE_CHOICES) { - closeBody(response); if (resume && response.statusCode() == PRECONDITION_FAILED) { + closeBody(response); resume = false; continue; } - throw new HttpTransporterException(response.statusCode()); + try { + rfc9457Reporter.generateException(response, (statusCode, reasonPhrase) -> { + throw new HttpTransporterException(statusCode); + }); + } finally { + closeBody(response); + } } } catch (ConnectException e) { closeBody(response); diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index a91044ec5..1f2b763da 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -40,6 +40,8 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { public static final String NAME = "jdk"; + private final JdkRfc9457Reporter rfc9457Reporter; + private float priority = 10.0f; private final ChecksumExtractor checksumExtractor; @@ -47,9 +49,11 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { private final PathProcessor pathProcessor; @Inject - public JdkTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { + public JdkTransporterFactory( + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRfc9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); + this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); } @Override @@ -72,7 +76,8 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi throw new NoTransporterException(repository, "Only HTTP/HTTPS is supported"); } - return new JdkTransporter(session, repository, javaVersion(), checksumExtractor, pathProcessor); + return new JdkTransporter( + session, repository, javaVersion(), checksumExtractor, pathProcessor, rfc9457Reporter); } private static int javaVersion() { diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java index 1a15aaed9..f6808db47 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java @@ -85,14 +85,16 @@ protected void testRetryHandler_explicitCount_positive() {} protected void testPut_Authenticated_ExpectContinueRejected_ExplicitlyConfiguredHeader() {} public JdkTransporterTest() { - super(() -> new JdkTransporterFactory(standardChecksumExtractor(), new DefaultPathProcessor())); + super(() -> new JdkTransporterFactory( + standardChecksumExtractor(), new DefaultPathProcessor(), new JdkRfc9457Reporter())); } @Test void enhanceConnectExceptionMessages() { String uri = "https://localhost:12345/"; RemoteRepository remoteRepository = new RemoteRepository.Builder("central", "default", uri).build(); - JdkTransporterFactory factory = new JdkTransporterFactory(s -> null, new DefaultPathProcessor()); + JdkTransporterFactory factory = + new JdkTransporterFactory(s -> null, new DefaultPathProcessor(), new JdkRfc9457Reporter()); try (Transporter transporter = factory.newInstance(TestUtils.newSession(), remoteRepository)) { transporter.peek(new PeekTask(URI.create("repo/file.txt"))); diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java new file mode 100644 index 000000000..819591139 --- /dev/null +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java @@ -0,0 +1,61 @@ +/* + * 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.eclipse.aether.transport.jdk; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; + +import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; + +public class JdkRfc9457Reporter extends Rfc9457Reporter { + @Override + protected boolean isRfc9457Message(final HttpURLConnection response) { + String contentType = response.getContentType(); + return hasRfc9457ContentType(contentType); + } + + @Override + protected int getStatusCode(final HttpURLConnection response) { + try { + return response.getResponseCode(); + } catch (IOException e) { + return -1; + } + } + + @Override + protected String getReasonPhrase(final HttpURLConnection response) { + return null; + } + + @Override + protected String getBody(final HttpURLConnection response) throws IOException { + try (BufferedReader br = new BufferedReader(new InputStreamReader(response.getInputStream()))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line); + } + return sb.toString(); + } + } +} diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index dcea7ce8b..71ea6c6cd 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -47,7 +47,8 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { private float priority = 10.0f; @Inject - public JdkTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { + public JdkTransporterFactory( + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRfc9457Reporter rfc9457Reporter) { // this is to equalize all Java version constructors to be same, so Supplier could work across all versions } diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRfc9457Reporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRfc9457Reporter.java new file mode 100644 index 000000000..9db92597a --- /dev/null +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRfc9457Reporter.java @@ -0,0 +1,71 @@ +/* + * 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.eclipse.aether.transport.jetty; + +import java.io.IOException; +import java.io.InputStream; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; +import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.client.util.InputStreamResponseListener; +import org.eclipse.jetty.http.HttpHeader; + +public class JettyRfc9457Reporter extends Rfc9457Reporter { + @Override + protected boolean isRfc9457Message(final InputStreamResponseListener listener) { + try { + Response response = listener.get(1, TimeUnit.SECONDS); + String contentType = response.getHeaders().get(HttpHeader.CONTENT_TYPE); + return hasRfc9457ContentType(contentType); + } catch (InterruptedException | TimeoutException | ExecutionException e) { + return false; + } + } + + @Override + protected int getStatusCode(final InputStreamResponseListener listener) { + try { + Response response = listener.get(1, TimeUnit.SECONDS); + return response.getStatus(); + } catch (InterruptedException | TimeoutException | ExecutionException e) { + return -1; + } + } + + @Override + protected String getReasonPhrase(final InputStreamResponseListener listener) { + try { + Response response = listener.get(1, TimeUnit.SECONDS); + return response.getReason(); + } catch (InterruptedException | TimeoutException | ExecutionException e) { + return null; + } + } + + @Override + protected String getBody(final InputStreamResponseListener listener) throws IOException { + try (InputStream is = listener.getInputStream()) { + return new String(is.readAllBytes()); + } + } +} diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java index 3d7fa715a..faa603120 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java @@ -99,6 +99,8 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor private final PathProcessor pathProcessor; + private final JettyRfc9457Reporter rfc9457Reporter; + private final URI baseUri; private final HttpClient client; @@ -121,12 +123,14 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor RepositorySystemSession session, RemoteRepository repository, ChecksumExtractor checksumExtractor, - PathProcessor pathProcessor) + PathProcessor pathProcessor, + JettyRfc9457Reporter rfc9457Reporter) throws NoTransporterException { this.session = session; this.repository = repository; this.checksumExtractor = checksumExtractor; this.pathProcessor = pathProcessor; + this.rfc9457Reporter = rfc9457Reporter; try { URI uri = new URI(repository.getUrl()).parseServerAuthority(); if (uri.isOpaque()) { @@ -285,7 +289,9 @@ protected void implGet(GetTask task) throws Exception { resume = false; continue; } - throw new HttpTransporterException(response.getStatus()); + rfc9457Reporter.generateException(listener, (statusCode, reasonPhrase) -> { + throw new HttpTransporterException(statusCode); + }); } break; } diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java index 83ecafce8..9d6ef3d42 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java @@ -40,6 +40,8 @@ public final class JettyTransporterFactory implements HttpTransporterFactory { public static final String NAME = "jetty"; + private final JettyRfc9457Reporter rfc9457Reporter; + private float priority = 15.0f; private final ChecksumExtractor checksumExtractor; @@ -47,9 +49,11 @@ public final class JettyTransporterFactory implements HttpTransporterFactory { private final PathProcessor pathProcessor; @Inject - public JettyTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { + public JettyTransporterFactory( + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JettyRfc9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); + this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); } @Override @@ -72,6 +76,6 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi throw new NoTransporterException(repository); } - return new JettyTransporter(session, repository, checksumExtractor, pathProcessor); + return new JettyTransporter(session, repository, checksumExtractor, pathProcessor, rfc9457Reporter); } } diff --git a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java index 67b3c976f..de4f13937 100644 --- a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java +++ b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java @@ -59,6 +59,7 @@ protected void testRetryHandler_explicitCount_positive() {} protected void testPut_Authenticated_ExpectContinueRejected_ExplicitlyConfiguredHeader() {} public JettyTransporterTest() { - super(() -> new JettyTransporterFactory(standardChecksumExtractor(), new TestPathProcessor())); + super(() -> new JettyTransporterFactory( + standardChecksumExtractor(), new TestPathProcessor(), new JettyRfc9457Reporter())); } } From 2159e1f88c3dc78d45760967996690c8a43318fd Mon Sep 17 00:00:00 2001 From: markdodgson Date: Mon, 2 Sep 2024 12:17:14 +0100 Subject: [PATCH 2/9] Added parsing of the RFC 9457 content --- .../SupplierRepositorySystemFactory.java | 8 +-- maven-resolver-spi/pom.xml | 4 ++ ...ception.java => HttpRFC9457Exception.java} | 15 ++++- .../http/RFC9457/RFC9457Payload.java | 66 +++++++++++++++++++ ...9457Reporter.java => RFC9457Reporter.java} | 61 +++++++++-------- .../supplier/RepositorySystemSupplier.java | 10 +-- .../supplier/RepositorySystemSupplier.java | 10 +-- maven-resolver-test-http/pom.xml | 4 ++ .../internal/test/util/http/HttpServer.java | 25 ++++++- .../test/util/http/HttpTransporterTest.java | 25 ++++++- ...porter.java => ApacheRFC9457Reporter.java} | 8 +-- .../transport/apache/ApacheTransporter.java | 4 +- .../apache/ApacheTransporterFactory.java | 4 +- .../apache/ApacheTransporterTest.java | 2 +- ...7Reporter.java => JdkRFC9457Reporter.java} | 8 +-- .../aether/transport/jdk/JdkTransporter.java | 4 +- .../transport/jdk/JdkTransporterFactory.java | 4 +- .../transport/jdk/JdkTransporterTest.java | 4 +- ...7Reporter.java => JdkRFC9457Reporter.java} | 8 +-- .../transport/jdk/JdkTransporterFactory.java | 2 +- ...eporter.java => JettyRFC9457Reporter.java} | 8 +-- .../transport/jetty/JettyTransporter.java | 4 +- .../jetty/JettyTransporterFactory.java | 4 +- .../transport/jetty/JettyTransporterTest.java | 2 +- pom.xml | 7 ++ 25 files changed, 217 insertions(+), 84 deletions(-) rename maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/{HttpRfc9457Exception.java => HttpRFC9457Exception.java} (78%) create mode 100644 maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java rename maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/{Rfc9457Reporter.java => RFC9457Reporter.java} (52%) rename maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/{ApacheRfc9457Reporter.java => ApacheRFC9457Reporter.java} (91%) rename maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/{JdkRfc9457Reporter.java => JdkRFC9457Reporter.java} (90%) rename maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/{JdkRfc9457Reporter.java => JdkRFC9457Reporter.java} (91%) rename maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/{JettyRfc9457Reporter.java => JettyRFC9457Reporter.java} (92%) diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java index 3517a71a9..b5f963607 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java @@ -35,9 +35,9 @@ import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.supplier.RepositorySystemSupplier; -import org.eclipse.aether.transport.jdk.JdkRfc9457Reporter; +import org.eclipse.aether.transport.jdk.JdkRFC9457Reporter; import org.eclipse.aether.transport.jdk.JdkTransporterFactory; -import org.eclipse.aether.transport.jetty.JettyRfc9457Reporter; +import org.eclipse.aether.transport.jetty.JettyRFC9457Reporter; import org.eclipse.aether.transport.jetty.JettyTransporterFactory; /** @@ -97,11 +97,11 @@ protected Map createTransporterFactories() { result.put( JdkTransporterFactory.NAME, new JdkTransporterFactory( - getChecksumExtractor(), getPathProcessor(), new JdkRfc9457Reporter())); + getChecksumExtractor(), getPathProcessor(), new JdkRFC9457Reporter())); result.put( JettyTransporterFactory.NAME, new JettyTransporterFactory( - getChecksumExtractor(), getPathProcessor(), new JettyRfc9457Reporter())); + getChecksumExtractor(), getPathProcessor(), new JettyRFC9457Reporter())); return result; } }.get(); diff --git a/maven-resolver-spi/pom.xml b/maven-resolver-spi/pom.xml index 384478aed..db6732df7 100644 --- a/maven-resolver-spi/pom.xml +++ b/maven-resolver-spi/pom.xml @@ -43,6 +43,10 @@ org.apache.maven.resolver maven-resolver-api + + com.google.code.gson + gson + org.junit.jupiter junit-jupiter-api diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRfc9457Exception.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java similarity index 78% rename from maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRfc9457Exception.java rename to maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java index 3c8235e2a..da7f4c8f3 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRfc9457Exception.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java @@ -18,6 +18,8 @@ */ package org.eclipse.aether.spi.connector.transport.http.RFC9457; +import java.io.IOException; + import org.eclipse.aether.spi.connector.transport.http.HttpTransporter; /** @@ -25,15 +27,18 @@ * * @since 2.0.2 */ -public class HttpRfc9457Exception extends Exception { +public class HttpRFC9457Exception extends IOException { private final int statusCode; private final String reasonPhrase; - public HttpRfc9457Exception(int statusCode, String reasonPhrase, String message) { - super(message); + private final RFC9457Payload rfc9457; + + public HttpRFC9457Exception(int statusCode, String reasonPhrase, RFC9457Payload rfc9457) { + super(rfc9457.toString()); this.statusCode = statusCode; this.reasonPhrase = reasonPhrase; + this.rfc9457 = rfc9457; } public int getStatusCode() { @@ -43,4 +48,8 @@ public int getStatusCode() { public String getReasonPhrase() { return reasonPhrase; } + + public RFC9457Payload getRfc9457() { + return rfc9457; + } } diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java new file mode 100644 index 000000000..9735473dc --- /dev/null +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java @@ -0,0 +1,66 @@ +/* + * 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.eclipse.aether.spi.connector.transport.http.RFC9457; + +import java.net.URI; + +public class RFC9457Payload { + private final URI type; + + private final int status; + + private final String title; + + private final String detail; + + private final URI instance; + + public RFC9457Payload() { + this(null, 0, null, null, null); + } + + public RFC9457Payload( + final URI type, final int status, final String title, final String detail, final URI instance) { + this.type = type; + this.status = status; + this.title = title; + this.detail = detail; + this.instance = instance; + } + + public URI getType() { + return type; + } + + public int getStatus() { + return status; + } + + public String getTitle() { + return title; + } + + public String getDetail() { + return detail; + } + + public URI getInstance() { + return instance; + } +} diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/Rfc9457Reporter.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java similarity index 52% rename from maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/Rfc9457Reporter.java rename to maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java index 1e6c27031..9e7611ae7 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/Rfc9457Reporter.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java @@ -20,20 +20,25 @@ import java.io.IOException; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + /** - * A reporter for RFC9457 messages. + * A reporter for RFC 9457 messages. * RFC9457 is a standard for reporting problems in HTTP responses as a JSON object. * There are members specified in the RFC but none of those appear to be required, * @see rfc9457 section 3.7 * Given the JSON fields are not mandatory, this reporter simply extracts the body of the * response without validation. - * A RFC9457 message is detected by the content type "application/problem+json". + * A RFC 9457 message is detected by the content type "application/problem+json". * * @param The type of the response. * @param The base exception type to throw if the response is not a RFC9457 message. */ -public abstract class Rfc9457Reporter { - protected abstract boolean isRfc9457Message(T response); +public abstract class RFC9457Reporter { + private static final Gson GSON = new Gson(); + + protected abstract boolean isRFC9457Message(T response); protected abstract int getStatusCode(T response); @@ -41,39 +46,39 @@ public abstract class Rfc9457Reporter { protected abstract String getBody(T response) throws IOException; - protected boolean hasRfc9457ContentType(String contentType) { - return contentType != null && contentType.equals("application/problem+json"); + protected boolean hasRFC9457ContentType(String contentType) { + return "application/problem+json".equals(contentType); } + /** - * Generates a {@link HttpRfc9457Exception} if the response type is a RFC9457 message. + * Generates a {@link HttpRFC9457Exception} if the response type is a RFC 9457 message. * Otherwise, it throws the base exception * - * @param request The response to check for RFC9457 messages. - * @param baseException The base exception to throw if the response is not a RFC9457 message. + * @param response The response to check for RFC 9457 messages. + * @param baseException The base exception to throw if the response is not a RFC 9457 message. */ - public void generateException(T request, BiConsumerChecked baseException) - throws HttpRfc9457Exception, E { - int statusCode = getStatusCode(request); - String reasonPhrase = getReasonPhrase(request); - if (isRfc9457Message(request)) { + public void generateException(T response, BiConsumerChecked baseException) + throws E, HttpRFC9457Exception { + int statusCode = getStatusCode(response); + String reasonPhrase = getReasonPhrase(response); + + if (isRFC9457Message(response)) { + String body; try { - /* The rfc9457 does not specify a structure to the payload, so we can't - really do anything with it other than add the content to the exception. */ - String body = getBody(request); - boolean hasReasonPhrase = reasonPhrase != null && !reasonPhrase.isEmpty(); - boolean hasBody = body != null && !body.isEmpty(); + body = getBody(response); + } catch (IOException ignore) { + // No body found but it is representing a RFC 9457 message due to the content type. + throw new HttpRFC9457Exception(statusCode, reasonPhrase, new RFC9457Payload()); + } - String message = String.format("status code: %d", statusCode); - if (hasReasonPhrase) { - message += String.format(", reason phrase: %s", reasonPhrase); - } - if (hasBody) { - message += String.format(", message: %s", body); + if (body != null && !body.isEmpty()) { + try { + RFC9457Payload rfc9457Payload = GSON.fromJson(body, RFC9457Payload.class); + throw new HttpRFC9457Exception(statusCode, reasonPhrase, rfc9457Payload); + } catch (JsonSyntaxException ignore) { } - - throw new HttpRfc9457Exception(statusCode, reasonPhrase, message); - } catch (IOException ignored) { } + throw new HttpRFC9457Exception(statusCode, reasonPhrase, new RFC9457Payload()); } baseException.accept(statusCode, reasonPhrase); } diff --git a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java index 27343ecf0..b54f4d4a2 100644 --- a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java +++ b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java @@ -132,7 +132,7 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor; import org.eclipse.aether.spi.synccontext.SyncContextFactory; -import org.eclipse.aether.transport.apache.ApacheRfc9457Reporter; +import org.eclipse.aether.transport.apache.ApacheRFC9457Reporter; import org.eclipse.aether.transport.apache.ApacheTransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.util.version.GenericVersionScheme; @@ -630,17 +630,17 @@ protected ChecksumExtractor createChecksumExtractor() { return new DefaultChecksumExtractor(getChecksumExtractorStrategies()); } - private ApacheRfc9457Reporter rfc9457Reporter; + private ApacheRFC9457Reporter rfc9457Reporter; - public final ApacheRfc9457Reporter getRfc9457Reporter() { + public final ApacheRFC9457Reporter getRfc9457Reporter() { if (rfc9457Reporter == null) { rfc9457Reporter = createRfc9457Reporter(); } return rfc9457Reporter; } - protected ApacheRfc9457Reporter createRfc9457Reporter() { - return new ApacheRfc9457Reporter(); + protected ApacheRFC9457Reporter createRfc9457Reporter() { + return new ApacheRFC9457Reporter(); } private Map transporterFactories; diff --git a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java index 3a0c1bafb..f0318c4f9 100644 --- a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java +++ b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java @@ -136,7 +136,7 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor; import org.eclipse.aether.spi.synccontext.SyncContextFactory; -import org.eclipse.aether.transport.apache.ApacheRfc9457Reporter; +import org.eclipse.aether.transport.apache.ApacheRFC9457Reporter; import org.eclipse.aether.transport.apache.ApacheTransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.util.version.GenericVersionScheme; @@ -634,17 +634,17 @@ protected ChecksumExtractor createChecksumExtractor() { return new DefaultChecksumExtractor(getChecksumExtractorStrategies()); } - private ApacheRfc9457Reporter rfc9457Reporter; + private ApacheRFC9457Reporter rfc9457Reporter; - public final ApacheRfc9457Reporter getRfc9457Reporter() { + public final ApacheRFC9457Reporter getRfc9457Reporter() { if (rfc9457Reporter == null) { rfc9457Reporter = createRfc9457Reporter(); } return rfc9457Reporter; } - protected ApacheRfc9457Reporter createRfc9457Reporter() { - return new ApacheRfc9457Reporter(); + protected ApacheRFC9457Reporter createRfc9457Reporter() { + return new ApacheRFC9457Reporter(); } private Map transporterFactories; diff --git a/maven-resolver-test-http/pom.xml b/maven-resolver-test-http/pom.xml index 43b03e2d0..b2806003d 100644 --- a/maven-resolver-test-http/pom.xml +++ b/maven-resolver-test-http/pom.xml @@ -90,6 +90,10 @@ org.junit.jupiter junit-jupiter-api + + com.google.code.gson + gson + diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java index ecab5b22d..0d9849d08 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java @@ -27,6 +27,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Base64; @@ -39,8 +40,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import com.google.gson.Gson; import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory; import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmHelper; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Payload; import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory; import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.http.HttpMethod; @@ -285,7 +288,7 @@ public HttpServer start() throws Exception { handlers.addHandler(new AuthHandler()); handlers.addHandler(new RedirectHandler()); handlers.addHandler(new RepoHandler()); - handlers.addHandler(new Rfc9457Handler()); + handlers.addHandler(new RFC9457Handler()); server = new Server(); httpConnector = new ServerConnector(server); @@ -497,7 +500,7 @@ private void writeResponseBodyMessage(HttpServletResponse response, String messa } } - private class Rfc9457Handler extends AbstractHandler { + private class RFC9457Handler extends AbstractHandler { @Override public void handle( final String target, @@ -515,7 +518,23 @@ public void handle( if (HttpMethod.GET.is(req.getMethod())) { response.setStatus(HttpServletResponse.SC_FORBIDDEN); response.setHeader(HttpHeader.CONTENT_TYPE.asString(), "application/problem+json"); - writeResponseBodyMessage(response, "{\"error\":\"error message\"}"); + RFC9457Payload rfc9457Payload; + if (path.endsWith("missing_fields.txt")) { + rfc9457Payload = new RFC9457Payload( + URI.create("https://example.com/probs/out-of-credit"), + HttpServletResponse.SC_FORBIDDEN, + null, + null, + null); + } else { + rfc9457Payload = new RFC9457Payload( + URI.create("https://example.com/probs/out-of-credit"), + HttpServletResponse.SC_FORBIDDEN, + "You do not have enough credit.", + "Your current balance is 30, but that costs 50.", + URI.create("/account/12345/msgs/abc")); + } + writeResponseBodyMessage(response, new Gson().toJson(rfc9457Payload)); } } } diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java index f974864c1..643c35542 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java @@ -57,7 +57,7 @@ import org.eclipse.aether.spi.connector.transport.http.HttpTransporter; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterFactory; -import org.eclipse.aether.spi.connector.transport.http.RFC9457.HttpRfc9457Exception; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.HttpRFC9457Exception; import org.eclipse.aether.transfer.NoTransporterException; import org.eclipse.aether.transfer.TransferCancelledException; import org.eclipse.aether.util.repository.AuthenticationBuilder; @@ -484,9 +484,28 @@ protected void testGet_rfc9457Response() throws Exception { try { transporter.get(new GetTask(URI.create("rfc9457/file.txt"))); fail("Expected error"); - } catch (HttpRfc9457Exception e) { + } catch (HttpRFC9457Exception e) { assertEquals(403, e.getStatusCode()); - assertTrue(e.getMessage().contains("{\"error\":\"error message\"}")); + assertEquals(e.getRfc9457().getType(), URI.create("https://example.com/probs/out-of-credit")); + assertEquals(e.getRfc9457().getStatus(), 403); + assertEquals(e.getRfc9457().getTitle(), "You do not have enough credit."); + assertEquals(e.getRfc9457().getDetail(), "Your current balance is 30, but that costs 50."); + assertEquals(e.getRfc9457().getInstance(), URI.create("/account/12345/msgs/abc")); + } + } + + @Test + protected void testGet_rfc9457Response_with_missing_fields() throws Exception { + try { + transporter.get(new GetTask(URI.create("rfc9457/missing_fields.txt"))); + fail("Expected error"); + } catch (HttpRFC9457Exception e) { + assertEquals(403, e.getStatusCode()); + assertEquals(e.getRfc9457().getType(), URI.create("https://example.com/probs/out-of-credit")); + assertEquals(e.getRfc9457().getStatus(), 403); + assertNull(e.getRfc9457().getTitle()); + assertNull(e.getRfc9457().getDetail()); + assertNull(e.getRfc9457().getInstance()); } } diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRfc9457Reporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java similarity index 91% rename from maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRfc9457Reporter.java rename to maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java index ea2348194..c8eaadd2c 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRfc9457Reporter.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java @@ -25,15 +25,15 @@ import org.apache.http.client.HttpResponseException; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.util.EntityUtils; -import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; -public class ApacheRfc9457Reporter extends Rfc9457Reporter { +public class ApacheRFC9457Reporter extends RFC9457Reporter { @Override - protected boolean isRfc9457Message(final CloseableHttpResponse response) { + protected boolean isRFC9457Message(final CloseableHttpResponse response) { Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE); if (headers.length > 0) { String contentType = headers[0].getValue(); - return hasRfc9457ContentType(contentType); + return hasRFC9457ContentType(contentType); } return false; } diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java index 5aea1d51a..863399e6b 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java @@ -145,7 +145,7 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo private final boolean supportWebDav; - private final ApacheRfc9457Reporter rfc9457Reporter; + private final ApacheRFC9457Reporter rfc9457Reporter; @SuppressWarnings("checkstyle:methodlength") ApacheTransporter( @@ -153,7 +153,7 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo RepositorySystemSession session, ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, - ApacheRfc9457Reporter rfc9457Reporter) + ApacheRFC9457Reporter rfc9457Reporter) throws NoTransporterException { if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) { throw new NoTransporterException(repository); diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java index 2c9c9f081..0e453c6f4 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java @@ -39,7 +39,7 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory { public static final String NAME = "apache"; - private final ApacheRfc9457Reporter rfc9457Reporter; + private final ApacheRFC9457Reporter rfc9457Reporter; private float priority = 5.0f; @@ -49,7 +49,7 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory { @Inject public ApacheTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, ApacheRfc9457Reporter rfc9457Reporter) { + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, ApacheRFC9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); diff --git a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java index e4b28d4ca..fd08d8998 100644 --- a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java +++ b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java @@ -45,7 +45,7 @@ class ApacheTransporterTest extends HttpTransporterTest { public ApacheTransporterTest() { super(() -> new ApacheTransporterFactory( - standardChecksumExtractor(), new TestPathProcessor(), new ApacheRfc9457Reporter())); + standardChecksumExtractor(), new TestPathProcessor(), new ApacheRFC9457Reporter())); } @Override diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java similarity index 90% rename from maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java rename to maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java index 6cf837166..9e87b1658 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java @@ -24,15 +24,15 @@ import java.util.Optional; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; -import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; -public class JdkRfc9457Reporter extends Rfc9457Reporter, HttpTransporterException> { +public class JdkRFC9457Reporter extends RFC9457Reporter, HttpTransporterException> { @Override - protected boolean isRfc9457Message(final HttpResponse response) { + protected boolean isRFC9457Message(final HttpResponse response) { Optional optionalContentType = response.headers().firstValue("Content-Type"); if (optionalContentType.isPresent()) { String contentType = optionalContentType.get(); - return hasRfc9457ContentType(contentType); + return hasRFC9457ContentType(contentType); } return false; } diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java index 73eb1ed24..c186093ab 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java @@ -116,7 +116,7 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte private final PathProcessor pathProcessor; - private final JdkRfc9457Reporter rfc9457Reporter; + private final JdkRFC9457Reporter rfc9457Reporter; private final URI baseUri; @@ -136,7 +136,7 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte int javaVersion, ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, - JdkRfc9457Reporter rfc9457Reporter) + JdkRFC9457Reporter rfc9457Reporter) throws NoTransporterException { this.checksumExtractor = checksumExtractor; this.rfc9457Reporter = rfc9457Reporter; diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index 1f2b763da..699d37de1 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -40,7 +40,7 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { public static final String NAME = "jdk"; - private final JdkRfc9457Reporter rfc9457Reporter; + private final JdkRFC9457Reporter rfc9457Reporter; private float priority = 10.0f; @@ -50,7 +50,7 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { @Inject public JdkTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRfc9457Reporter rfc9457Reporter) { + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRFC9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java index f6808db47..83f6e8489 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java @@ -86,7 +86,7 @@ protected void testPut_Authenticated_ExpectContinueRejected_ExplicitlyConfigured public JdkTransporterTest() { super(() -> new JdkTransporterFactory( - standardChecksumExtractor(), new DefaultPathProcessor(), new JdkRfc9457Reporter())); + standardChecksumExtractor(), new DefaultPathProcessor(), new JdkRFC9457Reporter())); } @Test @@ -94,7 +94,7 @@ void enhanceConnectExceptionMessages() { String uri = "https://localhost:12345/"; RemoteRepository remoteRepository = new RemoteRepository.Builder("central", "default", uri).build(); JdkTransporterFactory factory = - new JdkTransporterFactory(s -> null, new DefaultPathProcessor(), new JdkRfc9457Reporter()); + new JdkTransporterFactory(s -> null, new DefaultPathProcessor(), new JdkRFC9457Reporter()); try (Transporter transporter = factory.newInstance(TestUtils.newSession(), remoteRepository)) { transporter.peek(new PeekTask(URI.create("repo/file.txt"))); diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java similarity index 91% rename from maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java rename to maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java index 819591139..f43cd29e7 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRfc9457Reporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java @@ -24,13 +24,13 @@ import java.net.HttpURLConnection; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; -import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; -public class JdkRfc9457Reporter extends Rfc9457Reporter { +public class JdkRFC9457Reporter extends RFC9457Reporter { @Override - protected boolean isRfc9457Message(final HttpURLConnection response) { + protected boolean isRFC9457Message(final HttpURLConnection response) { String contentType = response.getContentType(); - return hasRfc9457ContentType(contentType); + return hasRFC9457ContentType(contentType); } @Override diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index 71ea6c6cd..7641163c2 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -48,7 +48,7 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { @Inject public JdkTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRfc9457Reporter rfc9457Reporter) { + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRFC9457Reporter rfc9457Reporter) { // this is to equalize all Java version constructors to be same, so Supplier could work across all versions } diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRfc9457Reporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java similarity index 92% rename from maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRfc9457Reporter.java rename to maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java index 9db92597a..d2f76a197 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRfc9457Reporter.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java @@ -25,18 +25,18 @@ import java.util.concurrent.TimeoutException; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; -import org.eclipse.aether.spi.connector.transport.http.RFC9457.Rfc9457Reporter; +import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; import org.eclipse.jetty.client.api.Response; import org.eclipse.jetty.client.util.InputStreamResponseListener; import org.eclipse.jetty.http.HttpHeader; -public class JettyRfc9457Reporter extends Rfc9457Reporter { +public class JettyRFC9457Reporter extends RFC9457Reporter { @Override - protected boolean isRfc9457Message(final InputStreamResponseListener listener) { + protected boolean isRFC9457Message(final InputStreamResponseListener listener) { try { Response response = listener.get(1, TimeUnit.SECONDS); String contentType = response.getHeaders().get(HttpHeader.CONTENT_TYPE); - return hasRfc9457ContentType(contentType); + return hasRFC9457ContentType(contentType); } catch (InterruptedException | TimeoutException | ExecutionException e) { return false; } diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java index faa603120..42dd5619c 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java @@ -99,7 +99,7 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor private final PathProcessor pathProcessor; - private final JettyRfc9457Reporter rfc9457Reporter; + private final JettyRFC9457Reporter rfc9457Reporter; private final URI baseUri; @@ -124,7 +124,7 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor RemoteRepository repository, ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, - JettyRfc9457Reporter rfc9457Reporter) + JettyRFC9457Reporter rfc9457Reporter) throws NoTransporterException { this.session = session; this.repository = repository; diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java index 9d6ef3d42..3c4fb1551 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java @@ -40,7 +40,7 @@ public final class JettyTransporterFactory implements HttpTransporterFactory { public static final String NAME = "jetty"; - private final JettyRfc9457Reporter rfc9457Reporter; + private final JettyRFC9457Reporter rfc9457Reporter; private float priority = 15.0f; @@ -50,7 +50,7 @@ public final class JettyTransporterFactory implements HttpTransporterFactory { @Inject public JettyTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JettyRfc9457Reporter rfc9457Reporter) { + ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JettyRFC9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); diff --git a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java index de4f13937..45cfdea23 100644 --- a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java +++ b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java @@ -60,6 +60,6 @@ protected void testPut_Authenticated_ExpectContinueRejected_ExplicitlyConfigured public JettyTransporterTest() { super(() -> new JettyTransporterFactory( - standardChecksumExtractor(), new TestPathProcessor(), new JettyRfc9457Reporter())); + standardChecksumExtractor(), new TestPathProcessor(), new JettyRFC9457Reporter())); } } diff --git a/pom.xml b/pom.xml index 16eb7680c..a058e750a 100644 --- a/pom.xml +++ b/pom.xml @@ -104,6 +104,7 @@ 2.0.13 10.0.22 + 2.10.1 3.9.8 4.0.0-beta-3 @@ -289,6 +290,12 @@ jimfs 1.3.0 + + + com.google.code.gson + gson + ${gsonVersion} + From 620e35759ad4c2a72ab33fb5d3eaee8fdc9e1cde Mon Sep 17 00:00:00 2001 From: markdodgson Date: Mon, 2 Sep 2024 23:04:57 +0100 Subject: [PATCH 3/9] Deserializer to establish behaviour of defaults as recommended in RFC 9457 --- .../transport/http/RFC9457/RFC9457Parser.java | 73 ++++++++++++++++++ .../http/RFC9457/RFC9457Payload.java | 8 +- .../http/RFC9457/RFC9457Reporter.java | 12 +-- .../http/RFC9457/RFC9457ParserTest.java | 74 +++++++++++++++++++ .../internal/test/util/http/HttpServer.java | 13 ++-- .../test/util/http/HttpTransporterTest.java | 4 +- pom.xml | 3 +- 7 files changed, 162 insertions(+), 25 deletions(-) create mode 100644 maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Parser.java create mode 100644 maven-resolver-spi/src/test/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457ParserTest.java diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Parser.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Parser.java new file mode 100644 index 000000000..4e11a52af --- /dev/null +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Parser.java @@ -0,0 +1,73 @@ +/* + * 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.eclipse.aether.spi.connector.transport.http.RFC9457; + +import java.lang.reflect.Type; +import java.net.URI; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; + +public class RFC9457Parser { + private static Gson gson = new GsonBuilder() + .registerTypeAdapter(RFC9457Payload.class, new RFC9457PayloadAdapter()) + .create(); + + public static RFC9457Payload parse(String data) { + return gson.fromJson(data, RFC9457Payload.class); + } + + private static class RFC9457PayloadAdapter implements JsonDeserializer { + @Override + public RFC9457Payload deserialize( + final JsonElement json, final Type typeOfT, final JsonDeserializationContext context) + throws JsonParseException { + JsonObject asJsonObject = json.getAsJsonObject(); + URI type = parseNullableURI(asJsonObject, "type", "about:blank"); + Integer status = parseStatus(asJsonObject); + String title = parseNullableString(asJsonObject, "title"); + String detail = parseNullableString(asJsonObject, "detail"); + URI instance = parseNullableURI(asJsonObject, "instance", null); + return new RFC9457Payload(type, status, title, detail, instance); + } + } + + private static Integer parseStatus(JsonObject jsonObject) { + return jsonObject.get("status") == null || jsonObject.get("status").isJsonNull() + ? null + : jsonObject.get("status").getAsInt(); + } + + private static String parseNullableString(JsonObject jsonObject, String key) { + return jsonObject.get(key) == null || jsonObject.get(key).isJsonNull() + ? null + : jsonObject.get(key).getAsString(); + } + + private static URI parseNullableURI(JsonObject jsonObject, String key, String defaultValue) { + return !jsonObject.has(key) || jsonObject.get(key).isJsonNull() + ? defaultValue != null ? URI.create(defaultValue) : null + : URI.create(jsonObject.get(key).getAsString()); + } +} diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java index 9735473dc..c9fdd7abd 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java @@ -23,7 +23,7 @@ public class RFC9457Payload { private final URI type; - private final int status; + private final Integer status; private final String title; @@ -32,11 +32,11 @@ public class RFC9457Payload { private final URI instance; public RFC9457Payload() { - this(null, 0, null, null, null); + this(null, null, null, null, null); } public RFC9457Payload( - final URI type, final int status, final String title, final String detail, final URI instance) { + final URI type, final Integer status, final String title, final String detail, final URI instance) { this.type = type; this.status = status; this.title = title; @@ -48,7 +48,7 @@ public URI getType() { return type; } - public int getStatus() { + public Integer getStatus() { return status; } diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java index 9e7611ae7..f234afdcc 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java @@ -20,9 +20,6 @@ import java.io.IOException; -import com.google.gson.Gson; -import com.google.gson.JsonSyntaxException; - /** * A reporter for RFC 9457 messages. * RFC9457 is a standard for reporting problems in HTTP responses as a JSON object. @@ -36,8 +33,6 @@ * @param The base exception type to throw if the response is not a RFC9457 message. */ public abstract class RFC9457Reporter { - private static final Gson GSON = new Gson(); - protected abstract boolean isRFC9457Message(T response); protected abstract int getStatusCode(T response); @@ -72,11 +67,8 @@ public void generateException(T response, BiConsumerChecked } if (body != null && !body.isEmpty()) { - try { - RFC9457Payload rfc9457Payload = GSON.fromJson(body, RFC9457Payload.class); - throw new HttpRFC9457Exception(statusCode, reasonPhrase, rfc9457Payload); - } catch (JsonSyntaxException ignore) { - } + RFC9457Payload rfc9457Payload = RFC9457Parser.parse(body); + throw new HttpRFC9457Exception(statusCode, reasonPhrase, rfc9457Payload); } throw new HttpRFC9457Exception(statusCode, reasonPhrase, new RFC9457Payload()); } diff --git a/maven-resolver-spi/src/test/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457ParserTest.java b/maven-resolver-spi/src/test/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457ParserTest.java new file mode 100644 index 000000000..dfa501b3b --- /dev/null +++ b/maven-resolver-spi/src/test/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457ParserTest.java @@ -0,0 +1,74 @@ +/* + * 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.eclipse.aether.spi.connector.transport.http.RFC9457; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class RFC9457ParserTest { + @Test + void testParseAllFields() { + String data = + "{\"type\":\"https://example.com/error\",\"status\":400,\"title\":\"Bad Request\",\"detail\":\"The request could not be understood by the server due to malformed syntax.\",\"instance\":\"https://example.com/error/400\"}"; + RFC9457Payload payload = RFC9457Parser.parse(data); + + assertEquals("https://example.com/error", payload.getType().toString()); + assertEquals(400, payload.getStatus()); + assertEquals("Bad Request", payload.getTitle()); + assertEquals("The request could not be understood by the server due to malformed syntax.", payload.getDetail()); + assertEquals("https://example.com/error/400", payload.getInstance().toString()); + } + + @Test + void testParseWithMissingFields() { + String data = "{\"type\":\"https://example.com/other_error\",\"status\":403}"; + RFC9457Payload payload = RFC9457Parser.parse(data); + + assertEquals("https://example.com/other_error", payload.getType().toString()); + assertEquals(403, payload.getStatus()); + assertNull(payload.getTitle()); + assertNull(payload.getDetail()); + assertNull(payload.getInstance()); + } + + @Test + void testParseWithNoFields() { + String data = "{}"; + RFC9457Payload payload = RFC9457Parser.parse(data); + + assertEquals("about:blank", payload.getType().toString()); + assertNull(payload.getStatus()); + assertNull(payload.getTitle()); + assertNull(payload.getDetail()); + assertNull(payload.getInstance()); + } + + @Test + void testParseWithNullFields() { + String data = "{\"type\":null,\"status\":null,\"title\":null,\"detail\":null,\"instance\":null}"; + RFC9457Payload payload = RFC9457Parser.parse(data); + + assertEquals("about:blank", payload.getType().toString()); + assertNull(payload.getStatus()); + assertNull(payload.getTitle()); + assertNull(payload.getDetail()); + assertNull(payload.getInstance()); + } +} diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java index 0d9849d08..6cbcb16b9 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpServer.java @@ -520,12 +520,7 @@ public void handle( response.setHeader(HttpHeader.CONTENT_TYPE.asString(), "application/problem+json"); RFC9457Payload rfc9457Payload; if (path.endsWith("missing_fields.txt")) { - rfc9457Payload = new RFC9457Payload( - URI.create("https://example.com/probs/out-of-credit"), - HttpServletResponse.SC_FORBIDDEN, - null, - null, - null); + rfc9457Payload = new RFC9457Payload(null, null, null, null, null); } else { rfc9457Payload = new RFC9457Payload( URI.create("https://example.com/probs/out-of-credit"), @@ -534,11 +529,15 @@ public void handle( "Your current balance is 30, but that costs 50.", URI.create("/account/12345/msgs/abc")); } - writeResponseBodyMessage(response, new Gson().toJson(rfc9457Payload)); + writeResponseBodyMessage(response, buildRFC9457Message(rfc9457Payload)); } } } + private String buildRFC9457Message(RFC9457Payload payload) { + return new Gson().toJson(payload, RFC9457Payload.class); + } + private class RedirectHandler extends AbstractHandler { @Override public void handle(String target, Request req, HttpServletRequest request, HttpServletResponse response) { diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java index 643c35542..ea1813a13 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java @@ -501,8 +501,8 @@ protected void testGet_rfc9457Response_with_missing_fields() throws Exception { fail("Expected error"); } catch (HttpRFC9457Exception e) { assertEquals(403, e.getStatusCode()); - assertEquals(e.getRfc9457().getType(), URI.create("https://example.com/probs/out-of-credit")); - assertEquals(e.getRfc9457().getStatus(), 403); + assertEquals(e.getRfc9457().getType(), URI.create("about:blank")); + assertNull(e.getRfc9457().getStatus()); assertNull(e.getRfc9457().getTitle()); assertNull(e.getRfc9457().getDetail()); assertNull(e.getRfc9457().getInstance()); diff --git a/pom.xml b/pom.xml index a058e750a..4a71040e0 100644 --- a/pom.xml +++ b/pom.xml @@ -104,7 +104,6 @@ 2.0.13 10.0.22 - 2.10.1 3.9.8 4.0.0-beta-3 @@ -294,7 +293,7 @@ com.google.code.gson gson - ${gsonVersion} + 2.10.1 From 53176c9f7907554c011ca40b65dafea6f9521cd8 Mon Sep 17 00:00:00 2001 From: markdodgson Date: Tue, 3 Sep 2024 17:37:54 +0100 Subject: [PATCH 4/9] Renaming RFC --- .../http/RFC9457/HttpRFC9457Exception.java | 2 +- .../http/RFC9457/RFC9457Reporter.java | 2 +- .../test/util/http/HttpTransporterTest.java | 24 +++++++++---------- .../transport/jdk/JdkTransporterFactory.java | 2 +- .../jetty/JettyTransporterFactory.java | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java index da7f4c8f3..a161dd01f 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java @@ -49,7 +49,7 @@ public String getReasonPhrase() { return reasonPhrase; } - public RFC9457Payload getRfc9457() { + public RFC9457Payload getRFC9457() { return rfc9457; } } diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java index f234afdcc..8fbd2cbb6 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java @@ -22,7 +22,7 @@ /** * A reporter for RFC 9457 messages. - * RFC9457 is a standard for reporting problems in HTTP responses as a JSON object. + * RFC 9457 is a standard for reporting problems in HTTP responses as a JSON object. * There are members specified in the RFC but none of those appear to be required, * @see rfc9457 section 3.7 * Given the JSON fields are not mandatory, this reporter simply extracts the body of the diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java index ea1813a13..ca817128c 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java @@ -480,32 +480,32 @@ protected void testGet_ProxyUnauthenticated() throws Exception { } @Test - protected void testGet_rfc9457Response() throws Exception { + protected void testGet_RFC9457Response() throws Exception { try { transporter.get(new GetTask(URI.create("rfc9457/file.txt"))); fail("Expected error"); } catch (HttpRFC9457Exception e) { assertEquals(403, e.getStatusCode()); - assertEquals(e.getRfc9457().getType(), URI.create("https://example.com/probs/out-of-credit")); - assertEquals(e.getRfc9457().getStatus(), 403); - assertEquals(e.getRfc9457().getTitle(), "You do not have enough credit."); - assertEquals(e.getRfc9457().getDetail(), "Your current balance is 30, but that costs 50."); - assertEquals(e.getRfc9457().getInstance(), URI.create("/account/12345/msgs/abc")); + assertEquals(e.getRFC9457().getType(), URI.create("https://example.com/probs/out-of-credit")); + assertEquals(e.getRFC9457().getStatus(), 403); + assertEquals(e.getRFC9457().getTitle(), "You do not have enough credit."); + assertEquals(e.getRFC9457().getDetail(), "Your current balance is 30, but that costs 50."); + assertEquals(e.getRFC9457().getInstance(), URI.create("/account/12345/msgs/abc")); } } @Test - protected void testGet_rfc9457Response_with_missing_fields() throws Exception { + protected void testGet_RFC9457Response_with_missing_fields() throws Exception { try { transporter.get(new GetTask(URI.create("rfc9457/missing_fields.txt"))); fail("Expected error"); } catch (HttpRFC9457Exception e) { assertEquals(403, e.getStatusCode()); - assertEquals(e.getRfc9457().getType(), URI.create("about:blank")); - assertNull(e.getRfc9457().getStatus()); - assertNull(e.getRfc9457().getTitle()); - assertNull(e.getRfc9457().getDetail()); - assertNull(e.getRfc9457().getInstance()); + assertEquals(e.getRFC9457().getType(), URI.create("about:blank")); + assertNull(e.getRFC9457().getStatus()); + assertNull(e.getRFC9457().getTitle()); + assertNull(e.getRFC9457().getDetail()); + assertNull(e.getRFC9457().getInstance()); } } diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index 699d37de1..d05e75c30 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -53,7 +53,7 @@ public JdkTransporterFactory( ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRFC9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); - this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); + this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "RFC9457Reporter"); } @Override diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java index 3c4fb1551..2226fa1c7 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java @@ -53,7 +53,7 @@ public JettyTransporterFactory( ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JettyRFC9457Reporter rfc9457Reporter) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); - this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); + this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "RFC9457Reporter"); } @Override From a50eabbdc3ecc68d398318518bd78579b9639d16 Mon Sep 17 00:00:00 2001 From: markdodgson Date: Wed, 11 Sep 2024 11:00:57 +0100 Subject: [PATCH 5/9] Add toString so the payload bubbles up to the cli --- .../transport/http/RFC9457/RFC9457Payload.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java index c9fdd7abd..c38cc2a0e 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java @@ -63,4 +63,14 @@ public String getDetail() { public URI getInstance() { return instance; } + + @Override + public String toString() { + return "RFC9457Payload {" + "type=" + + type + ", status=" + + status + ", title='" + + title + ", detail='" + + detail + ", instance=" + + instance + '}'; + } } From 1c7138e6471a81fdc67a9510e26d1e42d9205f27 Mon Sep 17 00:00:00 2001 From: markdodgson Date: Wed, 11 Sep 2024 11:16:09 +0100 Subject: [PATCH 6/9] Updated gson version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a71040e0..9b588d953 100644 --- a/pom.xml +++ b/pom.xml @@ -293,7 +293,7 @@ com.google.code.gson gson - 2.10.1 + 2.11.0 From cf8c50400278152660aecd61fc6e57430bca4fc6 Mon Sep 17 00:00:00 2001 From: markdodgson Date: Wed, 11 Sep 2024 15:57:30 +0100 Subject: [PATCH 7/9] Rename payload --- .../http/RFC9457/HttpRFC9457Exception.java | 12 +++++------ .../test/util/http/HttpTransporterTest.java | 20 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java index a161dd01f..223c809b9 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/HttpRFC9457Exception.java @@ -32,13 +32,13 @@ public class HttpRFC9457Exception extends IOException { private final String reasonPhrase; - private final RFC9457Payload rfc9457; + private final RFC9457Payload payload; - public HttpRFC9457Exception(int statusCode, String reasonPhrase, RFC9457Payload rfc9457) { - super(rfc9457.toString()); + public HttpRFC9457Exception(int statusCode, String reasonPhrase, RFC9457Payload payload) { + super(payload.toString()); this.statusCode = statusCode; this.reasonPhrase = reasonPhrase; - this.rfc9457 = rfc9457; + this.payload = payload; } public int getStatusCode() { @@ -49,7 +49,7 @@ public String getReasonPhrase() { return reasonPhrase; } - public RFC9457Payload getRFC9457() { - return rfc9457; + public RFC9457Payload getPayload() { + return payload; } } diff --git a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java index ca817128c..b76811998 100644 --- a/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java +++ b/maven-resolver-test-http/src/main/java/org/eclipse/aether/internal/test/util/http/HttpTransporterTest.java @@ -486,11 +486,11 @@ protected void testGet_RFC9457Response() throws Exception { fail("Expected error"); } catch (HttpRFC9457Exception e) { assertEquals(403, e.getStatusCode()); - assertEquals(e.getRFC9457().getType(), URI.create("https://example.com/probs/out-of-credit")); - assertEquals(e.getRFC9457().getStatus(), 403); - assertEquals(e.getRFC9457().getTitle(), "You do not have enough credit."); - assertEquals(e.getRFC9457().getDetail(), "Your current balance is 30, but that costs 50."); - assertEquals(e.getRFC9457().getInstance(), URI.create("/account/12345/msgs/abc")); + assertEquals(e.getPayload().getType(), URI.create("https://example.com/probs/out-of-credit")); + assertEquals(e.getPayload().getStatus(), 403); + assertEquals(e.getPayload().getTitle(), "You do not have enough credit."); + assertEquals(e.getPayload().getDetail(), "Your current balance is 30, but that costs 50."); + assertEquals(e.getPayload().getInstance(), URI.create("/account/12345/msgs/abc")); } } @@ -501,11 +501,11 @@ protected void testGet_RFC9457Response_with_missing_fields() throws Exception { fail("Expected error"); } catch (HttpRFC9457Exception e) { assertEquals(403, e.getStatusCode()); - assertEquals(e.getRFC9457().getType(), URI.create("about:blank")); - assertNull(e.getRFC9457().getStatus()); - assertNull(e.getRFC9457().getTitle()); - assertNull(e.getRFC9457().getDetail()); - assertNull(e.getRFC9457().getInstance()); + assertEquals(e.getPayload().getType(), URI.create("about:blank")); + assertNull(e.getPayload().getStatus()); + assertNull(e.getPayload().getTitle()); + assertNull(e.getPayload().getDetail()); + assertNull(e.getPayload().getInstance()); } } From 156b09517904c13515839562084ac275797911a9 Mon Sep 17 00:00:00 2001 From: markdodgson Date: Wed, 11 Sep 2024 17:39:19 +0100 Subject: [PATCH 8/9] Add UTF-8 --- .../aether/transport/apache/ApacheRFC9457Reporter.java | 3 ++- .../org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java | 3 ++- .../org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java | 4 +++- .../eclipse/aether/transport/jetty/JettyRFC9457Reporter.java | 5 ++++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java index c8eaadd2c..80cb4bb12 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java @@ -19,6 +19,7 @@ package org.eclipse.aether.transport.apache; import java.io.IOException; +import java.nio.charset.StandardCharsets; import org.apache.http.Header; import org.apache.http.HttpHeaders; @@ -55,6 +56,6 @@ protected String getReasonPhrase(final CloseableHttpResponse response) { @Override protected String getBody(final CloseableHttpResponse response) throws IOException { - return EntityUtils.toString(response.getEntity()); + return EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); } } diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java index 9e87b1658..17c1a4506 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; import java.util.Optional; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; @@ -50,7 +51,7 @@ protected String getReasonPhrase(final HttpResponse response) { @Override protected String getBody(final HttpResponse response) throws IOException { try (InputStream is = response.body()) { - return new String(is.readAllBytes()); + return new String(is.readAllBytes(), StandardCharsets.UTF_8); } } } diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java index f43cd29e7..45a3a2a1d 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; +import java.nio.charset.StandardCharsets; import org.eclipse.aether.spi.connector.transport.http.HttpTransporterException; import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; @@ -49,7 +50,8 @@ protected String getReasonPhrase(final HttpURLConnection response) { @Override protected String getBody(final HttpURLConnection response) throws IOException { - try (BufferedReader br = new BufferedReader(new InputStreamReader(response.getInputStream()))) { + try (BufferedReader br = new BufferedReader(new InputStreamReader(response.getInputStream(), + StandardCharsets.UTF_8))) { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java index d2f76a197..4fe679b25 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -31,6 +32,8 @@ import org.eclipse.jetty.http.HttpHeader; public class JettyRFC9457Reporter extends RFC9457Reporter { + public static final JettyRFC9457Reporter INSTANCE = new JettyRFC9457Reporter(); + @Override protected boolean isRFC9457Message(final InputStreamResponseListener listener) { try { @@ -65,7 +68,7 @@ protected String getReasonPhrase(final InputStreamResponseListener listener) { @Override protected String getBody(final InputStreamResponseListener listener) throws IOException { try (InputStream is = listener.getInputStream()) { - return new String(is.readAllBytes()); + return new String(is.readAllBytes(), StandardCharsets.UTF_8); } } } From 9f3391eb1590ab9eee312f3750012d8721a333ed Mon Sep 17 00:00:00 2001 From: markdodgson Date: Thu, 12 Sep 2024 06:07:04 +0100 Subject: [PATCH 9/9] As recommended opted to use static instance. Using a static instance also has the benefit of keeping the changes internal. Therefore, no changes to the maven project are required to move to this version. --- .../SupplierRepositorySystemFactory.java | 8 ++------ .../transport/http/RFC9457/RFC9457Payload.java | 4 +++- .../transport/http/RFC9457/RFC9457Reporter.java | 4 ++-- .../supplier/RepositorySystemSupplier.java | 16 +--------------- .../supplier/RepositorySystemSupplier.java | 16 +--------------- .../transport/apache/ApacheRFC9457Reporter.java | 4 ++++ .../transport/apache/ApacheTransporter.java | 8 ++------ .../apache/ApacheTransporterFactory.java | 8 ++------ .../transport/apache/ApacheTransporterTest.java | 3 +-- .../aether/transport/jdk/JdkRFC9457Reporter.java | 4 ++++ .../aether/transport/jdk/JdkTransporter.java | 8 ++------ .../transport/jdk/JdkTransporterFactory.java | 9 ++------- .../aether/transport/jdk/JdkTransporterTest.java | 6 ++---- .../aether/transport/jdk/JdkRFC9457Reporter.java | 8 ++++++-- .../transport/jetty/JettyRFC9457Reporter.java | 2 ++ .../aether/transport/jetty/JettyTransporter.java | 8 ++------ .../transport/jetty/JettyTransporterFactory.java | 8 ++------ .../transport/jetty/JettyTransporterTest.java | 3 +-- 18 files changed, 41 insertions(+), 86 deletions(-) diff --git a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java index b5f963607..4eeb0ee9d 100644 --- a/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java +++ b/maven-resolver-demos/maven-resolver-demo-snippets/src/main/java/org/apache/maven/resolver/examples/supplier/SupplierRepositorySystemFactory.java @@ -35,9 +35,7 @@ import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.supplier.RepositorySystemSupplier; -import org.eclipse.aether.transport.jdk.JdkRFC9457Reporter; import org.eclipse.aether.transport.jdk.JdkTransporterFactory; -import org.eclipse.aether.transport.jetty.JettyRFC9457Reporter; import org.eclipse.aether.transport.jetty.JettyTransporterFactory; /** @@ -96,12 +94,10 @@ protected Map createTransporterFactories() { Map result = super.createTransporterFactories(); result.put( JdkTransporterFactory.NAME, - new JdkTransporterFactory( - getChecksumExtractor(), getPathProcessor(), new JdkRFC9457Reporter())); + new JdkTransporterFactory(getChecksumExtractor(), getPathProcessor())); result.put( JettyTransporterFactory.NAME, - new JettyTransporterFactory( - getChecksumExtractor(), getPathProcessor(), new JettyRFC9457Reporter())); + new JettyTransporterFactory(getChecksumExtractor(), getPathProcessor())); return result; } }.get(); diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java index c38cc2a0e..cf60a3960 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Payload.java @@ -21,6 +21,8 @@ import java.net.URI; public class RFC9457Payload { + public static final RFC9457Payload INSTANCE = new RFC9457Payload(); + private final URI type; private final Integer status; @@ -31,7 +33,7 @@ public class RFC9457Payload { private final URI instance; - public RFC9457Payload() { + private RFC9457Payload() { this(null, null, null, null, null); } diff --git a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java index 8fbd2cbb6..a91726ea5 100644 --- a/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java +++ b/maven-resolver-spi/src/main/java/org/eclipse/aether/spi/connector/transport/http/RFC9457/RFC9457Reporter.java @@ -63,14 +63,14 @@ public void generateException(T response, BiConsumerChecked body = getBody(response); } catch (IOException ignore) { // No body found but it is representing a RFC 9457 message due to the content type. - throw new HttpRFC9457Exception(statusCode, reasonPhrase, new RFC9457Payload()); + throw new HttpRFC9457Exception(statusCode, reasonPhrase, RFC9457Payload.INSTANCE); } if (body != null && !body.isEmpty()) { RFC9457Payload rfc9457Payload = RFC9457Parser.parse(body); throw new HttpRFC9457Exception(statusCode, reasonPhrase, rfc9457Payload); } - throw new HttpRFC9457Exception(statusCode, reasonPhrase, new RFC9457Payload()); + throw new HttpRFC9457Exception(statusCode, reasonPhrase, RFC9457Payload.INSTANCE); } baseException.accept(statusCode, reasonPhrase); } diff --git a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java index b54f4d4a2..b8189e21f 100644 --- a/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java +++ b/maven-resolver-supplier-mvn3/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java @@ -132,7 +132,6 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor; import org.eclipse.aether.spi.synccontext.SyncContextFactory; -import org.eclipse.aether.transport.apache.ApacheRFC9457Reporter; import org.eclipse.aether.transport.apache.ApacheTransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.util.version.GenericVersionScheme; @@ -630,19 +629,6 @@ protected ChecksumExtractor createChecksumExtractor() { return new DefaultChecksumExtractor(getChecksumExtractorStrategies()); } - private ApacheRFC9457Reporter rfc9457Reporter; - - public final ApacheRFC9457Reporter getRfc9457Reporter() { - if (rfc9457Reporter == null) { - rfc9457Reporter = createRfc9457Reporter(); - } - return rfc9457Reporter; - } - - protected ApacheRFC9457Reporter createRfc9457Reporter() { - return new ApacheRFC9457Reporter(); - } - private Map transporterFactories; public final Map getTransporterFactories() { @@ -658,7 +644,7 @@ protected Map createTransporterFactories() { result.put(FileTransporterFactory.NAME, new FileTransporterFactory()); result.put( ApacheTransporterFactory.NAME, - new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor(), getRfc9457Reporter())); + new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor())); return result; } diff --git a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java index f0318c4f9..917f2d689 100644 --- a/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java +++ b/maven-resolver-supplier-mvn4/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java @@ -136,7 +136,6 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor; import org.eclipse.aether.spi.synccontext.SyncContextFactory; -import org.eclipse.aether.transport.apache.ApacheRFC9457Reporter; import org.eclipse.aether.transport.apache.ApacheTransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.util.version.GenericVersionScheme; @@ -634,19 +633,6 @@ protected ChecksumExtractor createChecksumExtractor() { return new DefaultChecksumExtractor(getChecksumExtractorStrategies()); } - private ApacheRFC9457Reporter rfc9457Reporter; - - public final ApacheRFC9457Reporter getRfc9457Reporter() { - if (rfc9457Reporter == null) { - rfc9457Reporter = createRfc9457Reporter(); - } - return rfc9457Reporter; - } - - protected ApacheRFC9457Reporter createRfc9457Reporter() { - return new ApacheRFC9457Reporter(); - } - private Map transporterFactories; public final Map getTransporterFactories() { @@ -662,7 +648,7 @@ protected Map createTransporterFactories() { result.put(FileTransporterFactory.NAME, new FileTransporterFactory()); result.put( ApacheTransporterFactory.NAME, - new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor(), getRfc9457Reporter())); + new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor())); return result; } diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java index 80cb4bb12..3d9803ec1 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheRFC9457Reporter.java @@ -29,6 +29,10 @@ import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; public class ApacheRFC9457Reporter extends RFC9457Reporter { + public static final ApacheRFC9457Reporter INSTANCE = new ApacheRFC9457Reporter(); + + private ApacheRFC9457Reporter() {} + @Override protected boolean isRFC9457Message(final CloseableHttpResponse response) { Header[] headers = response.getHeaders(HttpHeaders.CONTENT_TYPE); diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java index 863399e6b..f9392139e 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java @@ -145,20 +145,16 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo private final boolean supportWebDav; - private final ApacheRFC9457Reporter rfc9457Reporter; - @SuppressWarnings("checkstyle:methodlength") ApacheTransporter( RemoteRepository repository, RepositorySystemSession session, ChecksumExtractor checksumExtractor, - PathProcessor pathProcessor, - ApacheRFC9457Reporter rfc9457Reporter) + PathProcessor pathProcessor) throws NoTransporterException { if (!"http".equalsIgnoreCase(repository.getProtocol()) && !"https".equalsIgnoreCase(repository.getProtocol())) { throw new NoTransporterException(repository); } - this.rfc9457Reporter = rfc9457Reporter; this.checksumExtractor = checksumExtractor; this.pathProcessor = pathProcessor; try { @@ -610,7 +606,7 @@ private void resume(T request, GetTask task) throws I private void handleStatus(CloseableHttpResponse response) throws Exception { int status = response.getStatusLine().getStatusCode(); if (status >= 300) { - rfc9457Reporter.generateException(response, (statusCode, reasonPhrase) -> { + ApacheRFC9457Reporter.INSTANCE.generateException(response, (statusCode, reasonPhrase) -> { throw new HttpResponseException(statusCode, reasonPhrase + " (" + statusCode + ")"); }); } diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java index 0e453c6f4..14c076f4b 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterFactory.java @@ -39,8 +39,6 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory { public static final String NAME = "apache"; - private final ApacheRFC9457Reporter rfc9457Reporter; - private float priority = 5.0f; private final ChecksumExtractor checksumExtractor; @@ -48,10 +46,8 @@ public final class ApacheTransporterFactory implements HttpTransporterFactory { private final PathProcessor pathProcessor; @Inject - public ApacheTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, ApacheRFC9457Reporter rfc9457Reporter) { + public ApacheTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); - this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "rfc9457Reporter"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); } @@ -77,6 +73,6 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi requireNonNull(session, "session cannot be null"); requireNonNull(repository, "repository cannot be null"); - return new ApacheTransporter(repository, session, checksumExtractor, pathProcessor, rfc9457Reporter); + return new ApacheTransporter(repository, session, checksumExtractor, pathProcessor); } } diff --git a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java index fd08d8998..bc7980c52 100644 --- a/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java +++ b/maven-resolver-transport-apache/src/test/java/org/eclipse/aether/transport/apache/ApacheTransporterTest.java @@ -44,8 +44,7 @@ class ApacheTransporterTest extends HttpTransporterTest { public ApacheTransporterTest() { - super(() -> new ApacheTransporterFactory( - standardChecksumExtractor(), new TestPathProcessor(), new ApacheRFC9457Reporter())); + super(() -> new ApacheTransporterFactory(standardChecksumExtractor(), new TestPathProcessor())); } @Override diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java index 17c1a4506..be976875e 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java @@ -28,6 +28,10 @@ import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; public class JdkRFC9457Reporter extends RFC9457Reporter, HttpTransporterException> { + public static final JdkRFC9457Reporter INSTANCE = new JdkRFC9457Reporter(); + + private JdkRFC9457Reporter() {} + @Override protected boolean isRFC9457Message(final HttpResponse response) { Optional optionalContentType = response.headers().firstValue("Content-Type"); diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java index c186093ab..1f835c0ea 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java @@ -116,8 +116,6 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte private final PathProcessor pathProcessor; - private final JdkRFC9457Reporter rfc9457Reporter; - private final URI baseUri; private final HttpClient client; @@ -135,11 +133,9 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte RemoteRepository repository, int javaVersion, ChecksumExtractor checksumExtractor, - PathProcessor pathProcessor, - JdkRFC9457Reporter rfc9457Reporter) + PathProcessor pathProcessor) throws NoTransporterException { this.checksumExtractor = checksumExtractor; - this.rfc9457Reporter = rfc9457Reporter; this.pathProcessor = pathProcessor; try { URI uri = new URI(repository.getUrl()).parseServerAuthority(); @@ -295,7 +291,7 @@ protected void implGet(GetTask task) throws Exception { continue; } try { - rfc9457Reporter.generateException(response, (statusCode, reasonPhrase) -> { + JdkRFC9457Reporter.INSTANCE.generateException(response, (statusCode, reasonPhrase) -> { throw new HttpTransporterException(statusCode); }); } finally { diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index d05e75c30..a91044ec5 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -40,8 +40,6 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { public static final String NAME = "jdk"; - private final JdkRFC9457Reporter rfc9457Reporter; - private float priority = 10.0f; private final ChecksumExtractor checksumExtractor; @@ -49,11 +47,9 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { private final PathProcessor pathProcessor; @Inject - public JdkTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRFC9457Reporter rfc9457Reporter) { + public JdkTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); - this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "RFC9457Reporter"); } @Override @@ -76,8 +72,7 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi throw new NoTransporterException(repository, "Only HTTP/HTTPS is supported"); } - return new JdkTransporter( - session, repository, javaVersion(), checksumExtractor, pathProcessor, rfc9457Reporter); + return new JdkTransporter(session, repository, javaVersion(), checksumExtractor, pathProcessor); } private static int javaVersion() { diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java index 83f6e8489..1a15aaed9 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-11/src/test/java/org/eclipse/aether/transport/jdk/JdkTransporterTest.java @@ -85,16 +85,14 @@ protected void testRetryHandler_explicitCount_positive() {} protected void testPut_Authenticated_ExpectContinueRejected_ExplicitlyConfiguredHeader() {} public JdkTransporterTest() { - super(() -> new JdkTransporterFactory( - standardChecksumExtractor(), new DefaultPathProcessor(), new JdkRFC9457Reporter())); + super(() -> new JdkTransporterFactory(standardChecksumExtractor(), new DefaultPathProcessor())); } @Test void enhanceConnectExceptionMessages() { String uri = "https://localhost:12345/"; RemoteRepository remoteRepository = new RemoteRepository.Builder("central", "default", uri).build(); - JdkTransporterFactory factory = - new JdkTransporterFactory(s -> null, new DefaultPathProcessor(), new JdkRFC9457Reporter()); + JdkTransporterFactory factory = new JdkTransporterFactory(s -> null, new DefaultPathProcessor()); try (Transporter transporter = factory.newInstance(TestUtils.newSession(), remoteRepository)) { transporter.peek(new PeekTask(URI.create("repo/file.txt"))); diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java index 45a3a2a1d..15f2d7be7 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkRFC9457Reporter.java @@ -28,6 +28,10 @@ import org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter; public class JdkRFC9457Reporter extends RFC9457Reporter { + public static final JdkRFC9457Reporter INSTANCE = new JdkRFC9457Reporter(); + + private JdkRFC9457Reporter() {} + @Override protected boolean isRFC9457Message(final HttpURLConnection response) { String contentType = response.getContentType(); @@ -50,8 +54,8 @@ protected String getReasonPhrase(final HttpURLConnection response) { @Override protected String getBody(final HttpURLConnection response) throws IOException { - try (BufferedReader br = new BufferedReader(new InputStreamReader(response.getInputStream(), - StandardCharsets.UTF_8))) { + try (BufferedReader br = + new BufferedReader(new InputStreamReader(response.getInputStream(), StandardCharsets.UTF_8))) { StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java index 4fe679b25..1defcf471 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyRFC9457Reporter.java @@ -34,6 +34,8 @@ public class JettyRFC9457Reporter extends RFC9457Reporter { public static final JettyRFC9457Reporter INSTANCE = new JettyRFC9457Reporter(); + private JettyRFC9457Reporter() {} + @Override protected boolean isRFC9457Message(final InputStreamResponseListener listener) { try { diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java index 42dd5619c..af78d285a 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporter.java @@ -99,8 +99,6 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor private final PathProcessor pathProcessor; - private final JettyRFC9457Reporter rfc9457Reporter; - private final URI baseUri; private final HttpClient client; @@ -123,14 +121,12 @@ final class JettyTransporter extends AbstractTransporter implements HttpTranspor RepositorySystemSession session, RemoteRepository repository, ChecksumExtractor checksumExtractor, - PathProcessor pathProcessor, - JettyRFC9457Reporter rfc9457Reporter) + PathProcessor pathProcessor) throws NoTransporterException { this.session = session; this.repository = repository; this.checksumExtractor = checksumExtractor; this.pathProcessor = pathProcessor; - this.rfc9457Reporter = rfc9457Reporter; try { URI uri = new URI(repository.getUrl()).parseServerAuthority(); if (uri.isOpaque()) { @@ -289,7 +285,7 @@ protected void implGet(GetTask task) throws Exception { resume = false; continue; } - rfc9457Reporter.generateException(listener, (statusCode, reasonPhrase) -> { + JettyRFC9457Reporter.INSTANCE.generateException(listener, (statusCode, reasonPhrase) -> { throw new HttpTransporterException(statusCode); }); } diff --git a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java index 2226fa1c7..83ecafce8 100644 --- a/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java +++ b/maven-resolver-transport-jetty/src/main/java/org/eclipse/aether/transport/jetty/JettyTransporterFactory.java @@ -40,8 +40,6 @@ public final class JettyTransporterFactory implements HttpTransporterFactory { public static final String NAME = "jetty"; - private final JettyRFC9457Reporter rfc9457Reporter; - private float priority = 15.0f; private final ChecksumExtractor checksumExtractor; @@ -49,11 +47,9 @@ public final class JettyTransporterFactory implements HttpTransporterFactory { private final PathProcessor pathProcessor; @Inject - public JettyTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JettyRFC9457Reporter rfc9457Reporter) { + public JettyTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { this.checksumExtractor = requireNonNull(checksumExtractor, "checksumExtractor"); this.pathProcessor = requireNonNull(pathProcessor, "pathProcessor"); - this.rfc9457Reporter = requireNonNull(rfc9457Reporter, "RFC9457Reporter"); } @Override @@ -76,6 +72,6 @@ public HttpTransporter newInstance(RepositorySystemSession session, RemoteReposi throw new NoTransporterException(repository); } - return new JettyTransporter(session, repository, checksumExtractor, pathProcessor, rfc9457Reporter); + return new JettyTransporter(session, repository, checksumExtractor, pathProcessor); } } diff --git a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java index 45cfdea23..67b3c976f 100644 --- a/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java +++ b/maven-resolver-transport-jetty/src/test/java/org/eclipse/aether/transport/jetty/JettyTransporterTest.java @@ -59,7 +59,6 @@ protected void testRetryHandler_explicitCount_positive() {} protected void testPut_Authenticated_ExpectContinueRejected_ExplicitlyConfiguredHeader() {} public JettyTransporterTest() { - super(() -> new JettyTransporterFactory( - standardChecksumExtractor(), new TestPathProcessor(), new JettyRFC9457Reporter())); + super(() -> new JettyTransporterFactory(standardChecksumExtractor(), new TestPathProcessor())); } }