From 58efd9ba030fd174d01f42406217f94482ba3d3e Mon Sep 17 00:00:00 2001 From: rfc2822 Date: Mon, 3 Nov 2014 19:30:07 +0100 Subject: [PATCH] Messing around with trailing slash again and again + tests (fixes #349) --- .../davdroid/webdav/WebDavResource.java | 2 +- test/robohydra/plugins/dav/index.js | 54 +++++++++++++++++++ .../davdroid/webdav/WebDavResourceTest.java | 27 ++++++---- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/src/at/bitfire/davdroid/webdav/WebDavResource.java b/src/at/bitfire/davdroid/webdav/WebDavResource.java index f213f1d3..75eba135 100644 --- a/src/at/bitfire/davdroid/webdav/WebDavResource.java +++ b/src/at/bitfire/davdroid/webdav/WebDavResource.java @@ -558,7 +558,7 @@ public class WebDavResource { } // about which resource is this response? - if (location.equals(href)) { // about ourselves + if (location.equals(href) || URIUtils.ensureTrailingSlash(location).equals(href)) { // about ourselves this.properties.putAll(properties); if (supportedComponents != null) this.supportedComponents = supportedComponents; diff --git a/test/robohydra/plugins/dav/index.js b/test/robohydra/plugins/dav/index.js index edda3c08..bdf7cee3 100644 --- a/test/robohydra/plugins/dav/index.js +++ b/test/robohydra/plugins/dav/index.js @@ -6,6 +6,60 @@ exports.getBodyParts = function(conf) { /* base URL, provide default DAV here */ new RoboHydraHeadDAV({ path: "/dav/" }), + /* multistatus parsing */ + new RoboHydraHeadDAV({ + path: "/dav/collection-response-with-trailing-slash", + handler: function(req,res,next) { + if (req.method == "PROPFIND") { + res.statusCode = 207; + res.write('\\ + \ + \ + /dav/collection-response-with-trailing-slash/ \ + \ + \ + \ + /principals/ok\ + \ + \ + \ + \ + \ + HTTP/1.1 200 OK\ + \ + \ + \ + '); + } + } + }), + new RoboHydraHeadDAV({ + path: "/dav/collection-response-without-trailing-slash", + handler: function(req,res,next) { + if (req.method == "PROPFIND") { + res.statusCode = 207; + res.write('\\ + \ + \ + /dav/collection-response-without-trailing-slash \ + \ + \ + \ + /principals/ok\ + \ + \ + \ + \ + \ + HTTP/1.1 200 OK\ + \ + \ + \ + '); + } + } + }), + /* principal URL */ new RoboHydraHeadDAV({ path: "/dav/principals/users/test", diff --git a/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java b/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java index 0dd948cd..e5cb21d1 100644 --- a/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java +++ b/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java @@ -23,15 +23,7 @@ import org.apache.commons.io.IOUtils; import android.content.res.AssetManager; import android.test.InstrumentationTestCase; import at.bitfire.davdroid.test.Constants; -import at.bitfire.davdroid.webdav.DavException; -import at.bitfire.davdroid.webdav.DavHttpClient; -import at.bitfire.davdroid.webdav.DavMultiget; -import at.bitfire.davdroid.webdav.HttpException; -import at.bitfire.davdroid.webdav.HttpPropfind; import at.bitfire.davdroid.webdav.HttpPropfind.Mode; -import at.bitfire.davdroid.webdav.NotFoundException; -import at.bitfire.davdroid.webdav.PreconditionFailedException; -import at.bitfire.davdroid.webdav.WebDavResource; import at.bitfire.davdroid.webdav.WebDavResource.PutMode; import ch.boye.httpclientandroidlib.impl.client.CloseableHttpClient; @@ -122,7 +114,7 @@ public class WebDavResourceTest extends InstrumentationTestCase { public void testPropfindCalendars() throws IOException, HttpException, DavException { WebDavResource dav = new WebDavResource(davCollection, "calendars/test"); - dav.propfind(HttpPropfind.Mode.CALDAV_COLLECTIONS); + dav.propfind(Mode.CALDAV_COLLECTIONS); assertEquals(3, dav.getMembers().size()); assertEquals("0xFF00FF", dav.getMembers().get(2).getColor()); for (WebDavResource member : dav.getMembers()) { @@ -134,6 +126,23 @@ public class WebDavResourceTest extends InstrumentationTestCase { } } + public void testPropfindTrailingSlashes() throws IOException, HttpException, DavException { + final String principalOK = "/principals/ok"; + + String requestPaths[] = { + "/dav/collection-response-with-trailing-slash", + "/dav/collection-response-with-trailing-slash/", + "/dav/collection-response-without-trailing-slash", + "/dav/collection-response-without-trailing-slash/" + }; + + for (String path : requestPaths) { + WebDavResource davSlash = new WebDavResource(davCollection, path); + davSlash.propfind(Mode.CARDDAV_COLLECTIONS); + assertEquals(principalOK, davSlash.getCurrentUserPrincipal()); + } + } + /* test normal HTTP/WebDAV */