/******************************************************************************* * Copyright (c) 2010, 2013 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.net.http; import java.io.IOException; import org.apache.commons.httpclient.HostConfiguration; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.auth.DigestScheme; import org.apache.commons.httpclient.cookie.CookiePolicy; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.mylyn.commons.core.operations.IOperationMonitor; import org.eclipse.mylyn.commons.net.AbstractWebLocation; import org.eclipse.mylyn.commons.net.AuthenticationType; import org.eclipse.mylyn.commons.net.UnsupportedRequestException; import org.eclipse.mylyn.commons.net.WebUtil; /** * Facilitates connections to repositories accessed through Http. * * @author Steffen Pingel * @since 3.7 */ public class CommonHttpClient3 { static final boolean DEBUG_AUTH = Boolean.valueOf(Platform.getDebugOption("org.eclipse.mylyn.commons.http/debug/authentication")); //$NON-NLS-1$ private static final String DEFAULT_USER_AGENT = "Apache XML-RPC/3.0"; //$NON-NLS-1$ private static HttpClient createHttpClient(String userAgent) { HttpClient httpClient = new HttpClient(); httpClient.setHttpConnectionManager(WebUtil.getConnectionManager()); httpClient.getParams().setCookiePolicy(CookiePolicy.RFC_2109); WebUtil.configureHttpClient(httpClient, userAgent); return httpClient; } volatile DigestScheme digestScheme; final HttpClient httpClient; private final AbstractWebLocation location; public CommonHttpClient3(AbstractWebLocation location) { this(location, createHttpClient(DEFAULT_USER_AGENT)); } public CommonHttpClient3(AbstractWebLocation location, HttpClient client) { this.location = location; this.httpClient = createHttpClient(DEFAULT_USER_AGENT); } public HttpClient getHttpClient() { return httpClient; } public AbstractWebLocation getLocation() { return location; } public int execute(HttpMethodBase method, IOperationMonitor monitor) throws IOException { HostConfiguration hostConfiguration = WebUtil.createHostConfiguration(getHttpClient(), location, monitor); return WebUtil.execute(getHttpClient(), hostConfiguration, method, monitor); } public synchronized HostConfiguration getHostConfiguration(IOperationMonitor monitor) throws IOException { if (location.getUrl() == null) { throw new IOException("No URL specified."); //$NON-NLS-1$ } return WebUtil.createHostConfiguration(httpClient, location, monitor); } protected void authenticate(IOperationMonitor monitor) throws IOException { } protected boolean needsReauthentication(int code, IProgressMonitor monitor) throws IOException { final AuthenticationType authenticationType; if (code == HttpStatus.SC_UNAUTHORIZED || code == HttpStatus.SC_FORBIDDEN) { authenticationType = AuthenticationType.HTTP; } else if (code == HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED) { authenticationType = AuthenticationType.PROXY; } else { return false; } try { location.requestCredentials(authenticationType, null, monitor); } catch (UnsupportedRequestException e) { IOException ioe = new IOException(HttpStatus.getStatusText(code)); ioe.initCause(e); throw ioe; } catch (UnsupportedOperationException e) { IOException ioe = new IOException(HttpStatus.getStatusText(code)); ioe.initCause(e); throw ioe; } return true; } }