Author: supun
Date: Thu Jun 2 14:19:25 2011
New Revision: 1130567
URL: http://svn.apache.org/viewvc?rev=1130567&view=rev
Log:
fixing an issue with not setting the transport headers for 202 responses
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java?rev=1130567&r1=1130566&r2=1130567&view=diff
==============================================================================
---
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
(original)
+++
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/nhttp/ClientHandler.java
Thu Jun 2 14:19:25 2011
@@ -61,8 +61,12 @@ import org.apache.synapse.transport.nhtt
import org.apache.synapse.commons.jmx.ThreadingView;
import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Comparator;
import java.util.Map;
import java.util.HashMap;
+import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@@ -723,11 +727,13 @@ public class ClientHandler implements NH
// Since we need to notify the SynapseCallback
receiver to remove the
// call backs registered we set a custom property
if (outMsgCtx.getOperationContext().isComplete()) {
+ setHeaders(context, response, outMsgCtx,
responseMsgCtx);
outMsgCtx.setProperty(NhttpConstants.HTTP_202_RECEIVED, "true");
mr.receive(outMsgCtx);
}
return;
}
+ setHeaders(context, response, outMsgCtx,
responseMsgCtx);
responseMsgCtx.setServerSide(true);
responseMsgCtx.setDoingREST(outMsgCtx.isDoingREST());
responseMsgCtx.setProperty(MessageContext.TRANSPORT_IN,
@@ -814,6 +820,53 @@ public class ClientHandler implements NH
}
}
+ private void setHeaders(HttpContext context, HttpResponse response,
+ MessageContext outMsgCtx, MessageContext
responseMsgCtx) {
+ Header[] headers = response.getAllHeaders();
+ if (headers != null && headers.length > 0) {
+
+ Map<String, String> headerMap
+ = new TreeMap<String, String>(new Comparator<String>() {
+ public int compare(String o1, String o2) {
+ return o1.compareToIgnoreCase(o2);
+ }
+ });
+ String endpointURLPrefix = (String)
context.getAttribute(NhttpConstants.ENDPOINT_PREFIX);
+
+ String servicePrefix = (String)
outMsgCtx.getProperty(NhttpConstants.SERVICE_PREFIX);
+ for (int i = 0; i < headers.length; i++) {
+ Header header = headers[i];
+ if ("Location".equals(header.getName())
+ && endpointURLPrefix != null && servicePrefix != null)
{
+ //Here, we are changing only the host name and the port of
the new URI - value of the Location
+ //header.
+ //If the new URI is again referring to a resource in the
server to which the original request
+ //is sent, then replace the hostname and port of the URI
with the hostname and port of synapse
+ //We are not changing the request url here, only the host
name and the port.
+ try {
+ URI serviceURI = new URI(servicePrefix);
+ URI endpointURI = new URI(endpointURLPrefix);
+ URI locationURI = new URI(header.getValue());
+
+ if
(locationURI.getHost().equalsIgnoreCase(endpointURI.getHost())) {
+ URI newURI = new URI(locationURI.getScheme(),
locationURI.getUserInfo(),
+ serviceURI.getHost(),
serviceURI.getPort(), locationURI.getPath(),
+ locationURI.getQuery(),
locationURI.getFragment());
+ headerMap.put(header.getName(), newURI.toString());
+
responseMsgCtx.setProperty(NhttpConstants.SERVICE_PREFIX,
+
outMsgCtx.getProperty(NhttpConstants.SERVICE_PREFIX));
+ }
+ } catch (URISyntaxException e) {
+ log.error(e.getMessage(), e);
+ }
+ } else {
+ headerMap.put(header.getName(), header.getValue());
+ }
+ }
+ responseMsgCtx.setProperty(MessageContext.TRANSPORT_HEADERS,
headerMap);
+ }
+ }
+
/**
* Checks whether the provided 500 response shall be logged as a warning.
* The behavior can be configured based on the content type of the message
via a transport