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