You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2012/07/23 05:27:33 UTC
svn commit: r1364484 - in /commons/proper/vfs/trunk:
core/src/main/java/org/apache/commons/vfs2/provider/http/
core/src/main/java/org/apache/commons/vfs2/provider/webdav/
core/src/test/java/org/apache/commons/vfs2/provider/http/test/ src/changes/
Author: ggregory
Date: Mon Jul 23 03:27:32 2012
New Revision: 1364484
URL: http://svn.apache.org/viewvc?rev=1364484&view=rev
Log:
[VFS-432][HTTP][WebDAV] Allow HTTP follow redirect.
Modified:
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileSystemConfigBuilder.java
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileObject.java
commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileSystemConfigBuilder.java
commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/http/test/HttpProviderTestCase.java
commons/proper/vfs/trunk/src/changes/changes.xml
Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java?rev=1364484&r1=1364483&r2=1364484&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileObject.java Mon Jul 23 03:27:32 2012
@@ -31,6 +31,7 @@ import org.apache.commons.httpclient.uti
import org.apache.commons.vfs2.FileContentInfoFactory;
import org.apache.commons.vfs2.FileNotFoundException;
import org.apache.commons.vfs2.FileSystemException;
+import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.FileType;
import org.apache.commons.vfs2.RandomAccessContent;
import org.apache.commons.vfs2.provider.AbstractFileName;
@@ -47,12 +48,20 @@ import org.apache.commons.vfs2.util.Rand
public class HttpFileObject extends AbstractFileObject<HttpFileSystem>
{
private final String urlCharset;
+ private final boolean followRedirect;
private HeadMethod method;
protected HttpFileObject(final AbstractFileName name, final HttpFileSystem fileSystem)
{
+ this(name, fileSystem, HttpFileSystemConfigBuilder.getInstance());
+ }
+
+ protected HttpFileObject(final AbstractFileName name, final HttpFileSystem fileSystem, final HttpFileSystemConfigBuilder builder)
+ {
super(name, fileSystem);
- urlCharset = HttpFileSystemConfigBuilder.getInstance().getUrlCharset(getFileSystem().getFileSystemOptions());
+ final FileSystemOptions fileSystemOptions = fileSystem.getFileSystemOptions();
+ urlCharset = builder.getUrlCharset(fileSystemOptions);
+ followRedirect = builder.getFollowRedirect(fileSystemOptions);
}
/**
@@ -162,14 +171,15 @@ public class HttpFileObject extends Abst
}
/**
- * Prepares a Method object.
+ * Prepares a HttpMethod object.
+ *
* @since 2.0 (was package)
*/
protected void setupMethod(final HttpMethod method) throws FileSystemException, URIException
{
String pathEncoded = ((URLFileName) getName()).getPathQueryEncoded(urlCharset);
method.setPath(pathEncoded);
- method.setFollowRedirects(true);
+ method.setFollowRedirects(this.getFollowRedirect());
method.setRequestHeader("User-Agent", "Jakarta-Commons-VFS");
}
@@ -210,6 +220,11 @@ public class HttpFileObject extends Abst
return new HttpFileContentInfoFactory();
}
+ protected boolean getFollowRedirect()
+ {
+ return followRedirect;
+ }
+
HeadMethod getHeadMethod() throws IOException
{
if (method != null) {
Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileSystemConfigBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileSystemConfigBuilder.java?rev=1364484&r1=1364483&r2=1364484&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileSystemConfigBuilder.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/http/HttpFileSystemConfigBuilder.java Mon Jul 23 03:27:32 2012
@@ -34,7 +34,11 @@ public class HttpFileSystemConfigBuilder
private static final int DEFAULT_MAX_CONNECTIONS = 50;
- private static final String OPTION_NAME_PREEMPTIVE_AUTHENTICATION = "preemptiveAuth";
+ private static final boolean DEFAULT_FOLLOW_REDIRECT = true;
+
+ private static final String KEY_PREEMPTIVE_AUTHENTICATION = "preemptiveAuth";
+
+ protected static final String KEY_FOLLOW_REDIRECT = "followRedirect";
/** @since 2.0 */
protected HttpFileSystemConfigBuilder(String prefix)
@@ -162,6 +166,21 @@ public class HttpFileSystemConfigBuilder
}
/**
+ * Sets whether to follow redirects for the connection.
+ *
+ * @param opts
+ * The FileSystem options.
+ * @param redirect
+ * {@code true} to follow redirects, {@code false} not to.
+ * @see #setFollowRedirect
+ * @since 2.1
+ */
+ public void setFollowRedirect(FileSystemOptions opts, boolean redirect)
+ {
+ setParam(opts, KEY_FOLLOW_REDIRECT, redirect);
+ }
+
+ /**
* The cookies to add to the request.
* @param opts The FileSystem options.
* @return the Cookie array.
@@ -172,6 +191,20 @@ public class HttpFileSystemConfigBuilder
}
/**
+ * Gets whether to follow redirects for the connection.
+ *
+ * @param opts
+ * The FileSystem options.
+ * @return {@code true} to follow redirects, {@code false} not to.
+ * @see #setFollowRedirect
+ * @since 2.1
+ */
+ public boolean getFollowRedirect(FileSystemOptions opts)
+ {
+ return getBoolean(opts, KEY_FOLLOW_REDIRECT, DEFAULT_FOLLOW_REDIRECT);
+ }
+
+ /**
* The maximum number of connections allowed.
* @param opts The FileSystem options.
* @param maxTotalConnections The maximum number of connections.
@@ -224,7 +257,7 @@ public class HttpFileSystemConfigBuilder
*/
public boolean isPreemptiveAuth(FileSystemOptions opts)
{
- return getBoolean(opts, OPTION_NAME_PREEMPTIVE_AUTHENTICATION, Boolean.FALSE).booleanValue();
+ return getBoolean(opts, KEY_PREEMPTIVE_AUTHENTICATION, Boolean.FALSE).booleanValue();
}
/**
@@ -238,7 +271,7 @@ public class HttpFileSystemConfigBuilder
*/
public void setPreemptiveAuth(FileSystemOptions opts, boolean preemptiveAuth)
{
- setParam(opts, OPTION_NAME_PREEMPTIVE_AUTHENTICATION, Boolean.valueOf(preemptiveAuth));
+ setParam(opts, KEY_PREEMPTIVE_AUTHENTICATION, Boolean.valueOf(preemptiveAuth));
}
@Override
Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileObject.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileObject.java?rev=1364484&r1=1364483&r2=1364484&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileObject.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileObject.java Mon Jul 23 03:27:32 2012
@@ -39,6 +39,7 @@ import org.apache.commons.vfs2.FileNotFo
import org.apache.commons.vfs2.FileNotFoundException;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
+import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.FileType;
import org.apache.commons.vfs2.NameScope;
import org.apache.commons.vfs2.provider.AbstractFileName;
@@ -91,10 +92,11 @@ public class WebdavFileObject extends Ht
protected WebdavFileObject(final AbstractFileName name, final WebdavFileSystem fileSystem)
{
- super(name, fileSystem);
+ super(name, fileSystem, WebdavFileSystemConfigBuilder.getInstance());
this.fileSystem = fileSystem;
builder = (WebdavFileSystemConfigBuilder) WebdavFileSystemConfigBuilder.getInstance();
- this.urlCharset = builder.getUrlCharset(getFileSystem().getFileSystemOptions());
+ final FileSystemOptions fileSystemOptions = fileSystem.getFileSystemOptions();
+ this.urlCharset = builder.getUrlCharset(fileSystemOptions);
}
protected void configureMethod(HttpMethodBase httpMethod)
@@ -394,8 +396,7 @@ public class WebdavFileObject extends Ht
{
String pathEncoded = ((URLFileName) getName()).getPathQueryEncoded(urlCharset);
method.setPath(pathEncoded);
- // All the WebDav methods are EntityEnclosingMethods and are not allowed to redirect.
- method.setFollowRedirects(false);
+ method.setFollowRedirects(this.getFollowRedirect());
method.setRequestHeader("User-Agent", "Jakarta-Commons-VFS");
method.addRequestHeader("Cache-control", "no-cache");
method.addRequestHeader("Cache-store", "no-store");
Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileSystemConfigBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileSystemConfigBuilder.java?rev=1364484&r1=1364483&r2=1364484&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileSystemConfigBuilder.java (original)
+++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs2/provider/webdav/WebdavFileSystemConfigBuilder.java Mon Jul 23 03:27:32 2012
@@ -28,6 +28,8 @@ import org.apache.commons.vfs2.provider.
public final class WebdavFileSystemConfigBuilder extends HttpFileSystemConfigBuilder
{
private static final WebdavFileSystemConfigBuilder BUILDER = new WebdavFileSystemConfigBuilder();
+
+ private static final boolean DEFAULT_FOLLOW_REDIRECT = false;
private WebdavFileSystemConfigBuilder()
{
@@ -65,6 +67,20 @@ public final class WebdavFileSystemConfi
}
/**
+ * Gets whether to follow redirects for the connection.
+ *
+ * @param opts
+ * The FileSystem options.
+ * @return {@code true} to follow redirects, {@code false} not to.
+ * @see #setFollowRedirect
+ * @since 2.1
+ */
+ public boolean getFollowRedirect(FileSystemOptions opts)
+ {
+ return getBoolean(opts, KEY_FOLLOW_REDIRECT, DEFAULT_FOLLOW_REDIRECT);
+ }
+
+ /**
* Whether to use versioning.
* @param opts The FileSystem options.
* @param versioning true if versioning should be enabled.
Modified: commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/http/test/HttpProviderTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/http/test/HttpProviderTestCase.java?rev=1364484&r1=1364483&r2=1364484&view=diff
==============================================================================
--- commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/http/test/HttpProviderTestCase.java (original)
+++ commons/proper/vfs/trunk/core/src/test/java/org/apache/commons/vfs2/provider/http/test/HttpProviderTestCase.java Mon Jul 23 03:27:32 2012
@@ -22,13 +22,15 @@ import java.io.IOException;
import junit.framework.Assert;
import junit.framework.Test;
-import org.apache.commons.vfs2.FileContent;
+import org.apache.commons.vfs2.FileNotFolderException;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemManager;
+import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.VFS;
import org.apache.commons.vfs2.impl.DefaultFileSystemManager;
import org.apache.commons.vfs2.provider.http.HttpFileProvider;
+import org.apache.commons.vfs2.provider.http.HttpFileSystemConfigBuilder;
import org.apache.commons.vfs2.test.AbstractProviderTestConfig;
import org.apache.commons.vfs2.test.ProviderTestSuite;
import org.apache.commons.vfs2.util.FreeSocketPortUtil;
@@ -81,6 +83,16 @@ public class HttpProviderTestCase extend
{
return new ProviderTestSuite(new HttpProviderTestCase())
{
+ /**
+ * Adds base tests - excludes the nested test cases.
+ */
+ @Override
+ protected void addBaseTests() throws Exception
+ {
+ super.addBaseTests();
+ addTests(HttpProviderTestCase.class);
+ }
+
@Override
protected void setUp() throws Exception
{
@@ -126,6 +138,12 @@ public class HttpProviderTestCase extend
ConnectionUri = "http://localhost:" + SocketPort;
}
+ private void checkReadTestsFolder(final FileObject file) throws FileSystemException
+ {
+ Assert.assertNotNull(file.getChildren());
+ Assert.assertTrue(file.getChildren().length > 0);
+ }
+
/**
* Returns the base folder for tests.
*/
@@ -149,17 +167,38 @@ public class HttpProviderTestCase extend
manager.addProvider("http", new HttpFileProvider());
}
- public void testGetContent() throws FileSystemException
+ private void testResloveFolderSlash(String uri, boolean followRedirect) throws FileSystemException
+ {
+ VFS.getManager().getFilesCache().close();
+ final FileSystemOptions opts = new FileSystemOptions();
+ HttpFileSystemConfigBuilder.getInstance().setFollowRedirect(opts, followRedirect);
+ final FileObject file = VFS.getManager().resolveFile(uri, opts);
+ try
+ {
+ checkReadTestsFolder(file);
+ } catch (FileNotFolderException e)
+ {
+ // Expected: VFS HTTP does not support listing children yet.
+ }
+ }
+
+ public void testResloveFolderSlashNoRedirectOff() throws FileSystemException
+ {
+ testResloveFolderSlash(ConnectionUri + "/read-tests", false);
+ }
+
+ public void testResloveFolderSlashNoRedirectOn() throws FileSystemException
+ {
+ testResloveFolderSlash(ConnectionUri + "/read-tests", true);
+ }
+
+ public void testResloveFolderSlashYesRedirectOff() throws FileSystemException
{
- final FileObject file = VFS.getManager().resolveFile(ConnectionUri + "/read-tests/file1.txt");
- Assert.assertNotNull(file.getContent());
+ testResloveFolderSlash(ConnectionUri + "/read-tests/", false);
}
- public void testGetContentInfo() throws FileSystemException
+ public void testResloveFolderSlashYesRedirectOn() throws FileSystemException
{
- final FileObject file = VFS.getManager().resolveFile(ConnectionUri + "/read-tests/file1.txt");
- final FileContent content = file.getContent();
- Assert.assertNotNull(content);
- Assert.assertNotNull(content.getContentInfo());
+ testResloveFolderSlash(ConnectionUri + "/read-tests/", true);
}
}
Modified: commons/proper/vfs/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1364484&r1=1364483&r2=1364484&view=diff
==============================================================================
--- commons/proper/vfs/trunk/src/changes/changes.xml (original)
+++ commons/proper/vfs/trunk/src/changes/changes.xml Mon Jul 23 03:27:32 2012
@@ -23,10 +23,13 @@
<body>
<release version="2.1" date="TBD" description="New features and bug fix release.">
- <action issue="VFS-431" dev="ggregory" type="add" due-to="awelynant">
+ <action issue="VFS-432" dev="ggregory" type="add" due-to="ggregory">
+ [HTTP][WebDAV] Allow HTTP follow redirect.
+ </action>
+ <action issue="VFS-431" dev="ggregory" type="add" due-to="ggregory">
FileSystemOption does not implement toString().
</action>
- <action issue="VFS-429" dev="ggregory" type="add" due-to="awelynant">
+ <action issue="VFS-429" dev="ggregory" type="add" due-to="ggregory">
Remove extra FileSystem ivar in AbstractFileObject subclasses with generics.
</action>
<action issue="VFS-427" dev="ggregory" type="add" due-to="awelynant">