Author: isudana
Date: Tue Dec 27 10:15:38 2016
New Revision: 1776101

URL: http://svn.apache.org/viewvc?rev=1776101&view=rev
Log:
Fix for SYNAPSE-1014
-----------------------
Porting fix from 
https://github.com/wso2/wso2-synapse/commit/fbc829ae1e52c552aa348967db929fa21a8cf1f6
 by Isuru Ranawaka

Modified:
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/PassThroughTransportUtils.java
    
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/utils/conn/SynapseNHttpClientConnection.java

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java?rev=1776101&r1=1776100&r2=1776101&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
 Tue Dec 27 10:15:38 2016
@@ -498,6 +498,15 @@ public class TargetHandler implements NH
         }
     }
 
+    /**
+     * Get the associated configuration of the {@code TargetHandler}
+     *
+     * @return associated {@code TargetConfiguration}
+     */
+    public TargetConfiguration getTargetConfiguration() {
+        return targetConfiguration;
+    }
+
     private boolean isResponseHaveBodyExpected(
             final String method, final HttpResponse response) {
 

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/PassThroughTransportUtils.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/PassThroughTransportUtils.java?rev=1776101&r1=1776100&r2=1776101&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/PassThroughTransportUtils.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/PassThroughTransportUtils.java
 Tue Dec 27 10:15:38 2016
@@ -41,6 +41,7 @@ import org.apache.synapse.transport.pass
 import org.apache.synapse.transport.passthru.config.TargetConfiguration;
 import org.apache.synapse.transport.passthru.connections.SourceConnections;
 import org.apache.synapse.transport.passthru.connections.TargetConnections;
+import org.apache.synapse.transport.utils.conn.SynapseNHttpClientConnection;
 
 import java.net.InetAddress;
 import java.util.Map;
@@ -262,7 +263,11 @@ public class PassThroughTransportUtils {
             TargetContext.updateState(conn, ProtocolState.CLOSING);
             connections.closeConnection(conn);
         } else {
-            connections.releaseConnection(conn);
+            if (conn instanceof SynapseNHttpClientConnection) {
+                ((SynapseNHttpClientConnection) conn).markForRelease();
+            } else {
+                connections.releaseConnection(conn);
+            }
         }
     }
 

Modified: 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/utils/conn/SynapseNHttpClientConnection.java
URL: 
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/utils/conn/SynapseNHttpClientConnection.java?rev=1776101&r1=1776100&r2=1776101&view=diff
==============================================================================
--- 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/utils/conn/SynapseNHttpClientConnection.java
 (original)
+++ 
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/utils/conn/SynapseNHttpClientConnection.java
 Tue Dec 27 10:15:38 2016
@@ -30,6 +30,7 @@ import org.apache.http.nio.NHttpMessageP
 import org.apache.http.nio.NHttpMessageWriterFactory;
 import org.apache.http.nio.reactor.IOSession;
 import org.apache.http.nio.util.ByteBufferAllocator;
+import org.apache.synapse.transport.passthru.TargetHandler;
 
 import java.io.IOException;
 import java.nio.charset.CharsetDecoder;
@@ -41,6 +42,8 @@ import java.nio.charset.CharsetEncoder;
  */
 public class SynapseNHttpClientConnection extends DefaultNHttpClientConnection 
{
 
+    private boolean markedForRelease = false;
+
     public SynapseNHttpClientConnection(IOSession session,
                                         int bufferSize,
                                         int fragmentSizeHint,
@@ -75,10 +78,30 @@ public class SynapseNHttpClientConnectio
     @Override
     public void consumeInput(final NHttpClientEventHandler handler) {
         super.consumeInput(handler);
+        if (markedForRelease) {
+            if (handler instanceof TargetHandler) {
+                resetState();
+                ((TargetHandler) 
handler).getTargetConfiguration().getConnections().releaseConnection(this);
+            }
+        }
     }
 
     @Override
     public void produceOutput(final NHttpClientEventHandler handler) {
         super.produceOutput(handler);
     }
+
+    /**
+     * Mark this connection to be released to the pool.
+     * <p>
+     * This needs to be called after finishing work related to a particular 
request/response,
+     * and only when keep-alive is enabled
+     */
+    public void markForRelease() {
+        this.markedForRelease = true;
+    }
+
+    private void resetState() {
+        markedForRelease = false;
+    }
 }


Reply via email to