/******************************************************************************* * Copyright (c) 2004, 2012 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 java.net.Proxy; import org.apache.http.HttpStatus; import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation; import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationException; 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.sdk.util.MockServer; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author Steffen Pingel */ public class CommonHttpClientPreemptiveAuthTest { private MockServer server; public CommonHttpClientPreemptiveAuthTest() { } @Before public void setUp() throws Exception { server = new MockServer(); server.startAndWait(); } @After public void tearDown() throws Exception { server.stop(); } @Test public void testExecuteGetNoPreemptiveAuth() throws Exception { RepositoryLocation location = createLocation(); location.setCredentials(AuthenticationType.HTTP, new UserCredentials("user", "pass")); CommonHttpClient client = new CommonHttpClient(location); server.addResponse(MockServer.OK); CommonHttpResponse response = client.executeGet("/", null, HttpRequestProcessor.DEFAULT); assertEquals(HttpStatus.SC_OK, response.getStatusCode()); assertEquals(null, server.getRequest().getHeader("Authorization")); } @Test(expected = AuthenticationException.class) public void testExecuteGetAuthChallengeNoCredentials() throws Exception { RepositoryLocation location = createLocation(); CommonHttpClient client = new CommonHttpClient(location); server.addResponse(MockServer.UNAUTHORIZED); client.executeGet("/", null, HttpRequestProcessor.DEFAULT); } @Test public void testExecuteGetAuthChallenge() throws Exception { RepositoryLocation location = createLocation(); location.setCredentials(AuthenticationType.HTTP, new UserCredentials("user", "pass")); CommonHttpClient client = new CommonHttpClient(location); server.addResponse(MockServer.UNAUTHORIZED); server.addResponse(MockServer.OK); CommonHttpResponse response = client.executeGet("/", null, HttpRequestProcessor.DEFAULT); assertEquals(HttpStatus.SC_OK, response.getStatusCode()); assertEquals("Did not expect preemptive credentails", null, server.getRequest().getHeader("Authorization")); assertEquals("Expect credentails on challenge", "Authorization: Basic dXNlcjpwYXNz", server.getRequest().getHeader("Authorization")); } @Test public void testExecuteGetPreemptiveAuth() throws Exception { RepositoryLocation location = createLocation(); location.setCredentials(AuthenticationType.HTTP, new UserCredentials("user", "pass")); CommonHttpClient client = new CommonHttpClient(location); client.setPreemptiveAuthenticationEnabled(true); server.addResponse(MockServer.OK); CommonHttpResponse response = client.executeGet("/", null, HttpRequestProcessor.DEFAULT); assertEquals("Authorization: Basic dXNlcjpwYXNz", server.getRequest().getHeader("Authorization")); assertEquals(HttpStatus.SC_OK, response.getStatusCode()); // subsequent requests will have cached credentials client.setPreemptiveAuthenticationEnabled(false); server.addResponse(MockServer.OK); response = client.executeGet("/", null, HttpRequestProcessor.DEFAULT); assertEquals("Authorization: Basic dXNlcjpwYXNz", server.getRequest().getHeader("Authorization")); assertEquals(HttpStatus.SC_OK, response.getStatusCode()); } private RepositoryLocation createLocation() { return new RepositoryLocation(server.getUrl()) { @Override public Proxy getProxyForHost(String host, String proxyType) { return null;// ensure that we do not try to connect to localhost through a proxy server } }; } }