/** * Copyright (c) 2009 Juwi MacMillan Group GmbH * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.juwimm.cms.http; import java.net.MalformedURLException; import java.net.URL; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpMethodBase; import org.apache.commons.httpclient.URIException; import org.apache.log4j.Logger; import de.juwimm.cms.common.HttpMessages; /** * <p> * Title: Tizzit * </p> * <p> * Description: Enterprise Content Management * </p> * <p> * Copyright: Copyright (c) 2004 * </p> * * @author <a href="sascha.kulawik@juwimm.com">Sascha-Matthias Kulawik</a> * @version $Revision: 1.1 $ */ public final class HttpClientWrapper extends de.juwimm.cms.common.http.HttpClientWrapper { private static Logger log = Logger.getLogger(HttpClientWrapper.class); private static HttpClientWrapper instance = null; public static HttpClientWrapper getInstance() { if (instance == null) { instance = new HttpClientWrapper(); } return instance; } private HttpClientWrapper() { super(); } public void testAndConfigureConnection(String testUrlString) throws HttpException { testAndConfigureConnection(testUrlString, null, null); } /** * * @param testUrlString * destination * @param userName * for authentication at testUrlString NOT for proxy * @param password * for authentication at testUrlString NOT for proxy * @throws HttpException */ public void testAndConfigureConnection(String testUrlString, String userName, String password) throws HttpException { URL testURL = null; try { testURL = new URL(testUrlString); } catch (MalformedURLException exe1) { throw new HttpException(HttpMessages.getString("HttpClientWrapper.testConnectionFailed", testUrlString, "\n")); } DlgUsernamePassword dlg = new DlgUsernamePassword(); if ((getHttpProxyUser() == null || "".equalsIgnoreCase(getHttpProxyUser())) && getHttpProxyPassword() == null || "".equalsIgnoreCase(getHttpProxyPassword())) { dlg.getTxtUsername().setText(System.getProperty("user.name")); } else { dlg.getTxtUsername().setText(getHttpProxyUser()); } dlg.getTxtPassword().setText(getHttpProxyPassword()); // dlg.getTxtNTDomain().setText(httpProxyNTDomain); // try no auth, base auth, ntlm auth with user giving username and // password until successful while (true) { try { testAndConfigureConnectionTryInvoke(testURL, userName, password); // save password only if connect successful saveProperties(dlg.getCboSave().isSelected()); break; } catch (URIException exe) { // http-Error-Code: 407 = Proxy Authentication Required if (exe.getReasonCode() == 407) { // ask user for user and password dlg.setVisible(true); if (dlg.isCanceled()) { throw new HttpException(HttpMessages.getString("HttpClientWrapper.noProxyWhereNeededExeption")); } setHttpProxyUser(dlg.getTxtUsername().getText()); setHttpProxyPassword(String.copyValueOf(dlg.getTxtPassword().getPassword())); // httpProxyNTDomain = dlg.getTxtNTDomain().getText(); } else { throw new HttpException(HttpMessages.getString("HttpClientWrapper.testConnectionFailed", testURL.getHost(), exe.getMessage())); } } } log.debug("finished test"); } /** * tries first with no auth toherwise first with non-ntlm proxy if still * http-error-code 407 with ntlm-proxy * * @param testURL * @param userName * for testURL authentication NOT for proxy * @param password * for testURL authentication NOT for proxy * @throws HttpException */ private void testAndConfigureConnectionTryInvoke(URL testURL, String userName, String password) throws HttpException { HttpMethodBase method = null; try { /* * At first Im trying here with default settings, so no proxy auth, * proxy if given and or proxy auth with username and password auth. */ method = invoke(testURL, userName, password); } catch (URIException exe) { if (exe.getReasonCode() == 407) { log.info("Proxy needs authorization to be configured"); if (this.getHttpProxyUser() != null) { try { /* * Now I want to try the proxy with NTLM * authentification. I can not figure out if I can use * NTLM, so we're trying it. */ this.setUseNTproxy(true); method = invoke(testURL, null, null); } catch (URIException exe2) { if (exe2.getReasonCode() == 407) { /* * Something went wrong - in general username / * password pair does not match - in this case this * could also be a wrong NT-DOMAIN. */ this.setUseNTproxy(false); throw exe2; } throw new HttpException(HttpMessages.getString("HttpClientWrapper.testConnectionFailed", testURL.getHost(), exe2.getMessage())); } } else { log.info("...but first you have to enter one"); this.setUseNTproxy(false); throw exe; } } else { throw new HttpException(HttpMessages.getString("HttpClientWrapper.testConnectionFailed", testURL.getHost(), exe.getMessage())); } } finally { if (method != null) { method.releaseConnection(); } } } }