On 2010-4-20 17:38, zhouke...@apache.org wrote:
Author: zhoukevin
Date: Tue Apr 20 09:38:04 2010
New Revision: 935847
URL: http://svn.apache.org/viewvc?rev=935847&view=rev
Log:
This patch implements the header related functions
[getHeaderField(int)/getHeaderFieldKey(int)/getHeaderField(String)/getLastModified()]
to prevent Harmony to return null when file URL is handled.
Modified:
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/org/apache/harmony/luni/internal/net/www/protocol/file/FileURLConnection.java
harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/internal/net/www/protocol/file/FileURLConnectionTest.java
Modified:
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/org/apache/harmony/luni/internal/net/www/protocol/file/FileURLConnection.java
URL:
http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/org/apache/harmony/luni/internal/net/www/protocol/file/FileURLConnection.java?rev=935847&r1=935846&r2=935847&view=diff
==============================================================================
---
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/org/apache/harmony/luni/internal/net/www/protocol/file/FileURLConnection.java
(original)
+++
harmony/enhanced/java/trunk/classlib/modules/luni/src/main/java/org/apache/harmony/luni/internal/net/www/protocol/file/FileURLConnection.java
Tue Apr 20 09:38:04 2010
@@ -28,6 +28,9 @@ import java.io.InputStream;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedHashMap;
import org.apache.harmony.luni.internal.net.www.MimeTable;
import org.apache.harmony.luni.util.Util;
@@ -48,8 +51,12 @@ public class FileURLConnection extends U
private boolean isDir;
+ private long lastModified = 0;
+
private FilePermission permission;
+ private LinkedHashMap<String, String> header;
+
/**
* Creates an instance of<code>FileURLConnection</code> for establishing
* a connection to the file pointed by this<code>URL<code>
@@ -63,6 +70,7 @@ public class FileURLConnection extends U
fileName = ""; //$NON-NLS-1$
}
fileName = Util.decode(fileName, false);
+ header = new LinkedHashMap<String, String>();
}
/**
@@ -76,15 +84,90 @@ public class FileURLConnection extends U
@Override
public void connect() throws IOException {
File f = new File(fileName);
- if (f.isDirectory()) {
- isDir = true;
+ if (isDir = f.isDirectory()) {
is = getDirectoryListing(f);
- // use -1 for the contentLength
} else {
is = new BufferedInputStream(new FileInputStream(f));
length = is.available();
+ lastModified = f.lastModified();
}
connected = true;
+ // updaetHeader must be after "connected = true", for updateHeader
+ // invokes getContentType which back invokes connect causing
+ // StackOverflow
+ updateHeader();
+ }
+
+ /**
+ * Function updates the header fields of a file.
+ */
+ private void updateHeader() {
+ String contentType = getContentType();
+ if (contentType != null) {
+ header.put("content-type", contentType); //$NON-NLS-1$
+ }
+ if (length>= 0) {
+ header.put("content-length", Integer.toString(length));
//$NON-NLS-1$
+ }
+ if (lastModified != 0) {
+ SimpleDateFormat dateFormat = new SimpleDateFormat(
+ "EEE, dd MMM yyyy HH:mm:ss 'GMT'"); //$NON-NLS-1$
+ header.put("last-modified", dateFormat.format(new Date(
//$NON-NLS-1$
+ lastModified)));
+ }
+ }
+
+ @Override
+ public String getHeaderField(String key) {
+ try {
+ if (!connected) {
+ connect();
+ }
+ } catch (IOException e) {
+ // Ignored
+ }
+ return header.get(key);
+ }
+
+ @Override
+ public String getHeaderField(int index) {
+ try {
+ if (!connected) {
+ connect();
+ }
+ } catch (IOException e) {
+ // Ignored
+ }
+ if (index> -1&& index< header.size()) {
+ return header.values().toArray(new String[0])[index];
+ }
+ return null;
+ }
+
+ @Override
+ public String getHeaderFieldKey(int index) {
+ try {
+ if (!connected) {
+ connect();
+ }
+ } catch (IOException e) {
+ // Ignored
+ }
+ if (index> -1&& index< header.size()) {
+ return header.keySet().toArray(new String[0])[index];
+ }
+ return null;
+ }
+
+ public long getLastModified() {
+ try {
+ if (!connected) {
+ connect();
+ }
+ } catch (IOException e) {
+ // default is -1
+ }
+ return lastModified;
}
/**
Modified:
harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/internal/net/www/protocol/file/FileURLConnectionTest.java
URL:
http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/internal/net/www/protocol/file/FileURLConnectionTest.java?rev=935847&r1=935846&r2=935847&view=diff
==============================================================================
---
harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/internal/net/www/protocol/file/FileURLConnectionTest.java
(original)
+++
harmony/enhanced/java/trunk/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/internal/net/www/protocol/file/FileURLConnectionTest.java
Tue Apr 20 09:38:04 2010
@@ -18,6 +18,7 @@ package org.apache.harmony.luni.tests.in
import java.io.IOException;
import java.net.URL;
+import java.net.URLConnection;
import junit.framework.TestCase;
@@ -63,4 +64,41 @@ public class FileURLConnectionTest exten
assertNotNull(conn.getInputStream());
assertEquals("file",conn.getURL().getProtocol());
}
+
+ public void testHeaderFunctions() throws IOException {
+ String resourceName = "org/apache/harmony/luni/tests/"; // folder name
+ URL url = ClassLoader.getSystemClassLoader().getResource(resourceName);
+ FileURLConnection conn = new FileURLConnection(url);
+ assertNotNull(conn.getInputStream());
+ assertEquals(conn.getContentType(),
conn.getHeaderField("content-type"));
+
+ resourceName = "org/apache/harmony/luni/tests/" + "test.rtf";
+ ; // folder name
+ url = ClassLoader.getSystemClassLoader().getResource(resourceName);
+ conn = new FileURLConnection(url);
+ assertNotNull(conn.getInputStream());
+ assertEquals(conn.getContentType(),
conn.getHeaderField("content-type"));
+ assertEquals(Integer.toString(conn.getContentLength()), conn
+ .getHeaderField("content-length"));
+ assertEquals(conn.getHeaderField(0), conn
+ .getHeaderField("content-type"));
+ assertEquals(conn.getHeaderField(1), conn
+ .getHeaderField("content-length"));
+ assertEquals(conn.getHeaderField(2), conn
+ .getHeaderField("last-modified"));
+ assertEquals("last-modified", conn.getHeaderFieldKey(2));
+ assertEquals("content-length", conn.getHeaderFieldKey(1));
+ assertEquals("content-type", conn.getHeaderFieldKey(0));
+ }
+
+ public void testHeader_BoundaryCheck() throws IOException {
+ String resourceName = "org/apache/harmony/luni/tests/";
+ URL url = ClassLoader.getSystemClassLoader().getResource(resourceName);
+ URLConnection urlConnection = url.openConnection();
+ assertNull(urlConnection.getHeaderField(Integer.MIN_VALUE));
+ assertNull(urlConnection.getHeaderField(Integer.MAX_VALUE));
+ assertNull(urlConnection.getHeaderFieldKey(Integer.MIN_VALUE));
+ assertNull(urlConnection.getHeaderFieldKey(Integer.MAX_VALUE));
+ assertNull(urlConnection.getHeaderField(null));
+ }
}
This patch is provided by Mohanraj Loganathan, Thanks.