Skip to content

Commit e033e34

Browse files
committed
Remove Redundant Close
Closes gh-12787
1 parent 1b4b91a commit e033e34

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

web/src/main/java/org/springframework/security/web/ObservationFilterChainDecorator.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,6 @@ private void start() {
324324

325325
private void error(Throwable error) {
326326
if (this.state.get() == 1) {
327-
this.scope.close();
328327
this.scope.getCurrentObservation().error(error);
329328
}
330329
}

web/src/test/java/org/springframework/security/web/ObservationFilterChainDecoratorTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@
3030
import org.springframework.mock.web.MockHttpServletResponse;
3131

3232
import static org.assertj.core.api.Assertions.assertThat;
33+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
3334
import static org.mockito.ArgumentMatchers.any;
3435
import static org.mockito.BDDMockito.given;
36+
import static org.mockito.BDDMockito.willThrow;
3537
import static org.mockito.Mockito.mock;
3638
import static org.mockito.Mockito.times;
3739
import static org.mockito.Mockito.verify;
@@ -87,4 +89,21 @@ void decorateFiltersWhenDefaultsThenObserves() throws Exception {
8789
assertThat(events.get(1).getName()).isEqualTo(filter.getClass().getSimpleName() + ".after");
8890
}
8991

92+
// gh-12787
93+
@Test
94+
void decorateFiltersWhenErrorsThenClosesObservationOnlyOnce() throws Exception {
95+
ObservationHandler<?> handler = mock(ObservationHandler.class);
96+
given(handler.supportsContext(any())).willReturn(true);
97+
ObservationRegistry registry = ObservationRegistry.create();
98+
registry.observationConfig().observationHandler(handler);
99+
ObservationFilterChainDecorator decorator = new ObservationFilterChainDecorator(registry);
100+
FilterChain chain = mock(FilterChain.class);
101+
Filter filter = mock(Filter.class);
102+
willThrow(IllegalArgumentException.class).given(filter).doFilter(any(), any(), any());
103+
FilterChain decorated = decorator.decorate(chain, List.of(filter));
104+
assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(
105+
() -> decorated.doFilter(new MockHttpServletRequest("GET", "/"), new MockHttpServletResponse()));
106+
verify(handler).onScopeClosed(any());
107+
}
108+
90109
}

0 commit comments

Comments
 (0)