Repository: ant
Updated Branches:
  refs/heads/master 79a34b8d2 -> 1ccf1989a


[AA] Bugzilla Bug 60628 - Ant Get Task To Accept Arbitrary Header


Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/b83bdceb
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/b83bdceb
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/b83bdceb

Branch: refs/heads/master
Commit: b83bdcebf0395250b3ae5e7e4af94ff1400493f0
Parents: a928452
Author: Arcadius Ahouansou <arcadius.ahouan...@aexp.com>
Authored: Mon Jan 23 22:46:06 2017 +0000
Committer: Arcadius Ahouansou <arcadius.ahouan...@aexp.com>
Committed: Mon Jan 23 22:46:06 2017 +0000

----------------------------------------------------------------------
 manual/Tasks/get.html                           | 34 ++++++++++++++++
 src/etc/testcases/taskdefs/get.xml              | 28 +++++++++++++
 src/main/org/apache/tools/ant/taskdefs/Get.java | 43 ++++++++++++++++++++
 .../apache/tools/ant/taskdefs/email/Header.java |  4 +-
 .../org/apache/tools/ant/taskdefs/GetTest.java  | 36 ++++++++++++++++
 5 files changed, 144 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant/blob/b83bdceb/manual/Tasks/get.html
----------------------------------------------------------------------
diff --git a/manual/Tasks/get.html b/manual/Tasks/get.html
index a2c9b7e..a6d89e9 100644
--- a/manual/Tasks/get.html
+++ b/manual/Tasks/get.html
@@ -170,6 +170,29 @@ plain text' authentication is used. This is only secure 
over an HTTPS link.
   name will be skipped.  If the returned name is a relative path, it
   will be considered relative to the <em>dest</em> attribute.</p>
 
+<h4>header</h4>
+<p>Any arbitrary number of HTTP headers can be added to a request.<br/>
+  The attributes of a nested <pre>&lt;header/&gt; </pre> node are as follow:
+<p></p>
+
+<table width="60%" border="1" cellpadding="2" cellspacing="0">
+  <tr>
+    <td valign="top"><b>Attribute</b></td>
+    <td valign="top"><b>Description</b></td>
+    <td align="center" valign="top"><b>Required</b></td>
+  </tr>
+  <tr>
+    <td valign="top">name</td>
+    <td valign="top">The name or key of this header.</td>
+    <td align="center" valign="top">Yes</td>
+  </tr>
+  <tr>
+    <td valign="top">value</td>
+    <td valign="top">The value to assign to the.</td>
+    <td align="center" valign="top">Yes</td>
+  </tr>
+</table>
+
 <h3>Examples</h3>
 <pre>  &lt;get src=&quot;http://ant.apache.org/&quot; 
dest=&quot;help/index.html&quot;/&gt;</pre>
 <p>Gets the index page of http://ant.apache.org/, and stores it in the file 
<code>help/index.html</code>.</p>
@@ -234,6 +257,17 @@ the <a href="input.html">input task</a> to query for a 
password.</p>
   &lt;url url=&quot;http://ant.apache.org/faq.html&quot;/&gt;
 &lt;/get&gt;
 </pre>
+
+<p>With custom HTTP headers</p>
+<pre>
+&lt;get src=&quot;http://ant.apache.org/index.html&quot; 
dest=&quot;downloads&quot;&gt;
+  &lt;header name=&quot;header1&quot; value==&quot;headerValue1&quot; /&gt;
+  &lt;header name=&quot;header2&quot; value==&quot;headerValue2&quot; /&gt;
+  &lt;header name=&quot;header3&quot; value==&quot;headerValue3&quot; /&gt;
+
+&lt;/get&gt;
+</pre>
+
 <p>Gets the index and FAQ pages of http://ant.apache.org/, and stores
   them in the directory <code>downloads</code> which will be created if
   necessary.</p>

http://git-wip-us.apache.org/repos/asf/ant/blob/b83bdceb/src/etc/testcases/taskdefs/get.xml
----------------------------------------------------------------------
diff --git a/src/etc/testcases/taskdefs/get.xml 
b/src/etc/testcases/taskdefs/get.xml
index b74e92a..569d833 100644
--- a/src/etc/testcases/taskdefs/get.xml
+++ b/src/etc/testcases/taskdefs/get.xml
@@ -98,6 +98,34 @@
     </fail>
   </target>
 
+  <target name="testTwoHeaders">
+    <get src="http://www.apache.org/"; dest="get.tmp">
+      <header name="header1" value="header1Value"/>
+      <header name="header2" value="header2Value"/>
+    </get>
+  </target>
+
+  <target name="testEmptyHeaders">
+    <get src="http://www.apache.org/"; dest="get.tmp">
+      <header name="" value="headerValue"/>
+      <header name="header2" value=""/>
+    </get>
+  </target>
+
+  <target name="testDuplicateHeaderNames">
+    <get src="http://www.apache.org/"; dest="get.tmp">
+      <header name="header1" value="headerValue1"/>
+      <header name="header1" value="headerValue2"/>
+      <header name="header1" value="headerValue3"/>
+    </get>
+  </target>
+
+  <target name="testHeaderSpacesTrimmed">
+    <get src="http://www.apache.org/"; dest="get.tmp">
+      <header name="  header1     " value="  headerValue1  "/>
+    </get>
+  </target>
+
   <target name="cleanup">
     <delete>
       <fileset dir="${basedir}" includes="get.tmp" />

http://git-wip-us.apache.org/repos/asf/ant/blob/b83bdceb/src/main/org/apache/tools/ant/taskdefs/Get.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Get.java 
b/src/main/org/apache/tools/ant/taskdefs/Get.java
index 83f3b6b..2200bd8 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Get.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Get.java
@@ -36,6 +36,7 @@ import org.apache.tools.ant.MagicNames;
 import org.apache.tools.ant.Main;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.email.Header;
 import org.apache.tools.ant.types.Mapper;
 import org.apache.tools.ant.types.Resource;
 import org.apache.tools.ant.types.ResourceCollection;
@@ -44,6 +45,8 @@ import org.apache.tools.ant.types.resources.URLProvider;
 import org.apache.tools.ant.types.resources.URLResource;
 import org.apache.tools.ant.util.FileNameMapper;
 import org.apache.tools.ant.util.FileUtils;
+import java.util.LinkedHashMap;
+import java.util.Map;
 
 /**
  * Gets a particular file from a URL source.
@@ -90,6 +93,9 @@ public class Get extends Task {
                            DEFAULT_AGENT_PREFIX + "/"
                            + Main.getShortAntVersion());
 
+    // Store headers as key/value pair without duplicate in keyz
+    private Map<String, String> headers = new LinkedHashMap<String, String>();
+
     /**
      * Does the work.
      *
@@ -483,6 +489,35 @@ public class Get extends Task {
     }
 
     /**
+     * Add a nested header
+     * @param header to be added
+     *
+     */
+    public void addConfiguredHeader(Header header) {
+        if (header != null) {
+            String key = trimToNull(header.getName());
+            String value = trimToNull(header.getValue());
+            if (key != null && value != null) {
+                this.headers.put(key, value);
+            }
+        }
+    }
+
+    private String trimToNull(String inputString) {
+
+        if (inputString == null) {
+            return null;
+        }
+
+        inputString = inputString.trim();
+        if ("".equals(inputString)) {
+            return null;
+        }
+        return inputString;
+    }
+
+
+    /**
      * Define the mapper to map source to destination files.
      * @return a mapper to be configured.
      * @exception BuildException if more than one mapper is defined.
@@ -726,6 +761,14 @@ public class Get extends Task {
                 connection.setRequestProperty("Accept-Encoding", 
GZIP_CONTENT_ENCODING);
             }
 
+            if (!headers.isEmpty()) {
+                for (final Map.Entry<String, String> header : 
headers.entrySet()) {
+                    //we do not log the header value as it may contain 
sensitive data like passwords
+                    log(String.format("Adding header '%s' ", header.getKey()));
+                    connection.setRequestProperty(header.getKey(), 
header.getValue());
+                }
+            }
+
             if (connection instanceof HttpURLConnection) {
                 ((HttpURLConnection) connection)
                         .setInstanceFollowRedirects(false);

http://git-wip-us.apache.org/repos/asf/ant/blob/b83bdceb/src/main/org/apache/tools/ant/taskdefs/email/Header.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/email/Header.java 
b/src/main/org/apache/tools/ant/taskdefs/email/Header.java
index 6bcfb66..aaee693 100644
--- a/src/main/org/apache/tools/ant/taskdefs/email/Header.java
+++ b/src/main/org/apache/tools/ant/taskdefs/email/Header.java
@@ -19,7 +19,9 @@
 package org.apache.tools.ant.taskdefs.email;
 
 /**
- * Class representing a generic e-mail header.
+ * Class representing a generic key-value header.
+ * TODO: This should be moved out of the email package
+ *
  * @since Ant 1.7
  */
 public class Header {

http://git-wip-us.apache.org/repos/asf/ant/blob/b83bdceb/src/tests/junit/org/apache/tools/ant/taskdefs/GetTest.java
----------------------------------------------------------------------
diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/GetTest.java 
b/src/tests/junit/org/apache/tools/ant/taskdefs/GetTest.java
index 3e1157d..52950c9 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/GetTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/GetTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.tools.ant.taskdefs;
 
+import org.apache.tools.ant.AntAssert;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.BuildFileRule;
 import org.junit.After;
@@ -25,6 +26,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 /**
@@ -103,6 +105,8 @@ public class GetTest {
     public void test7() {
         try {
             buildRule.executeTarget("test7");
+            AntAssert.assertNotContains("Adding header", buildRule.getLog());
+
             fail("userAgent may not be null or empty");
         } catch (BuildException ex) {
             //TODO assert value
@@ -119,4 +123,36 @@ public class GetTest {
         buildRule.executeTarget("testUseTomorrow");
     }
 
+    @Test
+    public void testTwoHeaders() {
+        buildRule.executeTarget("testTwoHeaders");
+        String log = buildRule.getLog();
+        AntAssert.assertContains("Adding header 'header1'", log);
+        AntAssert.assertContains("Adding header 'header2'", log);
+    }
+
+    @Test
+    public void testEmptyHeadersAreNeverAdded() {
+        buildRule.executeTarget("testEmptyHeaders");
+        AntAssert.assertNotContains("Adding header", buildRule.getLog());
+    }
+
+    @Test
+    public void testThatWhenMoreThanOneHeaderHaveSameNameOnlyLastOneIsAdded() {
+        buildRule.executeTarget("testDuplicateHeaderNames");
+        String log = buildRule.getLog();
+        AntAssert.assertContains("Adding header 'header1'", log);
+
+        String firstHeaderLogTrimmed = log.replaceFirst("Adding header ", "");
+        String allHeaderLogsTrimmed = log.replaceAll("Adding header ", "");
+
+        assertEquals("Only one header has been added", firstHeaderLogTrimmed, 
allHeaderLogsTrimmed);
+    }
+
+    @Test
+    public void testHeaderSpaceTrimmed() {
+        buildRule.executeTarget("testHeaderSpacesTrimmed");
+        AntAssert.assertContains("Adding header 'header1'", 
buildRule.getLog());
+    }
+
 }

Reply via email to