diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java index e09a9d9af9dd..735dfb47b863 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/ContextHandler.java @@ -589,11 +589,11 @@ public boolean addEventListener(EventListener listener) { if (super.addEventListener(listener)) { - if (listener instanceof ContextScopeListener) + if (listener instanceof ContextScopeListener contextScopeListener) { - _contextListeners.add((ContextScopeListener)listener); + _contextListeners.add(contextScopeListener); if (__context.get() != null) - ((ContextScopeListener)listener).enterScope(__context.get(), null); + contextScopeListener.enterScope(__context.get(), null); } return true; } @@ -605,9 +605,12 @@ public boolean removeEventListener(EventListener listener) { if (super.removeEventListener(listener)) { - if (listener instanceof ContextScopeListener) - _contextListeners.remove(listener); - + if (listener instanceof ContextScopeListener contextScopeListener) + { + _contextListeners.remove(contextScopeListener); + if (__context.get() != null) + contextScopeListener.exitScope(__context.get(), null); + } return true; } return false; @@ -1053,6 +1056,7 @@ public boolean handle(Request request, Response response, Callback callback) thr return true; // Past this point we are calling the downstream handler in scope. + Context lastContext = getCurrentContext(); ClassLoader lastLoader = enterScope(contextRequest); ContextResponse contextResponse = wrapResponse(contextRequest, response); try @@ -1068,7 +1072,7 @@ public boolean handle(Request request, Response response, Callback callback) thr { // We exit scope here, even though handle() is asynchronous, // as we have wrapped all our callbacks to re-enter the scope. - exitScope(contextRequest, request.getContext(), lastLoader); + exitScope(contextRequest, lastContext, lastLoader); } } diff --git a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ContextScopeListenerTest.java b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ContextScopeListenerTest.java index bdd08253fdfc..8df88e4d199d 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ContextScopeListenerTest.java +++ b/jetty-ee10/jetty-ee10-servlet/src/test/java/org/eclipse/jetty/ee10/servlet/ContextScopeListenerTest.java @@ -201,7 +201,7 @@ public void exitScope(Context context, Request request) ContentResponse response = _client.GET(uri); assertThat(response.getStatus(), equalTo(HttpStatus.OK_200)); - Awaitility.waitAtMost(5, TimeUnit.SECONDS).pollInterval(100, TimeUnit.MILLISECONDS).until(() -> _history.size() == 9); + Awaitility.waitAtMost(5, TimeUnit.SECONDS).pollInterval(100, TimeUnit.MILLISECONDS).until(() -> _history.size() >= 9); assertHistory( "enterScope /initialPath", "doGet",