diff --git a/gradle/changelog/url_exception.yaml b/gradle/changelog/url_exception.yaml new file mode 100644 index 0000000000..9349e0e281 --- /dev/null +++ b/gradle/changelog/url_exception.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Response with exception stack trace for invalid urls ([#1605](https://github.com/scm-manager/scm-manager/pull/1605)) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java b/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java index 2908cf9e65..234c4aeffa 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/JsonMarshallingResponseFilter.java @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.api.v2; import com.fasterxml.jackson.databind.JsonNode; @@ -35,6 +35,7 @@ import javax.inject.Inject; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.Provider; import java.util.Set; @@ -46,6 +47,8 @@ import java.util.Set; @Priority(ResponseFilterPriorities.JSON_MARSHALLING) public class JsonMarshallingResponseFilter implements ContainerResponseFilter { + private static final MediaType ERROR_MEDIA_TYPE = MediaType.valueOf(VndMediaType.ERROR_TYPE); + private final ObjectMapper objectMapper; private final Set enrichers; @@ -57,6 +60,9 @@ public class JsonMarshallingResponseFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { + if (isError(responseContext)) { + return; + } if (hasVndEntity(responseContext)) { JsonNode node = getJsonEntity(responseContext); callEnrichers(requestContext, responseContext, node); @@ -64,6 +70,10 @@ public class JsonMarshallingResponseFilter implements ContainerResponseFilter { } } + private boolean isError(ContainerResponseContext responseContext) { + return ERROR_MEDIA_TYPE.equals(responseContext.getMediaType()); + } + private void callEnrichers(ContainerRequestContext requestContext, ContainerResponseContext responseContext, JsonNode node) { JsonEnricherContext context = new JsonEnricherContext( requestContext.getUriInfo().getRequestUri(),