You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2020/12/11 11:43:53 UTC
[tomee] 03/03: Make sure we are consistent and also override other
methods from the context wrapper
This is an automated email from the ASF dual-hosted git repository.
jlmonteiro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tomee.git
commit fe434759320cae925b93f39a7909d84fb8030080
Author: Jean-Louis Monteiro <jl...@tomitribe.com>
AuthorDate: Fri Dec 11 12:43:28 2020 +0100
Make sure we are consistent and also override other methods from the context wrapper
---
.../org/apache/openejb/server/httpd/EEFilter.java | 29 +++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EEFilter.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EEFilter.java
index 18050c7..045eb43 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EEFilter.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EEFilter.java
@@ -38,6 +38,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.util.Properties;
+import java.util.concurrent.atomic.AtomicReference;
// its pupose is to start/stop request scope in async tasks
// and ensure logout is propagated to security service
@@ -98,6 +99,9 @@ public class EEFilter implements Filter {
public static class CdiRequest extends NoCdiRequest {
private final WebBeansContext webBeansContext;
+ // it's a request so not multi-threaded
+ private final AtomicReference<AsynContextWrapper> asyncContextWrapperReference = new AtomicReference<>();
+
public CdiRequest(final HttpServletRequest cast, final WebBeansContext webBeansContext, final EEFilter filter) {
super(cast, filter);
this.webBeansContext = webBeansContext;
@@ -105,12 +109,22 @@ public class EEFilter implements Filter {
@Override
public AsyncContext startAsync() throws IllegalStateException {
- return new AsynContextWrapper(super.startAsync(), this, webBeansContext);
+ asyncContextWrapperReference.compareAndSet(null,
+ new AsynContextWrapper(super.startAsync(), this, webBeansContext));
+ return asyncContextWrapperReference.get();
}
@Override
public AsyncContext startAsync(final ServletRequest servletRequest, final ServletResponse servletResponse) throws IllegalStateException {
- return new AsynContextWrapper(super.startAsync(servletRequest, servletResponse), servletRequest, webBeansContext);
+ asyncContextWrapperReference.compareAndSet(null,
+ new AsynContextWrapper(super.startAsync(servletRequest, servletResponse), servletRequest, webBeansContext));
+ return asyncContextWrapperReference.get();
+ }
+
+ @Override
+ public AsyncContext getAsyncContext() {
+ // tomcat won't return our wrapper
+ return asyncContextWrapperReference.get();
}
}
@@ -163,7 +177,16 @@ public class EEFilter implements Filter {
@Override
public boolean hasOriginalRequestAndResponse() {
- return delegate.hasOriginalRequestAndResponse();
+ final boolean tomcatHasOriginalRequestAndResponse = delegate.hasOriginalRequestAndResponse();
+ if (!tomcatHasOriginalRequestAndResponse) {
+ // unfortunately in the startAsync() Tomcat computes the hasOriginalRequestAndResponse flag
+ // Unfortunately we pass in the wrapped request so the flag is false
+ // we need to override the value returned by Tomcat in case we are wrapping the request
+ if (request instanceof NoCdiRequest) { // and CdiRequest
+ return request == delegate.getRequest(); // Tomcat should have this as the request and not the RequestFacade
+ }
+ }
+ return tomcatHasOriginalRequestAndResponse;
}
@Override