Bläddra i källkod

Remove Redundant Close

Closes gh-12787
Josh Cummings 2 år sedan
förälder
incheckning
e033e347b4

+ 0 - 1
web/src/main/java/org/springframework/security/web/ObservationFilterChainDecorator.java

@@ -324,7 +324,6 @@ public final class ObservationFilterChainDecorator implements FilterChainProxy.F
 
 				private void error(Throwable error) {
 					if (this.state.get() == 1) {
-						this.scope.close();
 						this.scope.getCurrentObservation().error(error);
 					}
 				}

+ 19 - 0
web/src/test/java/org/springframework/security/web/ObservationFilterChainDecoratorTests.java

@@ -30,8 +30,10 @@ import org.springframework.mock.web.MockHttpServletRequest;
 import org.springframework.mock.web.MockHttpServletResponse;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.BDDMockito.given;
+import static org.mockito.BDDMockito.willThrow;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -87,4 +89,21 @@ public class ObservationFilterChainDecoratorTests {
 		assertThat(events.get(1).getName()).isEqualTo(filter.getClass().getSimpleName() + ".after");
 	}
 
+	// gh-12787
+	@Test
+	void decorateFiltersWhenErrorsThenClosesObservationOnlyOnce() throws Exception {
+		ObservationHandler<?> handler = mock(ObservationHandler.class);
+		given(handler.supportsContext(any())).willReturn(true);
+		ObservationRegistry registry = ObservationRegistry.create();
+		registry.observationConfig().observationHandler(handler);
+		ObservationFilterChainDecorator decorator = new ObservationFilterChainDecorator(registry);
+		FilterChain chain = mock(FilterChain.class);
+		Filter filter = mock(Filter.class);
+		willThrow(IllegalArgumentException.class).given(filter).doFilter(any(), any(), any());
+		FilterChain decorated = decorator.decorate(chain, List.of(filter));
+		assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(
+				() -> decorated.doFilter(new MockHttpServletRequest("GET", "/"), new MockHttpServletResponse()));
+		verify(handler).onScopeClosed(any());
+	}
+
 }