support for non-ASCII linkpath in PAX headers
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/compress/trunk@1304717 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
index 2c98d14..6272fab 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
@@ -302,6 +302,12 @@
paxHeaders.put("path", entryName);
}
+ if (addPaxHeadersForNonAsciiNames
+ && (entry.isLink() || entry.isSymbolicLink())
+ && !ASCII.canEncode(entry.getLinkName())) {
+ paxHeaders.put("linkpath", entry.getLinkName());
+ }
+
if (paxHeaders.size() > 0) {
writePaxHeaders(entryName, paxHeaders);
}
diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java
index 28c9403..59c247f 100644
--- a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java
@@ -294,4 +294,25 @@
assertEquals(n, e.getName());
}
+ public void testWriteNonAsciiLinkPathNamePaxHeader() throws Exception {
+ String n = "\u00e4";
+ TarArchiveEntry t = new TarArchiveEntry("a", TarConstants.LF_LINK);
+ t.setSize(10 * 1024);
+ t.setLinkName(n);
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ TarArchiveOutputStream tos = new TarArchiveOutputStream(bos);
+ tos.setAddPaxHeadersForNonAsciiNames(true);
+ tos.putArchiveEntry(t);
+ tos.write(new byte[10 * 1024]);
+ tos.closeArchiveEntry();
+ tos.close();
+ byte[] data = bos.toByteArray();
+ assertEquals("15 linkpath=" + n + "\n",
+ new String(data, 512, 15, "UTF-8"));
+ TarArchiveInputStream tin =
+ new TarArchiveInputStream(new ByteArrayInputStream(data));
+ TarArchiveEntry e = tin.getNextTarEntry();
+ assertEquals(n, e.getLinkName());
+ }
+
}
\ No newline at end of file