| /******************************************************************************* |
| * Copyright (c) 2011, 2015 Tasktop Technologies and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Tasktop Technologies - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.commons.repositories.http.tests; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertNotNull; |
| |
| import java.io.IOException; |
| import java.util.concurrent.atomic.AtomicReference; |
| |
| import javax.net.ssl.SSLException; |
| import javax.net.ssl.TrustManager; |
| |
| import org.apache.http.HttpResponse; |
| import org.apache.http.HttpStatus; |
| import org.apache.http.auth.AuthScope; |
| import org.apache.http.auth.Credentials; |
| import org.apache.http.auth.UsernamePasswordCredentials; |
| import org.apache.http.client.methods.HttpGet; |
| import org.apache.http.conn.scheme.Scheme; |
| import org.apache.http.protocol.HttpContext; |
| import org.apache.http.util.EntityUtils; |
| import org.eclipse.mylyn.commons.core.net.SslSupport; |
| import org.eclipse.mylyn.commons.core.net.TrustAllTrustManager; |
| import org.eclipse.mylyn.commons.core.operations.IOperationMonitor; |
| import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation; |
| import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationType; |
| import org.eclipse.mylyn.commons.repositories.core.auth.UserCredentials; |
| import org.eclipse.mylyn.commons.repositories.http.core.CommonHttpClient; |
| import org.eclipse.mylyn.commons.repositories.http.core.CommonHttpResponse; |
| import org.eclipse.mylyn.commons.repositories.http.core.HttpRequestProcessor; |
| import org.eclipse.mylyn.commons.repositories.http.core.HttpUtil; |
| import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil; |
| import org.eclipse.mylyn.internal.commons.repositories.http.core.PollingSslProtocolSocketFactory; |
| import org.junit.BeforeClass; |
| import org.junit.Ignore; |
| import org.junit.Test; |
| |
| /** |
| * @author Steffen Pingel |
| */ |
| public class CommonHttpClientTest { |
| |
| @BeforeClass |
| public static void setUpClass() { |
| if (CommonTestUtil.fixProxyConfiguration()) { |
| CommonTestUtil.dumpSystemInfo(System.err); |
| } |
| } |
| |
| @Test |
| @Ignore |
| public void testCertificateAuthenticationCertificate() throws Exception { |
| if (CommonTestUtil.isCertificateAuthBroken() || CommonTestUtil.isBehindProxy()) { |
| System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificate() due to incompatible JVM"); |
| return; // skip test |
| } |
| if (!CommonTestUtil.hasCertificateCredentials()) { |
| System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificate() due to missing credentials"); |
| return; // skip test |
| } |
| |
| RepositoryLocation location = new RepositoryLocation(); |
| location.setUrl("https://mylyn.org/secure/index.txt"); |
| location.setCredentials(AuthenticationType.CERTIFICATE, CommonTestUtil.getCertificateCredentials()); |
| |
| HttpGet request = new HttpGet(location.getUrl()); |
| CommonHttpClient client = new CommonHttpClient(location); |
| HttpResponse response = client.execute(request, null); |
| try { |
| assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); |
| assertEquals("secret\n", EntityUtils.toString(response.getEntity())); |
| } finally { |
| HttpUtil.release(request, response, null); |
| } |
| } |
| |
| @Test(expected = SSLException.class) |
| @Ignore |
| public void testCertificateAuthenticationCertificateReset() throws Exception { |
| if (CommonTestUtil.isCertificateAuthBroken() || CommonTestUtil.isBehindProxy()) { |
| // bug 369805 |
| System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificateReset due to incompatible JVM"); |
| throw new SSLException(""); // skip test |
| } |
| if (!CommonTestUtil.hasCertificateCredentials()) { |
| System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificate() due to missing credentials"); |
| throw new SSLException(""); // skip test |
| } |
| |
| RepositoryLocation location = new RepositoryLocation(); |
| location.setUrl("https://mylyn.org/secure/index.txt"); |
| location.setCredentials(AuthenticationType.CERTIFICATE, CommonTestUtil.getCertificateCredentials()); |
| |
| HttpGet request = new HttpGet(location.getUrl()); |
| CommonHttpClient client = new CommonHttpClient(location); |
| // work-around for bug 369805 |
| Scheme oldScheme = setUpDefaultFactory(client); |
| try { |
| try { |
| HttpResponse response = client.execute(request, null); |
| try { |
| assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); |
| } finally { |
| HttpUtil.release(request, response, null); |
| } |
| } catch (SSLException e) { |
| throw new IllegalStateException("Unexpected exception", e); |
| } |
| |
| location.setCredentials(AuthenticationType.CERTIFICATE, null); |
| // the request should now fail |
| request = new HttpGet(location.getUrl()); |
| HttpResponse response = client.execute(request, null); |
| HttpUtil.release(request, response, null); |
| } finally { |
| tearDownDefaultFactory(client, oldScheme); |
| } |
| } |
| |
| @Test(expected = SSLException.class) |
| public void testCertificateAuthenticationNoCertificate() throws Exception { |
| if (!CommonTestUtil.isHttpsProxyBroken()) { |
| System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationNoCertificate() due to broken https proxy"); |
| throw new SSLException(""); // skip test |
| } |
| |
| RepositoryLocation location = new RepositoryLocation(); |
| location.setUrl("https://mylyn.org/secure/index.txt"); |
| |
| HttpGet request = new HttpGet(location.getUrl()); |
| CommonHttpClient client = new CommonHttpClient(location); |
| // work-around for bug 369805 |
| Scheme oldScheme = setUpDefaultFactory(client); |
| try { |
| HttpResponse response = client.execute(request, null); |
| HttpUtil.release(request, response, null); |
| } finally { |
| tearDownDefaultFactory(client, oldScheme); |
| } |
| } |
| |
| @Test |
| public void testExecuteGet() throws IOException { |
| RepositoryLocation location = new RepositoryLocation("http://mylyn.org"); |
| CommonHttpClient client = new CommonHttpClient(location); |
| Integer result = client.executeGet("/", null, new HttpRequestProcessor<Integer>() { |
| @Override |
| protected Integer doProcess(CommonHttpResponse response, IOperationMonitor monitor) throws IOException { |
| return response.getStatusCode(); |
| } |
| }); |
| assertEquals(HttpStatus.SC_OK, result.intValue()); |
| } |
| |
| @Test |
| public void testGetRequest() throws Exception { |
| RepositoryLocation location = new RepositoryLocation(); |
| location.setUrl("http://mylyn.org/"); |
| |
| HttpGet request = new HttpGet(location.getUrl()); |
| CommonHttpClient client = new CommonHttpClient(location); |
| HttpResponse response = client.execute(request, null); |
| try { |
| assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode()); |
| } finally { |
| HttpUtil.release(request, response, null); |
| } |
| } |
| |
| @Test |
| public void testHttpAuthenticationTypeHttp() throws Exception { |
| RepositoryLocation location = new RepositoryLocation(); |
| location.setUrl("http://mylyn.org/"); |
| location.setCredentials(AuthenticationType.HTTP, new UserCredentials("username", "password")); |
| |
| HttpGet request = new HttpGet(location.getUrl()); |
| CommonHttpClient client = new CommonHttpClient(location); |
| HttpResponse response = client.execute(request, null); |
| try { |
| AuthScope authScope = new AuthScope("mylyn.org", 80, AuthScope.ANY_REALM); |
| Credentials httpCredentials = client.getHttpClient().getCredentialsProvider().getCredentials(authScope); |
| assertEquals(new UsernamePasswordCredentials("username", "password"), httpCredentials); |
| } finally { |
| HttpUtil.release(request, response, null); |
| } |
| } |
| |
| @Test |
| public void testHttpAuthenticationTypeRepository() throws Exception { |
| RepositoryLocation location = new RepositoryLocation(); |
| location.setUrl("http://mylyn.org/"); |
| location.setCredentials(AuthenticationType.REPOSITORY, new UserCredentials("username", "password")); |
| |
| HttpGet request = new HttpGet(location.getUrl()); |
| CommonHttpClient client = new CommonHttpClient(location); |
| AuthScope authScope = new AuthScope("mylyn.org", 80, AuthScope.ANY_REALM); |
| |
| // credentials should be ignored |
| HttpResponse response = client.execute(request, null); |
| try { |
| Credentials httpCredentials = client.getHttpClient().getCredentialsProvider().getCredentials(authScope); |
| assertEquals(null, httpCredentials); |
| } finally { |
| HttpUtil.release(request, response, null); |
| } |
| |
| client.setHttpAuthenticationType(AuthenticationType.REPOSITORY); |
| // credentials should now be used |
| response = client.execute(request, null); |
| try { |
| Credentials httpCredentials = client.getHttpClient().getCredentialsProvider().getCredentials(authScope); |
| assertEquals(new UsernamePasswordCredentials("username", "password"), httpCredentials); |
| } finally { |
| HttpUtil.release(request, response, null); |
| } |
| } |
| |
| @Test |
| public void testHttpContextPerThread() throws Exception { |
| RepositoryLocation location = new RepositoryLocation("http://mylyn.org/"); |
| final CommonHttpClient client = new CommonHttpClient(location); |
| final AtomicReference<HttpContext> otherThreadContext = new AtomicReference<HttpContext>(); |
| Thread t = new Thread() { |
| @Override |
| public void run() { |
| otherThreadContext.set(client.getContext()); |
| }; |
| }; |
| t.start(); |
| t.join(); |
| assertNotNull(otherThreadContext.get()); |
| assertNotNull(client.getContext()); |
| assertFalse(otherThreadContext.get() == client.getContext()); |
| } |
| |
| private Scheme setUpDefaultFactory(CommonHttpClient client) { |
| PollingSslProtocolSocketFactory factory = new PollingSslProtocolSocketFactory(new SslSupport( |
| new TrustManager[] { new TrustAllTrustManager() }, null, null, null)); |
| Scheme oldScheme = client.getHttpClient() |
| .getConnectionManager() |
| .getSchemeRegistry() |
| .register(new Scheme("https", 443, factory)); //$NON-NLS-1$ |
| return oldScheme; |
| } |
| |
| private void tearDownDefaultFactory(CommonHttpClient client, Scheme oldScheme) { |
| client.getHttpClient().getConnectionManager().getSchemeRegistry().register(oldScheme); |
| } |
| |
| } |