From 428c09c3901ea643b6caaf32d2cb3607b00c3b82 Mon Sep 17 00:00:00 2001 From: rfc2822 Date: Fri, 10 Oct 2014 12:59:53 +0200 Subject: [PATCH] Send appropriate Accept/Content-Type headers + tests (closes #328) --- .../bitfire/davdroid/resource/CardDavAddressBook.java | 2 +- src/at/bitfire/davdroid/resource/Contact.java | 2 ++ src/at/bitfire/davdroid/resource/Event.java | 2 ++ src/at/bitfire/davdroid/resource/RemoteCollection.java | 10 +++++++++- src/at/bitfire/davdroid/webdav/HttpPropfind.java | 4 ++-- src/at/bitfire/davdroid/webdav/HttpReport.java | 1 + src/at/bitfire/davdroid/webdav/WebDavResource.java | 4 +++- test/robohydra/plugins/headdav.js | 8 +++++++- .../at/bitfire/davdroid/webdav/WebDavResourceTest.java | 4 ++-- 9 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/at/bitfire/davdroid/resource/CardDavAddressBook.java b/src/at/bitfire/davdroid/resource/CardDavAddressBook.java index 72f40611..c57a6add 100644 --- a/src/at/bitfire/davdroid/resource/CardDavAddressBook.java +++ b/src/at/bitfire/davdroid/resource/CardDavAddressBook.java @@ -17,7 +17,7 @@ public class CardDavAddressBook extends RemoteCollection { @Override protected String memberContentType() { - return "text/vcard"; + return Contact.MIME_TYPE; } @Override diff --git a/src/at/bitfire/davdroid/resource/Contact.java b/src/at/bitfire/davdroid/resource/Contact.java index a1805ff1..d301450c 100644 --- a/src/at/bitfire/davdroid/resource/Contact.java +++ b/src/at/bitfire/davdroid/resource/Contact.java @@ -61,6 +61,8 @@ import ezvcard.property.Url; public class Contact extends Resource { private final static String TAG = "davdroid.Contact"; + public final static String MIME_TYPE = "text/vcard"; + public final static String PROPERTY_STARRED = "X-DAVDROID-STARRED", PROPERTY_PHONETIC_FIRST_NAME = "X-PHONETIC-FIRST-NAME", diff --git a/src/at/bitfire/davdroid/resource/Event.java b/src/at/bitfire/davdroid/resource/Event.java index 7ee43b9e..59df4baa 100644 --- a/src/at/bitfire/davdroid/resource/Event.java +++ b/src/at/bitfire/davdroid/resource/Event.java @@ -67,6 +67,8 @@ import at.bitfire.davdroid.syncadapter.DavSyncAdapter; public class Event extends Resource { private final static String TAG = "davdroid.Event"; + public final static String MIME_TYPE = "text/calendar"; + private final static TimeZoneRegistry tzRegistry = new DefaultTimeZoneRegistryFactory().createRegistry(); @Getter @Setter private String summary, location, description; diff --git a/src/at/bitfire/davdroid/resource/RemoteCollection.java b/src/at/bitfire/davdroid/resource/RemoteCollection.java index 5bad96ee..1b8a35b6 100644 --- a/src/at/bitfire/davdroid/resource/RemoteCollection.java +++ b/src/at/bitfire/davdroid/resource/RemoteCollection.java @@ -120,7 +120,15 @@ public abstract class RemoteCollection { public Resource get(Resource resource) throws IOException, HttpException, DavException, InvalidResourceException { WebDavResource member = new WebDavResource(collection, resource.getName()); - member.get(); + + if (resource instanceof Contact) + member.get(Contact.MIME_TYPE); + else if (resource instanceof Event) + member.get(Event.MIME_TYPE); + else { + Log.wtf(TAG, "Should fetch something, but neither contact nor calendar"); + throw new InvalidResourceException("Didn't now which MIME type to accept"); + } byte[] data = member.getContent(); if (data == null) diff --git a/src/at/bitfire/davdroid/webdav/HttpPropfind.java b/src/at/bitfire/davdroid/webdav/HttpPropfind.java index 896367eb..0e6e211a 100644 --- a/src/at/bitfire/davdroid/webdav/HttpPropfind.java +++ b/src/at/bitfire/davdroid/webdav/HttpPropfind.java @@ -39,8 +39,6 @@ public class HttpPropfind extends HttpEntityEnclosingRequestBase { HttpPropfind(URI uri, Mode mode) { this(uri); - - setHeader("Content-Type", "text/xml; charset=UTF-8"); DavPropfind propfind = new DavPropfind(); propfind.prop = new DavProp(); @@ -87,6 +85,8 @@ public class HttpPropfind extends HttpEntityEnclosingRequestBase { StringWriter writer = new StringWriter(); serializer.write(propfind, writer); + setHeader("Content-Type", "text/xml; charset=UTF-8"); + setHeader("Accept", "text/xml"); setHeader("Depth", String.valueOf(depth)); setEntity(new StringEntity(writer.toString(), "UTF-8")); } catch(Exception ex) { diff --git a/src/at/bitfire/davdroid/webdav/HttpReport.java b/src/at/bitfire/davdroid/webdav/HttpReport.java index a94c7d30..044deba5 100644 --- a/src/at/bitfire/davdroid/webdav/HttpReport.java +++ b/src/at/bitfire/davdroid/webdav/HttpReport.java @@ -25,6 +25,7 @@ public class HttpReport extends HttpEntityEnclosingRequestBase { this(uri); setHeader("Content-Type", "text/xml; charset=UTF-8"); + setHeader("Accept", "text/xml"); setHeader("Depth", "0"); setEntity(new StringEntity(entity, "UTF-8")); diff --git a/src/at/bitfire/davdroid/webdav/WebDavResource.java b/src/at/bitfire/davdroid/webdav/WebDavResource.java index b482b87a..c8fa8f74 100644 --- a/src/at/bitfire/davdroid/webdav/WebDavResource.java +++ b/src/at/bitfire/davdroid/webdav/WebDavResource.java @@ -329,8 +329,10 @@ public class WebDavResource { /* resource operations */ - public void get() throws IOException, HttpException, DavException { + public void get(String acceptedType) throws IOException, HttpException, DavException { HttpGet get = new HttpGet(location); + get.addHeader("Accept", acceptedType); + CloseableHttpResponse response = httpClient.execute(get, context); try { checkResponse(response); diff --git a/test/robohydra/plugins/headdav.js b/test/robohydra/plugins/headdav.js index c9c25524..613a2678 100644 --- a/test/robohydra/plugins/headdav.js +++ b/test/robohydra/plugins/headdav.js @@ -16,8 +16,14 @@ RoboHydraHeadDAV = roboHydraHeads.roboHydraHeadType({ res.headers['DAV'] = 'addressbook, calendar-access'; res.statusCode = 500; + // verify Accept header + var accept = req.headers['accept']; + if (req.method == "GET" && (accept == undefined || !accept.match(/text\/(calendar|vcard|xml)/)) || + (req.method == "PROPFIND" || req.method == "REPORT") && (accept == undefined || accept != "text/xml")) + res.statusCode = 406; + // DAV operations that work on all URLs - if (req.method == "OPTIONS") { + else if (req.method == "OPTIONS") { res.statusCode = 204; res.headers['Allow'] = 'OPTIONS, PROPFIND, GET, PUT, DELETE, REPORT'; diff --git a/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java b/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java index 3c427b8d..3c7856eb 100644 --- a/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java +++ b/test/src/at/bitfire/davdroid/webdav/WebDavResourceTest.java @@ -145,7 +145,7 @@ public class WebDavResourceTest extends InstrumentationTestCase { } public void testGet() throws URISyntaxException, IOException, HttpException, DavException { - simpleFile.get(); + simpleFile.get("*/*"); @Cleanup InputStream is = assetMgr.open("test.random", AssetManager.ACCESS_STREAMING); byte[] expected = IOUtils.toByteArray(is); assertTrue(Arrays.equals(expected, simpleFile.getContent())); @@ -156,7 +156,7 @@ public class WebDavResourceTest extends InstrumentationTestCase { boolean sniWorking = false; try { - file.get(); + file.get("*/*"); sniWorking = true; } catch (SSLPeerUnverifiedException e) { }