package org.mapfish.print.processor.http;
import com.google.common.base.Predicate;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
import org.mapfish.print.TestHttpClientFactory;
import org.mapfish.print.attribute.HttpRequestHeadersAttribute;
import org.mapfish.print.config.Configuration;
import org.mapfish.print.config.Template;
import org.mapfish.print.output.Values;
import org.mapfish.print.processor.ProcessorDependencyGraph;
import org.mapfish.print.processor.http.MfClientHttpRequestFactoryProvider;
import org.mapfish.print.wrapper.json.PJsonObject;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.ClientHttpRequest;
import org.springframework.mock.http.client.MockClientHttpRequest;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import java.net.URI;
import javax.annotation.Nullable;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
@ContextConfiguration(locations = {
"classpath:org/mapfish/print/processor/http/forward-headers/add-custom-processor-application-context.xml"
})
public class ForwardHeadersProcessorTest extends AbstractHttpProcessorTest {
@Override
protected String baseDir() {
return "forward-headers";
}
@Override
protected Class<TestProcessor> testProcessorClass() {
return TestProcessor.class;
}
@Override
protected Class<? extends HttpProcessor> classUnderTest() {
return ForwardHeadersProcessor.class;
}
@Override
protected void addExtraValues(Values values) throws JSONException {
HttpRequestHeadersAttribute.Value headers = new HttpRequestHeadersAttribute.Value();
JSONObject inner = new JSONObject("{\"header1\": [\"header1-v1\",\"header1-v2\"], \"header2\": [\"header2-value\"], \"header3" +
"\": [\"header3-value\"]}");
headers.requestHeaders = new PJsonObject(inner, "headers");
values.put("requestHeaders", headers);
}
@Test
@DirtiesContext
public void testForwardAll() throws Exception {
this.httpClientFactory.registerHandler(new Predicate<URI>() {
@Override
public boolean apply(@Nullable URI input) {
return true;
}
}, new TestHttpClientFactory.Handler() {
@Override
public MockClientHttpRequest handleRequest(URI uri, HttpMethod httpMethod) throws Exception {
return new MockClientHttpRequest(httpMethod, uri);
}
});
configurationFactory.setDoValidation(false);
final Configuration config = configurationFactory.getConfig(getFile(baseDir() + "/config-forward-all.yaml"));
final Template template = config.getTemplate("main");
ProcessorDependencyGraph graph = template.getProcessorGraph();
Values values = new Values();
values.put(Values.CLIENT_HTTP_REQUEST_FACTORY_KEY, new MfClientHttpRequestFactoryProvider(this.httpClientFactory));
addExtraValues(values);
forkJoinPool.invoke(graph.createTask(values));
}
public static class TestProcessor extends AbstractTestProcessor {
@Nullable
@Override
public Void execute(TestParam values, ExecutionContext context) throws Exception {
final URI uri = new URI("http://localhost:8080/path?query#fragment");
final ClientHttpRequest request = values.clientHttpRequestFactoryProvider.get().createRequest(uri,
HttpMethod.GET);
final URI finalUri = request.getURI();
assertEquals("http", finalUri.getScheme());
assertEquals("localhost", finalUri.getHost());
assertEquals("/path", finalUri.getPath());
assertEquals(8080, finalUri.getPort());
assertEquals("query", finalUri.getQuery());
assertEquals("fragment", finalUri.getFragment());
assertEquals(2, request.getHeaders().size());
assertArrayEquals(new Object[]{"header1-v1", "header1-v2"}, request.getHeaders().get("header1").toArray());
assertArrayEquals(new Object[]{"header2-value"}, request.getHeaders().get("header2").toArray());
return null;
}
}
public static class TestProcessor2 extends AbstractTestProcessor {
@Nullable
@Override
public Void execute(TestParam values, ExecutionContext context) throws Exception {
final URI uri = new URI("http://localhost:8080/path?query#fragment");
final ClientHttpRequest request = values.clientHttpRequestFactoryProvider.get().createRequest(uri,
HttpMethod.GET);
assertEquals(3, request.getHeaders().size());
assertArrayEquals(new Object[]{"header1-v1", "header1-v2"}, request.getHeaders().get("header1").toArray());
assertArrayEquals(new Object[]{"header2-value"}, request.getHeaders().get("header2").toArray());
assertArrayEquals(new Object[]{"header3-value"}, request.getHeaders().get("header3").toArray());
return null;
}
}
}