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();
+ }
+
+}
+