API addition and provider implementation changes for bug 221177. Also added GetRemoteFileNameTest.
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java
index df4dce5..66a2119 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/AbstractRetrieveFileTransfer.java
@@ -689,4 +689,17 @@
setupProxy(proxy);
}
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.filetransfer.IIncomingFileTransfer#getRemoteFileName()
+ */
+ public String getRemoteFileName() {
+ String pathStr = getRemoteFileURL().getPath();
+ if (pathStr.length() > 0) {
+ IPath path = Path.fromPortableString(pathStr);
+ if (path.segmentCount() > 0)
+ return path.lastSegment();
+ }
+ return null;
+ }
+
}
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/HttpHelper.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/HttpHelper.java
new file mode 100644
index 0000000..8059578
--- /dev/null
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/HttpHelper.java
@@ -0,0 +1,39 @@
+/****************************************************************************
+ * Copyright (c) 2008 Composent, Inc. and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Composent, Inc. - initial API and implementation
+ *****************************************************************************/
+
+package org.eclipse.ecf.provider.filetransfer.retrieve;
+
+import java.util.StringTokenizer;
+
+/**
+ *
+ */
+public class HttpHelper {
+
+ public static final String CONTENT_DISPOSITION_HEADER = "Content-Disposition"; //$NON-NLS-1$
+
+ public static String getRemoteFileNameFromContentDispositionHeader(String headerValue) {
+ if (headerValue != null) {
+ StringTokenizer tokens = new StringTokenizer(headerValue, " \t\n\r\f=;,"); //$NON-NLS-1$
+ while (tokens.hasMoreTokens()) {
+ String token = tokens.nextToken();
+ if (token.equals("filename") && tokens.hasMoreTokens()) { //$NON-NLS-1$
+ // Expect next token to be the filename
+ String fileName = tokens.nextToken();
+ if (fileName.startsWith("\"") && fileName.endsWith("\"")) //$NON-NLS-1$ //$NON-NLS-2$
+ fileName = fileName.substring(1, fileName.length() - 1);
+ return fileName;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java
index 001d946..e2bd8ab 100644
--- a/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java
+++ b/providers/bundles/org.eclipse.ecf.provider.filetransfer/src/org/eclipse/ecf/provider/filetransfer/retrieve/UrlConnectionRetrieveFileTransfer.java
@@ -41,6 +41,8 @@
protected int responseCode = -1;
+ private String remoteFileName;
+
protected String responseMessage = null;
private JREProxyHelper proxyHelper = null;
@@ -54,6 +56,13 @@
proxyHelper = new JREProxyHelper();
}
+ /* (non-Javadoc)
+ * @see org.eclipse.ecf.provider.filetransfer.retrieve.AbstractRetrieveFileTransfer#getRemoteFileName()
+ */
+ public String getRemoteFileName() {
+ return remoteFileName;
+ }
+
protected void connect() throws IOException {
setupTimeouts();
urlConnection = getRemoteFileURL().openConnection();
@@ -137,6 +146,15 @@
throw new IOException(Messages.UrlConnectionRetrieveFileTransfer_EXCEPTION_INVALID_SERVER_RESPONSE);
lastModifiedTime = urlConnection.getLastModified();
setFileLength(urlConnection.getContentLength());
+
+ String contentDispositionValue = urlConnection.getHeaderField(HttpHelper.CONTENT_DISPOSITION_HEADER);
+ if (contentDispositionValue != null) {
+ remoteFileName = HttpHelper.getRemoteFileNameFromContentDispositionHeader(contentDispositionValue);
+ }
+
+ if (remoteFileName == null) {
+ remoteFileName = super.getRemoteFileName();
+ }
}
protected void getResumeResponseHeaderValues() throws IOException {