From 67d78eb61c1f1bc5cdc9c1acaaaecfca32af2831 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 18 Oct 2024 14:40:09 +0200 Subject: [PATCH] Avoid Servlet observations failures for invalid HTTP status Prior to this commit, the `DefaultServerRequestObservationConvention` for Servlet failed when the HTTP response status was invalid (for example, set to "0"). This commit catches `IllegalArgumentException` thrown for such invalid HTTP status and instead returns an unknown outcome for the observation. Fixes gh-33725 --- .../DefaultServerRequestObservationConvention.java | 11 ++++++++--- ...ultServerRequestObservationConventionTests.java | 14 +++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java b/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java index fbf0bf27e8..ce42d5d102 100644 --- a/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java +++ b/spring-web/src/main/java/org/springframework/http/server/observation/DefaultServerRequestObservationConvention.java @@ -160,9 +160,14 @@ public class DefaultServerRequestObservationConvention implements ServerRequestO } protected KeyValue outcome(ServerRequestObservationContext context) { - if (context.getResponse() != null) { - HttpStatusCode statusCode = HttpStatusCode.valueOf(context.getResponse().getStatus()); - return HttpOutcome.forStatus(statusCode); + try { + if (context.getResponse() != null) { + HttpStatusCode statusCode = HttpStatusCode.valueOf(context.getResponse().getStatus()); + return HttpOutcome.forStatus(statusCode); + } + } + catch (IllegalArgumentException ex) { + return HTTP_OUTCOME_UNKNOWN; } return HTTP_OUTCOME_UNKNOWN; } diff --git a/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java b/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java index 9d27d421a9..f23d67e4d5 100644 --- a/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/observation/DefaultServerRequestObservationConventionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2023 the original author or authors. + * Copyright 2002-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -137,4 +137,16 @@ class DefaultServerRequestObservationConventionTests { .contains(KeyValue.of("http.url", "/test")); } + @Test + void addsKeyValuesForInvalidStatusExchange() { + this.request.setRequestURI("/test/invalidStatus"); + this.response.setStatus(0); + + assertThat(this.convention.getLowCardinalityKeyValues(this.context)).hasSize(5) + .contains(KeyValue.of("method", "GET"), KeyValue.of("uri", "UNKNOWN"), KeyValue.of("status", "0"), + KeyValue.of("exception", "none"), KeyValue.of("outcome", "UNKNOWN")); + assertThat(this.convention.getHighCardinalityKeyValues(this.context)).hasSize(1) + .contains(KeyValue.of("http.url", "/test/invalidStatus")); + } + }