package guide;
import java.io.IOException;
import java.security.GeneralSecurityException;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.jayway.restassured.RestAssured;
import com.xebialabs.restito.server.StubServer;
import static com.xebialabs.restito.builder.ensure.EnsureHttp.ensureHttp;
import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;
import static com.xebialabs.restito.semantics.Action.ok;
import static com.xebialabs.restito.semantics.Condition.get;
import static org.apache.http.client.config.RequestConfig.custom;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
public class UsingHttpsTest {
private StubServer server;
@Before
public void start() {
server = new StubServer().secured();
RestAssured.port = server.getPort();
}
@After
public void stop() {
server.stop();
}
@Test
public void shouldPassWhenExpectedStubDidHappen() throws GeneralSecurityException, IOException {
server.run();
whenHttp(server).match(get("/asd")).then(ok()).mustHappen();
HttpResponse execute = sslReadyHttpClient().execute(new HttpGet("https://localhost:" + server.getPort() + "/asd"));
assertThat(execute.getStatusLine().getStatusCode(), equalTo(200));
ensureHttp(server).gotStubsCommitmentsDone();
}
@Test
public void shouldBePossibleToSpecifyKeyStoresWithStandardProperties() throws GeneralSecurityException, IOException {
System.setProperty("javax.net.ssl.trustStore","build/resources/main/keystore_server");
System.setProperty("javax.net.ssl.keyStore","build/resources/main/truststore_server");
System.setProperty("javax.net.ssl.trustStorePassword","secret");
System.setProperty("javax.net.ssl.keyStorePassword","secret");
server.run();
whenHttp(server).match(get("/asd")).then(ok()).mustHappen();
HttpResponse execute = sslReadyHttpClient().execute(new HttpGet("https://localhost:" + server.getPort() + "/asd"));
assertThat(execute.getStatusLine().getStatusCode(), equalTo(200));
ensureHttp(server).gotStubsCommitmentsDone();
}
/**
* Helper which returns HTTP client configured for https session
*/
private HttpClient sslReadyHttpClient() throws GeneralSecurityException {
final SSLContext context = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build();
final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(context);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("https", socketFactory)
.build();
return HttpClientBuilder.create()
.setDefaultRequestConfig(custom().setConnectionRequestTimeout(10000).build())
.setConnectionManager(new PoolingHttpClientConnectionManager(registry))
.setSSLSocketFactory(socketFactory)
.build();
}
}