apache / apache/maven-resolver

Expose response body digest for unexpected status codes

Open
#1,844 3 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Java
Stars
152
Forks
160
Avg merge
1d 4h
Merged PRs (30d)
49

Description

### New feature, improvement proposal

Codes like a 403 usually don't say much without having access to the response body.
Central seems to use this to indicate blocking of certain client IPs (https://the-asf.slack.com/archives/C7Q9JB404/p1776682107010189). In order to ease debugging issues like this the response body should be exposed (at least partially) in the exception.

Example stack trace:

```
Caused by: org.eclipse.aether.transfer.ArtifactTransferException: Could not transfer artifact eu.maveniverse.maven.mimir:extension3:pom:0.11.3 from/to central (https://repo.maven.apache.org/maven2): HTTP Status: 403
at org.eclipse.aether.connector.basic.ArtifactTransportListener.transferFailed(ArtifactTransportListener.java:44)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:467)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:290)
at org.eclipse.aether.internal.impl.filter.FilteringRepositoryConnector.get(FilteringRepositoryConnector.java:95)
at org.eclipse.aether.internal.impl.offline.OfflineRepositoryConnector.get(OfflineRepositoryConnector.java:82)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:503)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:400)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:201)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:180)
at org.apache.maven.impl.resolver.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:173)
at org.apache.maven.impl.resolver.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:121)
at org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:206)
at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolveCoreExtension(DefaultPluginDependenciesResolver.java:173)
at org.apache.maven.cling.extensions.BootstrapCoreExtensionManager.resolveExtension(BootstrapCoreExtensionManager.java:230)
at org.apache.maven.cling.extensions.BootstrapCoreExtensionManager.resolveCoreExtensions(BootstrapCoreExtensionManager.java:167)
at org.apache.maven.cling.extensions.BootstrapCoreExtensionManager.loadCoreExtensions(BootstrapCoreExtensionManager.java:150)
at org.apache.maven.cling.invoker.PlexusContainerCapsuleFactory.loadCoreExtensions(PlexusContainerCapsuleFactory.java:304)
at org.apache.maven.cling.invoker.PlexusContainerCapsuleFactory.container(PlexusContainerCapsuleFactory.java:90)
at org.apache.maven.cling.invoker.PlexusContainerCapsuleFactory.createContainerCapsule(PlexusContainerCapsuleFactory.java:81)
at org.apache.maven.cling.invoker.LookupInvoker.container(LookupInvoker.java:517)
at org.apache.maven.cling.invoker.LookupInvoker.doInvoke(LookupInvoker.java:158)
at org.apache.maven.cling.invoker.LookupInvoker.invoke(LookupInvoker.java:134)
at org.apache.maven.cling.ClingSupport.run(ClingSupport.java:76)
at org.apache.maven.cling.MavenCling.main(MavenCling.java:51)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.lang.reflect.Method.invoke(Method.java:565)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:314)
Caused by: org.eclipse.aether.spi.connector.transport.http.HttpTransporterException: HTTP Status: 403
at org.eclipse.aether.transport.jdk.JdkTransporter.lambda$implGet$0(JdkTransporter.java:301)
at org.eclipse.aether.spi.connector.transport.http.RFC9457.RFC9457Reporter.generateException(RFC9457Reporter.java:75)
at org.eclipse.aether.transport.jdk.JdkTransporter.implGet(JdkTransporter.java:300)
at org.eclipse.aether.spi.connector.transport.AbstractTransporter.get(AbstractTransporter.java:64)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$GetTaskRunner.runTask(BasicRepositoryConnector.java:533)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector$TaskRunner.run(BasicRepositoryConnector.java:464)
at org.eclipse.aether.connector.basic.BasicRepositoryConnector.get(BasicRepositoryConnector.java:290)
at org.eclipse.aether.internal.impl.filter.FilteringRepositoryConnector.get(FilteringRepositoryConnector.java:95)
at org.eclipse.aether.internal.impl.offline.OfflineRepositoryConnector.get(OfflineRepositoryConnector.java:82)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads(DefaultArtifactResolver.java:503)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:400)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:201)
at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:180)
at org.apache.maven.impl.resolver.DefaultArtifactDescriptorReader.loadPom(DefaultArtifactDescriptorReader.java:173)
at org.apache.maven.impl.resolver.DefaultArtifactDescriptorReader.readArtifactDescriptor(DefaultArtifactDescriptorReader.java:121)
at org.eclipse.aether.internal.impl.DefaultRepositorySystem.readArtifactDescriptor(DefaultRepositorySystem.java:206)
at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolveCoreExtension(DefaultPluginDependenciesResolver.java:173)
at org.apache.maven.cling.extensions.BootstrapCoreExtensionManager.resolveExtension(BootstrapCoreExtensionManager.java:230)
at org.apache.maven.cling.extensions.BootstrapCoreExtensionManager.resolveCoreExtensions(BootstrapCoreExtensionManager.java:167)
at org.apache.maven.cling.extensions.BootstrapCoreExtensionManager.loadCoreExtensions(BootstrapCoreExtensionManager.java:150)
at org.apache.maven.cling.invoker.PlexusContainerCapsuleFactory.loadCoreExtensions(PlexusContainerCapsuleFactory.java:304)
at org.apache.maven.cling.invoker.PlexusContainerCapsuleFactory.container(PlexusContainerCapsuleFactory.java:90)
at org.apache.maven.cling.invoker.PlexusContainerCapsuleFactory.createContainerCapsule(PlexusContainerCapsuleFactory.java:81)
at org.apache.maven.cling.invoker.LookupInvoker.container(LookupInvoker.java:517)
at org.apache.maven.cling.invoker.LookupInvoker.doInvoke(LookupInvoker.java:158)
at org.apache.maven.cling.invoker.LookupInvoker.invoke(LookupInvoker.java:134)
at org.apache.maven.cling.ClingSupport.run(ClingSupport.java:76)
at org.apache.maven.cling.MavenCling.main(MavenCling.java:51)
at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
at java.lang.reflect.Method.invoke(Method.java:565)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:255)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:201)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:361)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:314)
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start at JdkTransporter.implGet and RFC9457Reporter.generateException, the entry points shown in the stack trace, and inspect how HTTP status exceptions are constructed. Done means unexpected-status exceptions expose at least part of the response body, with behavior covered by the relevant existing tests if present.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
networking
Issue type
Feature
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.