From 84db1e8e167c210eea1b9e08118965c9cfbbe50a Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Tue, 16 Apr 2002 05:46:12 +0000 Subject: [PATCH] pulled from the sandbox, added the NoProxyHosts attr, including with java1.4 support (the ftp version), and tweaked behavior s.t. does nothing. but resets the proxy settings to no proxy. No docs (stil in the sandbox) or test (I need to be at work to test it) git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272446 13f79535-47bb-0310-9956-ffa450edef68 --- .../ant/taskdefs/optional/net/SetProxy.java | 259 ++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100644 src/main/org/apache/tools/ant/taskdefs/optional/net/SetProxy.java diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/net/SetProxy.java b/src/main/org/apache/tools/ant/taskdefs/optional/net/SetProxy.java new file mode 100644 index 000000000..e6feb24f6 --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/net/SetProxy.java @@ -0,0 +1,259 @@ +/* + * The Apache Software License, Version 1.1 + * + * Copyright (c) 2001-2002 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Ant", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + */ + +package org.apache.tools.ant.taskdefs.optional.net; + +import java.io.*; +import java.net.*; +import java.util.*; +import java.lang.reflect.*; +import org.apache.tools.ant.*; + +/** + * proxy definition task. This allows all tasks in the build file + * executed after this task to access the web through a proxy server + * @see + * java 1.4 network property list + * @author Steve Loughran + * @created March 17, 2001 + * @ant.task + */ + +public class SetProxy extends Task { + + /** + * proxy details + */ + protected String proxyHost = null; + + /** + * name of proxy port + */ + protected int proxyPort = 80; + + /** + * socks host. + */ + private String socksProxyHost = null; + + /** + * socks proxy port. 1080 is the default + */ + private int socksProxyPort = 1080; + + + /** + * list of non proxy hosts + */ + private String nonProxyHosts=null; + + /** + * set a proxy host. the port should be defined too + * + * @param hostname the new proxy hostname + */ + public void setProxyHost(String hostname) { + proxyHost = hostname; + } + + + /** + * set the proxy port number. + * + * @param port port number of the proxy + */ + public void setProxyPort(int port) { + proxyPort = port; + } + + /** + * Set the SocksProxyHost attribute + * + * @param host The new SocksProxyHost value + */ + public void setSocksProxyHost(String host) { + this.socksProxyHost = host; + } + + + /** + * Set the SocksProxyPort attribute + * + * @param port The new SocksProxyPort value + */ + public void setSocksProxyPort(int port) { + this.socksProxyPort = port; + } + + /** + * specify a list of hosts to bypass the proxy on; separate them with the + * vertical bar character '|' + * e.g. fozbot.corp.sun.com|*.eng.sun.com + * @param nonProxyHosts lists of hosts to talk direct to + */ + public void setNonProxyHosts(String nonProxyHosts) { + this.nonProxyHosts = nonProxyHosts; + } + + /** + * if the proxy port and host settings are not null, then the settings + * get applied these settings last beyond the life of the object and + * apply to all network connections + * Relevant docs: buglist #4183340 + * @return true if the settings were applied + */ + + public void applyWebProxySettings() { + boolean settingsChanged=false; + boolean enablingProxy=false; + Properties sysprops = System.getProperties(); + if(proxyHost!=null) { + settingsChanged=true; + if (proxyHost.length()!=0) { + traceSettingInfo(); + enablingProxy=true; + sysprops.put("http.proxyHost", proxyHost); + String portString = Integer.toString(proxyPort); + sysprops.put("http.proxyPort", portString); + sysprops.put("https.proxyHost", proxyHost); + sysprops.put("https.proxyPort", portString); + sysprops.put("ftp.proxyHost", proxyHost); + sysprops.put("ftp.proxyPort", portString); + if(nonProxyHosts!=null) { + sysprops.put("http.nonProxyHosts", nonProxyHosts); + sysprops.put("ftp.nonProxyHosts", nonProxyHosts); + } + } else { + log("resetting http proxy",Project.MSG_VERBOSE); + sysprops.remove("http.proxyPort"); + sysprops.remove("https.proxyHost"); + sysprops.remove("https.proxyPort"); + sysprops.remove("ftp.proxyHost"); + sysprops.remove("ftp.proxyPort"); + } + } + + //socks + if (socksProxyHost != null) { + settingsChanged=true; + if(socksProxyHost.length()!=0) { + enablingProxy=true; + sysprops.put("socksProxyHost", socksProxyHost); + sysprops.put("socksProxyPort", Integer.toString(socksProxyPort)); + } else { + log("resetting socks proxy",Project.MSG_VERBOSE); + sysprops.remove("socksProxyHost"); + sysprops.remove("socksProxyPort"); + } + } + + + //for Java1.1 we need to tell the system that the settings are new + if(settingsChanged && project.getJavaVersion() == Project.JAVA_1_1) { + legacyResetProxySettingsCall(enablingProxy); + } + } + + /** + * list out what is going on + */ + private void traceSettingInfo() { + log("Setting proxy to " + + (proxyHost!=null?proxyHost:"''") + + ":" + proxyPort, + Project.MSG_VERBOSE); + } + + + /** + * make a call to sun.net.www.http.HttpClient.resetProperties(); + * this is only needed for java 1.1; reflection is used to stop the compiler + * whining, and in case cleanroom JVMs dont have the class. + * @return true if we did something + */ + + protected boolean legacyResetProxySettingsCall(boolean setProxy) { + System.getProperties().put("http.proxySet", new Boolean(setProxy).toString()); + try { + Class c = Class.forName("sun.net.www.http.HttpClient"); + Method reset = c.getMethod("resetProperties", null); + reset.invoke(null, null); + return true; + } + catch (ClassNotFoundException cnfe) { + return false; + } + catch (NoSuchMethodException e) { + return false; + } + catch (IllegalAccessException e) { + return false; + } + catch (InvocationTargetException e) { + return false; + } + } + + + /** + * Does the work. + * + * @exception BuildException thrown in unrecoverable error. + */ + public void execute() throws BuildException { + applyWebProxySettings(); + } + +} +