package ca.uhn.fhir.rest.client; import static org.junit.Assert.*; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.Validate; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.dstu.resource.Patient; import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.rest.annotation.RequiredParam; import ca.uhn.fhir.rest.annotation.Search; import ca.uhn.fhir.rest.client.api.IBasicClient; import ca.uhn.fhir.rest.server.IResourceProvider; import ca.uhn.fhir.rest.server.RestfulServer; import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.TestUtil; public class ClientIntegrationTest { private int myPort; private Server myServer; private MyPatientResourceProvider myPatientProvider; private static FhirContext ourCtx = FhirContext.forDstu1(); @Before public void before() { myPort = PortUtil.findFreePort(); myServer = new Server(myPort); myPatientProvider = new MyPatientResourceProvider(); ServletHandler proxyHandler = new ServletHandler(); RestfulServer servlet = new RestfulServer(ourCtx); servlet.setResourceProviders(myPatientProvider); ServletHolder servletHolder = new ServletHolder(servlet); proxyHandler.addServletWithMapping(servletHolder, "/*"); myServer.setHandler(proxyHandler); } @SuppressWarnings("deprecation") @Test public void testClientSecurity() throws Exception { myServer.start(); FhirContext ctx = FhirContext.forDstu1(); HttpClientBuilder builder = HttpClientBuilder.create(); // PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(5000, TimeUnit.MILLISECONDS); // builder.setConnectionManager(connectionManager); builder.addInterceptorFirst(new HttpBasicAuthInterceptor("foobar", "boobear")); CloseableHttpClient httpClient = builder.build(); ctx.getRestfulClientFactory().setHttpClient(httpClient); PatientClient client = ctx.newRestfulClient(PatientClient.class, "http://localhost:" + myPort + "/"); List<Patient> actualPatients = client.searchForPatients(new StringDt("AAAABBBB")); assertEquals(1, actualPatients.size()); assertEquals("AAAABBBB", actualPatients.get(0).getNameFirstRep().getFamilyAsSingleString()); assertEquals("Basic Zm9vYmFyOmJvb2JlYXI=", myPatientProvider.getAuthorizationHeader()); } @After public void after() throws Exception { myServer.stop(); } public static class MyPatientResourceProvider implements IResourceProvider { private String myAuthorizationHeader; public String getAuthorizationHeader() { return myAuthorizationHeader; } @Override public Class<? extends IResource> getResourceType() { return Patient.class; } @Search public List<Patient> searchForPatients(@RequiredParam(name = "fooParam") StringDt theFooParam, HttpServletRequest theRequest, HttpServletResponse theResponse) { Validate.notNull(theRequest); Validate.notNull(theResponse); myAuthorizationHeader = theRequest.getHeader("authorization"); Patient retVal = new Patient(); retVal.setId("1"); retVal.addName().addFamily(theFooParam.getValue()); return Collections.singletonList(retVal); } } private static interface PatientClient extends IBasicClient { @Search public List<Patient> searchForPatients(@RequiredParam(name = "fooParam") StringDt theFooParam); } @AfterClass public static void afterClassClearContext() { TestUtil.clearAllStaticFieldsForUnitTest(); } }