blob: 8167d5502113e830bddf217c8600274b3709632e [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.gateway.filter.rewrite.api;
import com.jayway.jsonassert.JsonAssert;
import org.apache.hadoop.gateway.filter.AbstractGatewayFilter;
import org.apache.hadoop.gateway.util.urltemplate.Parser;
import org.apache.hadoop.test.TestUtils;
import org.apache.hadoop.test.log.NoOpAppender;
import org.apache.hadoop.test.mock.MockInteraction;
import org.apache.hadoop.test.mock.MockServlet;
import org.apache.log4j.Appender;
import org.apache.log4j.Logger;
import org.eclipse.jetty.http.HttpHeader;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.http.HttpTester;
import org.eclipse.jetty.servlet.ServletTester;
import org.eclipse.jetty.util.ArrayQueue;
import org.junit.After;
import org.junit.Ignore;
import org.junit.Test;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.EnumSet;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.core.Is.is;
import static org.junit.Assert.fail;
import static org.xmlmatchers.XmlMatchers.hasXPath;
import static org.xmlmatchers.transform.XmlConverters.the;
public class UrlRewriteServletFilterTest {
Logger LOG = Logger.getLogger(UrlRewriteServletFilterTest.class);
private ServletTester server;
private HttpTester.Request request;
private HttpTester.Response response;
private ArrayQueue<MockInteraction> interactions;
private MockInteraction interaction;
private static URL getTestResource( String name ) {
name = UrlRewriteServletFilterTest.class.getName().replaceAll( "\\.", "/" ) + "/" + name;
URL url = ClassLoader.getSystemResource( name );
return url;
}
public void setUp( Map<String,String> initParams ) throws Exception {
String descriptorUrl = getTestResource( "rewrite.xml" ).toExternalForm();
server = new ServletTester();
server.setContextPath( "/" );
server.getContext().addEventListener( new UrlRewriteServletContextListener() );
server.getContext().setInitParameter(
UrlRewriteServletContextListener.DESCRIPTOR_LOCATION_INIT_PARAM_NAME, descriptorUrl );
FilterHolder setupFilter = server.addFilter( SetupFilter.class, "/*", EnumSet.of( DispatcherType.REQUEST ) );
setupFilter.setFilter( new SetupFilter() );
FilterHolder rewriteFilter = server.addFilter( UrlRewriteServletFilter.class, "/*", EnumSet.of( DispatcherType.REQUEST ) );
if( initParams != null ) {
for( Map.Entry<String,String> entry : initParams.entrySet() ) {
rewriteFilter.setInitParameter( entry.getKey(), entry.getValue() );
}
}
rewriteFilter.setFilter( new UrlRewriteServletFilter() );
interactions = new ArrayQueue<MockInteraction>();
ServletHolder servlet = server.addServlet( MockServlet.class, "/" );
servlet.setServlet( new MockServlet( "mock-servlet", interactions ) );
server.start();
interaction = new MockInteraction();
request = HttpTester.newRequest();
response = null;
}
@After
public void tearDown() throws Exception {
if( server != null ) {
server.stop();
}
}
@Test
public void testInboundRequestUrlRewrite() throws Exception {
setUp( null );
// Setup the server side request/response interaction.
interaction.expect()
.method( "GET" )
.requestUrl( "http://mock-host:1/test-output-path-1" );
interaction.respond().status( 200 ).content( "test-response-content".getBytes() );
interactions.add( interaction );
// Create the client request.
request.setMethod( "GET" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
assertThat( response.getContent(), is( "test-response-content" ) );
}
@Test
public void testInboundHeaderRewrite() throws Exception {
setUp( null );
// Setup the server side request/response interaction.
interaction.expect()
.method( "GET" )
.requestUrl( "http://mock-host:1/test-output-path-1" )
.header( "Location", "http://mock-host:1/test-output-path-1" );
interaction.respond()
.status( 200 );
interactions.add( interaction );
// Create the client request.
request.setMethod( "GET" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
request.setHeader( "Location", "http://mock-host:1/test-input-path" );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testOutboundHeaderRewrite() throws Exception {
setUp( null );
// Setup the server side request/response interaction.
interaction.expect()
.method( "GET" )
.requestUrl( "http://mock-host:1/test-output-path-1" );
interaction.respond()
.status( 201 )
.header( "Location", "http://mock-host:1/test-input-path" );
interactions.add( interaction );
// Create the client request.
request.setMethod( "GET" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 201 ) );
assertThat( response.get( HttpHeader.LOCATION ), is( "http://mock-host:1/test-output-path-1" ) );
}
// @Ignore( "Need to figure out how to handle cookies since domain and path are separate." )
// @Test
// public void testRequestCookieRewrite() throws Exception {
// setUp( null );
// // Setup the server side request/response interaction.
// interaction.expect()
// .method( "GET" )
// .requestUrl( "http://mock-host:1/test-output-path-1" )
// .header( "Cookie", "cookie-name=cookie-value; Domain=docs.foo.com; Path=/accounts; Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly" );
// interaction.respond()
// .status( 201 );
// interactions.add( interaction );
// // Create the client request.
// request.setMethod( "GET" );
// request.setURI( "/test-input-path" );
// //request.setVersion( "HTTP/1.1" );
// request.setHeader( "Host", "mock-host:1" );
// request.setHeader( "Cookie", "cookie-name=cookie-value; Domain=docs.foo.com; Path=/accounts; Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly" );
//
// // Execute the request.
// response = TestUtils.execute( server, request );
//
// // Test the results.
// assertThat( response.getStatus(), is( 201 ) );
// fail( "TODO" );
// }
// @Ignore( "Need to figure out how to handle cookies since domain and path are separate." )
// @Test
// public void testResponseCookieRewrite() throws Exception {
// setUp( null );
// // Setup the server side request/response interaction.
// interaction.expect()
// .method( "GET" )
// .requestUrl( "http://mock-host:1/test-output-path-1" );
// interaction.respond()
// .status( 200 )
// .header( "Set-Cookie", "cookie-name=cookie-value; Domain=docs.foo.com; Path=/accounts; Expires=Wed, 13-Jan-2021 22:23:01 GMT; Secure; HttpOnly" );
// interactions.add( interaction );
// // Create the client request.
// request.setMethod( "GET" );
// request.setURI( "/test-input-path" );
// //request.setVersion( "HTTP/1.1" );
// request.setHeader( "Host", "mock-host:1" );
//
// // Execute the request.
// response = TestUtils.execute( server, request );
//
// // Test the results.
// assertThat( response.getStatus(), is( 200 ) );
// assertThat( response.get( HttpHeader.SET_COOKIE ), is( "TODO" ) );
// fail( "TODO" );
// }
@Test
public void testInboundJsonBodyRewrite() throws Exception {
setUp( null );
String inputJson = "{\"url\":\"http://mock-host:1/test-input-path\"}";
String outputJson = "{\"url\":\"http://mock-host:1/test-output-path-1\"}";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:1/test-output-path-1" )
.content( outputJson, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
request.setHeader( "Content-Type", "application/json; charset=UTF-8" );
request.setContent( inputJson );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testInboundXmlBodyRewrite() throws Exception {
setUp( null );
String input = "<root attribute=\"http://mock-host:1/test-input-path\">http://mock-host:1/test-input-path</root>";
String output = null;
if(System.getProperty("java.vendor").contains("IBM")){
output = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><root attribute=\"http://mock-host:1/test-output-path-1\">http://mock-host:1/test-output-path-1</root>";
}else {
output = "<?xml version=\"1.0\" standalone=\"no\"?><root attribute=\"http://mock-host:1/test-output-path-1\">http://mock-host:1/test-output-path-1</root>";
}
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:1/test-output-path-1" )
.content( output, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
request.setHeader( "Content-Type", "application/xml; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
// MatcherAssert.assertThat( XmlConverters.the( outputHtml ), XmlMatchers.hasXPath( "/html" ) );
@Test
public void testOutboundJsonBodyRewrite() throws Exception {
setUp( null );
String input = "{\"url\":\"http://mock-host:1/test-input-path\"}";
String expect = "{\"url\":\"http://mock-host:1/test-output-path-1\"}";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:1/test-output-path-1" );
interaction.respond()
.status( 200 )
.contentType( "application/json" )
.content( input, Charset.forName( "UTF-8" ) );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
assertThat( response.getContent(), is( expect ) );
}
@Test
public void testOutboundHtmlBodyRewrite() throws Exception {
setUp( null );
String input = "<html><head></head><body><a href=\"http://mock-host:1/test-input-path\">link text</a></body></html>";
String output = "<html><head></head><body><a href=\"http://mock-host:1/test-output-path-1\">link text</a></body></html>";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:1/test-output-path-1" )
.content( output, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
request.setHeader( "Content-Type", "application/html; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testInboundHtmlFormRewrite() throws Exception {
setUp( null );
String input = "Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21&url=http%3A%2F%2Fmock-host%3A1%2Ftest-input-path";
String expect = "Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21&url=http%3A%2F%2Fmock-host%3A1%2Ftest-output-path-1";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:1/test-output-path-1" )
.content( expect, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
request.setHeader( "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testRequestUrlRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
initParams.put( "request.url", "test-rule-2" );
setUp( initParams );
String input = "<root/>";
String expect = "<root/>";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:42/test-output-path-2" )
.contentType( "text/xml" )
.characterEncoding( "UTF-8" )
.content( expect, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:42" );
request.setHeader( "Content-Type", "text/xml; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testRequestHeaderRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
initParams.put( "request.headers", "test-filter-2" );
setUp( initParams );
String input = "<root/>";
String expect = "<root/>";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:42/test-output-path-1" )
.contentType( "text/xml" )
.characterEncoding( "UTF-8" )
.content( expect, Charset.forName( "UTF-8" ) )
.header( "Location", "http://mock-host:42/test-output-path-2" );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:42" );
request.setHeader( "Location", "http://mock-host:42/test-input-path-1" );
request.setHeader( "Content-Type", "text/xml; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
// @Ignore( "Not Implemented Yet" )
// @Test
// public void testRequestCookieRewriteWithFilterInitParam() {
// fail( "TODO" );
// }
@Test
public void testRequestJsonBodyRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
//initParams.put( "url, "" );
initParams.put( "request.body", "test-filter-2" );
//initParams.put( "response", "" );
setUp( initParams );
String inputJson = "{\"url\":\"http://mock-host:42/test-input-path-1\"}";
String expectJson = "{\"url\":\"http://mock-host:42/test-output-path-2\"}";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:42/test-output-path-1" )
.contentType( "application/json" )
.content( expectJson, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:42" );
request.setHeader( "Content-Type", "application/json; charset=UTF-8" );
request.setContent( inputJson );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testRequestXmlBodyRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
initParams.put( "request.body", "test-filter-2" );
setUp( initParams );
String input = "<root url='http://mock-host:42/test-input-path-1'><url>http://mock-host:42/test-input-path-1</url></root>";
String expect = "<root url='http://mock-host:42/test-output-path-2'><url>http://mock-host:42/test-output-path-2</url></root>";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:42/test-output-path-1" )
.contentType( "text/xml" )
.characterEncoding( "UTF-8" )
.content( expect, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:42" );
request.setHeader( "Content-Type", "text/xml; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testRequestXmlBodyRewriteWithFilterInitParamForInvalidFilterConfig() throws Exception {
Enumeration<Appender> realAppenders = NoOpAppender.setUp();
try {
Map<String,String> initParams = new HashMap<String,String>();
initParams.put( "request.body", "test-filter-3" );
setUp( initParams );
String input = "<root url='http://mock-host:42/test-input-path-1'><url>http://mock-host:42/test-input-path-2</url></root>";
String expect = "<root url='http://mock-host:42/test-input-path-2'><url>http://mock-host:42/test-input-path-2</url></root>";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:42/test-output-path-1" )
.contentType( "text/xml" )
.characterEncoding( "UTF-8" )
.content( expect, Charset.forName( "UTF-8" ) );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:42" );
request.setHeader( "Content-Type", "text/xml; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 500 ) );
} finally {
NoOpAppender.tearDown( realAppenders );
}
}
@Test
public void testRequestFormBodyRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
initParams.put( "request.body", "test-filter-2" );
setUp( initParams );
String input = "Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21&url=http%3A%2F%2Fmock-host%3A1%2Ftest-input-path";
String expect = "Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21&url=http%3A%2F%2Fmock-host%3A1%2Ftest-output-path-2";
// Setup the server side request/response interaction.
interaction.expect()
.method( "PUT" )
.requestUrl( "http://mock-host:1/test-output-path-1" )
.content( expect, Charset.forName( "UTF-8" ) )
.characterEncoding( "UTF-8" );
interaction.respond()
.status( 200 );
interactions.add( interaction );
request.setMethod( "PUT" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:1" );
request.setHeader( "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8" );
request.setContent( input );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
}
@Test
public void testResponseHeaderRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
initParams.put( "response.headers", "test-filter-2" );
setUp( initParams );
String output = "<root url='http://mock-host:42/test-input-path-2'><url>http://mock-host:42/test-input-path-3</url></root>";
// Setup the server side request/response interaction.
interaction.expect()
.method( "GET" )
.requestUrl( "http://mock-host:42/test-output-path-1" );
interaction.respond()
.content( output, Charset.forName( "UTF-8" ) )
.contentType( "text/xml" )
.header( "Location", "http://mock-host:42/test-input-path-4" )
.status( 307 );
interactions.add( interaction );
request.setMethod( "GET" );
request.setURI( "/test-input-path-1" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:42" );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 307 ) );
assertThat( response.get( HttpHeader.LOCATION ), is( "http://mock-host:42/test-output-path-2" ) );
String actual = response.getContent();
assertThat( the( actual ), hasXPath( "/root/@url", equalTo( "http://mock-host:42/test-output-path-1" ) ) );
assertThat( the( actual ), hasXPath( "/root/url/text()", equalTo( "http://mock-host:42/test-output-path-1" ) ) );
}
// @Ignore( "Not Implemented Yet" )
// @Test
// public void testResponseCookieRewriteWithFilterInitParam() {
// fail( "TODO" );
// }
@Test
public void testResponseJsonBodyRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
//initParams.put( "url, "" );
initParams.put( "response.body", "test-filter-2" );
//initParams.put( "response", "" );
setUp( initParams );
String responseJson = "{\"url\":\"http://mock-host:42/test-input-path-1\"}";
// Setup the server side request/response interaction.
interaction.expect()
.method( "GET" )
.requestUrl( "http://mock-host:42/test-output-path-1" );
interaction.respond()
.contentType( "application/json" )
.content( responseJson, Charset.forName( "UTF-8" ) )
.status( 200 );
interactions.add( interaction );
request.setMethod( "GET" );
request.setURI( "/test-input-path" );
//request.setVersion( "HTTP/1.1" );
request.setHeader( "Host", "mock-host:42" );
request.setHeader( "Content-Type", "application/json; charset=UTF-8" );
request.setContent( responseJson );
// Execute the request.
response = TestUtils.execute( server, request );
assertThat( response.getStatus(), is( 200 ) );
JsonAssert.with( response.getContent() ).assertThat( "$.url", is( "http://mock-host:42/test-output-path-2" ) );
}
@Test
public void testResponseXmlBodyRewriteWithFilterInitParam() throws Exception {
Map<String,String> initParams = new HashMap<String,String>();
initParams.put( "response.body", "test-filter-2" );
setUp( initParams );
String output = "<root url='http://mock-host:42/test-input-path-1'><url>http://mock-host:42/test-input-path-1</url></root>";
// Setup the server side request/response interaction.
interaction.expect()
.method( "GET" )
.requestUrl( "http://mock-host:42/test-output-path-1" );
interaction.respond()
.content( output, Charset.forName( "UTF-8" ) )
.contentType( "text/xml" )
.status( 200 );
interactions.add( interaction );
request.setMethod( "GET" );
request.setURI( "/test-input-path" );
request.setVersion( "HTTP/1.0" );
request.setHeader( "Host", "mock-host:42" );
// Execute the request.
response = TestUtils.execute( server, request );
// Test the results.
assertThat( response.getStatus(), is( 200 ) );
String actual = response.getContent();
assertThat( the( actual ), hasXPath( "/root/@url", equalTo( "http://mock-host:42/test-output-path-2" ) ) );
assertThat( the( actual ), hasXPath( "/root/url/text()", equalTo( "http://mock-host:42/test-output-path-2" ) ) );
}
private static class SetupFilter implements Filter {
@Override
public void init( FilterConfig filterConfig ) throws ServletException {
}
@Override
public void doFilter( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException {
HttpServletRequest httpRequest = ((HttpServletRequest)request);
StringBuffer sourceUrl = httpRequest.getRequestURL();
String queryString = httpRequest.getQueryString();
if( queryString != null ) {
sourceUrl.append( "?" );
sourceUrl.append( queryString );
}
try {
request.setAttribute(
AbstractGatewayFilter.SOURCE_REQUEST_URL_ATTRIBUTE_NAME,
Parser.parseLiteral( sourceUrl.toString() ) );
} catch( URISyntaxException e ) {
throw new ServletException( e );
}
chain.doFilter( request, response );
}
@Override
public void destroy() {
}
}
}