You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by du...@apache.org on 2016/05/29 18:27:46 UTC

svn commit: r1746042 - in /synapse/trunk/java/modules/transports/core/nhttp: ./ src/main/java/org/apache/synapse/transport/nhttp/ src/main/java/org/apache/synapse/transport/passthru/ src/main/java/org/apache/synapse/transport/passthru/util/

Author: dushan
Date: Sun May 29 18:27:45 2016
New Revision: 1746042

URL: http://svn.apache.org/viewvc?rev=1746042&view=rev
Log:
merging https://issues.apache.org/jira/browse/SYNAPSE-1025, integration tests were verified

Modified:
    synapse/trunk/java/modules/transports/core/nhttp/pom.xml
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.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/passthru/util/SourceResponseFactory.java
    synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java

Modified: synapse/trunk/java/modules/transports/core/nhttp/pom.xml
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/pom.xml?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/pom.xml (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/pom.xml Sun May 29 18:27:45 2016
@@ -158,6 +158,11 @@
             <groupId>commons-lang</groupId>
             <artifactId>commons-lang</artifactId>
         </dependency>
+        
+       <dependency>
+        <groupId>commons-collections</groupId>
+        <artifactId>commons-collections</artifactId>
+      </dependency>
 
         <!-- BouncyCastle API which is required when validating Certificates. -->
         <dependency>

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java Sun May 29 18:27:45 2016
@@ -166,4 +166,10 @@ public class NhttpConstants {
 
     //property name of nhttp log directory
     public static final String NHTTP_LOG_DIRECTORY = "nhttp.log.directory";
+    
+    /**
+     * This holds a MultiValue Map, which keeps transport headers' values other than last value
+     * (in order they appear) against the transport header.
+     */
+    public static final String EXCESS_TRANSPORT_HEADERS = "EXCESS_TRANSPORT_HEADERS";
 }

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java Sun May 29 18:27:45 2016
@@ -69,6 +69,7 @@ public class ClientWorker implements Run
         this.expectEntityBody = response.isExpectResponseBody();
 
         Map<String,String> headers = response.getHeaders();
+        Map excessHeaders = response.getExcessHeaders();
       
 		String oriURL = headers.get(PassThroughConstants.LOCATION);
 		
@@ -141,6 +142,7 @@ public class ClientWorker implements Run
             headerMap.put(headerEntry.getKey(), headerEntry.getValue());
         }
         responseMsgCtx.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);
+        responseMsgCtx.setProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS, excessHeaders);
         if (headerMap.get(HTTP.CONTENT_LEN) != null){
             responseMsgCtx.setProperty(PassThroughConstants.ORIGINAL_CONTENT_LENGTH,
                     headerMap.get(HTTP.CONTENT_LEN));

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java Sun May 29 18:27:45 2016
@@ -135,4 +135,7 @@ public class PassThroughConstants {
     public static final String COPY_CONTENT_LENGTH_FROM_INCOMING="COPY_CONTENT_LENGTH_FROM_INCOMING";
     
     public static final String ORIGINAL_CONTENT_LENGTH ="ORIGINAL_CONTENT_LENGTH";
+    
+    //Http method type constants to be used in synapse
+    public static final String HTTP_HEAD = "HEAD";
 }

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java Sun May 29 18:27:45 2016
@@ -430,6 +430,7 @@ public class ServerWorker implements Run
      * @return the Axis2 message context created
      */
     private MessageContext createMessageContext(SourceRequest request) {
+    	Map excessHeaders = request.getExcessHeaders();
         ConfigurationContext cfgCtx = sourceConfiguration.getConfigurationContext();
         MessageContext msgContext =
                 new MessageContext();
@@ -477,6 +478,8 @@ public class ServerWorker implements Run
             headers.put(entry.getKey(), entry.getValue());
         }
         msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, headers);
+        msgContext.setProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS, excessHeaders);
+        
         if (headers.get(HTTP.CONTENT_LEN) != null){
             msgContext.setProperty(PassThroughConstants.ORIGINAL_CONTENT_LENGTH,
                     headers.get(HTTP.CONTENT_LEN));

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java Sun May 29 18:27:45 2016
@@ -20,6 +20,7 @@
 
 package org.apache.synapse.transport.passthru;
 
+import org.apache.commons.collections.map.MultiValueMap;
 import org.apache.http.*;
 import org.apache.http.message.BasicHttpResponse;
 import org.apache.http.nio.ContentDecoder;
@@ -65,6 +66,10 @@ public class SourceRequest {
 
     /** The connection from the client */
     private NHttpServerConnection connection = null;
+    
+    /** Excess headers of the request */
+    private Map excessHeaders = new MultiValueMap();
+
 
     public SourceRequest(SourceConfiguration sourceConfiguration,
                          HttpRequest request,
@@ -87,9 +92,13 @@ public class SourceRequest {
         Header[] headers = request.getAllHeaders();
         if (headers != null) {
             for (Header header : headers) {
-                this.headers.put(header.getName(), header.getValue());
-            }
-        }
+                if(this.headers.containsKey(header.getName())) {
+	                 addExcessHeader(header);
+	            } else {
+	                 this.headers.put(header.getName(), header.getValue());
+	            }
+	        }
+	    }
     }
 
     /**
@@ -181,4 +190,12 @@ public class SourceRequest {
     public boolean isEntityEnclosing() {
         return entityEnclosing;
     }
+    
+    public Map getExcessHeaders() {
+        return this.excessHeaders;
+   }
+    
+    public void addExcessHeader(Header h) {
+        this.excessHeaders.put(h.getName(), h.getValue());
+   }
 }

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java Sun May 29 18:27:45 2016
@@ -31,15 +31,17 @@ import org.apache.synapse.transport.pass
 
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 public class SourceResponse {
 
     private Pipe pipe = null;
 
     /** Transport headers */
-    private Map<String, String> headers = new HashMap<String, String>();
+    private Map<String, TreeSet<String>> headers = new HashMap<String, TreeSet<String>>();
 
     /** Status of the response */
     private int status = HttpStatus.SC_OK;
@@ -58,6 +60,7 @@ public class SourceResponse {
 
     private SourceRequest request = null;
 
+    
     public SourceResponse(SourceConfiguration config, int status, SourceRequest request) {
         this(config, status, null, request);
     }
@@ -99,7 +102,11 @@ public class SourceResponse {
         BasicHttpEntity entity = new BasicHttpEntity();
 
         int contentLength = -1;
-        String contentLengthHeader = headers.get(HTTP.CONTENT_LEN);
+    	String contentLengthHeader = null; 
+        if(headers.get(HTTP.CONTENT_LEN) != null && headers.get(HTTP.CONTENT_LEN).size() > 0) {
+        	contentLengthHeader = headers.get(HTTP.CONTENT_LEN).first();
+        } 
+
         if (contentLengthHeader != null) {
             contentLength = Integer.parseInt(contentLengthHeader);
 
@@ -116,13 +123,17 @@ public class SourceResponse {
         response.setEntity(entity);
 
         // set any transport headers
-        Set<Map.Entry<String, String>> entries = headers.entrySet();
+        Set<Map.Entry<String, TreeSet<String>>> entries = headers.entrySet();
 
-        for (Map.Entry<String, String> entry : entries) {
-            if (entry.getKey() != null) {
-                response.addHeader(entry.getKey(), entry.getValue());
+        for (Map.Entry<String, TreeSet<String>> entry : entries) {
+            if (entry.getKey() != null) {     
+            	Iterator<String> i = entry.getValue().iterator();
+                while(i.hasNext()) {
+                	response.addHeader(entry.getKey(), i.next());
+                }   
             }
         }
+        
 
         SourceContext.updateState(conn, ProtocolState.RESPONSE_HEAD);
 
@@ -163,10 +174,18 @@ public class SourceResponse {
     }
 
     public void addHeader(String name, String value) {
-        headers.put(name, value);
+    	if(headers.get(name) == null) {
+    		TreeSet<String> values = new TreeSet<String>(); 
+    		values.add(value);
+    		headers.put(name, values);
+    	} else {
+    		TreeSet<String> values = headers.get(name);
+    		values.add(value);
+    	}
     }
 
     public void setStatus(int status) {
         this.status = status;
-    }        
+    } 
+
 }

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java Sun May 29 18:27:45 2016
@@ -45,8 +45,10 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.net.URL;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.TreeSet;
 
 import javax.xml.stream.XMLStreamException;
 
@@ -61,8 +63,8 @@ public class TargetRequest {
     private Pipe pipe = null;
 
     /** Headers map */
-    private Map<String, String> headers = new HashMap<String, String>();
-
+    private Map<String, TreeSet<String>> headers = new HashMap<String, TreeSet<String>>();
+    
     /** URL */
     private URL url;
 
@@ -125,11 +127,17 @@ public class TargetRequest {
                     (url.getQuery() != null ? "?" + url.getQuery() : "");
 
         long contentLength = -1;
-        String contentLengthHeader = headers.get(HTTP.CONTENT_LEN);
+        String contentLengthHeader = null;
+        
+        if(headers.get(HTTP.CONTENT_LEN) != null && headers.get(HTTP.CONTENT_LEN).size() > 0) {
+	        contentLengthHeader = headers.get(HTTP.CONTENT_LEN).first();
+	    }
+         
         if (contentLengthHeader != null) {
             contentLength = Integer.parseInt(contentLengthHeader);
             headers.remove(HTTP.CONTENT_LEN);
         }
+  
         
         MessageContext requestMsgCtx = TargetContext.get(conn).getRequestMsgCtx();
         Long lengthValue = (Long) requestMsgCtx.getProperty(
@@ -152,7 +160,7 @@ public class TargetRequest {
                     !requestMsgCtx.isPropertyTrue(PassThroughConstants.MESSAGE_BUILDER_INVOKED)) {
                     // If the message is multipart/related but it hasn't been built
                     // we can copy the content-type header of the request
-                    headers.put(HTTP.CONTENT_TYPE, trpContentType);
+                	addHeader(HTTP.CONTENT_TYPE, trpContentType);
                 }
             }
         }
@@ -184,10 +192,16 @@ public class TargetRequest {
                     version != null ? version : HttpVersion.HTTP_1_1);
         }
 
-        Set<Map.Entry<String, String>> entries = headers.entrySet();
-        for (Map.Entry<String, String> entry : entries) {
-            request.setHeader(entry.getKey(), entry.getValue());
-        }
+        
+        Set<Map.Entry<String, TreeSet<String>>> entries = headers.entrySet();
+        for (Map.Entry<String, TreeSet<String>> entry : entries) {
+             if (entry.getKey() != null) {
+                Iterator<String> i = entry.getValue().iterator();
+                 while(i.hasNext()) {
+                        request.addHeader(entry.getKey(), i.next());
+                 }
+             }
+         }
         
         //setup wsa action..
         if (request != null){
@@ -235,6 +249,29 @@ public class TargetRequest {
         }
     }
 
+    
+    public void addHeader(String name, String value) {
+		if (headers.get(name) == null) {
+			TreeSet<String> values = new TreeSet<String>();
+			values.add(value);
+			if (HTTP.CONTENT_TYPE.equalsIgnoreCase(name)) {
+				headers.put(HTTP.CONTENT_TYPE, values);
+			} else {
+				headers.put(name, values);
+			}
+		} else {
+			if (HTTP.CONTENT_TYPE.equalsIgnoreCase(name)) {
+				headers.remove(HTTP.CONTENT_TYPE);
+				TreeSet<String> values = new TreeSet<String>();
+				values.add(value);
+				headers.put(HTTP.CONTENT_TYPE, values);
+			} else {
+				TreeSet<String> values = headers.get(name);
+				values.add(value);
+			}
+		}
+	}
+    
 	/**
 	 * Handles the chunking messages in PassThough context, create a temporary buffer and
      * calculate the message size before writing to the external buffer, which is required the
@@ -312,9 +349,6 @@ public class TargetRequest {
         return hasEntityBody;
     }
 
-	public void addHeader(String name, String value) {
-        headers.put(name, value);
-    }
 
     public String getMethod() {
         return method;

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java Sun May 29 18:27:45 2016
@@ -29,6 +29,7 @@ import org.apache.synapse.transport.pass
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
+import org.apache.commons.collections.map.MultiValueMap;
 
 /**
  * This class represents a response coming from the target server.
@@ -40,6 +41,9 @@ public class TargetResponse {
 
     /** Headers of the response */
     private Map<String, String> headers = new HashMap<String, String>();
+    
+    /** Excess headers of the response */ 
+    private Map excessHeaders = new MultiValueMap();
 
     /** The status of the response */
     private int status = HttpStatus.SC_OK;
@@ -77,9 +81,13 @@ public class TargetResponse {
         Header[] headers = response.getAllHeaders();
         if (headers != null) {
             for (Header header : headers) {
-                this.headers.put(header.getName(), header.getValue());
-            }
-        }
+            	if(this.headers.containsKey(header.getName())) {
+            		addExcessHeader(header);
+            	} else {
+            		this.headers.put(header.getName(), header.getValue());
+            	}
+             }        
+        }   
 
         this.expectResponseBody = expectResponseBody;
     }    
@@ -140,6 +148,14 @@ public class TargetResponse {
         return headers;
     }
 
+    public Map getExcessHeaders() {
+    	return this.excessHeaders;
+    }
+    
+    public void addExcessHeader(Header h) {
+    	this.excessHeaders.put(h.getName(), h.getValue());
+    }
+
     public Pipe getPipe() {
         return pipe;
     }

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=1746042&r1=1746041&r2=1746042&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 Sun May 29 18:27:45 2016
@@ -33,6 +33,7 @@ import org.apache.http.protocol.HTTP;
 import org.apache.http.HttpStatus;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.synapse.transport.nhttp.NhttpConstants;
 import org.apache.synapse.transport.passthru.PassThroughConstants;
 import org.apache.synapse.transport.passthru.ProtocolState;
 import org.apache.synapse.transport.passthru.SourceContext;
@@ -117,6 +118,8 @@ public class PassThroughTransportUtils {
                                              boolean preserveServerHeader,
                                              boolean preserveUserAgentHeader) {
         Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
+        Map excessHeaders = (Map) msgContext.getProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS);
+
 
         if (headers == null || headers.isEmpty()) {
             return;
@@ -141,6 +144,7 @@ public class PassThroughTransportUtils {
                 iter.remove();
             }
         }
+
     }
 
     /**

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java Sun May 29 18:27:45 2016
@@ -26,12 +26,15 @@ import org.apache.http.protocol.HTTP;
 import org.apache.synapse.transport.nhttp.NhttpConstants;
 import org.apache.synapse.transport.nhttp.util.MessageFormatterDecoratorFactory;
 import org.apache.synapse.transport.nhttp.util.NhttpUtil;
+import org.apache.synapse.transport.passthru.Pipe;
 import org.apache.synapse.transport.passthru.SourceRequest;
 import org.apache.synapse.transport.passthru.SourceResponse;
 import org.apache.synapse.transport.passthru.config.SourceConfiguration;
 import org.apache.synapse.transport.passthru.PassThroughConstants;
 
+import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
 public class SourceResponseFactory {
@@ -54,7 +57,6 @@ public class SourceResponseFactory {
             sourceResponse.addHeader(HTTP.CONTENT_LEN,
                     (String) msgContext.getProperty(PassThroughConstants.ORIGINAL_CONTENT_LENGTH));
         }
-
         if (transportHeaders != null) {
             addResponseHeader(sourceResponse, transportHeaders);
         } else {
@@ -70,8 +72,21 @@ public class SourceResponseFactory {
              }
         	 
         }
-        return sourceResponse;
-    }
+
+		// Add excess response header.
+		String excessProp = NhttpConstants.EXCESS_TRANSPORT_HEADERS;
+		Map excessHeaders = (Map) msgContext.getProperty(excessProp);
+		if (excessHeaders != null) {
+			for (Iterator iterator = excessHeaders.keySet().iterator(); iterator.hasNext();) {
+				String key = (String) iterator.next();
+				for (String excessVal : (Collection<String>) excessHeaders.get(key)) {
+					sourceResponse.addHeader(key, (String) excessVal);
+				}
+			}
+		}
+		
+		return sourceResponse;
+	}
 
 	private static void addResponseHeader(SourceResponse sourceResponse, Map transportHeaders) {
 	    for (Object entryObj : transportHeaders.entrySet()) {

Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java?rev=1746042&r1=1746041&r2=1746042&view=diff
==============================================================================
--- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java (original)
+++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java Sun May 29 18:27:45 2016
@@ -39,6 +39,8 @@ import org.apache.synapse.transport.pass
 
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.Map;
 
 public class TargetRequestFactory {
@@ -126,6 +128,18 @@ public class TargetRequestFactory {
             if ("true".equals(fullUrl)) {
                 request.setFullUrl(true);                
             }
+            
+            // Add excess respsonse header.
+            String excessProp = NhttpConstants.EXCESS_TRANSPORT_HEADERS;
+            Map excessHeaders = (Map) msgContext.getProperty(excessProp);
+            if (excessHeaders != null) {
+                    for (Iterator iterator = excessHeaders.keySet().iterator(); iterator.hasNext();) {
+                            String key = (String) iterator.next();
+                            for (String excessVal : (Collection<String>) excessHeaders.get(key)) {
+                                    request.addHeader(key, (String) excessVal);
+                            }
+                    }
+            }
 
             return request;
         } catch (MalformedURLException e) {



Re: svn commit: r1746042 - in /synapse/trunk/java/modules/transports/core/nhttp: ./ src/main/java/org/apache/synapse/transport/nhttp/ src/main/java/org/apache/synapse/transport/passthru/ src/main/java/org/apache/synapse/transport/passthru/util/

Posted by Andreas Veithen <an...@gmail.com>.
Please note that we use spaces, not tabs for indentation.

Andreas

On Sun, May 29, 2016 at 7:27 PM,  <du...@apache.org> wrote:
> Author: dushan
> Date: Sun May 29 18:27:45 2016
> New Revision: 1746042
>
> URL: http://svn.apache.org/viewvc?rev=1746042&view=rev
> Log:
> merging https://issues.apache.org/jira/browse/SYNAPSE-1025, integration tests were verified
>
> Modified:
>     synapse/trunk/java/modules/transports/core/nhttp/pom.xml
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.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/passthru/util/SourceResponseFactory.java
>     synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/pom.xml
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/pom.xml?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/pom.xml (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/pom.xml Sun May 29 18:27:45 2016
> @@ -158,6 +158,11 @@
>              <groupId>commons-lang</groupId>
>              <artifactId>commons-lang</artifactId>
>          </dependency>
> +
> +       <dependency>
> +        <groupId>commons-collections</groupId>
> +        <artifactId>commons-collections</artifactId>
> +      </dependency>
>
>          <!-- BouncyCastle API which is required when validating Certificates. -->
>          <dependency>
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/NhttpConstants.java Sun May 29 18:27:45 2016
> @@ -166,4 +166,10 @@ public class NhttpConstants {
>
>      //property name of nhttp log directory
>      public static final String NHTTP_LOG_DIRECTORY = "nhttp.log.directory";
> +
> +    /**
> +     * This holds a MultiValue Map, which keeps transport headers' values other than last value
> +     * (in order they appear) against the transport header.
> +     */
> +    public static final String EXCESS_TRANSPORT_HEADERS = "EXCESS_TRANSPORT_HEADERS";
>  }
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ClientWorker.java Sun May 29 18:27:45 2016
> @@ -69,6 +69,7 @@ public class ClientWorker implements Run
>          this.expectEntityBody = response.isExpectResponseBody();
>
>          Map<String,String> headers = response.getHeaders();
> +        Map excessHeaders = response.getExcessHeaders();
>
>                 String oriURL = headers.get(PassThroughConstants.LOCATION);
>
> @@ -141,6 +142,7 @@ public class ClientWorker implements Run
>              headerMap.put(headerEntry.getKey(), headerEntry.getValue());
>          }
>          responseMsgCtx.setProperty(MessageContext.TRANSPORT_HEADERS, headerMap);
> +        responseMsgCtx.setProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS, excessHeaders);
>          if (headerMap.get(HTTP.CONTENT_LEN) != null){
>              responseMsgCtx.setProperty(PassThroughConstants.ORIGINAL_CONTENT_LENGTH,
>                      headerMap.get(HTTP.CONTENT_LEN));
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/PassThroughConstants.java Sun May 29 18:27:45 2016
> @@ -135,4 +135,7 @@ public class PassThroughConstants {
>      public static final String COPY_CONTENT_LENGTH_FROM_INCOMING="COPY_CONTENT_LENGTH_FROM_INCOMING";
>
>      public static final String ORIGINAL_CONTENT_LENGTH ="ORIGINAL_CONTENT_LENGTH";
> +
> +    //Http method type constants to be used in synapse
> +    public static final String HTTP_HEAD = "HEAD";
>  }
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/ServerWorker.java Sun May 29 18:27:45 2016
> @@ -430,6 +430,7 @@ public class ServerWorker implements Run
>       * @return the Axis2 message context created
>       */
>      private MessageContext createMessageContext(SourceRequest request) {
> +       Map excessHeaders = request.getExcessHeaders();
>          ConfigurationContext cfgCtx = sourceConfiguration.getConfigurationContext();
>          MessageContext msgContext =
>                  new MessageContext();
> @@ -477,6 +478,8 @@ public class ServerWorker implements Run
>              headers.put(entry.getKey(), entry.getValue());
>          }
>          msgContext.setProperty(MessageContext.TRANSPORT_HEADERS, headers);
> +        msgContext.setProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS, excessHeaders);
> +
>          if (headers.get(HTTP.CONTENT_LEN) != null){
>              msgContext.setProperty(PassThroughConstants.ORIGINAL_CONTENT_LENGTH,
>                      headers.get(HTTP.CONTENT_LEN));
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceRequest.java Sun May 29 18:27:45 2016
> @@ -20,6 +20,7 @@
>
>  package org.apache.synapse.transport.passthru;
>
> +import org.apache.commons.collections.map.MultiValueMap;
>  import org.apache.http.*;
>  import org.apache.http.message.BasicHttpResponse;
>  import org.apache.http.nio.ContentDecoder;
> @@ -65,6 +66,10 @@ public class SourceRequest {
>
>      /** The connection from the client */
>      private NHttpServerConnection connection = null;
> +
> +    /** Excess headers of the request */
> +    private Map excessHeaders = new MultiValueMap();
> +
>
>      public SourceRequest(SourceConfiguration sourceConfiguration,
>                           HttpRequest request,
> @@ -87,9 +92,13 @@ public class SourceRequest {
>          Header[] headers = request.getAllHeaders();
>          if (headers != null) {
>              for (Header header : headers) {
> -                this.headers.put(header.getName(), header.getValue());
> -            }
> -        }
> +                if(this.headers.containsKey(header.getName())) {
> +                        addExcessHeader(header);
> +                   } else {
> +                        this.headers.put(header.getName(), header.getValue());
> +                   }
> +               }
> +           }
>      }
>
>      /**
> @@ -181,4 +190,12 @@ public class SourceRequest {
>      public boolean isEntityEnclosing() {
>          return entityEnclosing;
>      }
> +
> +    public Map getExcessHeaders() {
> +        return this.excessHeaders;
> +   }
> +
> +    public void addExcessHeader(Header h) {
> +        this.excessHeaders.put(h.getName(), h.getValue());
> +   }
>  }
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/SourceResponse.java Sun May 29 18:27:45 2016
> @@ -31,15 +31,17 @@ import org.apache.synapse.transport.pass
>
>  import java.io.IOException;
>  import java.util.HashMap;
> +import java.util.Iterator;
>  import java.util.Map;
>  import java.util.Set;
> +import java.util.TreeSet;
>
>  public class SourceResponse {
>
>      private Pipe pipe = null;
>
>      /** Transport headers */
> -    private Map<String, String> headers = new HashMap<String, String>();
> +    private Map<String, TreeSet<String>> headers = new HashMap<String, TreeSet<String>>();
>
>      /** Status of the response */
>      private int status = HttpStatus.SC_OK;
> @@ -58,6 +60,7 @@ public class SourceResponse {
>
>      private SourceRequest request = null;
>
> +
>      public SourceResponse(SourceConfiguration config, int status, SourceRequest request) {
>          this(config, status, null, request);
>      }
> @@ -99,7 +102,11 @@ public class SourceResponse {
>          BasicHttpEntity entity = new BasicHttpEntity();
>
>          int contentLength = -1;
> -        String contentLengthHeader = headers.get(HTTP.CONTENT_LEN);
> +       String contentLengthHeader = null;
> +        if(headers.get(HTTP.CONTENT_LEN) != null && headers.get(HTTP.CONTENT_LEN).size() > 0) {
> +               contentLengthHeader = headers.get(HTTP.CONTENT_LEN).first();
> +        }
> +
>          if (contentLengthHeader != null) {
>              contentLength = Integer.parseInt(contentLengthHeader);
>
> @@ -116,13 +123,17 @@ public class SourceResponse {
>          response.setEntity(entity);
>
>          // set any transport headers
> -        Set<Map.Entry<String, String>> entries = headers.entrySet();
> +        Set<Map.Entry<String, TreeSet<String>>> entries = headers.entrySet();
>
> -        for (Map.Entry<String, String> entry : entries) {
> -            if (entry.getKey() != null) {
> -                response.addHeader(entry.getKey(), entry.getValue());
> +        for (Map.Entry<String, TreeSet<String>> entry : entries) {
> +            if (entry.getKey() != null) {
> +               Iterator<String> i = entry.getValue().iterator();
> +                while(i.hasNext()) {
> +                       response.addHeader(entry.getKey(), i.next());
> +                }
>              }
>          }
> +
>
>          SourceContext.updateState(conn, ProtocolState.RESPONSE_HEAD);
>
> @@ -163,10 +174,18 @@ public class SourceResponse {
>      }
>
>      public void addHeader(String name, String value) {
> -        headers.put(name, value);
> +       if(headers.get(name) == null) {
> +               TreeSet<String> values = new TreeSet<String>();
> +               values.add(value);
> +               headers.put(name, values);
> +       } else {
> +               TreeSet<String> values = headers.get(name);
> +               values.add(value);
> +       }
>      }
>
>      public void setStatus(int status) {
>          this.status = status;
> -    }
> +    }
> +
>  }
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetRequest.java Sun May 29 18:27:45 2016
> @@ -45,8 +45,10 @@ import java.io.IOException;
>  import java.io.OutputStream;
>  import java.net.URL;
>  import java.util.HashMap;
> +import java.util.Iterator;
>  import java.util.Map;
>  import java.util.Set;
> +import java.util.TreeSet;
>
>  import javax.xml.stream.XMLStreamException;
>
> @@ -61,8 +63,8 @@ public class TargetRequest {
>      private Pipe pipe = null;
>
>      /** Headers map */
> -    private Map<String, String> headers = new HashMap<String, String>();
> -
> +    private Map<String, TreeSet<String>> headers = new HashMap<String, TreeSet<String>>();
> +
>      /** URL */
>      private URL url;
>
> @@ -125,11 +127,17 @@ public class TargetRequest {
>                      (url.getQuery() != null ? "?" + url.getQuery() : "");
>
>          long contentLength = -1;
> -        String contentLengthHeader = headers.get(HTTP.CONTENT_LEN);
> +        String contentLengthHeader = null;
> +
> +        if(headers.get(HTTP.CONTENT_LEN) != null && headers.get(HTTP.CONTENT_LEN).size() > 0) {
> +               contentLengthHeader = headers.get(HTTP.CONTENT_LEN).first();
> +           }
> +
>          if (contentLengthHeader != null) {
>              contentLength = Integer.parseInt(contentLengthHeader);
>              headers.remove(HTTP.CONTENT_LEN);
>          }
> +
>
>          MessageContext requestMsgCtx = TargetContext.get(conn).getRequestMsgCtx();
>          Long lengthValue = (Long) requestMsgCtx.getProperty(
> @@ -152,7 +160,7 @@ public class TargetRequest {
>                      !requestMsgCtx.isPropertyTrue(PassThroughConstants.MESSAGE_BUILDER_INVOKED)) {
>                      // If the message is multipart/related but it hasn't been built
>                      // we can copy the content-type header of the request
> -                    headers.put(HTTP.CONTENT_TYPE, trpContentType);
> +                       addHeader(HTTP.CONTENT_TYPE, trpContentType);
>                  }
>              }
>          }
> @@ -184,10 +192,16 @@ public class TargetRequest {
>                      version != null ? version : HttpVersion.HTTP_1_1);
>          }
>
> -        Set<Map.Entry<String, String>> entries = headers.entrySet();
> -        for (Map.Entry<String, String> entry : entries) {
> -            request.setHeader(entry.getKey(), entry.getValue());
> -        }
> +
> +        Set<Map.Entry<String, TreeSet<String>>> entries = headers.entrySet();
> +        for (Map.Entry<String, TreeSet<String>> entry : entries) {
> +             if (entry.getKey() != null) {
> +                Iterator<String> i = entry.getValue().iterator();
> +                 while(i.hasNext()) {
> +                        request.addHeader(entry.getKey(), i.next());
> +                 }
> +             }
> +         }
>
>          //setup wsa action..
>          if (request != null){
> @@ -235,6 +249,29 @@ public class TargetRequest {
>          }
>      }
>
> +
> +    public void addHeader(String name, String value) {
> +               if (headers.get(name) == null) {
> +                       TreeSet<String> values = new TreeSet<String>();
> +                       values.add(value);
> +                       if (HTTP.CONTENT_TYPE.equalsIgnoreCase(name)) {
> +                               headers.put(HTTP.CONTENT_TYPE, values);
> +                       } else {
> +                               headers.put(name, values);
> +                       }
> +               } else {
> +                       if (HTTP.CONTENT_TYPE.equalsIgnoreCase(name)) {
> +                               headers.remove(HTTP.CONTENT_TYPE);
> +                               TreeSet<String> values = new TreeSet<String>();
> +                               values.add(value);
> +                               headers.put(HTTP.CONTENT_TYPE, values);
> +                       } else {
> +                               TreeSet<String> values = headers.get(name);
> +                               values.add(value);
> +                       }
> +               }
> +       }
> +
>         /**
>          * Handles the chunking messages in PassThough context, create a temporary buffer and
>       * calculate the message size before writing to the external buffer, which is required the
> @@ -312,9 +349,6 @@ public class TargetRequest {
>          return hasEntityBody;
>      }
>
> -       public void addHeader(String name, String value) {
> -        headers.put(name, value);
> -    }
>
>      public String getMethod() {
>          return method;
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetResponse.java Sun May 29 18:27:45 2016
> @@ -29,6 +29,7 @@ import org.apache.synapse.transport.pass
>  import java.io.IOException;
>  import java.util.HashMap;
>  import java.util.Map;
> +import org.apache.commons.collections.map.MultiValueMap;
>
>  /**
>   * This class represents a response coming from the target server.
> @@ -40,6 +41,9 @@ public class TargetResponse {
>
>      /** Headers of the response */
>      private Map<String, String> headers = new HashMap<String, String>();
> +
> +    /** Excess headers of the response */
> +    private Map excessHeaders = new MultiValueMap();
>
>      /** The status of the response */
>      private int status = HttpStatus.SC_OK;
> @@ -77,9 +81,13 @@ public class TargetResponse {
>          Header[] headers = response.getAllHeaders();
>          if (headers != null) {
>              for (Header header : headers) {
> -                this.headers.put(header.getName(), header.getValue());
> -            }
> -        }
> +               if(this.headers.containsKey(header.getName())) {
> +                       addExcessHeader(header);
> +               } else {
> +                       this.headers.put(header.getName(), header.getValue());
> +               }
> +             }
> +        }
>
>          this.expectResponseBody = expectResponseBody;
>      }
> @@ -140,6 +148,14 @@ public class TargetResponse {
>          return headers;
>      }
>
> +    public Map getExcessHeaders() {
> +       return this.excessHeaders;
> +    }
> +
> +    public void addExcessHeader(Header h) {
> +       this.excessHeaders.put(h.getName(), h.getValue());
> +    }
> +
>      public Pipe getPipe() {
>          return pipe;
>      }
>
> 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=1746042&r1=1746041&r2=1746042&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 Sun May 29 18:27:45 2016
> @@ -33,6 +33,7 @@ import org.apache.http.protocol.HTTP;
>  import org.apache.http.HttpStatus;
>  import org.apache.commons.logging.Log;
>  import org.apache.commons.logging.LogFactory;
> +import org.apache.synapse.transport.nhttp.NhttpConstants;
>  import org.apache.synapse.transport.passthru.PassThroughConstants;
>  import org.apache.synapse.transport.passthru.ProtocolState;
>  import org.apache.synapse.transport.passthru.SourceContext;
> @@ -117,6 +118,8 @@ public class PassThroughTransportUtils {
>                                               boolean preserveServerHeader,
>                                               boolean preserveUserAgentHeader) {
>          Map headers = (Map) msgContext.getProperty(MessageContext.TRANSPORT_HEADERS);
> +        Map excessHeaders = (Map) msgContext.getProperty(NhttpConstants.EXCESS_TRANSPORT_HEADERS);
> +
>
>          if (headers == null || headers.isEmpty()) {
>              return;
> @@ -141,6 +144,7 @@ public class PassThroughTransportUtils {
>                  iter.remove();
>              }
>          }
> +
>      }
>
>      /**
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/SourceResponseFactory.java Sun May 29 18:27:45 2016
> @@ -26,12 +26,15 @@ import org.apache.http.protocol.HTTP;
>  import org.apache.synapse.transport.nhttp.NhttpConstants;
>  import org.apache.synapse.transport.nhttp.util.MessageFormatterDecoratorFactory;
>  import org.apache.synapse.transport.nhttp.util.NhttpUtil;
> +import org.apache.synapse.transport.passthru.Pipe;
>  import org.apache.synapse.transport.passthru.SourceRequest;
>  import org.apache.synapse.transport.passthru.SourceResponse;
>  import org.apache.synapse.transport.passthru.config.SourceConfiguration;
>  import org.apache.synapse.transport.passthru.PassThroughConstants;
>
> +import java.util.Collection;
>  import java.util.HashMap;
> +import java.util.Iterator;
>  import java.util.Map;
>
>  public class SourceResponseFactory {
> @@ -54,7 +57,6 @@ public class SourceResponseFactory {
>              sourceResponse.addHeader(HTTP.CONTENT_LEN,
>                      (String) msgContext.getProperty(PassThroughConstants.ORIGINAL_CONTENT_LENGTH));
>          }
> -
>          if (transportHeaders != null) {
>              addResponseHeader(sourceResponse, transportHeaders);
>          } else {
> @@ -70,8 +72,21 @@ public class SourceResponseFactory {
>               }
>
>          }
> -        return sourceResponse;
> -    }
> +
> +               // Add excess response header.
> +               String excessProp = NhttpConstants.EXCESS_TRANSPORT_HEADERS;
> +               Map excessHeaders = (Map) msgContext.getProperty(excessProp);
> +               if (excessHeaders != null) {
> +                       for (Iterator iterator = excessHeaders.keySet().iterator(); iterator.hasNext();) {
> +                               String key = (String) iterator.next();
> +                               for (String excessVal : (Collection<String>) excessHeaders.get(key)) {
> +                                       sourceResponse.addHeader(key, (String) excessVal);
> +                               }
> +                       }
> +               }
> +
> +               return sourceResponse;
> +       }
>
>         private static void addResponseHeader(SourceResponse sourceResponse, Map transportHeaders) {
>             for (Object entryObj : transportHeaders.entrySet()) {
>
> Modified: synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java
> URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java?rev=1746042&r1=1746041&r2=1746042&view=diff
> ==============================================================================
> --- synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java (original)
> +++ synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/util/TargetRequestFactory.java Sun May 29 18:27:45 2016
> @@ -39,6 +39,8 @@ import org.apache.synapse.transport.pass
>
>  import java.net.MalformedURLException;
>  import java.net.URL;
> +import java.util.Collection;
> +import java.util.Iterator;
>  import java.util.Map;
>
>  public class TargetRequestFactory {
> @@ -126,6 +128,18 @@ public class TargetRequestFactory {
>              if ("true".equals(fullUrl)) {
>                  request.setFullUrl(true);
>              }
> +
> +            // Add excess respsonse header.
> +            String excessProp = NhttpConstants.EXCESS_TRANSPORT_HEADERS;
> +            Map excessHeaders = (Map) msgContext.getProperty(excessProp);
> +            if (excessHeaders != null) {
> +                    for (Iterator iterator = excessHeaders.keySet().iterator(); iterator.hasNext();) {
> +                            String key = (String) iterator.next();
> +                            for (String excessVal : (Collection<String>) excessHeaders.get(key)) {
> +                                    request.addHeader(key, (String) excessVal);
> +                            }
> +                    }
> +            }
>
>              return request;
>          } catch (MalformedURLException e) {
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@synapse.apache.org
For additional commands, e-mail: dev-help@synapse.apache.org