Skip to content

Commit a4e13c5

Browse files
committed
Merge branch '6.0.x'
Closes gh-13150
2 parents eea3b77 + e033e34 commit a4e13c5

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
@@ -377,7 +377,6 @@ private void start() {
377377

378378
private void error(Throwable error) {
379379
if (this.state.get() == 1) {
380-
this.scope.close();
381380
this.scope.getCurrentObservation().error(error);
382381
}
383382
}

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

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

3636
import static org.assertj.core.api.Assertions.assertThat;
37+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
3738
import static org.mockito.ArgumentMatchers.any;
3839
import static org.mockito.BDDMockito.given;
40+
import static org.mockito.BDDMockito.willThrow;
3941
import static org.mockito.Mockito.mock;
4042
import static org.mockito.Mockito.times;
4143
import static org.mockito.Mockito.verify;
@@ -109,6 +111,23 @@ void decorateFiltersWhenDefaultsThenUsesEventName() throws Exception {
109111
assertThat(events.get(1).getName()).isEqualTo("authentication.basic.after");
110112
}
111113

114+
// gh-12787
115+
@Test
116+
void decorateFiltersWhenErrorsThenClosesObservationOnlyOnce() throws Exception {
117+
ObservationHandler<?> handler = mock(ObservationHandler.class);
118+
given(handler.supportsContext(any())).willReturn(true);
119+
ObservationRegistry registry = ObservationRegistry.create();
120+
registry.observationConfig().observationHandler(handler);
121+
ObservationFilterChainDecorator decorator = new ObservationFilterChainDecorator(registry);
122+
FilterChain chain = mock(FilterChain.class);
123+
Filter filter = mock(Filter.class);
124+
willThrow(IllegalArgumentException.class).given(filter).doFilter(any(), any(), any());
125+
FilterChain decorated = decorator.decorate(chain, List.of(filter));
126+
assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(
127+
() -> decorated.doFilter(new MockHttpServletRequest("GET", "/"), new MockHttpServletResponse()));
128+
verify(handler).onScopeClosed(any());
129+
}
130+
112131
private static class BasicAuthenticationFilter implements Filter {
113132

114133
@Override

0 commit comments

Comments
 (0)