tags:

views:

397

answers:

1

I created a custom router with one endpoint. The custom router looks up the destination of the endpoint based on the URL parameters of the inbound URL. I have an example of this up and running, and I am testing it out in a browser. I am trying to solve one last thing with this. When I make the call in the browser using http://localhost:8787/my-site, the call makes a redirect and the URL in the browser changes to http://server2.xyz.com:8080/my-site. I don't want the user to ever see http://server2.xyz.com:8080/my-site. I want the user to always see http://localhost:8787/my-site. How can I achieve this? I am using Mule 2.2.1 community edition with Java 1.6.

Here is my Mule configuration file:

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesource.org/schema/mule/core/2.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:spring="http://www.springframework.org/schema/beans"
    xmlns:http="http://www.mulesource.org/schema/mule/http/2.2"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.mulesource.org/schema/mule/core/2.2 http://www.mulesource.org/schema/mule/core/2.2/mule.xsd
        http://www.mulesource.org/schema/mule/http/2.2 http://www.mulesource.org/schema/mule/http/2.2/mule-http.xsd"&gt;

    <model name="ProxyService">
        <service name="HttpProxyService">
            <inbound>
                <http:inbound-endpoint address="http://localhost:8787" synchronous="true"/>
            </inbound>
            <outbound>
                <custom-outbound-router class="com.abc.xyz.routing.LookupOutboundRouter">
                    <outbound-endpoint name="custom" address="http://nonexistant.server.com:8080" synchronous="true"/>
                </custom-outbound-router>
            </outbound>
        </service>
    </model>
</mule>

Here is my custom router:

public class LookupOutboundRouter extends AbstractOutboundRouter {
 Logger logger = Logger.getLogger(LookupOutboundRouter.class);

 @Override
 public boolean isMatch(MuleMessage message) throws MessagingException {
  return true;
 }

 @Override
 public MuleMessage route(MuleMessage message, MuleSession session) throws MessagingException {
  String[] urlValues = StringUtils.split(message.getProperty("http.request").toString(), "/");

  String newUri = lookupServiceUri(urlValues[0]) + urlValues[1];
  logger.info("newUri=" + newUri);

  DynamicURIOutboundEndpoint ep;

  try {
   ep = new DynamicURIOutboundEndpoint((OutboundEndpoint) getEndpoints().get(0), new MuleEndpointURI(newUri));

   MuleMessage message2 = send(session, message, ep);

   return message2;
  } catch (EndpointException e1) {
   e1.printStackTrace();
  } catch (MuleException e) {
   e.printStackTrace();
  }

  return null;
 }

 /**
  * This will call the service registry.
  * @param id
  * @return
  */
 private String lookupServiceUri(String id) {
  if(id.equalsIgnoreCase("12345")) {
   return "http://server.xyz.com:8080/";
  } else {
   return "http://server2.xyz.com:8080/";
  }
 }
}
A: 

I was able to achieve this in the browser by setting followRedirects to true on the HTTP connector. The only issue with this now is that it does not work for POST redirects. I'm making a SOAP call from SoapUI now instead of using the browser.

Entity enclosing requests cannot be redirected without user intervention

Message               : Failed to route event via endpoint: org.mule.endpoint.DynamicURIOutboundEndpoint@fd285ee0. Message payload is of type: PostMethod
Type                  : org.mule.api.transport.DispatchException
Code                  : MULE_ERROR-42999
Payload               : org.apache.commons.httpclient.methods.PostMethod@9fa8f
JavaDoc               : http://www.mulesource.org/docs/site/current2/apidocs/org/mule/api/transport/DispatchException.html
hoffmandirt