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) {


Reply via email to